History

Merge tag 'drm-intel-next-2017-11-17-1' of git://anongit.freedesktop.org/drm/drm-intel into drm-next

More change sets for 4.16: - Many improvements for selftests and other igt tests (Chris) - Forcewake with PUNIT->PMIC bus fixes and robustness (Hans) - Define an engine class for uABI (Tvrtko) - Context switch fixes and improvements (Chris) - GT powersavings and power gating simplification and fixes (Chris) - Other general driver clean-ups (Chris, Lucas, Ville) - Removing old, useless and/or bad workarounds (Chris, Oscar, Radhakrishna) - IPS, pipe config, etc in preparation for another Fast Boot attempt (Maarten) - OA perf fixes and support to Coffee Lake and Cannonlake (Lionel) - Fixes around GPU fault registers (Michel) - GEM Proxy (Tina) - Refactor of Geminilake and Cannonlake plane color handling (James) - Generalize transcoder loop (Mika Kahola) - New HW Workaround for Cannonlake and Geminilake (Rodrigo) - Resume GuC before using GEM (Chris) - Stolen Memory handling improvements (Ville) - Initialize entry in PPAT for older compilers (Chris) - Other fixes and robustness improvements on execbuf (Chris) - Improve logs of GEM_BUG_ON (Mika Kuoppala) - Rework with massive rename of GuC functions and files (Sagar) - Don't sanitize frame start delay if pipe is off (Ville) - Cannonlake clock fixes (Rodrigo) - Cannonlake HDMI 2.0 support (Rodrigo) - Add a GuC doorbells selftest (Michel) - Add might_sleep() check to our wait_for() (Chris) Many GVT changes for 4.16: - CSB HWSP update support (Weinan) - GVT debug helpers, dyndbg and debugfs (Chuanxiao, Shuo) - full virtualized opregion (Xiaolin) - VM health check for sane fallback (Fred) - workload submission code refactor for future enabling (Zhi) - Updated repo URL in MAINTAINERS (Zhenyu) - other many misc fixes * tag 'drm-intel-next-2017-11-17-1' of git://anongit.freedesktop.org/drm/drm-intel: (260 commits) drm/i915: Update DRIVER_DATE to 20171117 drm/i915: Add a policy note for removing workarounds drm/i915/selftests: Report ENOMEM clearly for an allocation failure Revert "drm/i915: Display WA #1133 WaFbcSkipSegments:cnl, glk" drm/i915: Calculate g4x intermediate watermarks correctly drm/i915: Calculate vlv/chv intermediate watermarks correctly, v3. drm/i915: Pass crtc_state to ips toggle functions, v2 drm/i915: Pass idle crtc_state to intel_dp_sink_crc drm/i915: Enable FIFO underrun reporting after initial fastset, v4. drm/i915: Mark the userptr invalidate workqueue as WQ_MEM_RECLAIM drm/i915: Add might_sleep() check to wait_for() drm/i915/selftests: Add a GuC doorbells selftest drm/i915/cnl: Extend HDMI 2.0 support to CNL. drm/i915/cnl: Simplify dco_fraction calculation. drm/i915/cnl: Don't blindly replace qdiv. drm/i915/cnl: Fix wrpll math for higher freqs. drm/i915/cnl: Fix, simplify and unify wrpll variable sizes. drm/i915/cnl: Remove useless conversion. drm/i915/cnl: Remove spurious central_freq. drm/i915/selftests: exercise_ggtt may have nothing to do ...

Dave Airlie committed 8 years ago

Commit ca797d22 parents 2c1c55c 010d118129 files · +6526 −3154Browse files

Unified · Split

129 files
  1. Documentation/gpu/i915.rst +2 −2
  2. MAINTAINERS +1 −1
  3. arch/x86/include/asm/iosf_mbi.h +25 −0
  4. arch/x86/platform/intel/iosf_mbi.c +17 −2
  5. drivers/gpu/drm/i915/Kconfig.debug +28 −0
  6. drivers/gpu/drm/i915/Makefile +26 −5
  7. drivers/gpu/drm/i915/gvt/Makefile +1 −1
  8. drivers/gpu/drm/i915/gvt/cfg_space.c +21 −0
  9. drivers/gpu/drm/i915/gvt/cmd_parser.c +124 −101
  10. drivers/gpu/drm/i915/gvt/debug.h +12 −12
  11. drivers/gpu/drm/i915/gvt/debugfs.c +212 −0
  12. drivers/gpu/drm/i915/gvt/execlist.c +68 −428
  13. drivers/gpu/drm/i915/gvt/execlist.h +4 −4
  14. drivers/gpu/drm/i915/gvt/firmware.c +11 −15
  15. drivers/gpu/drm/i915/gvt/gtt.c +152 −109
  16. drivers/gpu/drm/i915/gvt/gtt.h +19 −23
  17. drivers/gpu/drm/i915/gvt/gvt.c +140 −8
  18. drivers/gpu/drm/i915/gvt/gvt.h +50 −21
  19. drivers/gpu/drm/i915/gvt/handlers.c +120 −19
  20. drivers/gpu/drm/i915/gvt/kvmgt.c +9 −121
  21. drivers/gpu/drm/i915/gvt/mmio.c +16 −16
  22. drivers/gpu/drm/i915/gvt/mmio.h +6 −0
  23. drivers/gpu/drm/i915/gvt/mpt.h +18 −16
  24. drivers/gpu/drm/i915/gvt/opregion.c +226 −49
  25. drivers/gpu/drm/i915/gvt/reg.h +5 −1
  26. drivers/gpu/drm/i915/gvt/render.c +8 −6
  27. drivers/gpu/drm/i915/gvt/scheduler.c +625 −42
  28. drivers/gpu/drm/i915/gvt/scheduler.h +20 −8
  29. drivers/gpu/drm/i915/gvt/vgpu.c +18 −16
  30. drivers/gpu/drm/i915/i915_cmd_parser.c +3 −10
  31. drivers/gpu/drm/i915/i915_debugfs.c +114 −17
  32. drivers/gpu/drm/i915/i915_drv.c +31 −21
  33. drivers/gpu/drm/i915/i915_drv.h +43 −19
  34. drivers/gpu/drm/i915/i915_gem.c +264 −52
  35. drivers/gpu/drm/i915/i915_gem.h +11 −1
  36. drivers/gpu/drm/i915/i915_gem_context.c +15 −47
  37. drivers/gpu/drm/i915/i915_gem_context.h +3 −1
  38. drivers/gpu/drm/i915/i915_gem_evict.c +3 −1
  39. drivers/gpu/drm/i915/i915_gem_execbuffer.c +43 −23
  40. drivers/gpu/drm/i915/i915_gem_gtt.c +52 −23
  41. drivers/gpu/drm/i915/i915_gem_object.h +9 −2
  42. drivers/gpu/drm/i915/i915_gem_render_state.c +47 −94
  43. drivers/gpu/drm/i915/i915_gem_render_state.h +1 −3
  44. drivers/gpu/drm/i915/i915_gem_request.c +2 −0
  45. drivers/gpu/drm/i915/i915_gem_stolen.c +44 −10
  46. drivers/gpu/drm/i915/i915_gem_tiling.c +9 −0
  47. drivers/gpu/drm/i915/i915_gpu_error.c +82 −20
  48. drivers/gpu/drm/i915/i915_guc_reg.h +0 −7
  49. drivers/gpu/drm/i915/i915_irq.c +6 −2
  50. drivers/gpu/drm/i915/i915_oa_bdw.c +2 −2
  51. drivers/gpu/drm/i915/i915_oa_bxt.c +2 −2
  52. drivers/gpu/drm/i915/i915_oa_cflgt2.c +2 −2
  53. drivers/gpu/drm/i915/i915_oa_cflgt3.c +109 −0
  54. drivers/gpu/drm/i915/i915_oa_cflgt3.h +34 −0
  55. drivers/gpu/drm/i915/i915_oa_chv.c +2 −2
  56. drivers/gpu/drm/i915/i915_oa_cnl.c +121 −0
  57. drivers/gpu/drm/i915/i915_oa_cnl.h +34 −0
  58. drivers/gpu/drm/i915/i915_oa_glk.c +2 −2
  59. drivers/gpu/drm/i915/i915_oa_hsw.c +2 −2
  60. drivers/gpu/drm/i915/i915_oa_kblgt2.c +2 −2
  61. drivers/gpu/drm/i915/i915_oa_kblgt3.c +2 −2
  62. drivers/gpu/drm/i915/i915_oa_sklgt2.c +2 −2
  63. drivers/gpu/drm/i915/i915_oa_sklgt3.c +2 −2
  64. drivers/gpu/drm/i915/i915_oa_sklgt4.c +2 −2
  65. drivers/gpu/drm/i915/i915_perf.c +70 −25
  66. drivers/gpu/drm/i915/i915_reg.h +68 −15
  67. drivers/gpu/drm/i915/i915_selftest.h +1 −1
  68. drivers/gpu/drm/i915/i915_utils.h +5 −2
  69. drivers/gpu/drm/i915/i915_vma.c +5 −1
  70. drivers/gpu/drm/i915/intel_audio.c +111 −91
  71. drivers/gpu/drm/i915/intel_bios.c +24 −0
  72. drivers/gpu/drm/i915/intel_breadcrumbs.c +43 −11
  73. drivers/gpu/drm/i915/intel_cdclk.c +285 −106
  74. drivers/gpu/drm/i915/intel_color.c +2 −2
  75. drivers/gpu/drm/i915/intel_crt.c +21 −25
  76. drivers/gpu/drm/i915/intel_csr.c +3 −2
  77. drivers/gpu/drm/i915/intel_ddi.c +184 −139
  78. drivers/gpu/drm/i915/intel_device_info.c +110 −11
  79. drivers/gpu/drm/i915/intel_display.c +201 −87
  80. drivers/gpu/drm/i915/intel_dp.c +238 −278
  81. drivers/gpu/drm/i915/intel_dp_mst.c +31 −48
  82. drivers/gpu/drm/i915/intel_dpio_phy.c +59 −63
  83. drivers/gpu/drm/i915/intel_dpll_mgr.c +42 −65
  84. drivers/gpu/drm/i915/intel_drv.h +33 −23
  85. drivers/gpu/drm/i915/intel_dsi.c +10 −9
  86. drivers/gpu/drm/i915/intel_dvo.c +2 −0
  87. drivers/gpu/drm/i915/intel_engine_cs.c +127 −88
  88. drivers/gpu/drm/i915/intel_guc.c +26 −12
  89. drivers/gpu/drm/i915/intel_guc.h +13 −2
  90. drivers/gpu/drm/i915/intel_guc_ct.c +1 −0
  91. drivers/gpu/drm/i915/intel_guc_fw.c +105 −69
  92. drivers/gpu/drm/i915/intel_guc_fwif.h +40 −0
  93. drivers/gpu/drm/i915/intel_guc_submission.c +501 −198
  94. drivers/gpu/drm/i915/intel_guc_submission.h +6 −5
  95. drivers/gpu/drm/i915/intel_hdmi.c +55 −43
  96. drivers/gpu/drm/i915/intel_huc.c +1 −1
  97. drivers/gpu/drm/i915/intel_lrc.c +110 −71
  98. drivers/gpu/drm/i915/intel_lrc.h +0 −1
  99. drivers/gpu/drm/i915/intel_lvds.c +2 −0
  100. drivers/gpu/drm/i915/intel_opregion.c +2 −2
  101. drivers/gpu/drm/i915/intel_pipe_crc.c +2 −2
  102. drivers/gpu/drm/i915/intel_pm.c +63 −111
  103. drivers/gpu/drm/i915/intel_psr.c +2 −2
  104. drivers/gpu/drm/i915/intel_ringbuffer.c +85 −38
  105. drivers/gpu/drm/i915/intel_ringbuffer.h +72 −7
  106. drivers/gpu/drm/i915/intel_runtime_pm.c +2 −1
  107. drivers/gpu/drm/i915/intel_sdvo.c +4 −2
  108. drivers/gpu/drm/i915/intel_sprite.c +5 −6
  109. drivers/gpu/drm/i915/intel_tv.c +4 −2
  110. drivers/gpu/drm/i915/intel_uc.c +12 −10
  111. drivers/gpu/drm/i915/intel_uc_fw.c +1 −1
  112. drivers/gpu/drm/i915/intel_uc_fw.h +1 −1
  113. drivers/gpu/drm/i915/intel_uncore.c +146 −23
  114. drivers/gpu/drm/i915/intel_vbt_defs.h +6 −2
  115. drivers/gpu/drm/i915/selftests/huge_pages.c +3 −0
  116. drivers/gpu/drm/i915/selftests/i915_gem_coherency.c +8 −8
  117. drivers/gpu/drm/i915/selftests/i915_gem_context.c +1 −1
  118. drivers/gpu/drm/i915/selftests/i915_gem_gtt.c +34 −14
  119. drivers/gpu/drm/i915/selftests/i915_gem_object.c +2 −0
  120. drivers/gpu/drm/i915/selftests/i915_gem_request.c +1 −1
  121. drivers/gpu/drm/i915/selftests/i915_gem_timeline.c +1 −1
  122. drivers/gpu/drm/i915/selftests/i915_live_selftests.h +1 −0
  123. drivers/gpu/drm/i915/selftests/i915_syncmap.c +3 −3
  124. drivers/gpu/drm/i915/selftests/i915_vma.c +1 −1
  125. drivers/gpu/drm/i915/selftests/intel_guc.c +367 −0
  126. drivers/gpu/drm/i915/selftests/intel_uncore.c +7 −4
  127. drivers/gpu/drm/i915/selftests/mock_engine.c +31 −10
  128. drivers/gpu/drm/i915/selftests/mock_gem_device.c +1 −6
  129. include/uapi/drm/i915_drm.h +37 −0
Documentation/gpu/i915.rst+2−2
@@ -350,10 +350,10 @@ GuC-specific firmware loader · 349 unmodified lines
350350 GuC-based command submission
351351 ----------------------------
352352
353−.. kernel-doc:: drivers/gpu/drm/i915/i915_guc_submission.c
353+.. kernel-doc:: drivers/gpu/drm/i915/intel_guc_submission.c
354354 :doc: GuC-based command submission
355355
356−.. kernel-doc:: drivers/gpu/drm/i915/i915_guc_submission.c
356+.. kernel-doc:: drivers/gpu/drm/i915/intel_guc_submission.c
357357 :internal:
358358
359359 GuC Firmware Layout
MAINTAINERS+1−1
@@ -7030,7 +7030,7 @@ M: Zhi Wang <zhi.a.wang@intel.com> · 7029 unmodified lines
70307030 L: intel-gvt-dev@lists.freedesktop.org
70317031 L: intel-gfx@lists.freedesktop.org
70327032 W: https://01.org/igvt-g
7033−T: git https://github.com/01org/gvt-linux.git
7033+T: git https://github.com/intel/gvt-linux.git
70347034 S: Supported
70357035 F: drivers/gpu/drm/i915/gvt/
70367036
arch/x86/include/asm/iosf_mbi.h+25−0
@@ -146,6 +146,18 @@ int iosf_mbi_register_pmic_bus_access_notifier(struct notifier_block *nb); · 145 unmodified lines
146146 */
147147 int iosf_mbi_unregister_pmic_bus_access_notifier(struct notifier_block *nb);
148148
149+/**
150+ * iosf_mbi_unregister_pmic_bus_access_notifier_unlocked - Unregister PMIC bus
151+ * notifier, unlocked
152+ *
153+ * Like iosf_mbi_unregister_pmic_bus_access_notifier(), but for use when the
154+ * caller has already called iosf_mbi_punit_acquire() itself.
155+ *
156+ * @nb: notifier_block to unregister
157+ */
158+int iosf_mbi_unregister_pmic_bus_access_notifier_unlocked(
159+ struct notifier_block *nb);
160+
149161 /**
150162 * iosf_mbi_call_pmic_bus_access_notifier_chain - Call PMIC bus notifier chain
151163 *
@@ -154,6 +166,11 @@ int iosf_mbi_unregister_pmic_bus_access_notifier(struct notifier_block *nb); · 2 unmodified lines
154166 */
155167 int iosf_mbi_call_pmic_bus_access_notifier_chain(unsigned long val, void *v);
156168
169+/**
170+ * iosf_mbi_assert_punit_acquired - Assert that the P-Unit has been acquired.
171+ */
172+void iosf_mbi_assert_punit_acquired(void);
173+
157174 #else /* CONFIG_IOSF_MBI is not enabled */
158175 static inline
159176 bool iosf_mbi_available(void)
@@ -197,12 +214,20 @@ int iosf_mbi_unregister_pmic_bus_access_notifier(struct notifier_block *nb) · 37 unmodified lines
197214 return 0;
198215 }
199216
217+static inline int
218+iosf_mbi_unregister_pmic_bus_access_notifier_unlocked(struct notifier_block *nb)
219+{
220+ return 0;
221+}
222+
200223 static inline
201224 int iosf_mbi_call_pmic_bus_access_notifier_chain(unsigned long val, void *v)
202225 {
203226 return 0;
204227 }
205228
229+static inline void iosf_mbi_assert_punit_acquired(void) {}
230+
206231 #endif /* CONFIG_IOSF_MBI */
207232
208233 #endif /* IOSF_MBI_SYMS_H */
arch/x86/platform/intel/iosf_mbi.c+17−2
@@ -218,14 +218,23 @@ int iosf_mbi_register_pmic_bus_access_notifier(struct notifier_block *nb) · 217 unmodified lines
218218 }
219219 EXPORT_SYMBOL(iosf_mbi_register_pmic_bus_access_notifier);
220220
221+int iosf_mbi_unregister_pmic_bus_access_notifier_unlocked(
222+ struct notifier_block *nb)
223+{
224+ iosf_mbi_assert_punit_acquired();
225+
226+ return blocking_notifier_chain_unregister(
227+ &iosf_mbi_pmic_bus_access_notifier, nb);
228+}
229+EXPORT_SYMBOL(iosf_mbi_unregister_pmic_bus_access_notifier_unlocked);
230+
221231 int iosf_mbi_unregister_pmic_bus_access_notifier(struct notifier_block *nb)
222232 {
223233 int ret;
224234
225235 /* Wait for the bus to go inactive before unregistering */
226236 mutex_lock(&iosf_mbi_punit_mutex);
227− ret = blocking_notifier_chain_unregister(
228− &iosf_mbi_pmic_bus_access_notifier, nb);
237+ ret = iosf_mbi_unregister_pmic_bus_access_notifier_unlocked(nb);
229238 mutex_unlock(&iosf_mbi_punit_mutex);
230239
231240 return ret;
@@ -239,6 +248,12 @@ int iosf_mbi_call_pmic_bus_access_notifier_chain(unsigned long val, void *v) · 7 unmodified lines
239248 }
240249 EXPORT_SYMBOL(iosf_mbi_call_pmic_bus_access_notifier_chain);
241250
251+void iosf_mbi_assert_punit_acquired(void)
252+{
253+ WARN_ON(!mutex_is_locked(&iosf_mbi_punit_mutex));
254+}
255+EXPORT_SYMBOL(iosf_mbi_assert_punit_acquired);
256+
242257 #ifdef CONFIG_IOSF_MBI_DEBUG
243258 static u32 dbg_mdr;
244259 static u32 dbg_mcr;
drivers/gpu/drm/i915/Kconfig.debug+28−0
@@ -28,6 +28,7 @@ config DRM_I915_DEBUG · 27 unmodified lines
2828 select SW_SYNC # signaling validation framework (igt/syncobj*)
2929 select DRM_I915_SW_FENCE_DEBUG_OBJECTS
3030 select DRM_I915_SELFTEST
31+ select DRM_I915_TRACE_GEM
3132 default n
3233 help
3334 Choose this option to turn on extra driver debugging that may affect
@@ -49,6 +50,19 @@ config DRM_I915_DEBUG_GEM · 15 unmodified lines
4950
5051 If in doubt, say "N".
5152
53+config DRM_I915_TRACE_GEM
54+ bool "Insert extra ftrace output from the GEM internals"
55+ select TRACING
56+ default n
57+ help
58+ Enable additional and verbose debugging output that will spam
59+ ordinary tests, but may be vital for post-mortem debugging when
60+ used with /proc/sys/kernel/ftrace_dump_on_oops
61+
62+ Recommended for driver developers only.
63+
64+ If in doubt, say "N".
65+
5266 config DRM_I915_SW_FENCE_DEBUG_OBJECTS
5367 bool "Enable additional driver debugging for fence objects"
5468 depends on DRM_I915
@@ -90,6 +104,20 @@ config DRM_I915_SELFTEST · 35 unmodified lines
90104
91105 If in doubt, say "N".
92106
107+config DRM_I915_SELFTEST_BROKEN
108+ bool "Enable broken and dangerous selftests"
109+ depends on DRM_I915_SELFTEST
110+ depends on BROKEN
111+ default n
112+ help
113+ This option enables the execution of selftests that are "dangerous"
114+ and may trigger unintended HW side-effects as they break strict
115+ rules given in the HW specification. For science.
116+
117+ Recommended for masochistic driver developers only.
118+
119+ If in doubt, say "N".
120+
93121 config DRM_I915_LOW_LEVEL_TRACEPOINTS
94122 bool "Enable low level request tracing events"
95123 depends on DRM_I915
drivers/gpu/drm/i915/Makefile+26−5
@@ -3,7 +3,26 @@ · 2 unmodified lines
33 # Makefile for the drm device driver. This driver provides support for the
44 # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
55
6−subdir-ccflags-$(CONFIG_DRM_I915_WERROR) := -Werror
6+# Add a set of useful warning flags and enable -Werror for CI to prevent
7+# trivial mistakes from creeping in. We have to do this piecemeal as we reject
8+# any patch that isn't warning clean, so turning on -Wall -Wextra (or W=1) we
9+# need to filter out dubious warnings. Still it is our interest
10+# to keep running locally with W=1 C=1 until we are completely clean.
11+#
12+# Note the danger in using -Wall -Wextra is that when CI updates gcc we
13+# will most likely get a sudden build breakage... Hopefully we will fix
14+# new warnings before CI updates!
15+subdir-ccflags-y := -Wall -Wextra
16+subdir-ccflags-y += $(call cc-disable-warning, unused-parameter)
17+subdir-ccflags-y += $(call cc-disable-warning, type-limits)
18+subdir-ccflags-y += $(call cc-disable-warning, missing-field-initializers)
19+subdir-ccflags-y += $(call cc-disable-warning, implicit-fallthrough)
20+subdir-ccflags-$(CONFIG_DRM_I915_WERROR) += -Werror
21+
22+# Fine grained warnings disable
23+CFLAGS_i915_pci.o = $(call cc-disable-warning, override-init)
24+CFLAGS_intel_fbdev.o = $(call cc-disable-warning, override-init)
25+
726 subdir-ccflags-y += \
827 $(call as-instr,movntdqa (%eax)$(comma)%xmm0,-DCONFIG_AS_MOVNTDQA)
928
@@ -64,10 +83,10 @@ i915-y += intel_uc.o \ · 54 unmodified lines
6483 intel_uc_fw.o \
6584 intel_guc.o \
6685 intel_guc_ct.o \
67− intel_guc_log.o \
6886 intel_guc_fw.o \
69− intel_huc.o \
70− i915_guc_submission.o
87+ intel_guc_log.o \
88+ intel_guc_submission.o \
89+ intel_huc.o
7190
7291 # autogenerated null render state
7392 i915-y += intel_renderstate_gen6.o \
@@ -144,7 +163,9 @@ i915-y += i915_perf.o \ · 70 unmodified lines
144163 i915_oa_kblgt2.o \
145164 i915_oa_kblgt3.o \
146165 i915_oa_glk.o \
147− i915_oa_cflgt2.o
166+ i915_oa_cflgt2.o \
167+ i915_oa_cflgt3.o \
168+ i915_oa_cnl.o
148169
149170 ifeq ($(CONFIG_DRM_I915_GVT),y)
150171 i915-y += intel_gvt.o
drivers/gpu/drm/i915/gvt/Makefile+1−1
@@ -2,7 +2,7 @@ · 1 unmodified line
22 GVT_DIR := gvt
33 GVT_SOURCE := gvt.o aperture_gm.o handlers.o vgpu.o trace_points.o firmware.o \
44 interrupt.o gtt.o cfg_space.o opregion.o mmio.o display.o edid.o \
5− execlist.o scheduler.o sched_policy.o render.o cmd_parser.o
5+ execlist.o scheduler.o sched_policy.o render.o cmd_parser.o debugfs.o
66
77 ccflags-y += -I$(src) -I$(src)/$(GVT_DIR)
88 i915-y += $(addprefix $(GVT_DIR)/, $(GVT_SOURCE))
drivers/gpu/drm/i915/gvt/cfg_space.c+21−0
@@ -208,6 +208,20 @@ static int emulate_pci_command_write(struct intel_vgpu *vgpu, · 207 unmodified lines
208208 return 0;
209209 }
210210
211+static int emulate_pci_rom_bar_write(struct intel_vgpu *vgpu,
212+ unsigned int offset, void *p_data, unsigned int bytes)
213+{
214+ u32 *pval = (u32 *)(vgpu_cfg_space(vgpu) + offset);
215+ u32 new = *(u32 *)(p_data);
216+
217+ if ((new & PCI_ROM_ADDRESS_MASK) == PCI_ROM_ADDRESS_MASK)
218+ /* We don't have rom, return size of 0. */
219+ *pval = 0;
220+ else
221+ vgpu_pci_cfg_mem_write(vgpu, offset, p_data, bytes);
222+ return 0;
223+}
224+
211225 static int emulate_pci_bar_write(struct intel_vgpu *vgpu, unsigned int offset,
212226 void *p_data, unsigned int bytes)
213227 {
@@ -300,6 +314,11 @@ int intel_vgpu_emulate_cfg_write(struct intel_vgpu *vgpu, unsigned int offset, · 86 unmodified lines
300314 }
301315
302316 switch (rounddown(offset, 4)) {
317+ case PCI_ROM_ADDRESS:
318+ if (WARN_ON(!IS_ALIGNED(offset, 4)))
319+ return -EINVAL;
320+ return emulate_pci_rom_bar_write(vgpu, offset, p_data, bytes);
321+
303322 case PCI_BASE_ADDRESS_0 ... PCI_BASE_ADDRESS_5:
304323 if (WARN_ON(!IS_ALIGNED(offset, 4)))
305324 return -EINVAL;
@@ -375,6 +394,8 @@ void intel_vgpu_init_cfg_space(struct intel_vgpu *vgpu, · 69 unmodified lines
375394 pci_resource_len(gvt->dev_priv->drm.pdev, 0);
376395 vgpu->cfg_space.bar[INTEL_GVT_PCI_BAR_APERTURE].size =
377396 pci_resource_len(gvt->dev_priv->drm.pdev, 2);
397+
398+ memset(vgpu_cfg_space(vgpu) + PCI_ROM_ADDRESS, 0, 4);
378399 }
379400
380401 /**
drivers/gpu/drm/i915/gvt/cmd_parser.c+124−101
@@ -709,18 +709,13 @@ static void parser_exec_state_dump(struct parser_exec_state *s) · 708 unmodified lines
709709
710710 print_opcode(cmd_val(s, 0), s->ring_id);
711711
712− /* print the whole page to trace */
713− pr_err(" ip_va=%p: %08x %08x %08x %08x\n",
714− s->ip_va, cmd_val(s, 0), cmd_val(s, 1),
715− cmd_val(s, 2), cmd_val(s, 3));
716−
717712 s->ip_va = (u32 *)((((u64)s->ip_va) >> 12) << 12);
718713
719714 while (cnt < 1024) {
720− pr_err("ip_va=%p: ", s->ip_va);
715+ gvt_dbg_cmd("ip_va=%p: ", s->ip_va);
721716 for (i = 0; i < 8; i++)
722− pr_err("%08x ", cmd_val(s, i));
723− pr_err("\n");
717+ gvt_dbg_cmd("%08x ", cmd_val(s, i));
718+ gvt_dbg_cmd("\n");
724719
725720 s->ip_va += 8 * sizeof(u32);
726721 cnt += 8;
@@ -825,7 +820,7 @@ static int force_nonpriv_reg_handler(struct parser_exec_state *s, · 98 unmodified lines
825820 if (!intel_gvt_in_force_nonpriv_whitelist(gvt, data)) {
826821 gvt_err("Unexpected forcenonpriv 0x%x LRI write, value=0x%x\n",
827822 offset, data);
828− return -EINVAL;
823+ return -EPERM;
829824 }
830825 return 0;
831826 }
@@ -839,7 +834,7 @@ static int cmd_reg_handler(struct parser_exec_state *s, · 7 unmodified lines
839834 if (offset + 4 > gvt->device_info.mmio_size) {
840835 gvt_vgpu_err("%s access to (%x) outside of MMIO range\n",
841836 cmd, offset);
842− return -EINVAL;
837+ return -EFAULT;
843838 }
844839
845840 if (!intel_gvt_mmio_is_cmd_access(gvt, offset)) {
@@ -854,8 +849,8 @@ static int cmd_reg_handler(struct parser_exec_state *s, · 8 unmodified lines
854849 }
855850
856851 if (is_force_nonpriv_mmio(offset) &&
857− force_nonpriv_reg_handler(s, offset, index))
858− return -EINVAL;
852+ force_nonpriv_reg_handler(s, offset, index))
853+ return -EPERM;
859854
860855 if (offset == i915_mmio_reg_offset(DERRMR) ||
861856 offset == i915_mmio_reg_offset(FORCEWAKE_MT)) {
@@ -894,11 +889,14 @@ static int cmd_handler_lri(struct parser_exec_state *s) · 32 unmodified lines
894889 i915_mmio_reg_offset(DERRMR))
895890 ret |= 0;
896891 else
897− ret |= (cmd_reg_inhibit(s, i)) ? -EINVAL : 0;
892+ ret |= (cmd_reg_inhibit(s, i)) ?
893+ -EBADRQC : 0;
898894 }
899895 if (ret)
900896 break;
901897 ret |= cmd_reg_handler(s, cmd_reg(s, i), i, "lri");
898+ if (ret)
899+ break;
902900 }
903901 return ret;
904902 }
@@ -912,11 +910,15 @@ static int cmd_handler_lrr(struct parser_exec_state *s) · 7 unmodified lines
912910 if (IS_BROADWELL(s->vgpu->gvt->dev_priv))
913911 ret |= ((cmd_reg_inhibit(s, i) ||
914912 (cmd_reg_inhibit(s, i + 1)))) ?
915− -EINVAL : 0;
913+ -EBADRQC : 0;
916914 if (ret)
917915 break;
918916 ret |= cmd_reg_handler(s, cmd_reg(s, i), i, "lrr-src");
917+ if (ret)
918+ break;
919919 ret |= cmd_reg_handler(s, cmd_reg(s, i + 1), i, "lrr-dst");
920+ if (ret)
921+ break;
920922 }
921923 return ret;
922924 }
@@ -934,15 +936,19 @@ static int cmd_handler_lrm(struct parser_exec_state *s) · 11 unmodified lines
934936
935937 for (i = 1; i < cmd_len;) {
936938 if (IS_BROADWELL(gvt->dev_priv))
937− ret |= (cmd_reg_inhibit(s, i)) ? -EINVAL : 0;
939+ ret |= (cmd_reg_inhibit(s, i)) ? -EBADRQC : 0;
938940 if (ret)
939941 break;
940942 ret |= cmd_reg_handler(s, cmd_reg(s, i), i, "lrm");
943+ if (ret)
944+ break;
941945 if (cmd_val(s, 0) & (1 << 22)) {
942946 gma = cmd_gma(s, i + 1);
943947 if (gmadr_bytes == 8)
944948 gma |= (cmd_gma_hi(s, i + 2)) << 32;
945949 ret |= cmd_address_audit(s, gma, sizeof(u32), false);
950+ if (ret)
951+ break;
946952 }
947953 i += gmadr_dw_number(s) + 1;
948954 }
@@ -958,11 +964,15 @@ static int cmd_handler_srm(struct parser_exec_state *s) · 9 unmodified lines
958964
959965 for (i = 1; i < cmd_len;) {
960966 ret |= cmd_reg_handler(s, cmd_reg(s, i), i, "srm");
967+ if (ret)
968+ break;
961969 if (cmd_val(s, 0) & (1 << 22)) {
962970 gma = cmd_gma(s, i + 1);
963971 if (gmadr_bytes == 8)
964972 gma |= (cmd_gma_hi(s, i + 2)) << 32;
965973 ret |= cmd_address_audit(s, gma, sizeof(u32), false);
974+ if (ret)
975+ break;
966976 }
967977 i += gmadr_dw_number(s) + 1;
968978 }
@@ -1116,7 +1126,7 @@ static int gen8_decode_mi_display_flip(struct parser_exec_state *s, · 147 unmodified lines
11161126
11171127 v = (dword0 & GENMASK(21, 19)) >> 19;
11181128 if (WARN_ON(v >= ARRAY_SIZE(gen8_plane_code)))
1119− return -EINVAL;
1129+ return -EBADRQC;
11201130
11211131 info->pipe = gen8_plane_code[v].pipe;
11221132 info->plane = gen8_plane_code[v].plane;
@@ -1136,7 +1146,7 @@ static int gen8_decode_mi_display_flip(struct parser_exec_state *s, · 13 unmodified lines
11361146 info->surf_reg = SPRSURF(info->pipe);
11371147 } else {
11381148 WARN_ON(1);
1139− return -EINVAL;
1149+ return -EBADRQC;
11401150 }
11411151 return 0;
11421152 }
@@ -1185,7 +1195,7 @@ static int skl_decode_mi_display_flip(struct parser_exec_state *s, · 42 unmodified lines
11851195
11861196 default:
11871197 gvt_vgpu_err("unknown plane code %d\n", plane);
1188− return -EINVAL;
1198+ return -EBADRQC;
11891199 }
11901200
11911201 info->stride_val = (dword1 & GENMASK(15, 6)) >> 6;
@@ -1348,10 +1358,13 @@ static unsigned long get_gma_bb_from_cmd(struct parser_exec_state *s, int index) · 156 unmodified lines
13481358 {
13491359 unsigned long addr;
13501360 unsigned long gma_high, gma_low;
1351− int gmadr_bytes = s->vgpu->gvt->device_info.gmadr_bytes_in_cmd;
1361+ struct intel_vgpu *vgpu = s->vgpu;
1362+ int gmadr_bytes = vgpu->gvt->device_info.gmadr_bytes_in_cmd;
13521363
1353− if (WARN_ON(gmadr_bytes != 4 && gmadr_bytes != 8))
1364+ if (WARN_ON(gmadr_bytes != 4 && gmadr_bytes != 8)) {
1365+ gvt_vgpu_err("invalid gma bytes %d\n", gmadr_bytes);
13541366 return INTEL_GVT_INVALID_ADDR;
1367+ }
13551368
13561369 gma_low = cmd_val(s, index) & BATCH_BUFFER_ADDR_MASK;
13571370 if (gmadr_bytes == 4) {
@@ -1374,16 +1387,16 @@ static inline int cmd_address_audit(struct parser_exec_state *s, · 16 unmodified lines
13741387 if (op_size > max_surface_size) {
13751388 gvt_vgpu_err("command address audit fail name %s\n",
13761389 s->info->name);
1377− return -EINVAL;
1390+ return -EFAULT;
13781391 }
13791392
13801393 if (index_mode) {
1381− if (guest_gma >= GTT_PAGE_SIZE / sizeof(u64)) {
1382− ret = -EINVAL;
1394+ if (guest_gma >= I915_GTT_PAGE_SIZE / sizeof(u64)) {
1395+ ret = -EFAULT;
13831396 goto err;
13841397 }
13851398 } else if (!intel_gvt_ggtt_validate_range(vgpu, guest_gma, op_size)) {
1386− ret = -EINVAL;
1399+ ret = -EFAULT;
13871400 goto err;
13881401 }
13891402
@@ -1439,7 +1452,7 @@ static inline int unexpected_cmd(struct parser_exec_state *s) · 49 unmodified lines
14391452
14401453 gvt_vgpu_err("Unexpected %s in command buffer!\n", s->info->name);
14411454
1442− return -EINVAL;
1455+ return -EBADRQC;
14431456 }
14441457
14451458 static int cmd_handler_mi_semaphore_wait(struct parser_exec_state *s)
@@ -1545,10 +1558,10 @@ static int copy_gma_to_hva(struct intel_vgpu *vgpu, struct intel_vgpu_mm *mm, · 99 unmodified lines
15451558 return -EFAULT;
15461559 }
15471560
1548− offset = gma & (GTT_PAGE_SIZE - 1);
1561+ offset = gma & (I915_GTT_PAGE_SIZE - 1);
15491562
1550− copy_len = (end_gma - gma) >= (GTT_PAGE_SIZE - offset) ?
1551− GTT_PAGE_SIZE - offset : end_gma - gma;
1563+ copy_len = (end_gma - gma) >= (I915_GTT_PAGE_SIZE - offset) ?
1564+ I915_GTT_PAGE_SIZE - offset : end_gma - gma;
15521565
15531566 intel_gvt_hypervisor_read_gpa(vgpu, gpa, va + len, copy_len);
15541567
@@ -1576,110 +1589,113 @@ static int batch_buffer_needs_scan(struct parser_exec_state *s) · 21 unmodified lines
15761589 return 1;
15771590 }
15781591
1579−static int find_bb_size(struct parser_exec_state *s)
1592+static int find_bb_size(struct parser_exec_state *s, unsigned long *bb_size)
15801593 {
15811594 unsigned long gma = 0;
15821595 struct cmd_info *info;
1583− int bb_size = 0;
15841596 uint32_t cmd_len = 0;
1585− bool met_bb_end = false;
1597+ bool bb_end = false;
15861598 struct intel_vgpu *vgpu = s->vgpu;
15871599 u32 cmd;
15881600
1601+ *bb_size = 0;
1602+
15891603 /* get the start gm address of the batch buffer */
15901604 gma = get_gma_bb_from_cmd(s, 1);
1591− cmd = cmd_val(s, 0);
1605+ if (gma == INTEL_GVT_INVALID_ADDR)
1606+ return -EFAULT;
15921607
1608+ cmd = cmd_val(s, 0);
15931609 info = get_cmd_info(s->vgpu->gvt, cmd, s->ring_id);
15941610 if (info == NULL) {
15951611 gvt_vgpu_err("unknown cmd 0x%x, opcode=0x%x\n",
15961612 cmd, get_opcode(cmd, s->ring_id));
1597− return -EINVAL;
1613+ return -EBADRQC;
15981614 }
15991615 do {
1600− copy_gma_to_hva(s->vgpu, s->vgpu->gtt.ggtt_mm,
1601− gma, gma + 4, &cmd);
1616+ if (copy_gma_to_hva(s->vgpu, s->vgpu->gtt.ggtt_mm,
1617+ gma, gma + 4, &cmd) < 0)
1618+ return -EFAULT;
16021619 info = get_cmd_info(s->vgpu->gvt, cmd, s->ring_id);
16031620 if (info == NULL) {
16041621 gvt_vgpu_err("unknown cmd 0x%x, opcode=0x%x\n",
16051622 cmd, get_opcode(cmd, s->ring_id));
1606− return -EINVAL;
1623+ return -EBADRQC;
16071624 }
16081625
16091626 if (info->opcode == OP_MI_BATCH_BUFFER_END) {
1610− met_bb_end = true;
1627+ bb_end = true;
16111628 } else if (info->opcode == OP_MI_BATCH_BUFFER_START) {
1612− if (BATCH_BUFFER_2ND_LEVEL_BIT(cmd) == 0) {
1629+ if (BATCH_BUFFER_2ND_LEVEL_BIT(cmd) == 0)
16131630 /* chained batch buffer */
1614− met_bb_end = true;
1615− }
1631+ bb_end = true;
16161632 }
16171633 cmd_len = get_cmd_length(info, cmd) << 2;
1618− bb_size += cmd_len;
1634+ *bb_size += cmd_len;
16191635 gma += cmd_len;
1636+ } while (!bb_end);
16201637
1621− } while (!met_bb_end);
1622−
1623− return bb_size;
1638+ return 0;
16241639 }
16251640
16261641 static int perform_bb_shadow(struct parser_exec_state *s)
16271642 {
1628− struct intel_shadow_bb_entry *entry_obj;
16291643 struct intel_vgpu *vgpu = s->vgpu;
1644+ struct intel_vgpu_shadow_bb *bb;
16301645 unsigned long gma = 0;
1631− int bb_size;
1632− void *dst = NULL;
1646+ unsigned long bb_size;
16331647 int ret = 0;
16341648
16351649 /* get the start gm address of the batch buffer */
16361650 gma = get_gma_bb_from_cmd(s, 1);
1651+ if (gma == INTEL_GVT_INVALID_ADDR)
1652+ return -EFAULT;
16371653
1638− /* get the size of the batch buffer */
1639− bb_size = find_bb_size(s);
1640− if (bb_size < 0)
1641− return -EINVAL;
1654+ ret = find_bb_size(s, &bb_size);
1655+ if (ret)
1656+ return ret;
16421657
1643− /* allocate shadow batch buffer */
1644− entry_obj = kmalloc(sizeof(*entry_obj), GFP_KERNEL);
1645− if (entry_obj == NULL)
1658+ bb = kzalloc(sizeof(*bb), GFP_KERNEL);
1659+ if (!bb)
16461660 return -ENOMEM;
16471661
1648− entry_obj->obj =
1649− i915_gem_object_create(s->vgpu->gvt->dev_priv,
1650− roundup(bb_size, PAGE_SIZE));
1651− if (IS_ERR(entry_obj->obj)) {
1652− ret = PTR_ERR(entry_obj->obj);
1653− goto free_entry;
1662+ bb->obj = i915_gem_object_create(s->vgpu->gvt->dev_priv,
1663+ roundup(bb_size, PAGE_SIZE));
1664+ if (IS_ERR(bb->obj)) {
1665+ ret = PTR_ERR(bb->obj);
1666+ goto err_free_bb;
16541667 }
1655− entry_obj->len = bb_size;
1656− INIT_LIST_HEAD(&entry_obj->list);
16571668
1658− dst = i915_gem_object_pin_map(entry_obj->obj, I915_MAP_WB);
1659− if (IS_ERR(dst)) {
1660− ret = PTR_ERR(dst);
1661− goto put_obj;
1662− }
1669+ ret = i915_gem_obj_prepare_shmem_write(bb->obj, &bb->clflush);
1670+ if (ret)
1671+ goto err_free_obj;
16631672
1664− ret = i915_gem_object_set_to_cpu_domain(entry_obj->obj, false);
1665− if (ret) {
1666− gvt_vgpu_err("failed to set shadow batch to CPU\n");
1667− goto unmap_src;
1673+ bb->va = i915_gem_object_pin_map(bb->obj, I915_MAP_WB);
1674+ if (IS_ERR(bb->va)) {
1675+ ret = PTR_ERR(bb->va);
1676+ goto err_finish_shmem_access;
16681677 }
16691678
1670− entry_obj->va = dst;
1671− entry_obj->bb_start_cmd_va = s->ip_va;
1679+ if (bb->clflush & CLFLUSH_BEFORE) {
1680+ drm_clflush_virt_range(bb->va, bb->obj->base.size);
1681+ bb->clflush &= ~CLFLUSH_BEFORE;
1682+ }
16721683
1673− /* copy batch buffer to shadow batch buffer*/
16741684 ret = copy_gma_to_hva(s->vgpu, s->vgpu->gtt.ggtt_mm,
16751685 gma, gma + bb_size,
1676− dst);
1686+ bb->va);
16771687 if (ret < 0) {
16781688 gvt_vgpu_err("fail to copy guest ring buffer\n");
1679− goto unmap_src;
1689+ ret = -EFAULT;
1690+ goto err_unmap;
16801691 }
16811692
1682− list_add(&entry_obj->list, &s->workload->shadow_bb);
1693+ INIT_LIST_HEAD(&bb->list);
1694+ list_add(&bb->list, &s->workload->shadow_bb);
1695+
1696+ bb->accessing = true;
1697+ bb->bb_start_cmd_va = s->ip_va;
1698+
16831699 /*
16841700 * ip_va saves the virtual address of the shadow batch buffer, while
16851701 * ip_gma saves the graphics address of the original batch buffer.
@@ -1688,17 +1704,17 @@ static int perform_bb_shadow(struct parser_exec_state *s) · 2 unmodified lines
16881704 * buffer's gma in pair. After all, we don't want to pin the shadow
16891705 * buffer here (too early).
16901706 */
1691− s->ip_va = dst;
1707+ s->ip_va = bb->va;
16921708 s->ip_gma = gma;
1693−
16941709 return 0;
1695−
1696−unmap_src:
1697− i915_gem_object_unpin_map(entry_obj->obj);
1698−put_obj:
1699− i915_gem_object_put(entry_obj->obj);
1700−free_entry:
1701− kfree(entry_obj);
1710+err_unmap:
1711+ i915_gem_object_unpin_map(bb->obj);
1712+err_finish_shmem_access:
1713+ i915_gem_obj_finish_shmem_access(bb->obj);
1714+err_free_obj:
1715+ i915_gem_object_put(bb->obj);
1716+err_free_bb:
1717+ kfree(bb);
17021718 return ret;
17031719 }
17041720
@@ -1710,13 +1726,13 @@ static int cmd_handler_mi_batch_buffer_start(struct parser_exec_state *s) · 5 unmodified lines
17101726
17111727 if (s->buf_type == BATCH_BUFFER_2ND_LEVEL) {
17121728 gvt_vgpu_err("Found MI_BATCH_BUFFER_START in 2nd level BB\n");
1713− return -EINVAL;
1729+ return -EFAULT;
17141730 }
17151731
17161732 second_level = BATCH_BUFFER_2ND_LEVEL_BIT(cmd_val(s, 0)) == 1;
17171733 if (second_level && (s->buf_type != BATCH_BUFFER_INSTRUCTION)) {
17181734 gvt_vgpu_err("Jumping to 2nd level BB from RB is not allowed\n");
1719− return -EINVAL;
1735+ return -EFAULT;
17201736 }
17211737
17221738 s->saved_buf_addr_type = s->buf_addr_type;
@@ -1740,7 +1756,6 @@ static int cmd_handler_mi_batch_buffer_start(struct parser_exec_state *s) · 17 unmodified lines
17401756 if (ret < 0)
17411757 return ret;
17421758 }
1743−
17441759 return ret;
17451760 }
17461761
@@ -2430,7 +2445,7 @@ static int cmd_parser_exec(struct parser_exec_state *s) · 683 unmodified lines
24302445 if (info == NULL) {
24312446 gvt_vgpu_err("unknown cmd 0x%x, opcode=0x%x\n",
24322447 cmd, get_opcode(cmd, s->ring_id));
2433− return -EINVAL;
2448+ return -EBADRQC;
24342449 }
24352450
24362451 s->info = info;
@@ -2465,6 +2480,10 @@ static inline bool gma_out_of_range(unsigned long gma, · 28 unmodified lines
24652480 return (gma > gma_tail) && (gma < gma_head);
24662481 }
24672482
2483+/* Keep the consistent return type, e.g EBADRQC for unknown
2484+ * cmd, EFAULT for invalid address, EPERM for nonpriv. later
2485+ * works as the input of VM healthy status.
2486+ */
24682487 static int command_scan(struct parser_exec_state *s,
24692488 unsigned long rb_head, unsigned long rb_tail,
24702489 unsigned long rb_start, unsigned long rb_len)
@@ -2487,7 +2506,7 @@ static int command_scan(struct parser_exec_state *s, · 16 unmodified lines
24872506 s->ip_gma, rb_start,
24882507 gma_bottom);
24892508 parser_exec_state_dump(s);
2490− return -EINVAL;
2509+ return -EFAULT;
24912510 }
24922511 if (gma_out_of_range(s->ip_gma, gma_head, gma_tail)) {
24932512 gvt_vgpu_err("ip_gma %lx out of range."
@@ -2516,7 +2535,7 @@ static int scan_workload(struct intel_vgpu_workload *workload) · 22 unmodified lines
25162535 int ret = 0;
25172536
25182537 /* ring base is page aligned */
2519− if (WARN_ON(!IS_ALIGNED(workload->rb_start, GTT_PAGE_SIZE)))
2538+ if (WARN_ON(!IS_ALIGNED(workload->rb_start, I915_GTT_PAGE_SIZE)))
25202539 return -EINVAL;
25212540
25222541 gma_head = workload->rb_start + workload->rb_head;
@@ -2565,7 +2584,8 @@ static int scan_wa_ctx(struct intel_shadow_wa_ctx *wa_ctx) · 42 unmodified lines
25652584 wa_ctx);
25662585
25672586 /* ring base is page aligned */
2568− if (WARN_ON(!IS_ALIGNED(wa_ctx->indirect_ctx.guest_gma, GTT_PAGE_SIZE)))
2587+ if (WARN_ON(!IS_ALIGNED(wa_ctx->indirect_ctx.guest_gma,
2588+ I915_GTT_PAGE_SIZE)))
25692589 return -EINVAL;
25702590
25712591 ring_tail = wa_ctx->indirect_ctx.size + 3 * sizeof(uint32_t);
@@ -2604,6 +2624,7 @@ out: · 32 unmodified lines
26042624 static int shadow_workload_ring_buffer(struct intel_vgpu_workload *workload)
26052625 {
26062626 struct intel_vgpu *vgpu = workload->vgpu;
2627+ struct intel_vgpu_submission *s = &vgpu->submission;
26072628 unsigned long gma_head, gma_tail, gma_top, guest_rb_size;
26082629 void *shadow_ring_buffer_va;
26092630 int ring_id = workload->ring_id;
@@ -2619,19 +2640,21 @@ static int shadow_workload_ring_buffer(struct intel_vgpu_workload *workload) · 9 unmodified lines
26192640 gma_tail = workload->rb_start + workload->rb_tail;
26202641 gma_top = workload->rb_start + guest_rb_size;
26212642
2622− if (workload->rb_len > vgpu->reserve_ring_buffer_size[ring_id]) {
2623− void *va = vgpu->reserve_ring_buffer_va[ring_id];
2643+ if (workload->rb_len > s->ring_scan_buffer_size[ring_id]) {
2644+ void *p;
2645+
26242646 /* realloc the new ring buffer if needed */
2625− vgpu->reserve_ring_buffer_va[ring_id] =
2626− krealloc(va, workload->rb_len, GFP_KERNEL);
2627− if (!vgpu->reserve_ring_buffer_va[ring_id]) {
2628− gvt_vgpu_err("fail to alloc reserve ring buffer\n");
2647+ p = krealloc(s->ring_scan_buffer[ring_id], workload->rb_len,
2648+ GFP_KERNEL);
2649+ if (!p) {
2650+ gvt_vgpu_err("fail to re-alloc ring scan buffer\n");
26292651 return -ENOMEM;
26302652 }
2631− vgpu->reserve_ring_buffer_size[ring_id] = workload->rb_len;
2653+ s->ring_scan_buffer[ring_id] = p;
2654+ s->ring_scan_buffer_size[ring_id] = workload->rb_len;
26322655 }
26332656
2634− shadow_ring_buffer_va = vgpu->reserve_ring_buffer_va[ring_id];
2657+ shadow_ring_buffer_va = s->ring_scan_buffer[ring_id];
26352658
26362659 /* get shadow ring buffer va */
26372660 workload->shadow_ring_buffer_va = shadow_ring_buffer_va;
drivers/gpu/drm/i915/gvt/debug.h+12−12
@@ -25,41 +25,41 @@ · 24 unmodified lines
2525 #define __GVT_DEBUG_H__
2626
2727 #define gvt_err(fmt, args...) \
28− DRM_ERROR("gvt: "fmt, ##args)
28+ pr_err("gvt: "fmt, ##args)
2929
3030 #define gvt_vgpu_err(fmt, args...) \
3131 do { \
3232 if (IS_ERR_OR_NULL(vgpu)) \
33− DRM_DEBUG_DRIVER("gvt: "fmt, ##args); \
33+ pr_err("gvt: "fmt, ##args); \
3434 else \
35− DRM_DEBUG_DRIVER("gvt: vgpu %d: "fmt, vgpu->id, ##args);\
35+ pr_err("gvt: vgpu %d: "fmt, vgpu->id, ##args);\
3636 } while (0)
3737
3838 #define gvt_dbg_core(fmt, args...) \
39− DRM_DEBUG_DRIVER("gvt: core: "fmt, ##args)
39+ pr_debug("gvt: core: "fmt, ##args)
4040
4141 #define gvt_dbg_irq(fmt, args...) \
42− DRM_DEBUG_DRIVER("gvt: irq: "fmt, ##args)
42+ pr_debug("gvt: irq: "fmt, ##args)
4343
4444 #define gvt_dbg_mm(fmt, args...) \
45− DRM_DEBUG_DRIVER("gvt: mm: "fmt, ##args)
45+ pr_debug("gvt: mm: "fmt, ##args)
4646
4747 #define gvt_dbg_mmio(fmt, args...) \
48− DRM_DEBUG_DRIVER("gvt: mmio: "fmt, ##args)
48+ pr_debug("gvt: mmio: "fmt, ##args)
4949
5050 #define gvt_dbg_dpy(fmt, args...) \
51− DRM_DEBUG_DRIVER("gvt: dpy: "fmt, ##args)
51+ pr_debug("gvt: dpy: "fmt, ##args)
5252
5353 #define gvt_dbg_el(fmt, args...) \
54− DRM_DEBUG_DRIVER("gvt: el: "fmt, ##args)
54+ pr_debug("gvt: el: "fmt, ##args)
5555
5656 #define gvt_dbg_sched(fmt, args...) \
57− DRM_DEBUG_DRIVER("gvt: sched: "fmt, ##args)
57+ pr_debug("gvt: sched: "fmt, ##args)
5858
5959 #define gvt_dbg_render(fmt, args...) \
60− DRM_DEBUG_DRIVER("gvt: render: "fmt, ##args)
60+ pr_debug("gvt: render: "fmt, ##args)
6161
6262 #define gvt_dbg_cmd(fmt, args...) \
63− DRM_DEBUG_DRIVER("gvt: cmd: "fmt, ##args)
63+ pr_debug("gvt: cmd: "fmt, ##args)
6464
6565 #endif
drivers/gpu/drm/i915/gvt/debugfs.c+212−0
@@ -0,0 +1,212 @@
1+/*
2+ * Copyright(c) 2011-2017 Intel Corporation. All rights reserved.
3+ *
4+ * Permission is hereby granted, free of charge, to any person obtaining a
5+ * copy of this software and associated documentation files (the "Software"),
6+ * to deal in the Software without restriction, including without limitation
7+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8+ * and/or sell copies of the Software, and to permit persons to whom the
9+ * Software is furnished to do so, subject to the following conditions:
10+ *
11+ * The above copyright notice and this permission notice (including the next
12+ * paragraph) shall be included in all copies or substantial portions of the
13+ * Software.
14+ *
15+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+ * SOFTWARE.
22+ */
23+#include <linux/debugfs.h>
24+#include <linux/list_sort.h>
25+#include "i915_drv.h"
26+#include "gvt.h"
27+
28+struct mmio_diff_param {
29+ struct intel_vgpu *vgpu;
30+ int total;
31+ int diff;
32+ struct list_head diff_mmio_list;
33+};
34+
35+struct diff_mmio {
36+ struct list_head node;
37+ u32 offset;
38+ u32 preg;
39+ u32 vreg;
40+};
41+
42+/* Compare two diff_mmio items. */
43+static int mmio_offset_compare(void *priv,
44+ struct list_head *a, struct list_head *b)
45+{
46+ struct diff_mmio *ma;
47+ struct diff_mmio *mb;
48+
49+ ma = container_of(a, struct diff_mmio, node);
50+ mb = container_of(b, struct diff_mmio, node);
51+ if (ma->offset < mb->offset)
52+ return -1;
53+ else if (ma->offset > mb->offset)
54+ return 1;
55+ return 0;
56+}
57+
58+static inline int mmio_diff_handler(struct intel_gvt *gvt,
59+ u32 offset, void *data)
60+{
61+ struct drm_i915_private *dev_priv = gvt->dev_priv;
62+ struct mmio_diff_param *param = data;
63+ struct diff_mmio *node;
64+ u32 preg, vreg;
65+
66+ preg = I915_READ_NOTRACE(_MMIO(offset));
67+ vreg = vgpu_vreg(param->vgpu, offset);
68+
69+ if (preg != vreg) {
70+ node = kmalloc(sizeof(*node), GFP_KERNEL);
71+ if (!node)
72+ return -ENOMEM;
73+
74+ node->offset = offset;
75+ node->preg = preg;
76+ node->vreg = vreg;
77+ list_add(&node->node, &param->diff_mmio_list);
78+ param->diff++;
79+ }
80+ param->total++;
81+ return 0;
82+}
83+
84+/* Show the all the different values of tracked mmio. */
85+static int vgpu_mmio_diff_show(struct seq_file *s, void *unused)
86+{
87+ struct intel_vgpu *vgpu = s->private;
88+ struct intel_gvt *gvt = vgpu->gvt;
89+ struct mmio_diff_param param = {
90+ .vgpu = vgpu,
91+ .total = 0,
92+ .diff = 0,
93+ };
94+ struct diff_mmio *node, *next;
95+
96+ INIT_LIST_HEAD(&param.diff_mmio_list);
97+
98+ mutex_lock(&gvt->lock);
99+ spin_lock_bh(&gvt->scheduler.mmio_context_lock);
100+
101+ mmio_hw_access_pre(gvt->dev_priv);
102+ /* Recognize all the diff mmios to list. */
103+ intel_gvt_for_each_tracked_mmio(gvt, mmio_diff_handler, &param);
104+ mmio_hw_access_post(gvt->dev_priv);
105+
106+ spin_unlock_bh(&gvt->scheduler.mmio_context_lock);
107+ mutex_unlock(&gvt->lock);
108+
109+ /* In an ascending order by mmio offset. */
110+ list_sort(NULL, &param.diff_mmio_list, mmio_offset_compare);
111+
112+ seq_printf(s, "%-8s %-8s %-8s %-8s\n", "Offset", "HW", "vGPU", "Diff");
113+ list_for_each_entry_safe(node, next, &param.diff_mmio_list, node) {
114+ u32 diff = node->preg ^ node->vreg;
115+
116+ seq_printf(s, "%08x %08x %08x %*pbl\n",
117+ node->offset, node->preg, node->vreg,
118+ 32, &diff);
119+ list_del(&node->node);
120+ kfree(node);
121+ }
122+ seq_printf(s, "Total: %d, Diff: %d\n", param.total, param.diff);
123+ return 0;
124+}
125+
126+static int vgpu_mmio_diff_open(struct inode *inode, struct file *file)
127+{
128+ return single_open(file, vgpu_mmio_diff_show, inode->i_private);
129+}
130+
131+static const struct file_operations vgpu_mmio_diff_fops = {
132+ .open = vgpu_mmio_diff_open,
133+ .read = seq_read,
134+ .llseek = seq_lseek,
135+ .release = single_release,
136+};
137+
138+/**
139+ * intel_gvt_debugfs_add_vgpu - register debugfs entries for a vGPU
140+ * @vgpu: a vGPU
141+ *
142+ * Returns:
143+ * Zero on success, negative error code if failed.
144+ */
145+int intel_gvt_debugfs_add_vgpu(struct intel_vgpu *vgpu)
146+{
147+ struct dentry *ent;
148+ char name[10] = "";
149+
150+ sprintf(name, "vgpu%d", vgpu->id);
151+ vgpu->debugfs = debugfs_create_dir(name, vgpu->gvt->debugfs_root);
152+ if (!vgpu->debugfs)
153+ return -ENOMEM;
154+
155+ ent = debugfs_create_bool("active", 0444, vgpu->debugfs,
156+ &vgpu->active);
157+ if (!ent)
158+ return -ENOMEM;
159+
160+ ent = debugfs_create_file("mmio_diff", 0444, vgpu->debugfs,
161+ vgpu, &vgpu_mmio_diff_fops);
162+ if (!ent)
163+ return -ENOMEM;
164+
165+ return 0;
166+}
167+
168+/**
169+ * intel_gvt_debugfs_remove_vgpu - remove debugfs entries of a vGPU
170+ * @vgpu: a vGPU
171+ */
172+void intel_gvt_debugfs_remove_vgpu(struct intel_vgpu *vgpu)
173+{
174+ debugfs_remove_recursive(vgpu->debugfs);
175+ vgpu->debugfs = NULL;
176+}
177+
178+/**
179+ * intel_gvt_debugfs_init - register gvt debugfs root entry
180+ * @gvt: GVT device
181+ *
182+ * Returns:
183+ * zero on success, negative if failed.
184+ */
185+int intel_gvt_debugfs_init(struct intel_gvt *gvt)
186+{
187+ struct drm_minor *minor = gvt->dev_priv->drm.primary;
188+ struct dentry *ent;
189+
190+ gvt->debugfs_root = debugfs_create_dir("gvt", minor->debugfs_root);
191+ if (!gvt->debugfs_root) {
192+ gvt_err("Cannot create debugfs dir\n");
193+ return -ENOMEM;
194+ }
195+
196+ ent = debugfs_create_ulong("num_tracked_mmio", 0444, gvt->debugfs_root,
197+ &gvt->mmio.num_tracked_mmio);
198+ if (!ent)
199+ return -ENOMEM;
200+
201+ return 0;
202+}
203+
204+/**
205+ * intel_gvt_debugfs_clean - remove debugfs entries
206+ * @gvt: GVT device
207+ */
208+void intel_gvt_debugfs_clean(struct intel_gvt *gvt)
209+{
210+ debugfs_remove_recursive(gvt->debugfs_root);
211+ gvt->debugfs_root = NULL;
212+}
drivers/gpu/drm/i915/gvt/execlist.c+68−428
@@ -46,8 +46,6 @@ · 45 unmodified lines
4646 #define same_context(a, b) (((a)->context_id == (b)->context_id) && \
4747 ((a)->lrca == (b)->lrca))
4848
49−static void clean_workloads(struct intel_vgpu *vgpu, unsigned long engine_mask);
50−
5149 static int context_switch_events[] = {
5250 [RCS] = RCS_AS_CONTEXT_SWITCH,
5351 [BCS] = BCS_AS_CONTEXT_SWITCH,
@@ -135,6 +133,8 @@ static void emulate_csb_update(struct intel_vgpu_execlist *execlist, · 81 unmodified lines
135133 struct execlist_context_status_pointer_format ctx_status_ptr;
136134 u32 write_pointer;
137135 u32 ctx_status_ptr_reg, ctx_status_buf_reg, offset;
136+ unsigned long hwsp_gpa;
137+ struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
138138
139139 ctx_status_ptr_reg = execlist_ring_mmio(vgpu->gvt, ring_id,
140140 _EL_OFFSET_STATUS_PTR);
@@ -160,6 +160,20 @@ static void emulate_csb_update(struct intel_vgpu_execlist *execlist, · 19 unmodified lines
160160 ctx_status_ptr.write_ptr = write_pointer;
161161 vgpu_vreg(vgpu, ctx_status_ptr_reg) = ctx_status_ptr.dw;
162162
163+ /* Update the CSB and CSB write pointer in HWSP */
164+ hwsp_gpa = intel_vgpu_gma_to_gpa(vgpu->gtt.ggtt_mm,
165+ vgpu->hws_pga[ring_id]);
166+ if (hwsp_gpa != INTEL_GVT_INVALID_ADDR) {
167+ intel_gvt_hypervisor_write_gpa(vgpu,
168+ hwsp_gpa + I915_HWS_CSB_BUF0_INDEX * 4 +
169+ write_pointer * 8,
170+ status, 8);
171+ intel_gvt_hypervisor_write_gpa(vgpu,
172+ hwsp_gpa +
173+ intel_hws_csb_write_index(dev_priv) * 4,
174+ &write_pointer, 4);
175+ }
176+
163177 gvt_dbg_el("vgpu%d: w pointer %u reg %x csb l %x csb h %x\n",
164178 vgpu->id, write_pointer, offset, status->ldw, status->udw);
165179
@@ -358,218 +372,47 @@ static int emulate_execlist_schedule_in(struct intel_vgpu_execlist *execlist, · 192 unmodified lines
358372 return 0;
359373 }
360374
361−static void free_workload(struct intel_vgpu_workload *workload)
362−{
363− intel_vgpu_unpin_mm(workload->shadow_mm);
364− intel_gvt_mm_unreference(workload->shadow_mm);
365− kmem_cache_free(workload->vgpu->workloads, workload);
366−}
367−
368375 #define get_desc_from_elsp_dwords(ed, i) \
369376 ((struct execlist_ctx_descriptor_format *)&((ed)->data[i * 2]))
370377
371−static int prepare_shadow_batch_buffer(struct intel_vgpu_workload *workload)
372−{
373− const int gmadr_bytes = workload->vgpu->gvt->device_info.gmadr_bytes_in_cmd;
374− struct intel_shadow_bb_entry *entry_obj;
375−
376− /* pin the gem object to ggtt */
377− list_for_each_entry(entry_obj, &workload->shadow_bb, list) {
378− struct i915_vma *vma;
379−
380− vma = i915_gem_object_ggtt_pin(entry_obj->obj, NULL, 0, 4, 0);
381− if (IS_ERR(vma)) {
382− return PTR_ERR(vma);
383− }
384−
385− /* FIXME: we are not tracking our pinned VMA leaving it
386− * up to the core to fix up the stray pin_count upon
387− * free.
388− */
389−
390− /* update the relocate gma with shadow batch buffer*/
391− entry_obj->bb_start_cmd_va[1] = i915_ggtt_offset(vma);
392− if (gmadr_bytes == 8)
393− entry_obj->bb_start_cmd_va[2] = 0;
394− }
395− return 0;
396−}
397−
398−static int update_wa_ctx_2_shadow_ctx(struct intel_shadow_wa_ctx *wa_ctx)
399−{
400− struct intel_vgpu_workload *workload = container_of(wa_ctx,
401− struct intel_vgpu_workload,
402− wa_ctx);
403− int ring_id = workload->ring_id;
404− struct i915_gem_context *shadow_ctx = workload->vgpu->shadow_ctx;
405− struct drm_i915_gem_object *ctx_obj =
406− shadow_ctx->engine[ring_id].state->obj;
407− struct execlist_ring_context *shadow_ring_context;
408− struct page *page;
409−
410− page = i915_gem_object_get_page(ctx_obj, LRC_STATE_PN);
411− shadow_ring_context = kmap_atomic(page);
412−
413− shadow_ring_context->bb_per_ctx_ptr.val =
414− (shadow_ring_context->bb_per_ctx_ptr.val &
415− (~PER_CTX_ADDR_MASK)) | wa_ctx->per_ctx.shadow_gma;
416− shadow_ring_context->rcs_indirect_ctx.val =
417− (shadow_ring_context->rcs_indirect_ctx.val &
418− (~INDIRECT_CTX_ADDR_MASK)) | wa_ctx->indirect_ctx.shadow_gma;
419−
420− kunmap_atomic(shadow_ring_context);
421− return 0;
422−}
423−
424−static int prepare_shadow_wa_ctx(struct intel_shadow_wa_ctx *wa_ctx)
425−{
426− struct i915_vma *vma;
427− unsigned char *per_ctx_va =
428− (unsigned char *)wa_ctx->indirect_ctx.shadow_va +
429− wa_ctx->indirect_ctx.size;
430−
431− if (wa_ctx->indirect_ctx.size == 0)
432− return 0;
433−
434− vma = i915_gem_object_ggtt_pin(wa_ctx->indirect_ctx.obj, NULL,
435− 0, CACHELINE_BYTES, 0);
436− if (IS_ERR(vma)) {
437− return PTR_ERR(vma);
438− }
439−
440− /* FIXME: we are not tracking our pinned VMA leaving it
441− * up to the core to fix up the stray pin_count upon
442− * free.
443− */
444−
445− wa_ctx->indirect_ctx.shadow_gma = i915_ggtt_offset(vma);
446−
447− wa_ctx->per_ctx.shadow_gma = *((unsigned int *)per_ctx_va + 1);
448− memset(per_ctx_va, 0, CACHELINE_BYTES);
449−
450− update_wa_ctx_2_shadow_ctx(wa_ctx);
451− return 0;
452−}
453−
454−static void release_shadow_batch_buffer(struct intel_vgpu_workload *workload)
455−{
456− /* release all the shadow batch buffer */
457− if (!list_empty(&workload->shadow_bb)) {
458− struct intel_shadow_bb_entry *entry_obj =
459− list_first_entry(&workload->shadow_bb,
460− struct intel_shadow_bb_entry,
461− list);
462− struct intel_shadow_bb_entry *temp;
463−
464− list_for_each_entry_safe(entry_obj, temp, &workload->shadow_bb,
465− list) {
466− i915_gem_object_unpin_map(entry_obj->obj);
467− i915_gem_object_put(entry_obj->obj);
468− list_del(&entry_obj->list);
469− kfree(entry_obj);
470− }
471− }
472−}
473−
474378 static int prepare_execlist_workload(struct intel_vgpu_workload *workload)
475379 {
476380 struct intel_vgpu *vgpu = workload->vgpu;
381+ struct intel_vgpu_submission *s = &vgpu->submission;
477382 struct execlist_ctx_descriptor_format ctx[2];
478383 int ring_id = workload->ring_id;
479384 int ret;
480385
481− ret = intel_vgpu_pin_mm(workload->shadow_mm);
482− if (ret) {
483− gvt_vgpu_err("fail to vgpu pin mm\n");
484− goto out;
485− }
486−
487− ret = intel_vgpu_sync_oos_pages(workload->vgpu);
488− if (ret) {
489− gvt_vgpu_err("fail to vgpu sync oos pages\n");
490− goto err_unpin_mm;
491− }
492−
493− ret = intel_vgpu_flush_post_shadow(workload->vgpu);
494− if (ret) {
495− gvt_vgpu_err("fail to flush post shadow\n");
496− goto err_unpin_mm;
497− }
498−
499− ret = intel_gvt_generate_request(workload);
500− if (ret) {
501− gvt_vgpu_err("fail to generate request\n");
502− goto err_unpin_mm;
503− }
504−
505− ret = prepare_shadow_batch_buffer(workload);
506− if (ret) {
507− gvt_vgpu_err("fail to prepare_shadow_batch_buffer\n");
508− goto err_unpin_mm;
509− }
510−
511− ret = prepare_shadow_wa_ctx(&workload->wa_ctx);
512− if (ret) {
513− gvt_vgpu_err("fail to prepare_shadow_wa_ctx\n");
514− goto err_shadow_batch;
515− }
516−
517386 if (!workload->emulate_schedule_in)
518387 return 0;
519388
520− ctx[0] = *get_desc_from_elsp_dwords(&workload->elsp_dwords, 1);
521− ctx[1] = *get_desc_from_elsp_dwords(&workload->elsp_dwords, 0);
389+ ctx[0] = *get_desc_from_elsp_dwords(&workload->elsp_dwords, 0);
390+ ctx[1] = *get_desc_from_elsp_dwords(&workload->elsp_dwords, 1);
522391
523− ret = emulate_execlist_schedule_in(&vgpu->execlist[ring_id], ctx);
524− if (!ret)
525− goto out;
526− else
392+ ret = emulate_execlist_schedule_in(&s->execlist[ring_id], ctx);
393+ if (ret) {
527394 gvt_vgpu_err("fail to emulate execlist schedule in\n");
528−
529− release_shadow_wa_ctx(&workload->wa_ctx);
530−err_shadow_batch:
531− release_shadow_batch_buffer(workload);
532−err_unpin_mm:
533− intel_vgpu_unpin_mm(workload->shadow_mm);
534−out:
535− return ret;
395+ return ret;
396+ }
397+ return 0;
536398 }
537399
538400 static int complete_execlist_workload(struct intel_vgpu_workload *workload)
539401 {
540402 struct intel_vgpu *vgpu = workload->vgpu;
541403 int ring_id = workload->ring_id;
542− struct intel_vgpu_execlist *execlist = &vgpu->execlist[ring_id];
404+ struct intel_vgpu_submission *s = &vgpu->submission;
405+ struct intel_vgpu_execlist *execlist = &s->execlist[ring_id];
543406 struct intel_vgpu_workload *next_workload;
544407 struct list_head *next = workload_q_head(vgpu, ring_id)->next;
545408 bool lite_restore = false;
546− int ret;
409+ int ret = 0;
547410
548411 gvt_dbg_el("complete workload %p status %d\n", workload,
549412 workload->status);
550413
551− if (!workload->status) {
552− release_shadow_batch_buffer(workload);
553− release_shadow_wa_ctx(&workload->wa_ctx);
554− }
555−
556− if (workload->status || (vgpu->resetting_eng & ENGINE_MASK(ring_id))) {
557− /* if workload->status is not successful means HW GPU
558− * has occurred GPU hang or something wrong with i915/GVT,
559− * and GVT won't inject context switch interrupt to guest.
560− * So this error is a vGPU hang actually to the guest.
561− * According to this we should emunlate a vGPU hang. If
562− * there are pending workloads which are already submitted
563− * from guest, we should clean them up like HW GPU does.
564− *
565− * if it is in middle of engine resetting, the pending
566− * workloads won't be submitted to HW GPU and will be
567− * cleaned up during the resetting process later, so doing
568− * the workload clean up here doesn't have any impact.
569− **/
570− clean_workloads(vgpu, ENGINE_MASK(ring_id));
414+ if (workload->status || (vgpu->resetting_eng & ENGINE_MASK(ring_id)))
571415 goto out;
572− }
573416
574417 if (!list_empty(workload_q_head(vgpu, ring_id))) {
575418 struct execlist_ctx_descriptor_format *this_desc, *next_desc;
@@ -584,213 +427,60 @@ static int complete_execlist_workload(struct intel_vgpu_workload *workload) · 8 unmodified lines
584427
585428 if (lite_restore) {
586429 gvt_dbg_el("next context == current - no schedule-out\n");
587− free_workload(workload);
588− return 0;
430+ goto out;
589431 }
590432
591433 ret = emulate_execlist_ctx_schedule_out(execlist, &workload->ctx_desc);
592− if (ret)
593− goto err;
594434 out:
595− free_workload(workload);
596− return 0;
597−err:
598− free_workload(workload);
435+ intel_vgpu_unpin_mm(workload->shadow_mm);
436+ intel_vgpu_destroy_workload(workload);
599437 return ret;
600438 }
601439
602−#define RING_CTX_OFF(x) \
603− offsetof(struct execlist_ring_context, x)
604−
605−static void read_guest_pdps(struct intel_vgpu *vgpu,
606− u64 ring_context_gpa, u32 pdp[8])
607−{
608− u64 gpa;
609− int i;
610−
611− gpa = ring_context_gpa + RING_CTX_OFF(pdp3_UDW.val);
612−
613− for (i = 0; i < 8; i++)
614− intel_gvt_hypervisor_read_gpa(vgpu,
615− gpa + i * 8, &pdp[7 - i], 4);
616−}
617−
618−static int prepare_mm(struct intel_vgpu_workload *workload)
619−{
620− struct execlist_ctx_descriptor_format *desc = &workload->ctx_desc;
621− struct intel_vgpu_mm *mm;
622− struct intel_vgpu *vgpu = workload->vgpu;
623− int page_table_level;
624− u32 pdp[8];
625−
626− if (desc->addressing_mode == 1) { /* legacy 32-bit */
627− page_table_level = 3;
628− } else if (desc->addressing_mode == 3) { /* legacy 64 bit */
629− page_table_level = 4;
630− } else {
631− gvt_vgpu_err("Advanced Context mode(SVM) is not supported!\n");
632− return -EINVAL;
633− }
634−
635− read_guest_pdps(workload->vgpu, workload->ring_context_gpa, pdp);
636−
637− mm = intel_vgpu_find_ppgtt_mm(workload->vgpu, page_table_level, pdp);
638− if (mm) {
639− intel_gvt_mm_reference(mm);
640− } else {
641−
642− mm = intel_vgpu_create_mm(workload->vgpu, INTEL_GVT_MM_PPGTT,
643− pdp, page_table_level, 0);
644− if (IS_ERR(mm)) {
645− gvt_vgpu_err("fail to create mm object.\n");
646− return PTR_ERR(mm);
647− }
648− }
649− workload->shadow_mm = mm;
650− return 0;
651−}
652−
653−#define get_last_workload(q) \
654− (list_empty(q) ? NULL : container_of(q->prev, \
655− struct intel_vgpu_workload, list))
656−
657440 static int submit_context(struct intel_vgpu *vgpu, int ring_id,
658441 struct execlist_ctx_descriptor_format *desc,
659442 bool emulate_schedule_in)
660443 {
661− struct list_head *q = workload_q_head(vgpu, ring_id);
662− struct intel_vgpu_workload *last_workload = get_last_workload(q);
444+ struct intel_vgpu_submission *s = &vgpu->submission;
663445 struct intel_vgpu_workload *workload = NULL;
664− struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
665− u64 ring_context_gpa;
666− u32 head, tail, start, ctl, ctx_ctl, per_ctx, indirect_ctx;
667− int ret;
668−
669− ring_context_gpa = intel_vgpu_gma_to_gpa(vgpu->gtt.ggtt_mm,
670− (u32)((desc->lrca + 1) << GTT_PAGE_SHIFT));
671− if (ring_context_gpa == INTEL_GVT_INVALID_ADDR) {
672− gvt_vgpu_err("invalid guest context LRCA: %x\n", desc->lrca);
673− return -EINVAL;
674− }
675−
676− intel_gvt_hypervisor_read_gpa(vgpu, ring_context_gpa +
677− RING_CTX_OFF(ring_header.val), &head, 4);
678446
679− intel_gvt_hypervisor_read_gpa(vgpu, ring_context_gpa +
680− RING_CTX_OFF(ring_tail.val), &tail, 4);
447+ workload = intel_vgpu_create_workload(vgpu, ring_id, desc);
448+ if (IS_ERR(workload))
449+ return PTR_ERR(workload);
681450
682− head &= RB_HEAD_OFF_MASK;
683− tail &= RB_TAIL_OFF_MASK;
684−
685− if (last_workload && same_context(&last_workload->ctx_desc, desc)) {
686− gvt_dbg_el("ring id %d cur workload == last\n", ring_id);
687− gvt_dbg_el("ctx head %x real head %lx\n", head,
688− last_workload->rb_tail);
689− /*
690− * cannot use guest context head pointer here,
691− * as it might not be updated at this time
692− */
693− head = last_workload->rb_tail;
694− }
695−
696− gvt_dbg_el("ring id %d begin a new workload\n", ring_id);
697−
698− workload = kmem_cache_zalloc(vgpu->workloads, GFP_KERNEL);
699− if (!workload)
700− return -ENOMEM;
701−
702− /* record some ring buffer register values for scan and shadow */
703− intel_gvt_hypervisor_read_gpa(vgpu, ring_context_gpa +
704− RING_CTX_OFF(rb_start.val), &start, 4);
705− intel_gvt_hypervisor_read_gpa(vgpu, ring_context_gpa +
706− RING_CTX_OFF(rb_ctrl.val), &ctl, 4);
707− intel_gvt_hypervisor_read_gpa(vgpu, ring_context_gpa +
708− RING_CTX_OFF(ctx_ctrl.val), &ctx_ctl, 4);
709−
710− INIT_LIST_HEAD(&workload->list);
711− INIT_LIST_HEAD(&workload->shadow_bb);
712−
713− init_waitqueue_head(&workload->shadow_ctx_status_wq);
714− atomic_set(&workload->shadow_ctx_active, 0);
715−
716− workload->vgpu = vgpu;
717− workload->ring_id = ring_id;
718− workload->ctx_desc = *desc;
719− workload->ring_context_gpa = ring_context_gpa;
720− workload->rb_head = head;
721− workload->rb_tail = tail;
722− workload->rb_start = start;
723− workload->rb_ctl = ctl;
724451 workload->prepare = prepare_execlist_workload;
725452 workload->complete = complete_execlist_workload;
726− workload->status = -EINPROGRESS;
727453 workload->emulate_schedule_in = emulate_schedule_in;
728− workload->shadowed = false;
729−
730− if (ring_id == RCS) {
731− intel_gvt_hypervisor_read_gpa(vgpu, ring_context_gpa +
732− RING_CTX_OFF(bb_per_ctx_ptr.val), &per_ctx, 4);
733− intel_gvt_hypervisor_read_gpa(vgpu, ring_context_gpa +
734− RING_CTX_OFF(rcs_indirect_ctx.val), &indirect_ctx, 4);
735−
736− workload->wa_ctx.indirect_ctx.guest_gma =
737− indirect_ctx & INDIRECT_CTX_ADDR_MASK;
738− workload->wa_ctx.indirect_ctx.size =
739− (indirect_ctx & INDIRECT_CTX_SIZE_MASK) *
740− CACHELINE_BYTES;
741− workload->wa_ctx.per_ctx.guest_gma =
742− per_ctx & PER_CTX_ADDR_MASK;
743− workload->wa_ctx.per_ctx.valid = per_ctx & 1;
744− }
745454
746455 if (emulate_schedule_in)
747− workload->elsp_dwords = vgpu->execlist[ring_id].elsp_dwords;
748−
749− gvt_dbg_el("workload %p ring id %d head %x tail %x start %x ctl %x\n",
750− workload, ring_id, head, tail, start, ctl);
456+ workload->elsp_dwords = s->execlist[ring_id].elsp_dwords;
751457
752458 gvt_dbg_el("workload %p emulate schedule_in %d\n", workload,
753459 emulate_schedule_in);
754460
755− ret = prepare_mm(workload);
756− if (ret) {
757− kmem_cache_free(vgpu->workloads, workload);
758− return ret;
759− }
760−
761− /* Only scan and shadow the first workload in the queue
762− * as there is only one pre-allocated buf-obj for shadow.
763− */
764− if (list_empty(workload_q_head(vgpu, ring_id))) {
765− intel_runtime_pm_get(dev_priv);
766− mutex_lock(&dev_priv->drm.struct_mutex);
767− intel_gvt_scan_and_shadow_workload(workload);
768− mutex_unlock(&dev_priv->drm.struct_mutex);
769− intel_runtime_pm_put(dev_priv);
770− }
771−
772461 queue_workload(workload);
773462 return 0;
774463 }
775464
776465 int intel_vgpu_submit_execlist(struct intel_vgpu *vgpu, int ring_id)
777466 {
778− struct intel_vgpu_execlist *execlist = &vgpu->execlist[ring_id];
779− struct execlist_ctx_descriptor_format desc[2];
467+ struct intel_vgpu_submission *s = &vgpu->submission;
468+ struct intel_vgpu_execlist *execlist = &s->execlist[ring_id];
469+ struct execlist_ctx_descriptor_format *desc[2];
780470 int i, ret;
781471
782− desc[0] = *get_desc_from_elsp_dwords(&execlist->elsp_dwords, 1);
783− desc[1] = *get_desc_from_elsp_dwords(&execlist->elsp_dwords, 0);
472+ desc[0] = get_desc_from_elsp_dwords(&execlist->elsp_dwords, 0);
473+ desc[1] = get_desc_from_elsp_dwords(&execlist->elsp_dwords, 1);
784474
785− if (!desc[0].valid) {
475+ if (!desc[0]->valid) {
786476 gvt_vgpu_err("invalid elsp submission, desc0 is invalid\n");
787477 goto inv_desc;
788478 }
789479
790480 for (i = 0; i < ARRAY_SIZE(desc); i++) {
791− if (!desc[i].valid)
481+ if (!desc[i]->valid)
792482 continue;
793− if (!desc[i].privilege_access) {
483+ if (!desc[i]->privilege_access) {
794484 gvt_vgpu_err("unexpected GGTT elsp submission\n");
795485 goto inv_desc;
796486 }
@@ -798,9 +488,9 @@ int intel_vgpu_submit_execlist(struct intel_vgpu *vgpu, int ring_id) · 1 unmodified line
798488
799489 /* submit workload */
800490 for (i = 0; i < ARRAY_SIZE(desc); i++) {
801− if (!desc[i].valid)
491+ if (!desc[i]->valid)
802492 continue;
803− ret = submit_context(vgpu, ring_id, &desc[i], i == 0);
493+ ret = submit_context(vgpu, ring_id, desc[i], i == 0);
804494 if (ret) {
805495 gvt_vgpu_err("failed to submit desc %d\n", i);
806496 return ret;
@@ -811,13 +501,14 @@ int intel_vgpu_submit_execlist(struct intel_vgpu *vgpu, int ring_id) · 4 unmodified lines
811501
812502 inv_desc:
813503 gvt_vgpu_err("descriptors content: desc0 %08x %08x desc1 %08x %08x\n",
814− desc[0].udw, desc[0].ldw, desc[1].udw, desc[1].ldw);
504+ desc[0]->udw, desc[0]->ldw, desc[1]->udw, desc[1]->ldw);
815505 return -EINVAL;
816506 }
817507
818508 static void init_vgpu_execlist(struct intel_vgpu *vgpu, int ring_id)
819509 {
820− struct intel_vgpu_execlist *execlist = &vgpu->execlist[ring_id];
510+ struct intel_vgpu_submission *s = &vgpu->submission;
511+ struct intel_vgpu_execlist *execlist = &s->execlist[ring_id];
821512 struct execlist_context_status_pointer_format ctx_status_ptr;
822513 u32 ctx_status_ptr_reg;
823514
@@ -837,91 +528,40 @@ static void init_vgpu_execlist(struct intel_vgpu *vgpu, int ring_id) · 13 unmodified lines
837528 vgpu_vreg(vgpu, ctx_status_ptr_reg) = ctx_status_ptr.dw;
838529 }
839530
840−static void clean_workloads(struct intel_vgpu *vgpu, unsigned long engine_mask)
841−{
842− struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
843− struct intel_engine_cs *engine;
844− struct intel_vgpu_workload *pos, *n;
845− unsigned int tmp;
846−
847− /* free the unsubmited workloads in the queues. */
848− for_each_engine_masked(engine, dev_priv, engine_mask, tmp) {
849− list_for_each_entry_safe(pos, n,
850− &vgpu->workload_q_head[engine->id], list) {
851− list_del_init(&pos->list);
852− free_workload(pos);
853− }
854−
855− clear_bit(engine->id, vgpu->shadow_ctx_desc_updated);
856− }
857−}
858−
859−void intel_vgpu_clean_execlist(struct intel_vgpu *vgpu)
531+void clean_execlist(struct intel_vgpu *vgpu)
860532 {
861533 enum intel_engine_id i;
862534 struct intel_engine_cs *engine;
863535
864− clean_workloads(vgpu, ALL_ENGINES);
865− kmem_cache_destroy(vgpu->workloads);
866−
867536 for_each_engine(engine, vgpu->gvt->dev_priv, i) {
868− kfree(vgpu->reserve_ring_buffer_va[i]);
869− vgpu->reserve_ring_buffer_va[i] = NULL;
870− vgpu->reserve_ring_buffer_size[i] = 0;
871− }
537+ struct intel_vgpu_submission *s = &vgpu->submission;
872538
873−}
874−
875−#define RESERVE_RING_BUFFER_SIZE ((1 * PAGE_SIZE)/8)
876−int intel_vgpu_init_execlist(struct intel_vgpu *vgpu)
877−{
878− enum intel_engine_id i;
879− struct intel_engine_cs *engine;
880−
881− /* each ring has a virtual execlist engine */
882− for_each_engine(engine, vgpu->gvt->dev_priv, i) {
883− init_vgpu_execlist(vgpu, i);
884− INIT_LIST_HEAD(&vgpu->workload_q_head[i]);
885− }
886−
887− vgpu->workloads = kmem_cache_create("gvt-g_vgpu_workload",
888− sizeof(struct intel_vgpu_workload), 0,
889− SLAB_HWCACHE_ALIGN,
890− NULL);
891−
892− if (!vgpu->workloads)
893− return -ENOMEM;
894−
895− /* each ring has a shadow ring buffer until vgpu destroyed */
896− for_each_engine(engine, vgpu->gvt->dev_priv, i) {
897− vgpu->reserve_ring_buffer_va[i] =
898− kmalloc(RESERVE_RING_BUFFER_SIZE, GFP_KERNEL);
899− if (!vgpu->reserve_ring_buffer_va[i]) {
900− gvt_vgpu_err("fail to alloc reserve ring buffer\n");
901− goto out;
902− }
903− vgpu->reserve_ring_buffer_size[i] = RESERVE_RING_BUFFER_SIZE;
539+ kfree(s->ring_scan_buffer[i]);
540+ s->ring_scan_buffer[i] = NULL;
541+ s->ring_scan_buffer_size[i] = 0;
904542 }
905− return 0;
906−out:
907− for_each_engine(engine, vgpu->gvt->dev_priv, i) {
908− if (vgpu->reserve_ring_buffer_size[i]) {
909− kfree(vgpu->reserve_ring_buffer_va[i]);
910− vgpu->reserve_ring_buffer_va[i] = NULL;
911− vgpu->reserve_ring_buffer_size[i] = 0;
912− }
913− }
914− return -ENOMEM;
915543 }
916544
917−void intel_vgpu_reset_execlist(struct intel_vgpu *vgpu,
545+void reset_execlist(struct intel_vgpu *vgpu,
918546 unsigned long engine_mask)
919547 {
920548 struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
921549 struct intel_engine_cs *engine;
922550 unsigned int tmp;
923551
924− clean_workloads(vgpu, engine_mask);
925552 for_each_engine_masked(engine, dev_priv, engine_mask, tmp)
926553 init_vgpu_execlist(vgpu, engine->id);
927554 }
555+
556+int init_execlist(struct intel_vgpu *vgpu)
557+{
558+ reset_execlist(vgpu, ALL_ENGINES);
559+ return 0;
560+}
561+
562+const struct intel_vgpu_submission_ops intel_vgpu_execlist_submission_ops = {
563+ .name = "execlist",
564+ .init = init_execlist,
565+ .reset = reset_execlist,
566+ .clean = clean_execlist,
567+};
drivers/gpu/drm/i915/gvt/execlist.h+4−4
@@ -36,10 +36,6 @@ · 35 unmodified lines
3636 #define _GVT_EXECLIST_H_
3737
3838 struct execlist_ctx_descriptor_format {
39− union {
40− u32 udw;
41− u32 context_id;
42− };
4339 union {
4440 u32 ldw;
4541 struct {
@@ -54,6 +50,10 @@ struct execlist_ctx_descriptor_format { · 8 unmodified lines
5450 u32 lrca : 20;
5551 };
5652 };
53+ union {
54+ u32 udw;
55+ u32 context_id;
56+ };
5757 };
5858
5959 struct execlist_status_format {
drivers/gpu/drm/i915/gvt/firmware.c+11−15
@@ -66,20 +66,23 @@ static struct bin_attribute firmware_attr = { · 65 unmodified lines
6666 .mmap = NULL,
6767 };
6868
69−static int expose_firmware_sysfs(struct intel_gvt *gvt)
69+static int mmio_snapshot_handler(struct intel_gvt *gvt, u32 offset, void *data)
7070 {
7171 struct drm_i915_private *dev_priv = gvt->dev_priv;
72+
73+ *(u32 *)(data + offset) = I915_READ_NOTRACE(_MMIO(offset));
74+ return 0;
75+}
76+
77+static int expose_firmware_sysfs(struct intel_gvt *gvt)
78+{
7279 struct intel_gvt_device_info *info = &gvt->device_info;
7380 struct pci_dev *pdev = gvt->dev_priv->drm.pdev;
74− struct intel_gvt_mmio_info *e;
75− struct gvt_mmio_block *block = gvt->mmio.mmio_block;
76− int num = gvt->mmio.num_mmio_block;
7781 struct gvt_firmware_header *h;
7882 void *firmware;
7983 void *p;
8084 unsigned long size, crc32_start;
81− int i, j;
82− int ret;
85+ int i, ret;
8386
8487 size = sizeof(*h) + info->mmio_size + info->cfg_space_size;
8588 firmware = vzalloc(size);
@@ -104,15 +107,8 @@ static int expose_firmware_sysfs(struct intel_gvt *gvt) · 18 unmodified lines
104107
105108 p = firmware + h->mmio_offset;
106109
107− hash_for_each(gvt->mmio.mmio_info_table, i, e, node)
108− *(u32 *)(p + e->offset) = I915_READ_NOTRACE(_MMIO(e->offset));
109−
110− for (i = 0; i < num; i++, block++) {
111− for (j = 0; j < block->size; j += 4)
112− *(u32 *)(p + INTEL_GVT_MMIO_OFFSET(block->offset) + j) =
113− I915_READ_NOTRACE(_MMIO(INTEL_GVT_MMIO_OFFSET(
114− block->offset) + j));
115− }
110+ /* Take a snapshot of hw mmio registers. */
111+ intel_gvt_for_each_tracked_mmio(gvt, mmio_snapshot_handler, p);
116112
117113 memcpy(gvt->firmware.mmio, p, info->mmio_size);
118114
drivers/gpu/drm/i915/gvt/gtt.c+152−109
@@ -94,12 +94,12 @@ int intel_gvt_ggtt_index_g2h(struct intel_vgpu *vgpu, unsigned long g_index, · 93 unmodified lines
9494 u64 h_addr;
9595 int ret;
9696
97− ret = intel_gvt_ggtt_gmadr_g2h(vgpu, g_index << GTT_PAGE_SHIFT,
97+ ret = intel_gvt_ggtt_gmadr_g2h(vgpu, g_index << I915_GTT_PAGE_SHIFT,
9898 &h_addr);
9999 if (ret)
100100 return ret;
101101
102− *h_index = h_addr >> GTT_PAGE_SHIFT;
102+ *h_index = h_addr >> I915_GTT_PAGE_SHIFT;
103103 return 0;
104104 }
105105
@@ -109,12 +109,12 @@ int intel_gvt_ggtt_h2g_index(struct intel_vgpu *vgpu, unsigned long h_index, · 3 unmodified lines
109109 u64 g_addr;
110110 int ret;
111111
112− ret = intel_gvt_ggtt_gmadr_h2g(vgpu, h_index << GTT_PAGE_SHIFT,
112+ ret = intel_gvt_ggtt_gmadr_h2g(vgpu, h_index << I915_GTT_PAGE_SHIFT,
113113 &g_addr);
114114 if (ret)
115115 return ret;
116116
117− *g_index = g_addr >> GTT_PAGE_SHIFT;
117+ *g_index = g_addr >> I915_GTT_PAGE_SHIFT;
118118 return 0;
119119 }
120120
@@ -156,13 +156,15 @@ int intel_gvt_ggtt_h2g_index(struct intel_vgpu *vgpu, unsigned long h_index, · 35 unmodified lines
156156
157157 struct gtt_type_table_entry {
158158 int entry_type;
159+ int pt_type;
159160 int next_pt_type;
160161 int pse_entry_type;
161162 };
162163
163−#define GTT_TYPE_TABLE_ENTRY(type, e_type, npt_type, pse_type) \
164+#define GTT_TYPE_TABLE_ENTRY(type, e_type, cpt_type, npt_type, pse_type) \
164165 [type] = { \
165166 .entry_type = e_type, \
167+ .pt_type = cpt_type, \
166168 .next_pt_type = npt_type, \
167169 .pse_entry_type = pse_type, \
168170 }
@@ -170,55 +172,68 @@ struct gtt_type_table_entry { · 1 unmodified line
170172 static struct gtt_type_table_entry gtt_type_table[] = {
171173 GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_ROOT_L4_ENTRY,
172174 GTT_TYPE_PPGTT_ROOT_L4_ENTRY,
175+ GTT_TYPE_INVALID,
173176 GTT_TYPE_PPGTT_PML4_PT,
174177 GTT_TYPE_INVALID),
175178 GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PML4_PT,
176179 GTT_TYPE_PPGTT_PML4_ENTRY,
180+ GTT_TYPE_PPGTT_PML4_PT,
177181 GTT_TYPE_PPGTT_PDP_PT,
178182 GTT_TYPE_INVALID),
179183 GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PML4_ENTRY,
180184 GTT_TYPE_PPGTT_PML4_ENTRY,
185+ GTT_TYPE_PPGTT_PML4_PT,
181186 GTT_TYPE_PPGTT_PDP_PT,
182187 GTT_TYPE_INVALID),
183188 GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PDP_PT,
184189 GTT_TYPE_PPGTT_PDP_ENTRY,
190+ GTT_TYPE_PPGTT_PDP_PT,
185191 GTT_TYPE_PPGTT_PDE_PT,
186192 GTT_TYPE_PPGTT_PTE_1G_ENTRY),
187193 GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_ROOT_L3_ENTRY,
188194 GTT_TYPE_PPGTT_ROOT_L3_ENTRY,
195+ GTT_TYPE_INVALID,
189196 GTT_TYPE_PPGTT_PDE_PT,
190197 GTT_TYPE_PPGTT_PTE_1G_ENTRY),
191198 GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PDP_ENTRY,
192199 GTT_TYPE_PPGTT_PDP_ENTRY,
200+ GTT_TYPE_PPGTT_PDP_PT,
193201 GTT_TYPE_PPGTT_PDE_PT,
194202 GTT_TYPE_PPGTT_PTE_1G_ENTRY),
195203 GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PDE_PT,
196204 GTT_TYPE_PPGTT_PDE_ENTRY,
205+ GTT_TYPE_PPGTT_PDE_PT,
197206 GTT_TYPE_PPGTT_PTE_PT,
198207 GTT_TYPE_PPGTT_PTE_2M_ENTRY),
199208 GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PDE_ENTRY,
200209 GTT_TYPE_PPGTT_PDE_ENTRY,
210+ GTT_TYPE_PPGTT_PDE_PT,
201211 GTT_TYPE_PPGTT_PTE_PT,
202212 GTT_TYPE_PPGTT_PTE_2M_ENTRY),
203213 GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PTE_PT,
204214 GTT_TYPE_PPGTT_PTE_4K_ENTRY,
215+ GTT_TYPE_PPGTT_PTE_PT,
205216 GTT_TYPE_INVALID,
206217 GTT_TYPE_INVALID),
207218 GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PTE_4K_ENTRY,
208219 GTT_TYPE_PPGTT_PTE_4K_ENTRY,
220+ GTT_TYPE_PPGTT_PTE_PT,
209221 GTT_TYPE_INVALID,
210222 GTT_TYPE_INVALID),
211223 GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PTE_2M_ENTRY,
212224 GTT_TYPE_PPGTT_PDE_ENTRY,
225+ GTT_TYPE_PPGTT_PDE_PT,
213226 GTT_TYPE_INVALID,
214227 GTT_TYPE_PPGTT_PTE_2M_ENTRY),
215228 GTT_TYPE_TABLE_ENTRY(GTT_TYPE_PPGTT_PTE_1G_ENTRY,
216229 GTT_TYPE_PPGTT_PDP_ENTRY,
230+ GTT_TYPE_PPGTT_PDP_PT,
217231 GTT_TYPE_INVALID,
218232 GTT_TYPE_PPGTT_PTE_1G_ENTRY),
219233 GTT_TYPE_TABLE_ENTRY(GTT_TYPE_GGTT_PTE,
220234 GTT_TYPE_GGTT_PTE,
221235 GTT_TYPE_INVALID,
236+ GTT_TYPE_INVALID,
222237 GTT_TYPE_INVALID),
223238 };
224239
@@ -227,6 +242,11 @@ static inline int get_next_pt_type(int type) · 2 unmodified lines
227242 return gtt_type_table[type].next_pt_type;
228243 }
229244
245+static inline int get_pt_type(int type)
246+{
247+ return gtt_type_table[type].pt_type;
248+}
249+
230250 static inline int get_entry_type(int type)
231251 {
232252 return gtt_type_table[type].entry_type;
@@ -351,7 +371,7 @@ static bool gen8_gtt_test_pse(struct intel_gvt_gtt_entry *e) · 118 unmodified lines
351371 return false;
352372
353373 e->type = get_entry_type(e->type);
354− if (!(e->val64 & (1 << 7)))
374+ if (!(e->val64 & BIT(7)))
355375 return false;
356376
357377 e->type = get_pse_type(e->type);
@@ -369,12 +389,17 @@ static bool gen8_gtt_test_present(struct intel_gvt_gtt_entry *e) · 11 unmodified lines
369389 || e->type == GTT_TYPE_PPGTT_ROOT_L4_ENTRY)
370390 return (e->val64 != 0);
371391 else
372− return (e->val64 & (1 << 0));
392+ return (e->val64 & BIT(0));
373393 }
374394
375395 static void gtt_entry_clear_present(struct intel_gvt_gtt_entry *e)
376396 {
377− e->val64 &= ~(1 << 0);
397+ e->val64 &= ~BIT(0);
398+}
399+
400+static void gtt_entry_set_present(struct intel_gvt_gtt_entry *e)
401+{
402+ e->val64 |= BIT(0);
378403 }
379404
380405 /*
@@ -382,7 +407,7 @@ static void gtt_entry_clear_present(struct intel_gvt_gtt_entry *e) · 1 unmodified line
382407 */
383408 static unsigned long gma_to_ggtt_pte_index(unsigned long gma)
384409 {
385− unsigned long x = (gma >> GTT_PAGE_SHIFT);
410+ unsigned long x = (gma >> I915_GTT_PAGE_SHIFT);
386411
387412 trace_gma_index(__func__, gma, x);
388413 return x;
@@ -406,6 +431,7 @@ static struct intel_gvt_gtt_pte_ops gen8_gtt_pte_ops = { · 17 unmodified lines
406431 .get_entry = gtt_get_entry64,
407432 .set_entry = gtt_set_entry64,
408433 .clear_present = gtt_entry_clear_present,
434+ .set_present = gtt_entry_set_present,
409435 .test_present = gen8_gtt_test_present,
410436 .test_pse = gen8_gtt_test_pse,
411437 .get_pfn = gen8_gtt_get_pfn,
@@ -494,7 +520,7 @@ static inline int ppgtt_spt_get_entry( · 82 unmodified lines
494520 return -EINVAL;
495521
496522 ret = ops->get_entry(page_table, e, index, guest,
497− spt->guest_page.gfn << GTT_PAGE_SHIFT,
523+ spt->guest_page.track.gfn << I915_GTT_PAGE_SHIFT,
498524 spt->vgpu);
499525 if (ret)
500526 return ret;
@@ -516,7 +542,7 @@ static inline int ppgtt_spt_set_entry( · 15 unmodified lines
516542 return -EINVAL;
517543
518544 return ops->set_entry(page_table, e, index, guest,
519− spt->guest_page.gfn << GTT_PAGE_SHIFT,
545+ spt->guest_page.track.gfn << I915_GTT_PAGE_SHIFT,
520546 spt->vgpu);
521547 }
522548
@@ -537,88 +563,103 @@ static inline int ppgtt_spt_set_entry( · 14 unmodified lines
537563 spt->shadow_page.type, e, index, false)
538564
539565 /**
540− * intel_vgpu_init_guest_page - init a guest page data structure
566+ * intel_vgpu_init_page_track - init a page track data structure
541567 * @vgpu: a vGPU
542− * @p: a guest page data structure
568+ * @t: a page track data structure
543569 * @gfn: guest memory page frame number
544− * @handler: function will be called when target guest memory page has
570+ * @handler: the function will be called when target guest memory page has
545571 * been modified.
546572 *
547− * This function is called when user wants to track a guest memory page.
573+ * This function is called when a user wants to prepare a page track data
574+ * structure to track a guest memory page.
548575 *
549576 * Returns:
550577 * Zero on success, negative error code if failed.
551578 */
552−int intel_vgpu_init_guest_page(struct intel_vgpu *vgpu,
553− struct intel_vgpu_guest_page *p,
579+int intel_vgpu_init_page_track(struct intel_vgpu *vgpu,
580+ struct intel_vgpu_page_track *t,
554581 unsigned long gfn,
555582 int (*handler)(void *, u64, void *, int),
556583 void *data)
557584 {
558− INIT_HLIST_NODE(&p->node);
585+ INIT_HLIST_NODE(&t->node);
559586
560− p->writeprotection = false;
561− p->gfn = gfn;
562− p->handler = handler;
563− p->data = data;
564− p->oos_page = NULL;
565− p->write_cnt = 0;
587+ t->tracked = false;
588+ t->gfn = gfn;
589+ t->handler = handler;
590+ t->data = data;
566591
567− hash_add(vgpu->gtt.guest_page_hash_table, &p->node, p->gfn);
592+ hash_add(vgpu->gtt.tracked_guest_page_hash_table, &t->node, t->gfn);
568593 return 0;
569594 }
570595
571−static int detach_oos_page(struct intel_vgpu *vgpu,
572− struct intel_vgpu_oos_page *oos_page);
573−
574596 /**
575− * intel_vgpu_clean_guest_page - release the resource owned by guest page data
576− * structure
597+ * intel_vgpu_clean_page_track - release a page track data structure
577598 * @vgpu: a vGPU
578− * @p: a tracked guest page
599+ * @t: a page track data structure
579600 *
580− * This function is called when user tries to stop tracking a guest memory
581− * page.
601+ * This function is called before a user frees a page track data structure.
582602 */
583−void intel_vgpu_clean_guest_page(struct intel_vgpu *vgpu,
584− struct intel_vgpu_guest_page *p)
603+void intel_vgpu_clean_page_track(struct intel_vgpu *vgpu,
604+ struct intel_vgpu_page_track *t)
585605 {
586− if (!hlist_unhashed(&p->node))
587− hash_del(&p->node);
588−
589− if (p->oos_page)
590− detach_oos_page(vgpu, p->oos_page);
606+ if (!hlist_unhashed(&t->node))
607+ hash_del(&t->node);
591608
592− if (p->writeprotection)
593− intel_gvt_hypervisor_unset_wp_page(vgpu, p);
609+ if (t->tracked)
610+ intel_gvt_hypervisor_disable_page_track(vgpu, t);
594611 }
595612
596613 /**
597− * intel_vgpu_find_guest_page - find a guest page data structure by GFN.
614+ * intel_vgpu_find_tracked_page - find a tracked guest page
598615 * @vgpu: a vGPU
599616 * @gfn: guest memory page frame number
600617 *
601− * This function is called when emulation logic wants to know if a trapped GFN
602− * is a tracked guest page.
618+ * This function is called when the emulation layer wants to figure out if a
619+ * trapped GFN is a tracked guest page.
603620 *
604621 * Returns:
605− * Pointer to guest page data structure, NULL if failed.
622+ * Pointer to page track data structure, NULL if not found.
606623 */
607−struct intel_vgpu_guest_page *intel_vgpu_find_guest_page(
624+struct intel_vgpu_page_track *intel_vgpu_find_tracked_page(
608625 struct intel_vgpu *vgpu, unsigned long gfn)
609626 {
610− struct intel_vgpu_guest_page *p;
627+ struct intel_vgpu_page_track *t;
611628
612− hash_for_each_possible(vgpu->gtt.guest_page_hash_table,
613− p, node, gfn) {
614− if (p->gfn == gfn)
615− return p;
629+ hash_for_each_possible(vgpu->gtt.tracked_guest_page_hash_table,
630+ t, node, gfn) {
631+ if (t->gfn == gfn)
632+ return t;
616633 }
617634 return NULL;
618635 }
619636
637+static int init_guest_page(struct intel_vgpu *vgpu,
638+ struct intel_vgpu_guest_page *p,
639+ unsigned long gfn,
640+ int (*handler)(void *, u64, void *, int),
641+ void *data)
642+{
643+ p->oos_page = NULL;
644+ p->write_cnt = 0;
645+
646+ return intel_vgpu_init_page_track(vgpu, &p->track, gfn, handler, data);
647+}
648+
649+static int detach_oos_page(struct intel_vgpu *vgpu,
650+ struct intel_vgpu_oos_page *oos_page);
651+
652+static void clean_guest_page(struct intel_vgpu *vgpu,
653+ struct intel_vgpu_guest_page *p)
654+{
655+ if (p->oos_page)
656+ detach_oos_page(vgpu, p->oos_page);
657+
658+ intel_vgpu_clean_page_track(vgpu, &p->track);
659+}
660+
620661 static inline int init_shadow_page(struct intel_vgpu *vgpu,
621− struct intel_vgpu_shadow_page *p, int type)
662+ struct intel_vgpu_shadow_page *p, int type, bool hash)
622663 {
623664 struct device *kdev = &vgpu->gvt->dev_priv->drm.pdev->dev;
624665 dma_addr_t daddr;
@@ -634,8 +675,9 @@ static inline int init_shadow_page(struct intel_vgpu *vgpu, · 9 unmodified lines
634675
635676 INIT_HLIST_NODE(&p->node);
636677
637− p->mfn = daddr >> GTT_PAGE_SHIFT;
638− hash_add(vgpu->gtt.shadow_page_hash_table, &p->node, p->mfn);
678+ p->mfn = daddr >> I915_GTT_PAGE_SHIFT;
679+ if (hash)
680+ hash_add(vgpu->gtt.shadow_page_hash_table, &p->node, p->mfn);
639681 return 0;
640682 }
641683
@@ -644,7 +686,7 @@ static inline void clean_shadow_page(struct intel_vgpu *vgpu, · 2 unmodified lines
644686 {
645687 struct device *kdev = &vgpu->gvt->dev_priv->drm.pdev->dev;
646688
647− dma_unmap_page(kdev, p->mfn << GTT_PAGE_SHIFT, 4096,
689+ dma_unmap_page(kdev, p->mfn << I915_GTT_PAGE_SHIFT, 4096,
648690 PCI_DMA_BIDIRECTIONAL);
649691
650692 if (!hlist_unhashed(&p->node))
@@ -664,6 +706,9 @@ static inline struct intel_vgpu_shadow_page *find_shadow_page( · 13 unmodified lines
664706 return NULL;
665707 }
666708
709+#define page_track_to_guest_page(ptr) \
710+ container_of(ptr, struct intel_vgpu_guest_page, track)
711+
667712 #define guest_page_to_ppgtt_spt(ptr) \
668713 container_of(ptr, struct intel_vgpu_ppgtt_spt, guest_page)
669714
@@ -697,7 +742,7 @@ static void ppgtt_free_shadow_page(struct intel_vgpu_ppgtt_spt *spt) · 27 unmodified lines
697742 trace_spt_free(spt->vgpu->id, spt, spt->shadow_page.type);
698743
699744 clean_shadow_page(spt->vgpu, &spt->shadow_page);
700− intel_vgpu_clean_guest_page(spt->vgpu, &spt->guest_page);
745+ clean_guest_page(spt->vgpu, &spt->guest_page);
701746 list_del_init(&spt->post_shadow_list);
702747
703748 free_spt(spt);
@@ -713,22 +758,24 @@ static void ppgtt_free_all_shadow_page(struct intel_vgpu *vgpu) · 9 unmodified lines
713758 ppgtt_free_shadow_page(shadow_page_to_ppgtt_spt(sp));
714759 }
715760
716−static int ppgtt_handle_guest_write_page_table_bytes(void *gp,
761+static int ppgtt_handle_guest_write_page_table_bytes(
762+ struct intel_vgpu_guest_page *gpt,
717763 u64 pa, void *p_data, int bytes);
718764
719−static int ppgtt_write_protection_handler(void *gp, u64 pa,
765+static int ppgtt_write_protection_handler(void *data, u64 pa,
720766 void *p_data, int bytes)
721767 {
722− struct intel_vgpu_guest_page *gpt = (struct intel_vgpu_guest_page *)gp;
768+ struct intel_vgpu_page_track *t = data;
769+ struct intel_vgpu_guest_page *p = page_track_to_guest_page(t);
723770 int ret;
724771
725772 if (bytes != 4 && bytes != 8)
726773 return -EINVAL;
727774
728− if (!gpt->writeprotection)
775+ if (!t->tracked)
729776 return -EINVAL;
730777
731− ret = ppgtt_handle_guest_write_page_table_bytes(gp,
778+ ret = ppgtt_handle_guest_write_page_table_bytes(p,
732779 pa, p_data, bytes);
733780 if (ret)
734781 return ret;
@@ -762,13 +809,13 @@ retry: · 27 unmodified lines
762809 * TODO: guest page type may be different with shadow page type,
763810 * when we support PSE page in future.
764811 */
765− ret = init_shadow_page(vgpu, &spt->shadow_page, type);
812+ ret = init_shadow_page(vgpu, &spt->shadow_page, type, true);
766813 if (ret) {
767814 gvt_vgpu_err("fail to initialize shadow page for spt\n");
768815 goto err;
769816 }
770817
771− ret = intel_vgpu_init_guest_page(vgpu, &spt->guest_page,
818+ ret = init_guest_page(vgpu, &spt->guest_page,
772819 gfn, ppgtt_write_protection_handler, NULL);
773820 if (ret) {
774821 gvt_vgpu_err("fail to initialize guest page for spt\n");
@@ -798,7 +845,7 @@ static struct intel_vgpu_ppgtt_spt *ppgtt_find_shadow_page( · 23 unmodified lines
798845 ((spt)->vgpu->gvt->device_info.gtt_entry_size_shift)
799846
800847 #define pt_entries(spt) \
801− (GTT_PAGE_SIZE >> pt_entry_size_shift(spt))
848+ (I915_GTT_PAGE_SIZE >> pt_entry_size_shift(spt))
802849
803850 #define for_each_present_guest_entry(spt, e, i) \
804851 for (i = 0; i < pt_entries(spt); i++) \
@@ -856,7 +903,7 @@ static int ppgtt_invalidate_shadow_page(struct intel_vgpu_ppgtt_spt *spt) · 51 unmodified lines
856903 int v = atomic_read(&spt->refcount);
857904
858905 trace_spt_change(spt->vgpu->id, "die", spt,
859− spt->guest_page.gfn, spt->shadow_page.type);
906+ spt->guest_page.track.gfn, spt->shadow_page.type);
860907
861908 trace_spt_refcount(spt->vgpu->id, "dec", spt, v, (v - 1));
862909
@@ -878,7 +925,7 @@ static int ppgtt_invalidate_shadow_page(struct intel_vgpu_ppgtt_spt *spt) · 15 unmodified lines
878925 }
879926 release:
880927 trace_spt_change(spt->vgpu->id, "release", spt,
881− spt->guest_page.gfn, spt->shadow_page.type);
928+ spt->guest_page.track.gfn, spt->shadow_page.type);
882929 ppgtt_free_shadow_page(spt);
883930 return 0;
884931 fail:
@@ -895,6 +942,7 @@ static struct intel_vgpu_ppgtt_spt *ppgtt_populate_shadow_page_by_guest_entry( · 10 unmodified lines
895942 struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
896943 struct intel_vgpu_ppgtt_spt *s = NULL;
897944 struct intel_vgpu_guest_page *g;
945+ struct intel_vgpu_page_track *t;
898946 int ret;
899947
900948 if (WARN_ON(!gtt_type_is_pt(get_next_pt_type(we->type)))) {
@@ -902,8 +950,9 @@ static struct intel_vgpu_ppgtt_spt *ppgtt_populate_shadow_page_by_guest_entry( · 1 unmodified line
902950 goto fail;
903951 }
904952
905− g = intel_vgpu_find_guest_page(vgpu, ops->get_pfn(we));
906− if (g) {
953+ t = intel_vgpu_find_tracked_page(vgpu, ops->get_pfn(we));
954+ if (t) {
955+ g = page_track_to_guest_page(t);
907956 s = guest_page_to_ppgtt_spt(g);
908957 ppgtt_get_shadow_page(s);
909958 } else {
@@ -915,7 +964,8 @@ static struct intel_vgpu_ppgtt_spt *ppgtt_populate_shadow_page_by_guest_entry( · 5 unmodified lines
915964 goto fail;
916965 }
917966
918− ret = intel_gvt_hypervisor_set_wp_page(vgpu, &s->guest_page);
967+ ret = intel_gvt_hypervisor_enable_page_track(vgpu,
968+ &s->guest_page.track);
919969 if (ret)
920970 goto fail;
921971
@@ -923,7 +973,7 @@ static struct intel_vgpu_ppgtt_spt *ppgtt_populate_shadow_page_by_guest_entry( · 1 unmodified line
923973 if (ret)
924974 goto fail;
925975
926− trace_spt_change(vgpu->id, "new", s, s->guest_page.gfn,
976+ trace_spt_change(vgpu->id, "new", s, s->guest_page.track.gfn,
927977 s->shadow_page.type);
928978 }
929979 return s;
@@ -953,7 +1003,7 @@ static int ppgtt_populate_shadow_page(struct intel_vgpu_ppgtt_spt *spt) · 23 unmodified lines
9531003 int ret;
9541004
9551005 trace_spt_change(spt->vgpu->id, "born", spt,
956− spt->guest_page.gfn, spt->shadow_page.type);
1006+ spt->guest_page.track.gfn, spt->shadow_page.type);
9571007
9581008 if (gtt_type_is_pte_pt(spt->shadow_page.type)) {
9591009 for_each_present_guest_entry(spt, &ge, i) {
@@ -1078,11 +1128,11 @@ static int sync_oos_page(struct intel_vgpu *vgpu, · 118 unmodified lines
10781128 old.type = new.type = get_entry_type(spt->guest_page_type);
10791129 old.val64 = new.val64 = 0;
10801130
1081− for (index = 0; index < (GTT_PAGE_SIZE >> info->gtt_entry_size_shift);
1082− index++) {
1131+ for (index = 0; index < (I915_GTT_PAGE_SIZE >>
1132+ info->gtt_entry_size_shift); index++) {
10831133 ops->get_entry(oos_page->mem, &old, index, false, 0, vgpu);
10841134 ops->get_entry(NULL, &new, index, true,
1085− oos_page->guest_page->gfn << PAGE_SHIFT, vgpu);
1135+ oos_page->guest_page->track.gfn << PAGE_SHIFT, vgpu);
10861136
10871137 if (old.val64 == new.val64
10881138 && !test_and_clear_bit(index, spt->post_shadow_bitmap))
@@ -1132,8 +1182,9 @@ static int attach_oos_page(struct intel_vgpu *vgpu, · 43 unmodified lines
11321182 struct intel_gvt *gvt = vgpu->gvt;
11331183 int ret;
11341184
1135− ret = intel_gvt_hypervisor_read_gpa(vgpu, gpt->gfn << GTT_PAGE_SHIFT,
1136− oos_page->mem, GTT_PAGE_SIZE);
1185+ ret = intel_gvt_hypervisor_read_gpa(vgpu,
1186+ gpt->track.gfn << I915_GTT_PAGE_SHIFT,
1187+ oos_page->mem, I915_GTT_PAGE_SIZE);
11371188 if (ret)
11381189 return ret;
11391190
@@ -1152,7 +1203,7 @@ static int ppgtt_set_guest_page_sync(struct intel_vgpu *vgpu, · 12 unmodified lines
11521203 {
11531204 int ret;
11541205
1155− ret = intel_gvt_hypervisor_set_wp_page(vgpu, gpt);
1206+ ret = intel_gvt_hypervisor_enable_page_track(vgpu, &gpt->track);
11561207 if (ret)
11571208 return ret;
11581209
@@ -1200,7 +1251,7 @@ static int ppgtt_set_guest_page_oos(struct intel_vgpu *vgpu, · 41 unmodified lines
12001251 gpt, guest_page_to_ppgtt_spt(gpt)->guest_page_type);
12011252
12021253 list_add_tail(&oos_page->vm_list, &vgpu->gtt.oos_page_list_head);
1203− return intel_gvt_hypervisor_unset_wp_page(vgpu, gpt);
1254+ return intel_gvt_hypervisor_disable_page_track(vgpu, &gpt->track);
12041255 }
12051256
12061257 /**
@@ -1335,10 +1386,10 @@ int intel_vgpu_flush_post_shadow(struct intel_vgpu *vgpu) · 128 unmodified lines
13351386 return 0;
13361387 }
13371388
1338−static int ppgtt_handle_guest_write_page_table_bytes(void *gp,
1389+static int ppgtt_handle_guest_write_page_table_bytes(
1390+ struct intel_vgpu_guest_page *gpt,
13391391 u64 pa, void *p_data, int bytes)
13401392 {
1341− struct intel_vgpu_guest_page *gpt = (struct intel_vgpu_guest_page *)gp;
13421393 struct intel_vgpu_ppgtt_spt *spt = guest_page_to_ppgtt_spt(gpt);
13431394 struct intel_vgpu *vgpu = spt->vgpu;
13441395 struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
@@ -1415,7 +1466,7 @@ static int gen8_mm_alloc_page_table(struct intel_vgpu_mm *mm) · 70 unmodified lines
14151466 mm->shadow_page_table = mem + mm->page_table_entry_size;
14161467 } else if (mm->type == INTEL_GVT_MM_GGTT) {
14171468 mm->page_table_entry_cnt =
1418− (gvt_ggtt_gm_sz(gvt) >> GTT_PAGE_SHIFT);
1469+ (gvt_ggtt_gm_sz(gvt) >> I915_GTT_PAGE_SHIFT);
14191470 mm->page_table_entry_size = mm->page_table_entry_cnt *
14201471 info->gtt_entry_size;
14211472 mem = vzalloc(mm->page_table_entry_size);
@@ -1737,8 +1788,8 @@ unsigned long intel_vgpu_gma_to_gpa(struct intel_vgpu_mm *mm, unsigned long gma) · 315 unmodified lines
17371788 gma_ops->gma_to_ggtt_pte_index(gma));
17381789 if (ret)
17391790 goto err;
1740− gpa = (pte_ops->get_pfn(&e) << GTT_PAGE_SHIFT)
1741− + (gma & ~GTT_PAGE_MASK);
1791+ gpa = (pte_ops->get_pfn(&e) << I915_GTT_PAGE_SHIFT)
1792+ + (gma & ~I915_GTT_PAGE_MASK);
17421793
17431794 trace_gma_translate(vgpu->id, "ggtt", 0, 0, gma, gpa);
17441795 return gpa;
@@ -1790,8 +1841,8 @@ unsigned long intel_vgpu_gma_to_gpa(struct intel_vgpu_mm *mm, unsigned long gma) · 45 unmodified lines
17901841 }
17911842 }
17921843
1793− gpa = (pte_ops->get_pfn(&e) << GTT_PAGE_SHIFT)
1794− + (gma & ~GTT_PAGE_MASK);
1844+ gpa = (pte_ops->get_pfn(&e) << I915_GTT_PAGE_SHIFT)
1845+ + (gma & ~I915_GTT_PAGE_MASK);
17951846
17961847 trace_gma_translate(vgpu->id, "ppgtt", 0,
17971848 mm->page_table_level, gma, gpa);
@@ -1859,7 +1910,7 @@ static int emulate_gtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off, · 61 unmodified lines
18591910 if (bytes != 4 && bytes != 8)
18601911 return -EINVAL;
18611912
1862− gma = g_gtt_index << GTT_PAGE_SHIFT;
1913+ gma = g_gtt_index << I915_GTT_PAGE_SHIFT;
18631914
18641915 /* the VM may configure the whole GM space when ballooning is used */
18651916 if (!vgpu_gmadr_is_valid(vgpu, gma))
@@ -1878,11 +1929,11 @@ static int emulate_gtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off, · 12 unmodified lines
18781929 * update the entry in this situation p2m will fail
18791930 * settting the shadow entry to point to a scratch page
18801931 */
1881− ops->set_pfn(&m, gvt->gtt.scratch_ggtt_mfn);
1932+ ops->set_pfn(&m, gvt->gtt.scratch_mfn);
18821933 }
18831934 } else {
18841935 m = e;
1885− ops->set_pfn(&m, gvt->gtt.scratch_ggtt_mfn);
1936+ ops->set_pfn(&m, gvt->gtt.scratch_mfn);
18861937 }
18871938
18881939 ggtt_set_shadow_entry(ggtt_mm, &m, g_gtt_index);
@@ -1922,7 +1973,7 @@ static int alloc_scratch_pages(struct intel_vgpu *vgpu, · 33 unmodified lines
19221973 {
19231974 struct intel_vgpu_gtt *gtt = &vgpu->gtt;
19241975 struct intel_gvt_gtt_pte_ops *ops = vgpu->gvt->gtt.pte_ops;
1925− int page_entry_num = GTT_PAGE_SIZE >>
1976+ int page_entry_num = I915_GTT_PAGE_SIZE >>
19261977 vgpu->gvt->device_info.gtt_entry_size_shift;
19271978 void *scratch_pt;
19281979 int i;
@@ -1946,7 +1997,7 @@ static int alloc_scratch_pages(struct intel_vgpu *vgpu, · 17 unmodified lines
19461997 return -ENOMEM;
19471998 }
19481999 gtt->scratch_pt[type].page_mfn =
1949− (unsigned long)(daddr >> GTT_PAGE_SHIFT);
2000+ (unsigned long)(daddr >> I915_GTT_PAGE_SHIFT);
19502001 gtt->scratch_pt[type].page = virt_to_page(scratch_pt);
19512002 gvt_dbg_mm("vgpu%d create scratch_pt: type %d mfn=0x%lx\n",
19522003 vgpu->id, type, gtt->scratch_pt[type].page_mfn);
@@ -1989,7 +2040,7 @@ static int release_scratch_page_tree(struct intel_vgpu *vgpu) · 36 unmodified lines
19892040 for (i = GTT_TYPE_PPGTT_PTE_PT; i < GTT_TYPE_MAX; i++) {
19902041 if (vgpu->gtt.scratch_pt[i].page != NULL) {
19912042 daddr = (dma_addr_t)(vgpu->gtt.scratch_pt[i].page_mfn <<
1992− GTT_PAGE_SHIFT);
2043+ I915_GTT_PAGE_SHIFT);
19932044 dma_unmap_page(dev, daddr, 4096, PCI_DMA_BIDIRECTIONAL);
19942045 __free_page(vgpu->gtt.scratch_pt[i].page);
19952046 vgpu->gtt.scratch_pt[i].page = NULL;
@@ -2032,7 +2083,7 @@ int intel_vgpu_init_gtt(struct intel_vgpu *vgpu) · 36 unmodified lines
20322083 struct intel_vgpu_gtt *gtt = &vgpu->gtt;
20332084 struct intel_vgpu_mm *ggtt_mm;
20342085
2035− hash_init(gtt->guest_page_hash_table);
2086+ hash_init(gtt->tracked_guest_page_hash_table);
20362087 hash_init(gtt->shadow_page_hash_table);
20372088
20382089 INIT_LIST_HEAD(&gtt->mm_list_head);
@@ -2285,15 +2336,16 @@ int intel_gvt_init_gtt(struct intel_gvt *gvt) · 246 unmodified lines
22852336 __free_page(virt_to_page(page));
22862337 return -ENOMEM;
22872338 }
2288− gvt->gtt.scratch_ggtt_page = virt_to_page(page);
2289− gvt->gtt.scratch_ggtt_mfn = (unsigned long)(daddr >> GTT_PAGE_SHIFT);
2339+
2340+ gvt->gtt.scratch_page = virt_to_page(page);
2341+ gvt->gtt.scratch_mfn = (unsigned long)(daddr >> I915_GTT_PAGE_SHIFT);
22902342
22912343 if (enable_out_of_sync) {
22922344 ret = setup_spt_oos(gvt);
22932345 if (ret) {
22942346 gvt_err("fail to initialize SPT oos\n");
22952347 dma_unmap_page(dev, daddr, 4096, PCI_DMA_BIDIRECTIONAL);
2296− __free_page(gvt->gtt.scratch_ggtt_page);
2348+ __free_page(gvt->gtt.scratch_page);
22972349 return ret;
22982350 }
22992351 }
@@ -2312,12 +2364,12 @@ int intel_gvt_init_gtt(struct intel_gvt *gvt) · 12 unmodified lines
23122364 void intel_gvt_clean_gtt(struct intel_gvt *gvt)
23132365 {
23142366 struct device *dev = &gvt->dev_priv->drm.pdev->dev;
2315− dma_addr_t daddr = (dma_addr_t)(gvt->gtt.scratch_ggtt_mfn <<
2316− GTT_PAGE_SHIFT);
2367+ dma_addr_t daddr = (dma_addr_t)(gvt->gtt.scratch_mfn <<
2368+ I915_GTT_PAGE_SHIFT);
23172369
23182370 dma_unmap_page(dev, daddr, 4096, PCI_DMA_BIDIRECTIONAL);
23192371
2320− __free_page(gvt->gtt.scratch_ggtt_page);
2372+ __free_page(gvt->gtt.scratch_page);
23212373
23222374 if (enable_out_of_sync)
23232375 clean_spt_oos(gvt);
@@ -2343,7 +2395,7 @@ void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu) · 19 unmodified lines
23432395
23442396 memset(&e, 0, sizeof(struct intel_gvt_gtt_entry));
23452397 e.type = GTT_TYPE_GGTT_PTE;
2346− ops->set_pfn(&e, gvt->gtt.scratch_ggtt_mfn);
2398+ ops->set_pfn(&e, gvt->gtt.scratch_mfn);
23472399 e.val64 |= _PAGE_PRESENT;
23482400
23492401 index = vgpu_aperture_gmadr_base(vgpu) >> PAGE_SHIFT;
@@ -2369,8 +2421,6 @@ void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu) · 19 unmodified lines
23692421 */
23702422 void intel_vgpu_reset_gtt(struct intel_vgpu *vgpu)
23712423 {
2372− int i;
2373−
23742424 ppgtt_free_all_shadow_page(vgpu);
23752425
23762426 /* Shadow pages are only created when there is no page
@@ -2380,11 +2430,4 @@ void intel_vgpu_reset_gtt(struct intel_vgpu *vgpu) · 3 unmodified lines
23802430 intel_vgpu_free_mm(vgpu, INTEL_GVT_MM_PPGTT);
23812431
23822432 intel_vgpu_reset_ggtt(vgpu);
2383−
2384− /* clear scratch page for security */
2385− for (i = GTT_TYPE_PPGTT_PTE_PT; i < GTT_TYPE_MAX; i++) {
2386− if (vgpu->gtt.scratch_pt[i].page != NULL)
2387− memset(page_address(vgpu->gtt.scratch_pt[i].page),
2388− 0, PAGE_SIZE);
2389− }
23902433 }
drivers/gpu/drm/i915/gvt/gtt.h+19−23
@@ -34,9 +34,8 @@ · 33 unmodified lines
3434 #ifndef _GVT_GTT_H_
3535 #define _GVT_GTT_H_
3636
37−#define GTT_PAGE_SHIFT 12
38−#define GTT_PAGE_SIZE (1UL << GTT_PAGE_SHIFT)
39−#define GTT_PAGE_MASK (~(GTT_PAGE_SIZE-1))
37+#define I915_GTT_PAGE_SHIFT 12
38+#define I915_GTT_PAGE_MASK (~(I915_GTT_PAGE_SIZE - 1))
4039
4140 struct intel_vgpu_mm;
4241
@@ -63,6 +62,7 @@ struct intel_gvt_gtt_pte_ops { · 20 unmodified lines
6362 struct intel_vgpu *vgpu);
6463 bool (*test_present)(struct intel_gvt_gtt_entry *e);
6564 void (*clear_present)(struct intel_gvt_gtt_entry *e);
65+ void (*set_present)(struct intel_gvt_gtt_entry *e);
6666 bool (*test_pse)(struct intel_gvt_gtt_entry *e);
6767 void (*set_pfn)(struct intel_gvt_gtt_entry *e, unsigned long pfn);
6868 unsigned long (*get_pfn)(struct intel_gvt_gtt_entry *e);
@@ -86,8 +86,8 @@ struct intel_gvt_gtt { · 17 unmodified lines
8686 struct list_head oos_page_free_list_head;
8787 struct list_head mm_lru_list_head;
8888
89− struct page *scratch_ggtt_page;
90− unsigned long scratch_ggtt_mfn;
89+ struct page *scratch_page;
90+ unsigned long scratch_mfn;
9191 };
9292
9393 enum {
@@ -193,18 +193,16 @@ struct intel_vgpu_scratch_pt { · 99 unmodified lines
193193 unsigned long page_mfn;
194194 };
195195
196−
197196 struct intel_vgpu_gtt {
198197 struct intel_vgpu_mm *ggtt_mm;
199198 unsigned long active_ppgtt_mm_bitmap;
200199 struct list_head mm_list_head;
201200 DECLARE_HASHTABLE(shadow_page_hash_table, INTEL_GVT_GTT_HASH_BITS);
202− DECLARE_HASHTABLE(guest_page_hash_table, INTEL_GVT_GTT_HASH_BITS);
203− atomic_t n_write_protected_guest_page;
201+ DECLARE_HASHTABLE(tracked_guest_page_hash_table, INTEL_GVT_GTT_HASH_BITS);
202+ atomic_t n_tracked_guest_page;
204203 struct list_head oos_page_list_head;
205204 struct list_head post_shadow_list_head;
206205 struct intel_vgpu_scratch_pt scratch_pt[GTT_TYPE_MAX];
207−
208206 };
209207
210208 extern int intel_vgpu_init_gtt(struct intel_vgpu *vgpu);
@@ -228,12 +226,16 @@ struct intel_vgpu_shadow_page { · 17 unmodified lines
228226 unsigned long mfn;
229227 };
230228
231−struct intel_vgpu_guest_page {
229+struct intel_vgpu_page_track {
232230 struct hlist_node node;
233− bool writeprotection;
231+ bool tracked;
234232 unsigned long gfn;
235233 int (*handler)(void *, u64, void *, int);
236234 void *data;
235+};
236+
237+struct intel_vgpu_guest_page {
238+ struct intel_vgpu_page_track track;
237239 unsigned long write_cnt;
238240 struct intel_vgpu_oos_page *oos_page;
239241 };
@@ -243,7 +245,7 @@ struct intel_vgpu_oos_page { · 3 unmodified lines
243245 struct list_head list;
244246 struct list_head vm_list;
245247 int id;
246− unsigned char mem[GTT_PAGE_SIZE];
248+ unsigned char mem[I915_GTT_PAGE_SIZE];
247249 };
248250
249251 #define GTT_ENTRY_NUM_IN_ONE_PAGE 512
@@ -258,22 +260,16 @@ struct intel_vgpu_ppgtt_spt { · 8 unmodified lines
258260 struct list_head post_shadow_list;
259261 };
260262
261−int intel_vgpu_init_guest_page(struct intel_vgpu *vgpu,
262− struct intel_vgpu_guest_page *guest_page,
263+int intel_vgpu_init_page_track(struct intel_vgpu *vgpu,
264+ struct intel_vgpu_page_track *t,
263265 unsigned long gfn,
264266 int (*handler)(void *gp, u64, void *, int),
265267 void *data);
266268
267−void intel_vgpu_clean_guest_page(struct intel_vgpu *vgpu,
268− struct intel_vgpu_guest_page *guest_page);
269−
270−int intel_vgpu_set_guest_page_writeprotection(struct intel_vgpu *vgpu,
271− struct intel_vgpu_guest_page *guest_page);
272−
273−void intel_vgpu_clear_guest_page_writeprotection(struct intel_vgpu *vgpu,
274− struct intel_vgpu_guest_page *guest_page);
269+void intel_vgpu_clean_page_track(struct intel_vgpu *vgpu,
270+ struct intel_vgpu_page_track *t);
275271
276−struct intel_vgpu_guest_page *intel_vgpu_find_guest_page(
272+struct intel_vgpu_page_track *intel_vgpu_find_tracked_page(
277273 struct intel_vgpu *vgpu, unsigned long gfn);
278274
279275 int intel_vgpu_sync_oos_pages(struct intel_vgpu *vgpu);
drivers/gpu/drm/i915/gvt/gvt.c+140−8
@@ -36,6 +36,8 @@ · 35 unmodified lines
3636
3737 #include "i915_drv.h"
3838 #include "gvt.h"
39+#include <linux/vfio.h>
40+#include <linux/mdev.h>
3941
4042 struct intel_gvt_host intel_gvt_host;
4143
@@ -44,6 +46,129 @@ static const char * const supported_hypervisors[] = { · 2 unmodified lines
4446 [INTEL_GVT_HYPERVISOR_KVM] = "KVM",
4547 };
4648
49+static struct intel_vgpu_type *intel_gvt_find_vgpu_type(struct intel_gvt *gvt,
50+ const char *name)
51+{
52+ int i;
53+ struct intel_vgpu_type *t;
54+ const char *driver_name = dev_driver_string(
55+ &gvt->dev_priv->drm.pdev->dev);
56+
57+ for (i = 0; i < gvt->num_types; i++) {
58+ t = &gvt->types[i];
59+ if (!strncmp(t->name, name + strlen(driver_name) + 1,
60+ sizeof(t->name)))
61+ return t;
62+ }
63+
64+ return NULL;
65+}
66+
67+static ssize_t available_instances_show(struct kobject *kobj,
68+ struct device *dev, char *buf)
69+{
70+ struct intel_vgpu_type *type;
71+ unsigned int num = 0;
72+ void *gvt = kdev_to_i915(dev)->gvt;
73+
74+ type = intel_gvt_find_vgpu_type(gvt, kobject_name(kobj));
75+ if (!type)
76+ num = 0;
77+ else
78+ num = type->avail_instance;
79+
80+ return sprintf(buf, "%u\n", num);
81+}
82+
83+static ssize_t device_api_show(struct kobject *kobj, struct device *dev,
84+ char *buf)
85+{
86+ return sprintf(buf, "%s\n", VFIO_DEVICE_API_PCI_STRING);
87+}
88+
89+static ssize_t description_show(struct kobject *kobj, struct device *dev,
90+ char *buf)
91+{
92+ struct intel_vgpu_type *type;
93+ void *gvt = kdev_to_i915(dev)->gvt;
94+
95+ type = intel_gvt_find_vgpu_type(gvt, kobject_name(kobj));
96+ if (!type)
97+ return 0;
98+
99+ return sprintf(buf, "low_gm_size: %dMB\nhigh_gm_size: %dMB\n"
100+ "fence: %d\nresolution: %s\n"
101+ "weight: %d\n",
102+ BYTES_TO_MB(type->low_gm_size),
103+ BYTES_TO_MB(type->high_gm_size),
104+ type->fence, vgpu_edid_str(type->resolution),
105+ type->weight);
106+}
107+
108+static MDEV_TYPE_ATTR_RO(available_instances);
109+static MDEV_TYPE_ATTR_RO(device_api);
110+static MDEV_TYPE_ATTR_RO(description);
111+
112+static struct attribute *gvt_type_attrs[] = {
113+ &mdev_type_attr_available_instances.attr,
114+ &mdev_type_attr_device_api.attr,
115+ &mdev_type_attr_description.attr,
116+ NULL,
117+};
118+
119+static struct attribute_group *gvt_vgpu_type_groups[] = {
120+ [0 ... NR_MAX_INTEL_VGPU_TYPES - 1] = NULL,
121+};
122+
123+static bool intel_get_gvt_attrs(struct attribute ***type_attrs,
124+ struct attribute_group ***intel_vgpu_type_groups)
125+{
126+ *type_attrs = gvt_type_attrs;
127+ *intel_vgpu_type_groups = gvt_vgpu_type_groups;
128+ return true;
129+}
130+
131+static bool intel_gvt_init_vgpu_type_groups(struct intel_gvt *gvt)
132+{
133+ int i, j;
134+ struct intel_vgpu_type *type;
135+ struct attribute_group *group;
136+
137+ for (i = 0; i < gvt->num_types; i++) {
138+ type = &gvt->types[i];
139+
140+ group = kzalloc(sizeof(struct attribute_group), GFP_KERNEL);
141+ if (WARN_ON(!group))
142+ goto unwind;
143+
144+ group->name = type->name;
145+ group->attrs = gvt_type_attrs;
146+ gvt_vgpu_type_groups[i] = group;
147+ }
148+
149+ return true;
150+
151+unwind:
152+ for (j = 0; j < i; j++) {
153+ group = gvt_vgpu_type_groups[j];
154+ kfree(group);
155+ }
156+
157+ return false;
158+}
159+
160+static void intel_gvt_cleanup_vgpu_type_groups(struct intel_gvt *gvt)
161+{
162+ int i;
163+ struct attribute_group *group;
164+
165+ for (i = 0; i < gvt->num_types; i++) {
166+ group = gvt_vgpu_type_groups[i];
167+ gvt_vgpu_type_groups[i] = NULL;
168+ kfree(group);
169+ }
170+}
171+
47172 static const struct intel_gvt_ops intel_gvt_ops = {
48173 .emulate_cfg_read = intel_vgpu_emulate_cfg_read,
49174 .emulate_cfg_write = intel_vgpu_emulate_cfg_write,
@@ -54,6 +179,8 @@ static const struct intel_gvt_ops intel_gvt_ops = { · 4 unmodified lines
54179 .vgpu_reset = intel_gvt_reset_vgpu,
55180 .vgpu_activate = intel_gvt_activate_vgpu,
56181 .vgpu_deactivate = intel_gvt_deactivate_vgpu,
182+ .gvt_find_vgpu_type = intel_gvt_find_vgpu_type,
183+ .get_gvt_attrs = intel_get_gvt_attrs,
57184 };
58185
59186 /**
@@ -191,17 +318,18 @@ void intel_gvt_clean_device(struct drm_i915_private *dev_priv) · 131 unmodified lines
191318 if (WARN_ON(!gvt))
192319 return;
193320
321+ intel_gvt_debugfs_clean(gvt);
194322 clean_service_thread(gvt);
195323 intel_gvt_clean_cmd_parser(gvt);
196324 intel_gvt_clean_sched_policy(gvt);
197325 intel_gvt_clean_workload_scheduler(gvt);
198− intel_gvt_clean_opregion(gvt);
199326 intel_gvt_clean_gtt(gvt);
200327 intel_gvt_clean_irq(gvt);
201328 intel_gvt_clean_mmio_info(gvt);
202329 intel_gvt_free_firmware(gvt);
203330
204331 intel_gvt_hypervisor_host_exit(&dev_priv->drm.pdev->dev, gvt);
332+ intel_gvt_cleanup_vgpu_type_groups(gvt);
205333 intel_gvt_clean_vgpu_types(gvt);
206334
207335 idr_destroy(&gvt->vgpu_idr);
@@ -268,13 +396,9 @@ int intel_gvt_init_device(struct drm_i915_private *dev_priv) · 60 unmodified lines
268396 if (ret)
269397 goto out_clean_irq;
270398
271− ret = intel_gvt_init_opregion(gvt);
272− if (ret)
273− goto out_clean_gtt;
274−
275399 ret = intel_gvt_init_workload_scheduler(gvt);
276400 if (ret)
277− goto out_clean_opregion;
401+ goto out_clean_gtt;
278402
279403 ret = intel_gvt_init_sched_policy(gvt);
280404 if (ret)
@@ -292,6 +416,12 @@ int intel_gvt_init_device(struct drm_i915_private *dev_priv) · 11 unmodified lines
292416 if (ret)
293417 goto out_clean_thread;
294418
419+ ret = intel_gvt_init_vgpu_type_groups(gvt);
420+ if (ret == false) {
421+ gvt_err("failed to init vgpu type groups: %d\n", ret);
422+ goto out_clean_types;
423+ }
424+
295425 ret = intel_gvt_hypervisor_host_init(&dev_priv->drm.pdev->dev, gvt,
296426 &intel_gvt_ops);
297427 if (ret) {
@@ -307,6 +437,10 @@ int intel_gvt_init_device(struct drm_i915_private *dev_priv) · 9 unmodified lines
307437 }
308438 gvt->idle_vgpu = vgpu;
309439
440+ ret = intel_gvt_debugfs_init(gvt);
441+ if (ret)
442+ gvt_err("debugfs registeration failed, go on.\n");
443+
310444 gvt_dbg_core("gvt device initialization is done\n");
311445 dev_priv->gvt = gvt;
312446 return 0;
@@ -321,8 +455,6 @@ out_clean_sched_policy: · 8 unmodified lines
321455 intel_gvt_clean_sched_policy(gvt);
322456 out_clean_workload_scheduler:
323457 intel_gvt_clean_workload_scheduler(gvt);
324−out_clean_opregion:
325− intel_gvt_clean_opregion(gvt);
326458 out_clean_gtt:
327459 intel_gvt_clean_gtt(gvt);
328460 out_clean_irq:
drivers/gpu/drm/i915/gvt/gvt.h+50−21
@@ -125,7 +125,6 @@ struct intel_vgpu_irq { · 124 unmodified lines
125125 struct intel_vgpu_opregion {
126126 void *va;
127127 u32 gfn[INTEL_GVT_OPREGION_PAGES];
128− struct page *pages[INTEL_GVT_OPREGION_PAGES];
129128 };
130129
131130 #define vgpu_opregion(vgpu) (&(vgpu->opregion))
@@ -142,6 +141,33 @@ struct vgpu_sched_ctl { · 10 unmodified lines
142141 int weight;
143142 };
144143
144+enum {
145+ INTEL_VGPU_EXECLIST_SUBMISSION = 1,
146+ INTEL_VGPU_GUC_SUBMISSION,
147+};
148+
149+struct intel_vgpu_submission_ops {
150+ const char *name;
151+ int (*init)(struct intel_vgpu *vgpu);
152+ void (*clean)(struct intel_vgpu *vgpu);
153+ void (*reset)(struct intel_vgpu *vgpu, unsigned long engine_mask);
154+};
155+
156+struct intel_vgpu_submission {
157+ struct intel_vgpu_execlist execlist[I915_NUM_ENGINES];
158+ struct list_head workload_q_head[I915_NUM_ENGINES];
159+ struct kmem_cache *workloads;
160+ atomic_t running_workload_num;
161+ struct i915_gem_context *shadow_ctx;
162+ DECLARE_BITMAP(shadow_ctx_desc_updated, I915_NUM_ENGINES);
163+ DECLARE_BITMAP(tlb_handle_pending, I915_NUM_ENGINES);
164+ void *ring_scan_buffer[I915_NUM_ENGINES];
165+ int ring_scan_buffer_size[I915_NUM_ENGINES];
166+ const struct intel_vgpu_submission_ops *ops;
167+ int virtual_submission_interface;
168+ bool active;
169+};
170+
145171 struct intel_vgpu {
146172 struct intel_gvt *gvt;
147173 int id;
@@ -161,16 +187,10 @@ struct intel_vgpu { · 13 unmodified lines
161187 struct intel_vgpu_gtt gtt;
162188 struct intel_vgpu_opregion opregion;
163189 struct intel_vgpu_display display;
164− struct intel_vgpu_execlist execlist[I915_NUM_ENGINES];
165− struct list_head workload_q_head[I915_NUM_ENGINES];
166− struct kmem_cache *workloads;
167− atomic_t running_workload_num;
168− /* 1/2K for each reserve ring buffer */
169− void *reserve_ring_buffer_va[I915_NUM_ENGINES];
170− int reserve_ring_buffer_size[I915_NUM_ENGINES];
171− DECLARE_BITMAP(tlb_handle_pending, I915_NUM_ENGINES);
172− struct i915_gem_context *shadow_ctx;
173− DECLARE_BITMAP(shadow_ctx_desc_updated, I915_NUM_ENGINES);
190+ struct intel_vgpu_submission submission;
191+ u32 hws_pga[I915_NUM_ENGINES];
192+
193+ struct dentry *debugfs;
174194
175195 #if IS_ENABLED(CONFIG_DRM_I915_GVT_KVMGT)
176196 struct {
@@ -190,6 +210,10 @@ struct intel_vgpu { · 13 unmodified lines
190210 #endif
191211 };
192212
213+/* validating GM healthy status*/
214+#define vgpu_is_vm_unhealthy(ret_val) \
215+ (((ret_val) == -EBADRQC) || ((ret_val) == -EFAULT))
216+
193217 struct intel_gvt_gm {
194218 unsigned long vgpu_allocated_low_gm_size;
195219 unsigned long vgpu_allocated_high_gm_size;
@@ -231,7 +255,7 @@ struct intel_gvt_mmio { · 35 unmodified lines
231255 unsigned int num_mmio_block;
232256
233257 DECLARE_HASHTABLE(mmio_info_table, INTEL_GVT_MMIO_HASH_BITS);
234− unsigned int num_tracked_mmio;
258+ unsigned long num_tracked_mmio;
235259 };
236260
237261 struct intel_gvt_firmware {
@@ -240,11 +264,6 @@ struct intel_gvt_firmware { · 2 unmodified lines
240264 bool firmware_loaded;
241265 };
242266
243−struct intel_gvt_opregion {
244− void *opregion_va;
245− u32 opregion_pa;
246−};
247−
248267 #define NR_MAX_INTEL_VGPU_TYPES 20
249268 struct intel_vgpu_type {
250269 char name[16];
@@ -268,7 +287,6 @@ struct intel_gvt { · 17 unmodified lines
268287 struct intel_gvt_firmware firmware;
269288 struct intel_gvt_irq irq;
270289 struct intel_gvt_gtt gtt;
271− struct intel_gvt_opregion opregion;
272290 struct intel_gvt_workload_scheduler scheduler;
273291 struct notifier_block shadow_ctx_notifier_block[I915_NUM_ENGINES];
274292 DECLARE_HASHTABLE(cmd_table, GVT_CMD_HASH_BITS);
@@ -279,6 +297,8 @@ struct intel_gvt { · 4 unmodified lines
279297 struct task_struct *service_thread;
280298 wait_queue_head_t service_thread_wq;
281299 unsigned long service_request;
300+
301+ struct dentry *debugfs_root;
282302 };
283303
284304 static inline struct intel_gvt *to_gvt(struct drm_i915_private *i915)
@@ -484,9 +504,6 @@ static inline u64 intel_vgpu_get_bar_gpa(struct intel_vgpu *vgpu, int bar) · 199 unmodified lines
484504 PCI_BASE_ADDRESS_MEM_MASK;
485505 }
486506
487−void intel_gvt_clean_opregion(struct intel_gvt *gvt);
488−int intel_gvt_init_opregion(struct intel_gvt *gvt);
489−
490507 void intel_vgpu_clean_opregion(struct intel_vgpu *vgpu);
491508 int intel_vgpu_init_opregion(struct intel_vgpu *vgpu, u32 gpa);
492509
@@ -494,6 +511,7 @@ int intel_vgpu_emulate_opregion_request(struct intel_vgpu *vgpu, u32 swsci); · 1 unmodified line
494511 void populate_pvinfo_page(struct intel_vgpu *vgpu);
495512
496513 int intel_gvt_scan_and_shadow_workload(struct intel_vgpu_workload *workload);
514+void enter_failsafe_mode(struct intel_vgpu *vgpu, int reason);
497515
498516 struct intel_gvt_ops {
499517 int (*emulate_cfg_read)(struct intel_vgpu *, unsigned int, void *,
@@ -510,12 +528,17 @@ struct intel_gvt_ops { · 10 unmodified lines
510528 void (*vgpu_reset)(struct intel_vgpu *);
511529 void (*vgpu_activate)(struct intel_vgpu *);
512530 void (*vgpu_deactivate)(struct intel_vgpu *);
531+ struct intel_vgpu_type *(*gvt_find_vgpu_type)(struct intel_gvt *gvt,
532+ const char *name);
533+ bool (*get_gvt_attrs)(struct attribute ***type_attrs,
534+ struct attribute_group ***intel_vgpu_type_groups);
513535 };
514536
515537
516538 enum {
517539 GVT_FAILSAFE_UNSUPPORTED_GUEST,
518540 GVT_FAILSAFE_INSUFFICIENT_RESOURCE,
541+ GVT_FAILSAFE_GUEST_ERR,
519542 };
520543
521544 static inline void mmio_hw_access_pre(struct drm_i915_private *dev_priv)
@@ -591,6 +614,12 @@ static inline bool intel_gvt_mmio_has_mode_mask( · 69 unmodified lines
591614 return gvt->mmio.mmio_attribute[offset >> 2] & F_MODE_MASK;
592615 }
593616
617+int intel_gvt_debugfs_add_vgpu(struct intel_vgpu *vgpu);
618+void intel_gvt_debugfs_remove_vgpu(struct intel_vgpu *vgpu);
619+int intel_gvt_debugfs_init(struct intel_gvt *gvt);
620+void intel_gvt_debugfs_clean(struct intel_gvt *gvt);
621+
622+
594623 #include "trace.h"
595624 #include "mpt.h"
596625
drivers/gpu/drm/i915/gvt/handlers.c+120−19
@@ -137,17 +137,26 @@ static int new_mmio_info(struct intel_gvt *gvt, · 136 unmodified lines
137137 return 0;
138138 }
139139
140−static int render_mmio_to_ring_id(struct intel_gvt *gvt, unsigned int reg)
140+/**
141+ * intel_gvt_render_mmio_to_ring_id - convert a mmio offset into ring id
142+ * @gvt: a GVT device
143+ * @offset: register offset
144+ *
145+ * Returns:
146+ * Ring ID on success, negative error code if failed.
147+ */
148+int intel_gvt_render_mmio_to_ring_id(struct intel_gvt *gvt,
149+ unsigned int offset)
141150 {
142151 enum intel_engine_id id;
143152 struct intel_engine_cs *engine;
144153
145− reg &= ~GENMASK(11, 0);
154+ offset &= ~GENMASK(11, 0);
146155 for_each_engine(engine, gvt->dev_priv, id) {
147− if (engine->mmio_base == reg)
156+ if (engine->mmio_base == offset)
148157 return id;
149158 }
150− return -1;
159+ return -ENODEV;
151160 }
152161
153162 #define offset_to_fence_num(offset) \
@@ -157,7 +166,7 @@ static int render_mmio_to_ring_id(struct intel_gvt *gvt, unsigned int reg) · 3 unmodified lines
157166 (num * 8 + i915_mmio_reg_offset(FENCE_REG_GEN6_LO(0)))
158167
159168
160−static void enter_failsafe_mode(struct intel_vgpu *vgpu, int reason)
169+void enter_failsafe_mode(struct intel_vgpu *vgpu, int reason)
161170 {
162171 switch (reason) {
163172 case GVT_FAILSAFE_UNSUPPORTED_GUEST:
@@ -165,6 +174,8 @@ static void enter_failsafe_mode(struct intel_vgpu *vgpu, int reason) · 1 unmodified line
165174 break;
166175 case GVT_FAILSAFE_INSUFFICIENT_RESOURCE:
167176 pr_err("Graphics resource is not enough for the guest\n");
177+ case GVT_FAILSAFE_GUEST_ERR:
178+ pr_err("GVT Internal error for the guest\n");
168179 default:
169180 break;
170181 }
@@ -1369,6 +1380,34 @@ static int mailbox_write(struct intel_vgpu *vgpu, unsigned int offset, · 1198 unmodified lines
13691380 return intel_vgpu_default_mmio_write(vgpu, offset, &value, bytes);
13701381 }
13711382
1383+static int hws_pga_write(struct intel_vgpu *vgpu, unsigned int offset,
1384+ void *p_data, unsigned int bytes)
1385+{
1386+ u32 value = *(u32 *)p_data;
1387+ int ring_id = intel_gvt_render_mmio_to_ring_id(vgpu->gvt, offset);
1388+
1389+ if (!intel_gvt_ggtt_validate_range(vgpu, value, I915_GTT_PAGE_SIZE)) {
1390+ gvt_vgpu_err("VM(%d) write invalid HWSP address, reg:0x%x, value:0x%x\n",
1391+ vgpu->id, offset, value);
1392+ return -EINVAL;
1393+ }
1394+ /*
1395+ * Need to emulate all the HWSP register write to ensure host can
1396+ * update the VM CSB status correctly. Here listed registers can
1397+ * support BDW, SKL or other platforms with same HWSP registers.
1398+ */
1399+ if (unlikely(ring_id < 0 || ring_id > I915_NUM_ENGINES)) {
1400+ gvt_vgpu_err("VM(%d) access unknown hardware status page register:0x%x\n",
1401+ vgpu->id, offset);
1402+ return -EINVAL;
1403+ }
1404+ vgpu->hws_pga[ring_id] = value;
1405+ gvt_dbg_mmio("VM(%d) write: 0x%x to HWSP: 0x%x\n",
1406+ vgpu->id, value, offset);
1407+
1408+ return intel_vgpu_default_mmio_write(vgpu, offset, &value, bytes);
1409+}
1410+
13721411 static int skl_power_well_ctl_write(struct intel_vgpu *vgpu,
13731412 unsigned int offset, void *p_data, unsigned int bytes)
13741413 {
@@ -1398,18 +1437,36 @@ static int skl_lcpll_write(struct intel_vgpu *vgpu, unsigned int offset, · 23 unmodified lines
13981437 static int mmio_read_from_hw(struct intel_vgpu *vgpu,
13991438 unsigned int offset, void *p_data, unsigned int bytes)
14001439 {
1401− struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
1440+ struct intel_gvt *gvt = vgpu->gvt;
1441+ struct drm_i915_private *dev_priv = gvt->dev_priv;
1442+ int ring_id;
1443+ u32 ring_base;
1444+
1445+ ring_id = intel_gvt_render_mmio_to_ring_id(gvt, offset);
1446+ /**
1447+ * Read HW reg in following case
1448+ * a. the offset isn't a ring mmio
1449+ * b. the offset's ring is running on hw.
1450+ * c. the offset is ring time stamp mmio
1451+ */
1452+ if (ring_id >= 0)
1453+ ring_base = dev_priv->engine[ring_id]->mmio_base;
1454+
1455+ if (ring_id < 0 || vgpu == gvt->scheduler.engine_owner[ring_id] ||
1456+ offset == i915_mmio_reg_offset(RING_TIMESTAMP(ring_base)) ||
1457+ offset == i915_mmio_reg_offset(RING_TIMESTAMP_UDW(ring_base))) {
1458+ mmio_hw_access_pre(dev_priv);
1459+ vgpu_vreg(vgpu, offset) = I915_READ(_MMIO(offset));
1460+ mmio_hw_access_post(dev_priv);
1461+ }
14021462
1403− mmio_hw_access_pre(dev_priv);
1404− vgpu_vreg(vgpu, offset) = I915_READ(_MMIO(offset));
1405− mmio_hw_access_post(dev_priv);
14061463 return intel_vgpu_default_mmio_read(vgpu, offset, p_data, bytes);
14071464 }
14081465
14091466 static int elsp_mmio_write(struct intel_vgpu *vgpu, unsigned int offset,
14101467 void *p_data, unsigned int bytes)
14111468 {
1412− int ring_id = render_mmio_to_ring_id(vgpu->gvt, offset);
1469+ int ring_id = intel_gvt_render_mmio_to_ring_id(vgpu->gvt, offset);
14131470 struct intel_vgpu_execlist *execlist;
14141471 u32 data = *(u32 *)p_data;
14151472 int ret = 0;
@@ -1417,9 +1474,9 @@ static int elsp_mmio_write(struct intel_vgpu *vgpu, unsigned int offset, · 1 unmodified line
14171474 if (WARN_ON(ring_id < 0 || ring_id > I915_NUM_ENGINES - 1))
14181475 return -EINVAL;
14191476
1420− execlist = &vgpu->execlist[ring_id];
1477+ execlist = &vgpu->submission.execlist[ring_id];
14211478
1422− execlist->elsp_dwords.data[execlist->elsp_dwords.index] = data;
1479+ execlist->elsp_dwords.data[3 - execlist->elsp_dwords.index] = data;
14231480 if (execlist->elsp_dwords.index == 3) {
14241481 ret = intel_vgpu_submit_execlist(vgpu, ring_id);
14251482 if(ret)
@@ -1435,9 +1492,11 @@ static int elsp_mmio_write(struct intel_vgpu *vgpu, unsigned int offset, · 9 unmodified lines
14351492 static int ring_mode_mmio_write(struct intel_vgpu *vgpu, unsigned int offset,
14361493 void *p_data, unsigned int bytes)
14371494 {
1495+ struct intel_vgpu_submission *s = &vgpu->submission;
14381496 u32 data = *(u32 *)p_data;
1439− int ring_id = render_mmio_to_ring_id(vgpu->gvt, offset);
1497+ int ring_id = intel_gvt_render_mmio_to_ring_id(vgpu->gvt, offset);
14401498 bool enable_execlist;
1499+ int ret;
14411500
14421501 write_vreg(vgpu, offset, p_data, bytes);
14431502
@@ -1459,8 +1518,18 @@ static int ring_mode_mmio_write(struct intel_vgpu *vgpu, unsigned int offset, · 15 unmodified lines
14591518 (enable_execlist ? "enabling" : "disabling"),
14601519 ring_id);
14611520
1462− if (enable_execlist)
1463− intel_vgpu_start_schedule(vgpu);
1521+ if (!enable_execlist)
1522+ return 0;
1523+
1524+ if (s->active)
1525+ return 0;
1526+
1527+ ret = intel_vgpu_select_submission_ops(vgpu,
1528+ INTEL_VGPU_EXECLIST_SUBMISSION);
1529+ if (ret)
1530+ return ret;
1531+
1532+ intel_vgpu_start_schedule(vgpu);
14641533 }
14651534 return 0;
14661535 }
@@ -1492,7 +1561,7 @@ static int gvt_reg_tlb_control_handler(struct intel_vgpu *vgpu, · 25 unmodified lines
14921561 default:
14931562 return -EINVAL;
14941563 }
1495− set_bit(id, (void *)vgpu->tlb_handle_pending);
1564+ set_bit(id, (void *)vgpu->submission.tlb_handle_pending);
14961565
14971566 return 0;
14981567 }
@@ -2478,7 +2547,7 @@ static int init_broadwell_mmio_info(struct intel_gvt *gvt) · 979 unmodified lines
24782547 MMIO_RING_F(RING_REG, 32, 0, 0, 0, D_BDW_PLUS, NULL, NULL);
24792548 #undef RING_REG
24802549
2481− MMIO_RING_GM_RDR(RING_HWS_PGA, D_BDW_PLUS, NULL, NULL);
2550+ MMIO_RING_GM_RDR(RING_HWS_PGA, D_BDW_PLUS, NULL, hws_pga_write);
24822551
24832552 MMIO_DFH(HDC_CHICKEN0, D_BDW_PLUS, F_MODE_MASK | F_CMD_ACCESS, NULL, NULL);
24842553
@@ -2879,14 +2948,46 @@ int intel_gvt_setup_mmio_info(struct intel_gvt *gvt) · 394 unmodified lines
28792948 gvt->mmio.mmio_block = mmio_blocks;
28802949 gvt->mmio.num_mmio_block = ARRAY_SIZE(mmio_blocks);
28812950
2882− gvt_dbg_mmio("traced %u virtual mmio registers\n",
2883− gvt->mmio.num_tracked_mmio);
28842951 return 0;
28852952 err:
28862953 intel_gvt_clean_mmio_info(gvt);
28872954 return ret;
28882955 }
28892956
2957+/**
2958+ * intel_gvt_for_each_tracked_mmio - iterate each tracked mmio
2959+ * @gvt: a GVT device
2960+ * @handler: the handler
2961+ * @data: private data given to handler
2962+ *
2963+ * Returns:
2964+ * Zero on success, negative error code if failed.
2965+ */
2966+int intel_gvt_for_each_tracked_mmio(struct intel_gvt *gvt,
2967+ int (*handler)(struct intel_gvt *gvt, u32 offset, void *data),
2968+ void *data)
2969+{
2970+ struct gvt_mmio_block *block = gvt->mmio.mmio_block;
2971+ struct intel_gvt_mmio_info *e;
2972+ int i, j, ret;
2973+
2974+ hash_for_each(gvt->mmio.mmio_info_table, i, e, node) {
2975+ ret = handler(gvt, e->offset, data);
2976+ if (ret)
2977+ return ret;
2978+ }
2979+
2980+ for (i = 0; i < gvt->mmio.num_mmio_block; i++, block++) {
2981+ for (j = 0; j < block->size; j += 4) {
2982+ ret = handler(gvt,
2983+ INTEL_GVT_MMIO_OFFSET(block->offset) + j,
2984+ data);
2985+ if (ret)
2986+ return ret;
2987+ }
2988+ }
2989+ return 0;
2990+}
28902991
28912992 /**
28922993 * intel_vgpu_default_mmio_read - default MMIO read handler
drivers/gpu/drm/i915/gvt/kvmgt.c+9−121
@@ -248,120 +248,6 @@ static void gvt_cache_destroy(struct intel_vgpu *vgpu) · 247 unmodified lines
248248 }
249249 }
250250
251−static struct intel_vgpu_type *intel_gvt_find_vgpu_type(struct intel_gvt *gvt,
252− const char *name)
253−{
254− int i;
255− struct intel_vgpu_type *t;
256− const char *driver_name = dev_driver_string(
257− &gvt->dev_priv->drm.pdev->dev);
258−
259− for (i = 0; i < gvt->num_types; i++) {
260− t = &gvt->types[i];
261− if (!strncmp(t->name, name + strlen(driver_name) + 1,
262− sizeof(t->name)))
263− return t;
264− }
265−
266− return NULL;
267−}
268−
269−static ssize_t available_instances_show(struct kobject *kobj,
270− struct device *dev, char *buf)
271−{
272− struct intel_vgpu_type *type;
273− unsigned int num = 0;
274− void *gvt = kdev_to_i915(dev)->gvt;
275−
276− type = intel_gvt_find_vgpu_type(gvt, kobject_name(kobj));
277− if (!type)
278− num = 0;
279− else
280− num = type->avail_instance;
281−
282− return sprintf(buf, "%u\n", num);
283−}
284−
285−static ssize_t device_api_show(struct kobject *kobj, struct device *dev,
286− char *buf)
287−{
288− return sprintf(buf, "%s\n", VFIO_DEVICE_API_PCI_STRING);
289−}
290−
291−static ssize_t description_show(struct kobject *kobj, struct device *dev,
292− char *buf)
293−{
294− struct intel_vgpu_type *type;
295− void *gvt = kdev_to_i915(dev)->gvt;
296−
297− type = intel_gvt_find_vgpu_type(gvt, kobject_name(kobj));
298− if (!type)
299− return 0;
300−
301− return sprintf(buf, "low_gm_size: %dMB\nhigh_gm_size: %dMB\n"
302− "fence: %d\nresolution: %s\n"
303− "weight: %d\n",
304− BYTES_TO_MB(type->low_gm_size),
305− BYTES_TO_MB(type->high_gm_size),
306− type->fence, vgpu_edid_str(type->resolution),
307− type->weight);
308−}
309−
310−static MDEV_TYPE_ATTR_RO(available_instances);
311−static MDEV_TYPE_ATTR_RO(device_api);
312−static MDEV_TYPE_ATTR_RO(description);
313−
314−static struct attribute *type_attrs[] = {
315− &mdev_type_attr_available_instances.attr,
316− &mdev_type_attr_device_api.attr,
317− &mdev_type_attr_description.attr,
318− NULL,
319−};
320−
321−static struct attribute_group *intel_vgpu_type_groups[] = {
322− [0 ... NR_MAX_INTEL_VGPU_TYPES - 1] = NULL,
323−};
324−
325−static bool intel_gvt_init_vgpu_type_groups(struct intel_gvt *gvt)
326−{
327− int i, j;
328− struct intel_vgpu_type *type;
329− struct attribute_group *group;
330−
331− for (i = 0; i < gvt->num_types; i++) {
332− type = &gvt->types[i];
333−
334− group = kzalloc(sizeof(struct attribute_group), GFP_KERNEL);
335− if (WARN_ON(!group))
336− goto unwind;
337−
338− group->name = type->name;
339− group->attrs = type_attrs;
340− intel_vgpu_type_groups[i] = group;
341− }
342−
343− return true;
344−
345−unwind:
346− for (j = 0; j < i; j++) {
347− group = intel_vgpu_type_groups[j];
348− kfree(group);
349− }
350−
351− return false;
352−}
353−
354−static void intel_gvt_cleanup_vgpu_type_groups(struct intel_gvt *gvt)
355−{
356− int i;
357− struct attribute_group *group;
358−
359− for (i = 0; i < gvt->num_types; i++) {
360− group = intel_vgpu_type_groups[i];
361− kfree(group);
362− }
363−}
364−
365251 static void kvmgt_protect_table_init(struct kvmgt_guest_info *info)
366252 {
367253 hash_init(info->ptable);
@@ -441,7 +327,7 @@ static int intel_vgpu_create(struct kobject *kobj, struct mdev_device *mdev) · 73 unmodified lines
441327 pdev = mdev_parent_dev(mdev);
442328 gvt = kdev_to_i915(pdev)->gvt;
443329
444− type = intel_gvt_find_vgpu_type(gvt, kobject_name(kobj));
330+ type = intel_gvt_ops->gvt_find_vgpu_type(gvt, kobject_name(kobj));
445331 if (!type) {
446332 gvt_vgpu_err("failed to find type %s to create\n",
447333 kobject_name(kobj));
@@ -1188,7 +1074,7 @@ hw_id_show(struct device *dev, struct device_attribute *attr, · 740 unmodified lines
11881074 struct intel_vgpu *vgpu = (struct intel_vgpu *)
11891075 mdev_get_drvdata(mdev);
11901076 return sprintf(buf, "%u\n",
1191− vgpu->shadow_ctx->hw_id);
1077+ vgpu->submission.shadow_ctx->hw_id);
11921078 }
11931079 return sprintf(buf, "\n");
11941080 }
@@ -1212,8 +1098,7 @@ static const struct attribute_group *intel_vgpu_groups[] = { · 17 unmodified lines
12121098 NULL,
12131099 };
12141100
1215−static const struct mdev_parent_ops intel_vgpu_ops = {
1216− .supported_type_groups = intel_vgpu_type_groups,
1101+static struct mdev_parent_ops intel_vgpu_ops = {
12171102 .mdev_attr_groups = intel_vgpu_groups,
12181103 .create = intel_vgpu_create,
12191104 .remove = intel_vgpu_remove,
@@ -1229,17 +1114,20 @@ static const struct mdev_parent_ops intel_vgpu_ops = { · 9 unmodified lines
12291114
12301115 static int kvmgt_host_init(struct device *dev, void *gvt, const void *ops)
12311116 {
1232− if (!intel_gvt_init_vgpu_type_groups(gvt))
1233− return -EFAULT;
1117+ struct attribute **kvm_type_attrs;
1118+ struct attribute_group **kvm_vgpu_type_groups;
12341119
12351120 intel_gvt_ops = ops;
1121+ if (!intel_gvt_ops->get_gvt_attrs(&kvm_type_attrs,
1122+ &kvm_vgpu_type_groups))
1123+ return -EFAULT;
1124+ intel_vgpu_ops.supported_type_groups = kvm_vgpu_type_groups;
12361125
12371126 return mdev_register_device(dev, &intel_vgpu_ops);
12381127 }
12391128
12401129 static void kvmgt_host_exit(struct device *dev, void *gvt)
12411130 {
1242− intel_gvt_cleanup_vgpu_type_groups(gvt);
12431131 mdev_unregister_device(dev);
12441132 }
12451133
drivers/gpu/drm/i915/gvt/mmio.c+16−16
@@ -117,18 +117,18 @@ static void failsafe_emulate_mmio_rw(struct intel_vgpu *vgpu, uint64_t pa, · 116 unmodified lines
117117 else
118118 memcpy(pt, p_data, bytes);
119119
120− } else if (atomic_read(&vgpu->gtt.n_write_protected_guest_page)) {
121− struct intel_vgpu_guest_page *gp;
120+ } else if (atomic_read(&vgpu->gtt.n_tracked_guest_page)) {
121+ struct intel_vgpu_page_track *t;
122122
123123 /* Since we enter the failsafe mode early during guest boot,
124124 * guest may not have chance to set up its ppgtt table, so
125125 * there should not be any wp pages for guest. Keep the wp
126126 * related code here in case we need to handle it in furture.
127127 */
128− gp = intel_vgpu_find_guest_page(vgpu, pa >> PAGE_SHIFT);
129− if (gp) {
128+ t = intel_vgpu_find_tracked_page(vgpu, pa >> PAGE_SHIFT);
129+ if (t) {
130130 /* remove write protection to prevent furture traps */
131− intel_vgpu_clean_guest_page(vgpu, gp);
131+ intel_vgpu_clean_page_track(vgpu, t);
132132 if (read)
133133 intel_gvt_hypervisor_read_gpa(vgpu, pa,
134134 p_data, bytes);
@@ -170,17 +170,17 @@ int intel_vgpu_emulate_mmio_read(struct intel_vgpu *vgpu, uint64_t pa, · 35 unmodified lines
170170 return ret;
171171 }
172172
173− if (atomic_read(&vgpu->gtt.n_write_protected_guest_page)) {
174− struct intel_vgpu_guest_page *gp;
173+ if (atomic_read(&vgpu->gtt.n_tracked_guest_page)) {
174+ struct intel_vgpu_page_track *t;
175175
176− gp = intel_vgpu_find_guest_page(vgpu, pa >> PAGE_SHIFT);
177− if (gp) {
176+ t = intel_vgpu_find_tracked_page(vgpu, pa >> PAGE_SHIFT);
177+ if (t) {
178178 ret = intel_gvt_hypervisor_read_gpa(vgpu, pa,
179179 p_data, bytes);
180180 if (ret) {
181181 gvt_vgpu_err("guest page read error %d, "
182182 "gfn 0x%lx, pa 0x%llx, var 0x%x, len %d\n",
183− ret, gp->gfn, pa, *(u32 *)p_data,
183+ ret, t->gfn, pa, *(u32 *)p_data,
184184 bytes);
185185 }
186186 mutex_unlock(&gvt->lock);
@@ -267,17 +267,17 @@ int intel_vgpu_emulate_mmio_write(struct intel_vgpu *vgpu, uint64_t pa, · 80 unmodified lines
267267 return ret;
268268 }
269269
270− if (atomic_read(&vgpu->gtt.n_write_protected_guest_page)) {
271− struct intel_vgpu_guest_page *gp;
270+ if (atomic_read(&vgpu->gtt.n_tracked_guest_page)) {
271+ struct intel_vgpu_page_track *t;
272272
273− gp = intel_vgpu_find_guest_page(vgpu, pa >> PAGE_SHIFT);
274− if (gp) {
275− ret = gp->handler(gp, pa, p_data, bytes);
273+ t = intel_vgpu_find_tracked_page(vgpu, pa >> PAGE_SHIFT);
274+ if (t) {
275+ ret = t->handler(t, pa, p_data, bytes);
276276 if (ret) {
277277 gvt_err("guest page write error %d, "
278278 "gfn 0x%lx, pa 0x%llx, "
279279 "var 0x%x, len %d\n",
280− ret, gp->gfn, pa,
280+ ret, t->gfn, pa,
281281 *(u32 *)p_data, bytes);
282282 }
283283 mutex_unlock(&gvt->lock);
drivers/gpu/drm/i915/gvt/mmio.h+6−0
@@ -65,11 +65,17 @@ struct intel_gvt_mmio_info { · 64 unmodified lines
6565 struct hlist_node node;
6666 };
6767
68+int intel_gvt_render_mmio_to_ring_id(struct intel_gvt *gvt,
69+ unsigned int reg);
6870 unsigned long intel_gvt_get_device_type(struct intel_gvt *gvt);
6971 bool intel_gvt_match_device(struct intel_gvt *gvt, unsigned long device);
7072
7173 int intel_gvt_setup_mmio_info(struct intel_gvt *gvt);
7274 void intel_gvt_clean_mmio_info(struct intel_gvt *gvt);
75+int intel_gvt_for_each_tracked_mmio(struct intel_gvt *gvt,
76+ int (*handler)(struct intel_gvt *gvt, u32 offset, void *data),
77+ void *data);
78+
7379
7480 #define INTEL_GVT_MMIO_OFFSET(reg) ({ \
7581 typeof(reg) __reg = reg; \
drivers/gpu/drm/i915/gvt/mpt.h+18−16
@@ -154,51 +154,53 @@ static inline unsigned long intel_gvt_hypervisor_virt_to_mfn(void *p) · 153 unmodified lines
154154 }
155155
156156 /**
157− * intel_gvt_hypervisor_set_wp_page - set a guest page to write-protected
157+ * intel_gvt_hypervisor_enable - set a guest page to write-protected
158158 * @vgpu: a vGPU
159− * @p: intel_vgpu_guest_page
159+ * @t: page track data structure
160160 *
161161 * Returns:
162162 * Zero on success, negative error code if failed.
163163 */
164−static inline int intel_gvt_hypervisor_set_wp_page(struct intel_vgpu *vgpu,
165− struct intel_vgpu_guest_page *p)
164+static inline int intel_gvt_hypervisor_enable_page_track(
165+ struct intel_vgpu *vgpu,
166+ struct intel_vgpu_page_track *t)
166167 {
167168 int ret;
168169
169− if (p->writeprotection)
170+ if (t->tracked)
170171 return 0;
171172
172− ret = intel_gvt_host.mpt->set_wp_page(vgpu->handle, p->gfn);
173+ ret = intel_gvt_host.mpt->set_wp_page(vgpu->handle, t->gfn);
173174 if (ret)
174175 return ret;
175− p->writeprotection = true;
176− atomic_inc(&vgpu->gtt.n_write_protected_guest_page);
176+ t->tracked = true;
177+ atomic_inc(&vgpu->gtt.n_tracked_guest_page);
177178 return 0;
178179 }
179180
180181 /**
181− * intel_gvt_hypervisor_unset_wp_page - remove the write-protection of a
182+ * intel_gvt_hypervisor_disable_page_track - remove the write-protection of a
182183 * guest page
183184 * @vgpu: a vGPU
184− * @p: intel_vgpu_guest_page
185+ * @t: page track data structure
185186 *
186187 * Returns:
187188 * Zero on success, negative error code if failed.
188189 */
189−static inline int intel_gvt_hypervisor_unset_wp_page(struct intel_vgpu *vgpu,
190− struct intel_vgpu_guest_page *p)
190+static inline int intel_gvt_hypervisor_disable_page_track(
191+ struct intel_vgpu *vgpu,
192+ struct intel_vgpu_page_track *t)
191193 {
192194 int ret;
193195
194− if (!p->writeprotection)
196+ if (!t->tracked)
195197 return 0;
196198
197− ret = intel_gvt_host.mpt->unset_wp_page(vgpu->handle, p->gfn);
199+ ret = intel_gvt_host.mpt->unset_wp_page(vgpu->handle, t->gfn);
198200 if (ret)
199201 return ret;
200− p->writeprotection = false;
201− atomic_dec(&vgpu->gtt.n_write_protected_guest_page);
202+ t->tracked = false;
203+ atomic_dec(&vgpu->gtt.n_tracked_guest_page);
202204 return 0;
203205 }
204206
drivers/gpu/drm/i915/gvt/opregion.c+226−49
@@ -25,36 +25,247 @@ · 24 unmodified lines
2525 #include "i915_drv.h"
2626 #include "gvt.h"
2727
28−static int init_vgpu_opregion(struct intel_vgpu *vgpu, u32 gpa)
28+/*
29+ * Note: Only for GVT-g virtual VBT generation, other usage must
30+ * not do like this.
31+ */
32+#define _INTEL_BIOS_PRIVATE
33+#include "intel_vbt_defs.h"
34+
35+#define OPREGION_SIGNATURE "IntelGraphicsMem"
36+#define MBOX_VBT (1<<3)
37+
38+/* device handle */
39+#define DEVICE_TYPE_CRT 0x01
40+#define DEVICE_TYPE_EFP1 0x04
41+#define DEVICE_TYPE_EFP2 0x40
42+#define DEVICE_TYPE_EFP3 0x20
43+#define DEVICE_TYPE_EFP4 0x10
44+
45+#define DEV_SIZE 38
46+
47+struct opregion_header {
48+ u8 signature[16];
49+ u32 size;
50+ u32 opregion_ver;
51+ u8 bios_ver[32];
52+ u8 vbios_ver[16];
53+ u8 driver_ver[16];
54+ u32 mboxes;
55+ u32 driver_model;
56+ u32 pcon;
57+ u8 dver[32];
58+ u8 rsvd[124];
59+} __packed;
60+
61+struct bdb_data_header {
62+ u8 id;
63+ u16 size; /* data size */
64+} __packed;
65+
66+struct efp_child_device_config {
67+ u16 handle;
68+ u16 device_type;
69+ u16 device_class;
70+ u8 i2c_speed;
71+ u8 dp_onboard_redriver; /* 158 */
72+ u8 dp_ondock_redriver; /* 158 */
73+ u8 hdmi_level_shifter_value:4; /* 169 */
74+ u8 hdmi_max_data_rate:4; /* 204 */
75+ u16 dtd_buf_ptr; /* 161 */
76+ u8 edidless_efp:1; /* 161 */
77+ u8 compression_enable:1; /* 198 */
78+ u8 compression_method:1; /* 198 */
79+ u8 ganged_edp:1; /* 202 */
80+ u8 skip0:4;
81+ u8 compression_structure_index:4; /* 198 */
82+ u8 skip1:4;
83+ u8 slave_port; /* 202 */
84+ u8 skip2;
85+ u8 dvo_port;
86+ u8 i2c_pin; /* for add-in card */
87+ u8 slave_addr; /* for add-in card */
88+ u8 ddc_pin;
89+ u16 edid_ptr;
90+ u8 dvo_config;
91+ u8 efp_docked_port:1; /* 158 */
92+ u8 lane_reversal:1; /* 184 */
93+ u8 onboard_lspcon:1; /* 192 */
94+ u8 iboost_enable:1; /* 196 */
95+ u8 hpd_invert:1; /* BXT 196 */
96+ u8 slip3:3;
97+ u8 hdmi_compat:1;
98+ u8 dp_compat:1;
99+ u8 tmds_compat:1;
100+ u8 skip4:5;
101+ u8 aux_channel;
102+ u8 dongle_detect;
103+ u8 pipe_cap:2;
104+ u8 sdvo_stall:1; /* 158 */
105+ u8 hpd_status:2;
106+ u8 integrated_encoder:1;
107+ u8 skip5:2;
108+ u8 dvo_wiring;
109+ u8 mipi_bridge_type; /* 171 */
110+ u16 device_class_ext;
111+ u8 dvo_function;
112+ u8 dp_usb_type_c:1; /* 195 */
113+ u8 skip6:7;
114+ u8 dp_usb_type_c_2x_gpio_index; /* 195 */
115+ u16 dp_usb_type_c_2x_gpio_pin; /* 195 */
116+ u8 iboost_dp:4; /* 196 */
117+ u8 iboost_hdmi:4; /* 196 */
118+} __packed;
119+
120+struct vbt {
121+ /* header->bdb_offset point to bdb_header offset */
122+ struct vbt_header header;
123+ struct bdb_header bdb_header;
124+
125+ struct bdb_data_header general_features_header;
126+ struct bdb_general_features general_features;
127+
128+ struct bdb_data_header general_definitions_header;
129+ struct bdb_general_definitions general_definitions;
130+
131+ struct efp_child_device_config child0;
132+ struct efp_child_device_config child1;
133+ struct efp_child_device_config child2;
134+ struct efp_child_device_config child3;
135+
136+ struct bdb_data_header driver_features_header;
137+ struct bdb_driver_features driver_features;
138+};
139+
140+static void virt_vbt_generation(struct vbt *v)
29141 {
30− u8 *buf;
31− int i;
142+ int num_child;
143+
144+ memset(v, 0, sizeof(struct vbt));
145+
146+ v->header.signature[0] = '$';
147+ v->header.signature[1] = 'V';
148+ v->header.signature[2] = 'B';
149+ v->header.signature[3] = 'T';
150+
151+ /* there's features depending on version! */
152+ v->header.version = 155;
153+ v->header.header_size = sizeof(v->header);
154+ v->header.vbt_size = sizeof(struct vbt) - sizeof(v->header);
155+ v->header.bdb_offset = offsetof(struct vbt, bdb_header);
156+
157+ strcpy(&v->bdb_header.signature[0], "BIOS_DATA_BLOCK");
158+ v->bdb_header.version = 186; /* child_dev_size = 38 */
159+ v->bdb_header.header_size = sizeof(v->bdb_header);
160+
161+ v->bdb_header.bdb_size = sizeof(struct vbt) - sizeof(struct vbt_header)
162+ - sizeof(struct bdb_header);
163+
164+ /* general features */
165+ v->general_features_header.id = BDB_GENERAL_FEATURES;
166+ v->general_features_header.size = sizeof(struct bdb_general_features);
167+ v->general_features.int_crt_support = 0;
168+ v->general_features.int_tv_support = 0;
169+
170+ /* child device */
171+ num_child = 4; /* each port has one child */
172+ v->general_definitions_header.id = BDB_GENERAL_DEFINITIONS;
173+ /* size will include child devices */
174+ v->general_definitions_header.size =
175+ sizeof(struct bdb_general_definitions) + num_child * DEV_SIZE;
176+ v->general_definitions.child_dev_size = DEV_SIZE;
177+
178+ /* portA */
179+ v->child0.handle = DEVICE_TYPE_EFP1;
180+ v->child0.device_type = DEVICE_TYPE_DP;
181+ v->child0.dvo_port = DVO_PORT_DPA;
182+ v->child0.aux_channel = DP_AUX_A;
183+ v->child0.dp_compat = true;
184+ v->child0.integrated_encoder = true;
185+
186+ /* portB */
187+ v->child1.handle = DEVICE_TYPE_EFP2;
188+ v->child1.device_type = DEVICE_TYPE_DP;
189+ v->child1.dvo_port = DVO_PORT_DPB;
190+ v->child1.aux_channel = DP_AUX_B;
191+ v->child1.dp_compat = true;
192+ v->child1.integrated_encoder = true;
193+
194+ /* portC */
195+ v->child2.handle = DEVICE_TYPE_EFP3;
196+ v->child2.device_type = DEVICE_TYPE_DP;
197+ v->child2.dvo_port = DVO_PORT_DPC;
198+ v->child2.aux_channel = DP_AUX_C;
199+ v->child2.dp_compat = true;
200+ v->child2.integrated_encoder = true;
201+
202+ /* portD */
203+ v->child3.handle = DEVICE_TYPE_EFP4;
204+ v->child3.device_type = DEVICE_TYPE_DP;
205+ v->child3.dvo_port = DVO_PORT_DPD;
206+ v->child3.aux_channel = DP_AUX_D;
207+ v->child3.dp_compat = true;
208+ v->child3.integrated_encoder = true;
209+
210+ /* driver features */
211+ v->driver_features_header.id = BDB_DRIVER_FEATURES;
212+ v->driver_features_header.size = sizeof(struct bdb_driver_features);
213+ v->driver_features.lvds_config = BDB_DRIVER_FEATURE_NO_LVDS;
214+}
32215
33− if (WARN((vgpu_opregion(vgpu)->va),
34− "vgpu%d: opregion has been initialized already.\n",
35− vgpu->id))
36− return -EINVAL;
216+static int alloc_and_init_virt_opregion(struct intel_vgpu *vgpu)
217+{
218+ u8 *buf;
219+ struct opregion_header *header;
220+ struct vbt v;
37221
222+ gvt_dbg_core("init vgpu%d opregion\n", vgpu->id);
38223 vgpu_opregion(vgpu)->va = (void *)__get_free_pages(GFP_KERNEL |
39224 __GFP_ZERO,
40225 get_order(INTEL_GVT_OPREGION_SIZE));
41−
42− if (!vgpu_opregion(vgpu)->va)
226+ if (!vgpu_opregion(vgpu)->va) {
227+ gvt_err("fail to get memory for vgpu virt opregion\n");
43228 return -ENOMEM;
229+ }
44230
45− memcpy(vgpu_opregion(vgpu)->va, vgpu->gvt->opregion.opregion_va,
46− INTEL_GVT_OPREGION_SIZE);
47−
48− for (i = 0; i < INTEL_GVT_OPREGION_PAGES; i++)
49− vgpu_opregion(vgpu)->gfn[i] = (gpa >> PAGE_SHIFT) + i;
231+ /* emulated opregion with VBT mailbox only */
232+ buf = (u8 *)vgpu_opregion(vgpu)->va;
233+ header = (struct opregion_header *)buf;
234+ memcpy(header->signature, OPREGION_SIGNATURE,
235+ sizeof(OPREGION_SIGNATURE));
236+ header->size = 0x8;
237+ header->opregion_ver = 0x02000000;
238+ header->mboxes = MBOX_VBT;
50239
51240 /* for unknown reason, the value in LID field is incorrect
52241 * which block the windows guest, so workaround it by force
53242 * setting it to "OPEN"
54243 */
55− buf = (u8 *)vgpu_opregion(vgpu)->va;
56244 buf[INTEL_GVT_OPREGION_CLID] = 0x3;
57245
246+ /* emulated vbt from virt vbt generation */
247+ virt_vbt_generation(&v);
248+ memcpy(buf + INTEL_GVT_OPREGION_VBT_OFFSET, &v, sizeof(struct vbt));
249+
250+ return 0;
251+}
252+
253+static int init_vgpu_opregion(struct intel_vgpu *vgpu, u32 gpa)
254+{
255+ int i, ret;
256+
257+ if (WARN((vgpu_opregion(vgpu)->va),
258+ "vgpu%d: opregion has been initialized already.\n",
259+ vgpu->id))
260+ return -EINVAL;
261+
262+ ret = alloc_and_init_virt_opregion(vgpu);
263+ if (ret < 0)
264+ return ret;
265+
266+ for (i = 0; i < INTEL_GVT_OPREGION_PAGES; i++)
267+ vgpu_opregion(vgpu)->gfn[i] = (gpa >> PAGE_SHIFT) + i;
268+
58269 return 0;
59270 }
60271
@@ -132,40 +343,6 @@ int intel_vgpu_init_opregion(struct intel_vgpu *vgpu, u32 gpa) · 71 unmodified lines
132343 return 0;
133344 }
134345
135−/**
136− * intel_gvt_clean_opregion - clean host opergion related stuffs
137− * @gvt: a GVT device
138− *
139− */
140−void intel_gvt_clean_opregion(struct intel_gvt *gvt)
141−{
142− memunmap(gvt->opregion.opregion_va);
143− gvt->opregion.opregion_va = NULL;
144−}
145−
146−/**
147− * intel_gvt_init_opregion - initialize host opergion related stuffs
148− * @gvt: a GVT device
149− *
150− * Returns:
151− * Zero on success, negative error code if failed.
152− */
153−int intel_gvt_init_opregion(struct intel_gvt *gvt)
154−{
155− gvt_dbg_core("init host opregion\n");
156−
157− pci_read_config_dword(gvt->dev_priv->drm.pdev, INTEL_GVT_PCI_OPREGION,
158− &gvt->opregion.opregion_pa);
159−
160− gvt->opregion.opregion_va = memremap(gvt->opregion.opregion_pa,
161− INTEL_GVT_OPREGION_SIZE, MEMREMAP_WB);
162− if (!gvt->opregion.opregion_va) {
163− gvt_err("fail to map host opregion\n");
164− return -EFAULT;
165− }
166− return 0;
167−}
168−
169346 #define GVT_OPREGION_FUNC(scic) \
170347 ({ \
171348 u32 __ret; \
drivers/gpu/drm/i915/gvt/reg.h+5−1
@@ -51,6 +51,9 @@ · 50 unmodified lines
5151
5252 #define INTEL_GVT_OPREGION_PAGES 2
5353 #define INTEL_GVT_OPREGION_SIZE (INTEL_GVT_OPREGION_PAGES * PAGE_SIZE)
54+#define INTEL_GVT_OPREGION_VBT_OFFSET 0x400
55+#define INTEL_GVT_OPREGION_VBT_SIZE \
56+ (INTEL_GVT_OPREGION_SIZE - INTEL_GVT_OPREGION_VBT_OFFSET)
5457
5558 #define VGT_SPRSTRIDE(pipe) _PIPE(pipe, _SPRA_STRIDE, _PLANE_STRIDE_2_B)
5659
@@ -71,6 +74,7 @@ · 14 unmodified lines
7174 #define RB_HEAD_OFF_MASK ((1U << 21) - (1U << 2))
7275 #define RB_TAIL_OFF_MASK ((1U << 21) - (1U << 3))
7376 #define RB_TAIL_SIZE_MASK ((1U << 21) - (1U << 12))
74−#define _RING_CTL_BUF_SIZE(ctl) (((ctl) & RB_TAIL_SIZE_MASK) + GTT_PAGE_SIZE)
77+#define _RING_CTL_BUF_SIZE(ctl) (((ctl) & RB_TAIL_SIZE_MASK) + \
78+ I915_GTT_PAGE_SIZE)
7579
7680 #endif
drivers/gpu/drm/i915/gvt/render.c+8−6
@@ -147,6 +147,7 @@ static u32 gen9_render_mocs_L3[32]; · 146 unmodified lines
147147 static void handle_tlb_pending_event(struct intel_vgpu *vgpu, int ring_id)
148148 {
149149 struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
150+ struct intel_vgpu_submission *s = &vgpu->submission;
150151 enum forcewake_domains fw;
151152 i915_reg_t reg;
152153 u32 regs[] = {
@@ -160,7 +161,7 @@ static void handle_tlb_pending_event(struct intel_vgpu *vgpu, int ring_id) · 7 unmodified lines
160161 if (WARN_ON(ring_id >= ARRAY_SIZE(regs)))
161162 return;
162163
163− if (!test_and_clear_bit(ring_id, (void *)vgpu->tlb_handle_pending))
164+ if (!test_and_clear_bit(ring_id, (void *)s->tlb_handle_pending))
164165 return;
165166
166167 reg = _MMIO(regs[ring_id]);
@@ -208,7 +209,7 @@ static void load_mocs(struct intel_vgpu *vgpu, int ring_id) · 41 unmodified lines
208209 offset.reg = regs[ring_id];
209210 for (i = 0; i < 64; i++) {
210211 gen9_render_mocs[ring_id][i] = I915_READ_FW(offset);
211− I915_WRITE(offset, vgpu_vreg(vgpu, offset));
212+ I915_WRITE_FW(offset, vgpu_vreg(vgpu, offset));
212213 offset.reg += 4;
213214 }
214215
@@ -261,14 +262,15 @@ static void restore_mocs(struct intel_vgpu *vgpu, int ring_id) · 46 unmodified lines
261262 static void switch_mmio_to_vgpu(struct intel_vgpu *vgpu, int ring_id)
262263 {
263264 struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
264− struct render_mmio *mmio;
265− u32 v;
266− int i, array_size;
267− u32 *reg_state = vgpu->shadow_ctx->engine[ring_id].lrc_reg_state;
265+ struct intel_vgpu_submission *s = &vgpu->submission;
266+ u32 *reg_state = s->shadow_ctx->engine[ring_id].lrc_reg_state;
268267 u32 ctx_ctrl = reg_state[CTX_CONTEXT_CONTROL_VAL];
269268 u32 inhibit_mask =
270269 _MASKED_BIT_ENABLE(CTX_CTRL_ENGINE_CTX_RESTORE_INHIBIT);
271270 i915_reg_t last_reg = _MMIO(0);
271+ struct render_mmio *mmio;
272+ u32 v;
273+ int i, array_size;
272274
273275 if (IS_SKYLAKE(vgpu->gvt->dev_priv)
274276 || IS_KABYLAKE(vgpu->gvt->dev_priv)) {
drivers/gpu/drm/i915/gvt/scheduler.c+625−42
@@ -57,7 +57,7 @@ static int populate_shadow_context(struct intel_vgpu_workload *workload) · 56 unmodified lines
5757 struct intel_vgpu *vgpu = workload->vgpu;
5858 struct intel_gvt *gvt = vgpu->gvt;
5959 int ring_id = workload->ring_id;
60− struct i915_gem_context *shadow_ctx = workload->vgpu->shadow_ctx;
60+ struct i915_gem_context *shadow_ctx = vgpu->submission.shadow_ctx;
6161 struct drm_i915_gem_object *ctx_obj =
6262 shadow_ctx->engine[ring_id].state->obj;
6363 struct execlist_ring_context *shadow_ring_context;
@@ -81,16 +81,16 @@ static int populate_shadow_context(struct intel_vgpu_workload *workload) · 17 unmodified lines
8181 while (i < context_page_num) {
8282 context_gpa = intel_vgpu_gma_to_gpa(vgpu->gtt.ggtt_mm,
8383 (u32)((workload->ctx_desc.lrca + i) <<
84− GTT_PAGE_SHIFT));
84+ I915_GTT_PAGE_SHIFT));
8585 if (context_gpa == INTEL_GVT_INVALID_ADDR) {
8686 gvt_vgpu_err("Invalid guest context descriptor\n");
87− return -EINVAL;
87+ return -EFAULT;
8888 }
8989
9090 page = i915_gem_object_get_page(ctx_obj, LRC_HEADER_PAGES + i);
9191 dst = kmap(page);
9292 intel_gvt_hypervisor_read_gpa(vgpu, context_gpa, dst,
93− GTT_PAGE_SIZE);
93+ I915_GTT_PAGE_SIZE);
9494 kunmap(page);
9595 i++;
9696 }
@@ -120,7 +120,7 @@ static int populate_shadow_context(struct intel_vgpu_workload *workload) · 23 unmodified lines
120120 sizeof(*shadow_ring_context),
121121 (void *)shadow_ring_context +
122122 sizeof(*shadow_ring_context),
123− GTT_PAGE_SIZE - sizeof(*shadow_ring_context));
123+ I915_GTT_PAGE_SIZE - sizeof(*shadow_ring_context));
124124
125125 kunmap(page);
126126 return 0;
@@ -131,6 +131,20 @@ static inline bool is_gvt_request(struct drm_i915_gem_request *req) · 4 unmodified lines
131131 return i915_gem_context_force_single_submission(req->ctx);
132132 }
133133
134+static void save_ring_hw_state(struct intel_vgpu *vgpu, int ring_id)
135+{
136+ struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
137+ u32 ring_base = dev_priv->engine[ring_id]->mmio_base;
138+ i915_reg_t reg;
139+
140+ reg = RING_INSTDONE(ring_base);
141+ vgpu_vreg(vgpu, i915_mmio_reg_offset(reg)) = I915_READ_FW(reg);
142+ reg = RING_ACTHD(ring_base);
143+ vgpu_vreg(vgpu, i915_mmio_reg_offset(reg)) = I915_READ_FW(reg);
144+ reg = RING_ACTHD_UDW(ring_base);
145+ vgpu_vreg(vgpu, i915_mmio_reg_offset(reg)) = I915_READ_FW(reg);
146+}
147+
134148 static int shadow_context_status_change(struct notifier_block *nb,
135149 unsigned long action, void *data)
136150 {
@@ -176,6 +190,7 @@ static int shadow_context_status_change(struct notifier_block *nb, · 39 unmodified lines
176190 break;
177191 case INTEL_CONTEXT_SCHEDULE_OUT:
178192 case INTEL_CONTEXT_SCHEDULE_PREEMPTED:
193+ save_ring_hw_state(workload->vgpu, ring_id);
179194 atomic_set(&workload->shadow_ctx_active, 0);
180195 break;
181196 default:
@@ -250,11 +265,12 @@ void release_shadow_wa_ctx(struct intel_shadow_wa_ctx *wa_ctx) · 68 unmodified lines
250265 */
251266 int intel_gvt_scan_and_shadow_workload(struct intel_vgpu_workload *workload)
252267 {
268+ struct intel_vgpu *vgpu = workload->vgpu;
269+ struct intel_vgpu_submission *s = &vgpu->submission;
270+ struct i915_gem_context *shadow_ctx = s->shadow_ctx;
271+ struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
253272 int ring_id = workload->ring_id;
254− struct i915_gem_context *shadow_ctx = workload->vgpu->shadow_ctx;
255− struct drm_i915_private *dev_priv = workload->vgpu->gvt->dev_priv;
256273 struct intel_engine_cs *engine = dev_priv->engine[ring_id];
257− struct intel_vgpu *vgpu = workload->vgpu;
258274 struct intel_ring *ring;
259275 int ret;
260276
@@ -267,7 +283,7 @@ int intel_gvt_scan_and_shadow_workload(struct intel_vgpu_workload *workload) · 6 unmodified lines
267283 shadow_ctx->desc_template |= workload->ctx_desc.addressing_mode <<
268284 GEN8_CTX_ADDRESSING_MODE_SHIFT;
269285
270− if (!test_and_set_bit(ring_id, vgpu->shadow_ctx_desc_updated))
286+ if (!test_and_set_bit(ring_id, s->shadow_ctx_desc_updated))
271287 shadow_context_descriptor_update(shadow_ctx,
272288 dev_priv->engine[ring_id]);
273289
@@ -310,14 +326,15 @@ err_scan: · 36 unmodified lines
310326 return ret;
311327 }
312328
313−int intel_gvt_generate_request(struct intel_vgpu_workload *workload)
329+static int intel_gvt_generate_request(struct intel_vgpu_workload *workload)
314330 {
315331 int ring_id = workload->ring_id;
316332 struct drm_i915_private *dev_priv = workload->vgpu->gvt->dev_priv;
317333 struct intel_engine_cs *engine = dev_priv->engine[ring_id];
318334 struct drm_i915_gem_request *rq;
319335 struct intel_vgpu *vgpu = workload->vgpu;
320− struct i915_gem_context *shadow_ctx = vgpu->shadow_ctx;
336+ struct intel_vgpu_submission *s = &vgpu->submission;
337+ struct i915_gem_context *shadow_ctx = s->shadow_ctx;
321338 int ret;
322339
323340 rq = i915_gem_request_alloc(dev_priv->engine[ring_id], shadow_ctx);
@@ -341,11 +358,203 @@ err_unpin: · 17 unmodified lines
341358 return ret;
342359 }
343360
361+static void release_shadow_batch_buffer(struct intel_vgpu_workload *workload);
362+
363+static int prepare_shadow_batch_buffer(struct intel_vgpu_workload *workload)
364+{
365+ struct intel_gvt *gvt = workload->vgpu->gvt;
366+ const int gmadr_bytes = gvt->device_info.gmadr_bytes_in_cmd;
367+ struct intel_vgpu_shadow_bb *bb;
368+ int ret;
369+
370+ list_for_each_entry(bb, &workload->shadow_bb, list) {
371+ bb->vma = i915_gem_object_ggtt_pin(bb->obj, NULL, 0, 0, 0);
372+ if (IS_ERR(bb->vma)) {
373+ ret = PTR_ERR(bb->vma);
374+ goto err;
375+ }
376+
377+ /* relocate shadow batch buffer */
378+ bb->bb_start_cmd_va[1] = i915_ggtt_offset(bb->vma);
379+ if (gmadr_bytes == 8)
380+ bb->bb_start_cmd_va[2] = 0;
381+
382+ /* No one is going to touch shadow bb from now on. */
383+ if (bb->clflush & CLFLUSH_AFTER) {
384+ drm_clflush_virt_range(bb->va, bb->obj->base.size);
385+ bb->clflush &= ~CLFLUSH_AFTER;
386+ }
387+
388+ ret = i915_gem_object_set_to_gtt_domain(bb->obj, false);
389+ if (ret)
390+ goto err;
391+
392+ i915_gem_obj_finish_shmem_access(bb->obj);
393+ bb->accessing = false;
394+
395+ i915_vma_move_to_active(bb->vma, workload->req, 0);
396+ }
397+ return 0;
398+err:
399+ release_shadow_batch_buffer(workload);
400+ return ret;
401+}
402+
403+static int update_wa_ctx_2_shadow_ctx(struct intel_shadow_wa_ctx *wa_ctx)
404+{
405+ struct intel_vgpu_workload *workload = container_of(wa_ctx,
406+ struct intel_vgpu_workload,
407+ wa_ctx);
408+ int ring_id = workload->ring_id;
409+ struct intel_vgpu_submission *s = &workload->vgpu->submission;
410+ struct i915_gem_context *shadow_ctx = s->shadow_ctx;
411+ struct drm_i915_gem_object *ctx_obj =
412+ shadow_ctx->engine[ring_id].state->obj;
413+ struct execlist_ring_context *shadow_ring_context;
414+ struct page *page;
415+
416+ page = i915_gem_object_get_page(ctx_obj, LRC_STATE_PN);
417+ shadow_ring_context = kmap_atomic(page);
418+
419+ shadow_ring_context->bb_per_ctx_ptr.val =
420+ (shadow_ring_context->bb_per_ctx_ptr.val &
421+ (~PER_CTX_ADDR_MASK)) | wa_ctx->per_ctx.shadow_gma;
422+ shadow_ring_context->rcs_indirect_ctx.val =
423+ (shadow_ring_context->rcs_indirect_ctx.val &
424+ (~INDIRECT_CTX_ADDR_MASK)) | wa_ctx->indirect_ctx.shadow_gma;
425+
426+ kunmap_atomic(shadow_ring_context);
427+ return 0;
428+}
429+
430+static int prepare_shadow_wa_ctx(struct intel_shadow_wa_ctx *wa_ctx)
431+{
432+ struct i915_vma *vma;
433+ unsigned char *per_ctx_va =
434+ (unsigned char *)wa_ctx->indirect_ctx.shadow_va +
435+ wa_ctx->indirect_ctx.size;
436+
437+ if (wa_ctx->indirect_ctx.size == 0)
438+ return 0;
439+
440+ vma = i915_gem_object_ggtt_pin(wa_ctx->indirect_ctx.obj, NULL,
441+ 0, CACHELINE_BYTES, 0);
442+ if (IS_ERR(vma))
443+ return PTR_ERR(vma);
444+
445+ /* FIXME: we are not tracking our pinned VMA leaving it
446+ * up to the core to fix up the stray pin_count upon
447+ * free.
448+ */
449+
450+ wa_ctx->indirect_ctx.shadow_gma = i915_ggtt_offset(vma);
451+
452+ wa_ctx->per_ctx.shadow_gma = *((unsigned int *)per_ctx_va + 1);
453+ memset(per_ctx_va, 0, CACHELINE_BYTES);
454+
455+ update_wa_ctx_2_shadow_ctx(wa_ctx);
456+ return 0;
457+}
458+
459+static void release_shadow_batch_buffer(struct intel_vgpu_workload *workload)
460+{
461+ struct intel_vgpu *vgpu = workload->vgpu;
462+ struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
463+ struct intel_vgpu_shadow_bb *bb, *pos;
464+
465+ if (list_empty(&workload->shadow_bb))
466+ return;
467+
468+ bb = list_first_entry(&workload->shadow_bb,
469+ struct intel_vgpu_shadow_bb, list);
470+
471+ mutex_lock(&dev_priv->drm.struct_mutex);
472+
473+ list_for_each_entry_safe(bb, pos, &workload->shadow_bb, list) {
474+ if (bb->obj) {
475+ if (bb->accessing)
476+ i915_gem_obj_finish_shmem_access(bb->obj);
477+
478+ if (bb->va && !IS_ERR(bb->va))
479+ i915_gem_object_unpin_map(bb->obj);
480+
481+ if (bb->vma && !IS_ERR(bb->vma)) {
482+ i915_vma_unpin(bb->vma);
483+ i915_vma_close(bb->vma);
484+ }
485+ __i915_gem_object_release_unless_active(bb->obj);
486+ }
487+ list_del(&bb->list);
488+ kfree(bb);
489+ }
490+
491+ mutex_unlock(&dev_priv->drm.struct_mutex);
492+}
493+
494+static int prepare_workload(struct intel_vgpu_workload *workload)
495+{
496+ struct intel_vgpu *vgpu = workload->vgpu;
497+ int ret = 0;
498+
499+ ret = intel_vgpu_pin_mm(workload->shadow_mm);
500+ if (ret) {
501+ gvt_vgpu_err("fail to vgpu pin mm\n");
502+ return ret;
503+ }
504+
505+ ret = intel_vgpu_sync_oos_pages(workload->vgpu);
506+ if (ret) {
507+ gvt_vgpu_err("fail to vgpu sync oos pages\n");
508+ goto err_unpin_mm;
509+ }
510+
511+ ret = intel_vgpu_flush_post_shadow(workload->vgpu);
512+ if (ret) {
513+ gvt_vgpu_err("fail to flush post shadow\n");
514+ goto err_unpin_mm;
515+ }
516+
517+ ret = intel_gvt_generate_request(workload);
518+ if (ret) {
519+ gvt_vgpu_err("fail to generate request\n");
520+ goto err_unpin_mm;
521+ }
522+
523+ ret = prepare_shadow_batch_buffer(workload);
524+ if (ret) {
525+ gvt_vgpu_err("fail to prepare_shadow_batch_buffer\n");
526+ goto err_unpin_mm;
527+ }
528+
529+ ret = prepare_shadow_wa_ctx(&workload->wa_ctx);
530+ if (ret) {
531+ gvt_vgpu_err("fail to prepare_shadow_wa_ctx\n");
532+ goto err_shadow_batch;
533+ }
534+
535+ if (workload->prepare) {
536+ ret = workload->prepare(workload);
537+ if (ret)
538+ goto err_shadow_wa_ctx;
539+ }
540+
541+ return 0;
542+err_shadow_wa_ctx:
543+ release_shadow_wa_ctx(&workload->wa_ctx);
544+err_shadow_batch:
545+ release_shadow_batch_buffer(workload);
546+err_unpin_mm:
547+ intel_vgpu_unpin_mm(workload->shadow_mm);
548+ return ret;
549+}
550+
344551 static int dispatch_workload(struct intel_vgpu_workload *workload)
345552 {
553+ struct intel_vgpu *vgpu = workload->vgpu;
554+ struct intel_vgpu_submission *s = &vgpu->submission;
555+ struct i915_gem_context *shadow_ctx = s->shadow_ctx;
556+ struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
346557 int ring_id = workload->ring_id;
347− struct i915_gem_context *shadow_ctx = workload->vgpu->shadow_ctx;
348− struct drm_i915_private *dev_priv = workload->vgpu->gvt->dev_priv;
349558 struct intel_engine_cs *engine = dev_priv->engine[ring_id];
350559 int ret = 0;
351560
@@ -358,12 +567,10 @@ static int dispatch_workload(struct intel_vgpu_workload *workload) · 6 unmodified lines
358567 if (ret)
359568 goto out;
360569
361− if (workload->prepare) {
362− ret = workload->prepare(workload);
363− if (ret) {
364− engine->context_unpin(engine, shadow_ctx);
365− goto out;
366− }
570+ ret = prepare_workload(workload);
571+ if (ret) {
572+ engine->context_unpin(engine, shadow_ctx);
573+ goto out;
367574 }
368575
369576 out:
@@ -431,7 +638,7 @@ static struct intel_vgpu_workload *pick_next_workload( · 61 unmodified lines
431638
432639 gvt_dbg_sched("ring id %d pick new workload %p\n", ring_id, workload);
433640
434− atomic_inc(&workload->vgpu->running_workload_num);
641+ atomic_inc(&workload->vgpu->submission.running_workload_num);
435642 out:
436643 mutex_unlock(&gvt->lock);
437644 return workload;
@@ -441,8 +648,9 @@ static void update_guest_context(struct intel_vgpu_workload *workload) · 3 unmodified lines
441648 {
442649 struct intel_vgpu *vgpu = workload->vgpu;
443650 struct intel_gvt *gvt = vgpu->gvt;
651+ struct intel_vgpu_submission *s = &vgpu->submission;
652+ struct i915_gem_context *shadow_ctx = s->shadow_ctx;
444653 int ring_id = workload->ring_id;
445− struct i915_gem_context *shadow_ctx = workload->vgpu->shadow_ctx;
446654 struct drm_i915_gem_object *ctx_obj =
447655 shadow_ctx->engine[ring_id].state->obj;
448656 struct execlist_ring_context *shadow_ring_context;
@@ -466,7 +674,7 @@ static void update_guest_context(struct intel_vgpu_workload *workload) · 17 unmodified lines
466674 while (i < context_page_num) {
467675 context_gpa = intel_vgpu_gma_to_gpa(vgpu->gtt.ggtt_mm,
468676 (u32)((workload->ctx_desc.lrca + i) <<
469− GTT_PAGE_SHIFT));
677+ I915_GTT_PAGE_SHIFT));
470678 if (context_gpa == INTEL_GVT_INVALID_ADDR) {
471679 gvt_vgpu_err("invalid guest context descriptor\n");
472680 return;
@@ -475,7 +683,7 @@ static void update_guest_context(struct intel_vgpu_workload *workload) · 2 unmodified lines
475683 page = i915_gem_object_get_page(ctx_obj, LRC_HEADER_PAGES + i);
476684 src = kmap(page);
477685 intel_gvt_hypervisor_write_gpa(vgpu, context_gpa, src,
478− GTT_PAGE_SIZE);
686+ I915_GTT_PAGE_SIZE);
479687 kunmap(page);
480688 i++;
481689 }
@@ -500,23 +708,41 @@ static void update_guest_context(struct intel_vgpu_workload *workload) · 18 unmodified lines
500708 sizeof(*shadow_ring_context),
501709 (void *)shadow_ring_context +
502710 sizeof(*shadow_ring_context),
503− GTT_PAGE_SIZE - sizeof(*shadow_ring_context));
711+ I915_GTT_PAGE_SIZE - sizeof(*shadow_ring_context));
504712
505713 kunmap(page);
506714 }
507715
716+static void clean_workloads(struct intel_vgpu *vgpu, unsigned long engine_mask)
717+{
718+ struct intel_vgpu_submission *s = &vgpu->submission;
719+ struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
720+ struct intel_engine_cs *engine;
721+ struct intel_vgpu_workload *pos, *n;
722+ unsigned int tmp;
723+
724+ /* free the unsubmited workloads in the queues. */
725+ for_each_engine_masked(engine, dev_priv, engine_mask, tmp) {
726+ list_for_each_entry_safe(pos, n,
727+ &s->workload_q_head[engine->id], list) {
728+ list_del_init(&pos->list);
729+ intel_vgpu_destroy_workload(pos);
730+ }
731+ clear_bit(engine->id, s->shadow_ctx_desc_updated);
732+ }
733+}
734+
508735 static void complete_current_workload(struct intel_gvt *gvt, int ring_id)
509736 {
510737 struct intel_gvt_workload_scheduler *scheduler = &gvt->scheduler;
511− struct intel_vgpu_workload *workload;
512− struct intel_vgpu *vgpu;
738+ struct intel_vgpu_workload *workload =
739+ scheduler->current_workload[ring_id];
740+ struct intel_vgpu *vgpu = workload->vgpu;
741+ struct intel_vgpu_submission *s = &vgpu->submission;
513742 int event;
514743
515744 mutex_lock(&gvt->lock);
516745
517− workload = scheduler->current_workload[ring_id];
518− vgpu = workload->vgpu;
519−
520746 /* For the workload w/ request, needs to wait for the context
521747 * switch to make sure request is completed.
522748 * For the workload w/o request, directly complete the workload.
@@ -553,7 +779,7 @@ static void complete_current_workload(struct intel_gvt *gvt, int ring_id) · 30 unmodified lines
553779 }
554780 mutex_lock(&dev_priv->drm.struct_mutex);
555781 /* unpin shadow ctx as the shadow_ctx update is done */
556− engine->context_unpin(engine, workload->vgpu->shadow_ctx);
782+ engine->context_unpin(engine, s->shadow_ctx);
557783 mutex_unlock(&dev_priv->drm.struct_mutex);
558784 }
559785
@@ -563,9 +789,32 @@ static void complete_current_workload(struct intel_gvt *gvt, int ring_id) · 3 unmodified lines
563789 scheduler->current_workload[ring_id] = NULL;
564790
565791 list_del_init(&workload->list);
792+
793+ if (!workload->status) {
794+ release_shadow_batch_buffer(workload);
795+ release_shadow_wa_ctx(&workload->wa_ctx);
796+ }
797+
798+ if (workload->status || (vgpu->resetting_eng & ENGINE_MASK(ring_id))) {
799+ /* if workload->status is not successful means HW GPU
800+ * has occurred GPU hang or something wrong with i915/GVT,
801+ * and GVT won't inject context switch interrupt to guest.
802+ * So this error is a vGPU hang actually to the guest.
803+ * According to this we should emunlate a vGPU hang. If
804+ * there are pending workloads which are already submitted
805+ * from guest, we should clean them up like HW GPU does.
806+ *
807+ * if it is in middle of engine resetting, the pending
808+ * workloads won't be submitted to HW GPU and will be
809+ * cleaned up during the resetting process later, so doing
810+ * the workload clean up here doesn't have any impact.
811+ **/
812+ clean_workloads(vgpu, ENGINE_MASK(ring_id));
813+ }
814+
566815 workload->complete(workload);
567816
568− atomic_dec(&vgpu->running_workload_num);
817+ atomic_dec(&s->running_workload_num);
569818 wake_up(&scheduler->workload_complete_wq);
570819
571820 if (gvt->scheduler.need_reschedule)
@@ -648,20 +897,23 @@ complete: · 76 unmodified lines
648897 FORCEWAKE_ALL);
649898
650899 intel_runtime_pm_put(gvt->dev_priv);
900+ if (ret && (vgpu_is_vm_unhealthy(ret)))
901+ enter_failsafe_mode(vgpu, GVT_FAILSAFE_GUEST_ERR);
651902 }
652903 return 0;
653904 }
654905
655906 void intel_gvt_wait_vgpu_idle(struct intel_vgpu *vgpu)
656907 {
908+ struct intel_vgpu_submission *s = &vgpu->submission;
657909 struct intel_gvt *gvt = vgpu->gvt;
658910 struct intel_gvt_workload_scheduler *scheduler = &gvt->scheduler;
659911
660− if (atomic_read(&vgpu->running_workload_num)) {
912+ if (atomic_read(&s->running_workload_num)) {
661913 gvt_dbg_sched("wait vgpu idle\n");
662914
663915 wait_event(scheduler->workload_complete_wq,
664− !atomic_read(&vgpu->running_workload_num));
916+ !atomic_read(&s->running_workload_num));
665917 }
666918 }
667919
@@ -726,23 +978,354 @@ err: · 58 unmodified lines
726978 return ret;
727979 }
728980
729−void intel_vgpu_clean_gvt_context(struct intel_vgpu *vgpu)
981+/**
982+ * intel_vgpu_clean_submission - free submission-related resource for vGPU
983+ * @vgpu: a vGPU
984+ *
985+ * This function is called when a vGPU is being destroyed.
986+ *
987+ */
988+void intel_vgpu_clean_submission(struct intel_vgpu *vgpu)
989+{
990+ struct intel_vgpu_submission *s = &vgpu->submission;
991+
992+ intel_vgpu_select_submission_ops(vgpu, 0);
993+ i915_gem_context_put(s->shadow_ctx);
994+ kmem_cache_destroy(s->workloads);
995+}
996+
997+
998+/**
999+ * intel_vgpu_reset_submission - reset submission-related resource for vGPU
1000+ * @vgpu: a vGPU
1001+ * @engine_mask: engines expected to be reset
1002+ *
1003+ * This function is called when a vGPU is being destroyed.
1004+ *
1005+ */
1006+void intel_vgpu_reset_submission(struct intel_vgpu *vgpu,
1007+ unsigned long engine_mask)
7301008 {
731− i915_gem_context_put(vgpu->shadow_ctx);
1009+ struct intel_vgpu_submission *s = &vgpu->submission;
1010+
1011+ if (!s->active)
1012+ return;
1013+
1014+ clean_workloads(vgpu, engine_mask);
1015+ s->ops->reset(vgpu, engine_mask);
7321016 }
7331017
734−int intel_vgpu_init_gvt_context(struct intel_vgpu *vgpu)
1018+/**
1019+ * intel_vgpu_setup_submission - setup submission-related resource for vGPU
1020+ * @vgpu: a vGPU
1021+ *
1022+ * This function is called when a vGPU is being created.
1023+ *
1024+ * Returns:
1025+ * Zero on success, negative error code if failed.
1026+ *
1027+ */
1028+int intel_vgpu_setup_submission(struct intel_vgpu *vgpu)
7351029 {
736− atomic_set(&vgpu->running_workload_num, 0);
1030+ struct intel_vgpu_submission *s = &vgpu->submission;
1031+ enum intel_engine_id i;
1032+ struct intel_engine_cs *engine;
1033+ int ret;
7371034
738− vgpu->shadow_ctx = i915_gem_context_create_gvt(
1035+ s->shadow_ctx = i915_gem_context_create_gvt(
7391036 &vgpu->gvt->dev_priv->drm);
740− if (IS_ERR(vgpu->shadow_ctx))
741− return PTR_ERR(vgpu->shadow_ctx);
1037+ if (IS_ERR(s->shadow_ctx))
1038+ return PTR_ERR(s->shadow_ctx);
1039+
1040+ bitmap_zero(s->shadow_ctx_desc_updated, I915_NUM_ENGINES);
1041+
1042+ s->workloads = kmem_cache_create("gvt-g_vgpu_workload",
1043+ sizeof(struct intel_vgpu_workload), 0,
1044+ SLAB_HWCACHE_ALIGN,
1045+ NULL);
1046+
1047+ if (!s->workloads) {
1048+ ret = -ENOMEM;
1049+ goto out_shadow_ctx;
1050+ }
1051+
1052+ for_each_engine(engine, vgpu->gvt->dev_priv, i)
1053+ INIT_LIST_HEAD(&s->workload_q_head[i]);
1054+
1055+ atomic_set(&s->running_workload_num, 0);
1056+ bitmap_zero(s->tlb_handle_pending, I915_NUM_ENGINES);
1057+
1058+ return 0;
1059+
1060+out_shadow_ctx:
1061+ i915_gem_context_put(s->shadow_ctx);
1062+ return ret;
1063+}
1064+
1065+/**
1066+ * intel_vgpu_select_submission_ops - select virtual submission interface
1067+ * @vgpu: a vGPU
1068+ * @interface: expected vGPU virtual submission interface
1069+ *
1070+ * This function is called when guest configures submission interface.
1071+ *
1072+ * Returns:
1073+ * Zero on success, negative error code if failed.
1074+ *
1075+ */
1076+int intel_vgpu_select_submission_ops(struct intel_vgpu *vgpu,
1077+ unsigned int interface)
1078+{
1079+ struct intel_vgpu_submission *s = &vgpu->submission;
1080+ const struct intel_vgpu_submission_ops *ops[] = {
1081+ [INTEL_VGPU_EXECLIST_SUBMISSION] =
1082+ &intel_vgpu_execlist_submission_ops,
1083+ };
1084+ int ret;
1085+
1086+ if (WARN_ON(interface >= ARRAY_SIZE(ops)))
1087+ return -EINVAL;
1088+
1089+ if (s->active) {
1090+ s->ops->clean(vgpu);
1091+ s->active = false;
1092+ gvt_dbg_core("vgpu%d: de-select ops [ %s ] \n",
1093+ vgpu->id, s->ops->name);
1094+ }
1095+
1096+ if (interface == 0) {
1097+ s->ops = NULL;
1098+ s->virtual_submission_interface = 0;
1099+ gvt_dbg_core("vgpu%d: no submission ops\n", vgpu->id);
1100+ return 0;
1101+ }
1102+
1103+ ret = ops[interface]->init(vgpu);
1104+ if (ret)
1105+ return ret;
1106+
1107+ s->ops = ops[interface];
1108+ s->virtual_submission_interface = interface;
1109+ s->active = true;
1110+
1111+ gvt_dbg_core("vgpu%d: activate ops [ %s ]\n",
1112+ vgpu->id, s->ops->name);
1113+
1114+ return 0;
1115+}
1116+
1117+/**
1118+ * intel_vgpu_destroy_workload - destroy a vGPU workload
1119+ * @vgpu: a vGPU
1120+ *
1121+ * This function is called when destroy a vGPU workload.
1122+ *
1123+ */
1124+void intel_vgpu_destroy_workload(struct intel_vgpu_workload *workload)
1125+{
1126+ struct intel_vgpu_submission *s = &workload->vgpu->submission;
1127+
1128+ if (workload->shadow_mm)
1129+ intel_gvt_mm_unreference(workload->shadow_mm);
1130+
1131+ kmem_cache_free(s->workloads, workload);
1132+}
1133+
1134+static struct intel_vgpu_workload *
1135+alloc_workload(struct intel_vgpu *vgpu)
1136+{
1137+ struct intel_vgpu_submission *s = &vgpu->submission;
1138+ struct intel_vgpu_workload *workload;
7421139
743− vgpu->shadow_ctx->engine[RCS].initialised = true;
1140+ workload = kmem_cache_zalloc(s->workloads, GFP_KERNEL);
1141+ if (!workload)
1142+ return ERR_PTR(-ENOMEM);
7441143
745− bitmap_zero(vgpu->shadow_ctx_desc_updated, I915_NUM_ENGINES);
1144+ INIT_LIST_HEAD(&workload->list);
1145+ INIT_LIST_HEAD(&workload->shadow_bb);
7461146
1147+ init_waitqueue_head(&workload->shadow_ctx_status_wq);
1148+ atomic_set(&workload->shadow_ctx_active, 0);
1149+
1150+ workload->status = -EINPROGRESS;
1151+ workload->shadowed = false;
1152+ workload->vgpu = vgpu;
1153+
1154+ return workload;
1155+}
1156+
1157+#define RING_CTX_OFF(x) \
1158+ offsetof(struct execlist_ring_context, x)
1159+
1160+static void read_guest_pdps(struct intel_vgpu *vgpu,
1161+ u64 ring_context_gpa, u32 pdp[8])
1162+{
1163+ u64 gpa;
1164+ int i;
1165+
1166+ gpa = ring_context_gpa + RING_CTX_OFF(pdp3_UDW.val);
1167+
1168+ for (i = 0; i < 8; i++)
1169+ intel_gvt_hypervisor_read_gpa(vgpu,
1170+ gpa + i * 8, &pdp[7 - i], 4);
1171+}
1172+
1173+static int prepare_mm(struct intel_vgpu_workload *workload)
1174+{
1175+ struct execlist_ctx_descriptor_format *desc = &workload->ctx_desc;
1176+ struct intel_vgpu_mm *mm;
1177+ struct intel_vgpu *vgpu = workload->vgpu;
1178+ int page_table_level;
1179+ u32 pdp[8];
1180+
1181+ if (desc->addressing_mode == 1) { /* legacy 32-bit */
1182+ page_table_level = 3;
1183+ } else if (desc->addressing_mode == 3) { /* legacy 64 bit */
1184+ page_table_level = 4;
1185+ } else {
1186+ gvt_vgpu_err("Advanced Context mode(SVM) is not supported!\n");
1187+ return -EINVAL;
1188+ }
1189+
1190+ read_guest_pdps(workload->vgpu, workload->ring_context_gpa, pdp);
1191+
1192+ mm = intel_vgpu_find_ppgtt_mm(workload->vgpu, page_table_level, pdp);
1193+ if (mm) {
1194+ intel_gvt_mm_reference(mm);
1195+ } else {
1196+
1197+ mm = intel_vgpu_create_mm(workload->vgpu, INTEL_GVT_MM_PPGTT,
1198+ pdp, page_table_level, 0);
1199+ if (IS_ERR(mm)) {
1200+ gvt_vgpu_err("fail to create mm object.\n");
1201+ return PTR_ERR(mm);
1202+ }
1203+ }
1204+ workload->shadow_mm = mm;
7471205 return 0;
7481206 }
1207+
1208+#define same_context(a, b) (((a)->context_id == (b)->context_id) && \
1209+ ((a)->lrca == (b)->lrca))
1210+
1211+#define get_last_workload(q) \
1212+ (list_empty(q) ? NULL : container_of(q->prev, \
1213+ struct intel_vgpu_workload, list))
1214+/**
1215+ * intel_vgpu_create_workload - create a vGPU workload
1216+ * @vgpu: a vGPU
1217+ * @desc: a guest context descriptor
1218+ *
1219+ * This function is called when creating a vGPU workload.
1220+ *
1221+ * Returns:
1222+ * struct intel_vgpu_workload * on success, negative error code in
1223+ * pointer if failed.
1224+ *
1225+ */
1226+struct intel_vgpu_workload *
1227+intel_vgpu_create_workload(struct intel_vgpu *vgpu, int ring_id,
1228+ struct execlist_ctx_descriptor_format *desc)
1229+{
1230+ struct intel_vgpu_submission *s = &vgpu->submission;
1231+ struct list_head *q = workload_q_head(vgpu, ring_id);
1232+ struct intel_vgpu_workload *last_workload = get_last_workload(q);
1233+ struct intel_vgpu_workload *workload = NULL;
1234+ struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
1235+ u64 ring_context_gpa;
1236+ u32 head, tail, start, ctl, ctx_ctl, per_ctx, indirect_ctx;
1237+ int ret;
1238+
1239+ ring_context_gpa = intel_vgpu_gma_to_gpa(vgpu->gtt.ggtt_mm,
1240+ (u32)((desc->lrca + 1) << I915_GTT_PAGE_SHIFT));
1241+ if (ring_context_gpa == INTEL_GVT_INVALID_ADDR) {
1242+ gvt_vgpu_err("invalid guest context LRCA: %x\n", desc->lrca);
1243+ return ERR_PTR(-EINVAL);
1244+ }
1245+
1246+ intel_gvt_hypervisor_read_gpa(vgpu, ring_context_gpa +
1247+ RING_CTX_OFF(ring_header.val), &head, 4);
1248+
1249+ intel_gvt_hypervisor_read_gpa(vgpu, ring_context_gpa +
1250+ RING_CTX_OFF(ring_tail.val), &tail, 4);
1251+
1252+ head &= RB_HEAD_OFF_MASK;
1253+ tail &= RB_TAIL_OFF_MASK;
1254+
1255+ if (last_workload && same_context(&last_workload->ctx_desc, desc)) {
1256+ gvt_dbg_el("ring id %d cur workload == last\n", ring_id);
1257+ gvt_dbg_el("ctx head %x real head %lx\n", head,
1258+ last_workload->rb_tail);
1259+ /*
1260+ * cannot use guest context head pointer here,
1261+ * as it might not be updated at this time
1262+ */
1263+ head = last_workload->rb_tail;
1264+ }
1265+
1266+ gvt_dbg_el("ring id %d begin a new workload\n", ring_id);
1267+
1268+ /* record some ring buffer register values for scan and shadow */
1269+ intel_gvt_hypervisor_read_gpa(vgpu, ring_context_gpa +
1270+ RING_CTX_OFF(rb_start.val), &start, 4);
1271+ intel_gvt_hypervisor_read_gpa(vgpu, ring_context_gpa +
1272+ RING_CTX_OFF(rb_ctrl.val), &ctl, 4);
1273+ intel_gvt_hypervisor_read_gpa(vgpu, ring_context_gpa +
1274+ RING_CTX_OFF(ctx_ctrl.val), &ctx_ctl, 4);
1275+
1276+ workload = alloc_workload(vgpu);
1277+ if (IS_ERR(workload))
1278+ return workload;
1279+
1280+ workload->ring_id = ring_id;
1281+ workload->ctx_desc = *desc;
1282+ workload->ring_context_gpa = ring_context_gpa;
1283+ workload->rb_head = head;
1284+ workload->rb_tail = tail;
1285+ workload->rb_start = start;
1286+ workload->rb_ctl = ctl;
1287+
1288+ if (ring_id == RCS) {
1289+ intel_gvt_hypervisor_read_gpa(vgpu, ring_context_gpa +
1290+ RING_CTX_OFF(bb_per_ctx_ptr.val), &per_ctx, 4);
1291+ intel_gvt_hypervisor_read_gpa(vgpu, ring_context_gpa +
1292+ RING_CTX_OFF(rcs_indirect_ctx.val), &indirect_ctx, 4);
1293+
1294+ workload->wa_ctx.indirect_ctx.guest_gma =
1295+ indirect_ctx & INDIRECT_CTX_ADDR_MASK;
1296+ workload->wa_ctx.indirect_ctx.size =
1297+ (indirect_ctx & INDIRECT_CTX_SIZE_MASK) *
1298+ CACHELINE_BYTES;
1299+ workload->wa_ctx.per_ctx.guest_gma =
1300+ per_ctx & PER_CTX_ADDR_MASK;
1301+ workload->wa_ctx.per_ctx.valid = per_ctx & 1;
1302+ }
1303+
1304+ gvt_dbg_el("workload %p ring id %d head %x tail %x start %x ctl %x\n",
1305+ workload, ring_id, head, tail, start, ctl);
1306+
1307+ ret = prepare_mm(workload);
1308+ if (ret) {
1309+ kmem_cache_free(s->workloads, workload);
1310+ return ERR_PTR(ret);
1311+ }
1312+
1313+ /* Only scan and shadow the first workload in the queue
1314+ * as there is only one pre-allocated buf-obj for shadow.
1315+ */
1316+ if (list_empty(workload_q_head(vgpu, ring_id))) {
1317+ intel_runtime_pm_get(dev_priv);
1318+ mutex_lock(&dev_priv->drm.struct_mutex);
1319+ ret = intel_gvt_scan_and_shadow_workload(workload);
1320+ mutex_unlock(&dev_priv->drm.struct_mutex);
1321+ intel_runtime_pm_put(dev_priv);
1322+ }
1323+
1324+ if (ret && (vgpu_is_vm_unhealthy(ret))) {
1325+ enter_failsafe_mode(vgpu, GVT_FAILSAFE_GUEST_ERR);
1326+ intel_vgpu_destroy_workload(workload);
1327+ return ERR_PTR(ret);
1328+ }
1329+
1330+ return workload;
1331+}
drivers/gpu/drm/i915/gvt/scheduler.h+20−8
@@ -112,17 +112,18 @@ struct intel_vgpu_workload { · 111 unmodified lines
112112 struct intel_shadow_wa_ctx wa_ctx;
113113 };
114114
115−/* Intel shadow batch buffer is a i915 gem object */
116−struct intel_shadow_bb_entry {
115+struct intel_vgpu_shadow_bb {
117116 struct list_head list;
118117 struct drm_i915_gem_object *obj;
118+ struct i915_vma *vma;
119119 void *va;
120− unsigned long len;
121120 u32 *bb_start_cmd_va;
121+ unsigned int clflush;
122+ bool accessing;
122123 };
123124
124125 #define workload_q_head(vgpu, ring_id) \
125− (&(vgpu->workload_q_head[ring_id]))
126+ (&(vgpu->submission.workload_q_head[ring_id]))
126127
127128 #define queue_workload(workload) do { \
128129 list_add_tail(&workload->list, \
@@ -137,12 +138,23 @@ void intel_gvt_clean_workload_scheduler(struct intel_gvt *gvt); · 8 unmodified lines
137138
138139 void intel_gvt_wait_vgpu_idle(struct intel_vgpu *vgpu);
139140
140−int intel_vgpu_init_gvt_context(struct intel_vgpu *vgpu);
141+int intel_vgpu_setup_submission(struct intel_vgpu *vgpu);
141142
142−void intel_vgpu_clean_gvt_context(struct intel_vgpu *vgpu);
143+void intel_vgpu_reset_submission(struct intel_vgpu *vgpu,
144+ unsigned long engine_mask);
143145
144−void release_shadow_wa_ctx(struct intel_shadow_wa_ctx *wa_ctx);
146+void intel_vgpu_clean_submission(struct intel_vgpu *vgpu);
145147
146−int intel_gvt_generate_request(struct intel_vgpu_workload *workload);
148+int intel_vgpu_select_submission_ops(struct intel_vgpu *vgpu,
149+ unsigned int interface);
150+
151+extern const struct intel_vgpu_submission_ops
152+intel_vgpu_execlist_submission_ops;
153+
154+struct intel_vgpu_workload *
155+intel_vgpu_create_workload(struct intel_vgpu *vgpu, int ring_id,
156+ struct execlist_ctx_descriptor_format *desc);
157+
158+void intel_vgpu_destroy_workload(struct intel_vgpu_workload *workload);
147159
148160 #endif
drivers/gpu/drm/i915/gvt/vgpu.c+18−16
@@ -43,7 +43,10 @@ void populate_pvinfo_page(struct intel_vgpu *vgpu) · 42 unmodified lines
4343 vgpu_vreg(vgpu, vgtif_reg(version_minor)) = 0;
4444 vgpu_vreg(vgpu, vgtif_reg(display_ready)) = 0;
4545 vgpu_vreg(vgpu, vgtif_reg(vgt_id)) = vgpu->id;
46+
4647 vgpu_vreg(vgpu, vgtif_reg(vgt_caps)) = VGT_CAPS_FULL_48BIT_PPGTT;
48+ vgpu_vreg(vgpu, vgtif_reg(vgt_caps)) |= VGT_CAPS_HWSP_EMULATION;
49+
4750 vgpu_vreg(vgpu, vgtif_reg(avail_rs.mappable_gmadr.base)) =
4851 vgpu_aperture_gmadr_base(vgpu);
4952 vgpu_vreg(vgpu, vgtif_reg(avail_rs.mappable_gmadr.size)) =
@@ -226,7 +229,7 @@ void intel_gvt_deactivate_vgpu(struct intel_vgpu *vgpu) · 176 unmodified lines
226229
227230 vgpu->active = false;
228231
229− if (atomic_read(&vgpu->running_workload_num)) {
232+ if (atomic_read(&vgpu->submission.running_workload_num)) {
230233 mutex_unlock(&gvt->lock);
231234 intel_gvt_wait_vgpu_idle(vgpu);
232235 mutex_lock(&gvt->lock);
@@ -252,10 +255,10 @@ void intel_gvt_destroy_vgpu(struct intel_vgpu *vgpu) · 19 unmodified lines
252255
253256 WARN(vgpu->active, "vGPU is still active!\n");
254257
258+ intel_gvt_debugfs_remove_vgpu(vgpu);
255259 idr_remove(&gvt->vgpu_idr, vgpu->id);
256260 intel_vgpu_clean_sched_policy(vgpu);
257− intel_vgpu_clean_gvt_context(vgpu);
258− intel_vgpu_clean_execlist(vgpu);
261+ intel_vgpu_clean_submission(vgpu);
259262 intel_vgpu_clean_display(vgpu);
260263 intel_vgpu_clean_opregion(vgpu);
261264 intel_vgpu_clean_gtt(vgpu);
@@ -293,7 +296,7 @@ struct intel_vgpu *intel_gvt_create_idle_vgpu(struct intel_gvt *gvt) · 31 unmodified lines
293296 vgpu->gvt = gvt;
294297
295298 for (i = 0; i < I915_NUM_ENGINES; i++)
296− INIT_LIST_HEAD(&vgpu->workload_q_head[i]);
299+ INIT_LIST_HEAD(&vgpu->submission.workload_q_head[i]);
297300
298301 ret = intel_vgpu_init_sched_policy(vgpu);
299302 if (ret)
@@ -346,7 +349,6 @@ static struct intel_vgpu *__intel_gvt_create_vgpu(struct intel_gvt *gvt, · 46 unmodified lines
346349 vgpu->handle = param->handle;
347350 vgpu->gvt = gvt;
348351 vgpu->sched_ctl.weight = param->weight;
349− bitmap_zero(vgpu->tlb_handle_pending, I915_NUM_ENGINES);
350352
351353 intel_vgpu_init_cfg_space(vgpu, param->primary);
352354
@@ -372,26 +374,26 @@ static struct intel_vgpu *__intel_gvt_create_vgpu(struct intel_gvt *gvt, · 19 unmodified lines
372374 if (ret)
373375 goto out_clean_gtt;
374376
375− ret = intel_vgpu_init_execlist(vgpu);
377+ ret = intel_vgpu_setup_submission(vgpu);
376378 if (ret)
377379 goto out_clean_display;
378380
379− ret = intel_vgpu_init_gvt_context(vgpu);
381+ ret = intel_vgpu_init_sched_policy(vgpu);
380382 if (ret)
381− goto out_clean_execlist;
383+ goto out_clean_submission;
382384
383− ret = intel_vgpu_init_sched_policy(vgpu);
385+ ret = intel_gvt_debugfs_add_vgpu(vgpu);
384386 if (ret)
385− goto out_clean_shadow_ctx;
387+ goto out_clean_sched_policy;
386388
387389 mutex_unlock(&gvt->lock);
388390
389391 return vgpu;
390392
391−out_clean_shadow_ctx:
392− intel_vgpu_clean_gvt_context(vgpu);
393−out_clean_execlist:
394− intel_vgpu_clean_execlist(vgpu);
393+out_clean_sched_policy:
394+ intel_vgpu_clean_sched_policy(vgpu);
395+out_clean_submission:
396+ intel_vgpu_clean_submission(vgpu);
395397 out_clean_display:
396398 intel_vgpu_clean_display(vgpu);
397399 out_clean_gtt:
@@ -500,10 +502,10 @@ void intel_gvt_reset_vgpu_locked(struct intel_vgpu *vgpu, bool dmlr, · 102 unmodified lines
500502 mutex_lock(&gvt->lock);
501503 }
502504
503− intel_vgpu_reset_execlist(vgpu, resetting_eng);
504−
505+ intel_vgpu_reset_submission(vgpu, resetting_eng);
505506 /* full GPU reset or device model level reset */
506507 if (engine_mask == ALL_ENGINES || dmlr) {
508+ intel_vgpu_select_submission_ops(vgpu, 0);
507509
508510 /*fence will not be reset during virtual reset */
509511 if (dmlr) {
drivers/gpu/drm/i915/i915_cmd_parser.c+3−10
@@ -798,22 +798,15 @@ struct cmd_node { · 797 unmodified lines
798798 */
799799 static inline u32 cmd_header_key(u32 x)
800800 {
801− u32 shift;
802−
803801 switch (x >> INSTR_CLIENT_SHIFT) {
804802 default:
805803 case INSTR_MI_CLIENT:
806− shift = STD_MI_OPCODE_SHIFT;
807− break;
804+ return x >> STD_MI_OPCODE_SHIFT;
808805 case INSTR_RC_CLIENT:
809− shift = STD_3D_OPCODE_SHIFT;
810− break;
806+ return x >> STD_3D_OPCODE_SHIFT;
811807 case INSTR_BC_CLIENT:
812− shift = STD_2D_OPCODE_SHIFT;
813− break;
808+ return x >> STD_2D_OPCODE_SHIFT;
814809 }
815−
816− return x >> shift;
817810 }
818811
819812 static int init_hash_table(struct intel_engine_cs *engine,
drivers/gpu/drm/i915/i915_debugfs.c+114−17
@@ -30,7 +30,7 @@ · 29 unmodified lines
3030 #include <linux/sort.h>
3131 #include <linux/sched/mm.h>
3232 #include "intel_drv.h"
33−#include "i915_guc_submission.h"
33+#include "intel_guc_submission.h"
3434
3535 static inline struct drm_i915_private *node_to_i915(struct drm_info_node *node)
3636 {
@@ -1974,7 +1974,6 @@ static int i915_context_status(struct seq_file *m, void *unused) · 1937 unmodified lines
19741974 struct intel_context *ce = &ctx->engine[engine->id];
19751975
19761976 seq_printf(m, "%s: ", engine->name);
1977− seq_putc(m, ce->initialised ? 'I' : 'i');
19781977 if (ce->state)
19791978 describe_obj(m, ce->state->obj);
19801979 if (ce->ring)
@@ -2434,7 +2433,7 @@ static void i915_guc_log_info(struct seq_file *m, · 453 unmodified lines
24342433
24352434 static void i915_guc_client_info(struct seq_file *m,
24362435 struct drm_i915_private *dev_priv,
2437− struct i915_guc_client *client)
2436+ struct intel_guc_client *client)
24382437 {
24392438 struct intel_engine_cs *engine;
24402439 enum intel_engine_id id;
@@ -2484,6 +2483,8 @@ static int i915_guc_info(struct seq_file *m, void *data) · 43 unmodified lines
24842483
24852484 seq_printf(m, "\nGuC execbuf client @ %p:\n", guc->execbuf_client);
24862485 i915_guc_client_info(m, dev_priv, guc->execbuf_client);
2486+ seq_printf(m, "\nGuC preempt client @ %p:\n", guc->preempt_client);
2487+ i915_guc_client_info(m, dev_priv, guc->preempt_client);
24872488
24882489 i915_guc_log_info(m, dev_priv);
24892490
@@ -2497,7 +2498,7 @@ static int i915_guc_stage_pool(struct seq_file *m, void *data) · 7 unmodified lines
24972498 struct drm_i915_private *dev_priv = node_to_i915(m->private);
24982499 const struct intel_guc *guc = &dev_priv->guc;
24992500 struct guc_stage_desc *desc = guc->stage_desc_pool_vaddr;
2500− struct i915_guc_client *client = guc->execbuf_client;
2501+ struct intel_guc_client *client = guc->execbuf_client;
25012502 unsigned int tmp;
25022503 int index;
25032504
@@ -2734,39 +2735,76 @@ static int i915_sink_crc(struct seq_file *m, void *data) · 230 unmodified lines
27342735 struct intel_connector *connector;
27352736 struct drm_connector_list_iter conn_iter;
27362737 struct intel_dp *intel_dp = NULL;
2738+ struct drm_modeset_acquire_ctx ctx;
27372739 int ret;
27382740 u8 crc[6];
27392741
2740− drm_modeset_lock_all(dev);
2742+ drm_modeset_acquire_init(&ctx, DRM_MODESET_ACQUIRE_INTERRUPTIBLE);
2743+
27412744 drm_connector_list_iter_begin(dev, &conn_iter);
2745+
27422746 for_each_intel_connector_iter(connector, &conn_iter) {
27432747 struct drm_crtc *crtc;
2748+ struct drm_connector_state *state;
2749+ struct intel_crtc_state *crtc_state;
27442750
2745− if (!connector->base.state->best_encoder)
2751+ if (connector->base.connector_type != DRM_MODE_CONNECTOR_eDP)
27462752 continue;
27472753
2748− crtc = connector->base.state->crtc;
2749− if (!crtc->state->active)
2754+retry:
2755+ ret = drm_modeset_lock(&dev->mode_config.connection_mutex, &ctx);
2756+ if (ret)
2757+ goto err;
2758+
2759+ state = connector->base.state;
2760+ if (!state->best_encoder)
27502761 continue;
27512762
2752− if (connector->base.connector_type != DRM_MODE_CONNECTOR_eDP)
2763+ crtc = state->crtc;
2764+ ret = drm_modeset_lock(&crtc->mutex, &ctx);
2765+ if (ret)
2766+ goto err;
2767+
2768+ crtc_state = to_intel_crtc_state(crtc->state);
2769+ if (!crtc_state->base.active)
27532770 continue;
27542771
2755− intel_dp = enc_to_intel_dp(connector->base.state->best_encoder);
2772+ /*
2773+ * We need to wait for all crtc updates to complete, to make
2774+ * sure any pending modesets and plane updates are completed.
2775+ */
2776+ if (crtc_state->base.commit) {
2777+ ret = wait_for_completion_interruptible(&crtc_state->base.commit->hw_done);
27562778
2757− ret = intel_dp_sink_crc(intel_dp, crc);
2779+ if (ret)
2780+ goto err;
2781+ }
2782+
2783+ intel_dp = enc_to_intel_dp(state->best_encoder);
2784+
2785+ ret = intel_dp_sink_crc(intel_dp, crtc_state, crc);
27582786 if (ret)
2759− goto out;
2787+ goto err;
27602788
27612789 seq_printf(m, "%02x%02x%02x%02x%02x%02x\n",
27622790 crc[0], crc[1], crc[2],
27632791 crc[3], crc[4], crc[5]);
27642792 goto out;
2793+
2794+err:
2795+ if (ret == -EDEADLK) {
2796+ ret = drm_modeset_backoff(&ctx);
2797+ if (!ret)
2798+ goto retry;
2799+ }
2800+ goto out;
27652801 }
27662802 ret = -ENODEV;
27672803 out:
27682804 drm_connector_list_iter_end(&conn_iter);
2769− drm_modeset_unlock_all(dev);
2805+ drm_modeset_drop_locks(&ctx);
2806+ drm_modeset_acquire_fini(&ctx);
2807+
27702808 return ret;
27712809 }
27722810
@@ -3049,7 +3087,7 @@ static void intel_connector_info(struct seq_file *m, · 276 unmodified lines
30493087 break;
30503088 case DRM_MODE_CONNECTOR_HDMIA:
30513089 if (intel_encoder->type == INTEL_OUTPUT_HDMI ||
3052− intel_encoder->type == INTEL_OUTPUT_UNKNOWN)
3090+ intel_encoder->type == INTEL_OUTPUT_DDI)
30533091 intel_hdmi_info(m, intel_connector);
30543092 break;
30553093 default:
@@ -3244,6 +3282,8 @@ static int i915_engine_info(struct seq_file *m, void *unused) · 188 unmodified lines
32443282 yesno(dev_priv->gt.awake));
32453283 seq_printf(m, "Global active requests: %d\n",
32463284 dev_priv->gt.active_requests);
3285+ seq_printf(m, "CS timestamp frequency: %u kHz\n",
3286+ dev_priv->info.cs_timestamp_frequency_khz);
32473287
32483288 p = drm_seq_file_printer(m);
32493289 for_each_engine(engine, dev_priv, id)
@@ -3601,7 +3641,7 @@ static int i915_dp_mst_info(struct seq_file *m, void *unused) · 351 unmodified lines
36013641 continue;
36023642
36033643 seq_printf(m, "MST Source Port %c\n",
3604− port_name(intel_dig_port->port));
3644+ port_name(intel_dig_port->base.port));
36053645 drm_dp_mst_dump_topology(m, &intel_dig_port->dp.mst_mgr);
36063646 }
36073647 drm_connector_list_iter_end(&conn_iter);
@@ -4448,6 +4488,61 @@ static void cherryview_sseu_device_status(struct drm_i915_private *dev_priv, · 840 unmodified lines
44484488 }
44494489 }
44504490
4491+static void gen10_sseu_device_status(struct drm_i915_private *dev_priv,
4492+ struct sseu_dev_info *sseu)
4493+{
4494+ const struct intel_device_info *info = INTEL_INFO(dev_priv);
4495+ int s_max = 6, ss_max = 4;
4496+ int s, ss;
4497+ u32 s_reg[s_max], eu_reg[2 * s_max], eu_mask[2];
4498+
4499+ for (s = 0; s < s_max; s++) {
4500+ /*
4501+ * FIXME: Valid SS Mask respects the spec and read
4502+ * only valid bits for those registers, excluding reserverd
4503+ * although this seems wrong because it would leave many
4504+ * subslices without ACK.
4505+ */
4506+ s_reg[s] = I915_READ(GEN10_SLICE_PGCTL_ACK(s)) &
4507+ GEN10_PGCTL_VALID_SS_MASK(s);
4508+ eu_reg[2 * s] = I915_READ(GEN10_SS01_EU_PGCTL_ACK(s));
4509+ eu_reg[2 * s + 1] = I915_READ(GEN10_SS23_EU_PGCTL_ACK(s));
4510+ }
4511+
4512+ eu_mask[0] = GEN9_PGCTL_SSA_EU08_ACK |
4513+ GEN9_PGCTL_SSA_EU19_ACK |
4514+ GEN9_PGCTL_SSA_EU210_ACK |
4515+ GEN9_PGCTL_SSA_EU311_ACK;
4516+ eu_mask[1] = GEN9_PGCTL_SSB_EU08_ACK |
4517+ GEN9_PGCTL_SSB_EU19_ACK |
4518+ GEN9_PGCTL_SSB_EU210_ACK |
4519+ GEN9_PGCTL_SSB_EU311_ACK;
4520+
4521+ for (s = 0; s < s_max; s++) {
4522+ if ((s_reg[s] & GEN9_PGCTL_SLICE_ACK) == 0)
4523+ /* skip disabled slice */
4524+ continue;
4525+
4526+ sseu->slice_mask |= BIT(s);
4527+ sseu->subslice_mask = info->sseu.subslice_mask;
4528+
4529+ for (ss = 0; ss < ss_max; ss++) {
4530+ unsigned int eu_cnt;
4531+
4532+ if (!(s_reg[s] & (GEN9_PGCTL_SS_ACK(ss))))
4533+ /* skip disabled subslice */
4534+ continue;
4535+
4536+ eu_cnt = 2 * hweight32(eu_reg[2 * s + ss / 2] &
4537+ eu_mask[ss % 2]);
4538+ sseu->eu_total += eu_cnt;
4539+ sseu->eu_per_subslice = max_t(unsigned int,
4540+ sseu->eu_per_subslice,
4541+ eu_cnt);
4542+ }
4543+ }
4544+}
4545+
44514546 static void gen9_sseu_device_status(struct drm_i915_private *dev_priv,
44524547 struct sseu_dev_info *sseu)
44534548 {
@@ -4483,7 +4578,7 @@ static void gen9_sseu_device_status(struct drm_i915_private *dev_priv, · 29 unmodified lines
44834578
44844579 sseu->slice_mask |= BIT(s);
44854580
4486− if (IS_GEN9_BC(dev_priv) || IS_CANNONLAKE(dev_priv))
4581+ if (IS_GEN9_BC(dev_priv))
44874582 sseu->subslice_mask =
44884583 INTEL_INFO(dev_priv)->sseu.subslice_mask;
44894584
@@ -4589,8 +4684,10 @@ static int i915_sseu_status(struct seq_file *m, void *unused) · 99 unmodified lines
45894684 cherryview_sseu_device_status(dev_priv, &sseu);
45904685 } else if (IS_BROADWELL(dev_priv)) {
45914686 broadwell_sseu_device_status(dev_priv, &sseu);
4592− } else if (INTEL_GEN(dev_priv) >= 9) {
4687+ } else if (IS_GEN9(dev_priv)) {
45934688 gen9_sseu_device_status(dev_priv, &sseu);
4689+ } else if (INTEL_GEN(dev_priv) >= 10) {
4690+ gen10_sseu_device_status(dev_priv, &sseu);
45944691 }
45954692
45964693 intel_runtime_pm_put(dev_priv);
drivers/gpu/drm/i915/i915_drv.c+31−21
@@ -372,9 +372,8 @@ static int i915_getparam(struct drm_device *dev, void *data, · 371 unmodified lines
372372 value |= I915_SCHEDULER_CAP_ENABLED;
373373 value |= I915_SCHEDULER_CAP_PRIORITY;
374374
375− if (INTEL_INFO(dev_priv)->has_logical_ring_preemption &&
376− i915_modparams.enable_execlists &&
377− !i915_modparams.enable_guc_submission)
375+ if (HAS_LOGICAL_RING_PREEMPTION(dev_priv) &&
376+ i915_modparams.enable_execlists)
378377 value |= I915_SCHEDULER_CAP_PREEMPTION;
379378 }
380379 break;
@@ -407,6 +406,9 @@ static int i915_getparam(struct drm_device *dev, void *data, · 26 unmodified lines
407406 */
408407 value = 1;
409408 break;
409+ case I915_PARAM_HAS_CONTEXT_ISOLATION:
410+ value = intel_engines_has_context_isolation(dev_priv);
411+ break;
410412 case I915_PARAM_SLICE_MASK:
411413 value = INTEL_INFO(dev_priv)->sseu.slice_mask;
412414 if (!value)
@@ -417,6 +419,9 @@ static int i915_getparam(struct drm_device *dev, void *data, · 4 unmodified lines
417419 if (!value)
418420 return -ENODEV;
419421 break;
422+ case I915_PARAM_CS_TIMESTAMP_FREQUENCY:
423+ value = 1000 * INTEL_INFO(dev_priv)->cs_timestamp_frequency_khz;
424+ break;
420425 default:
421426 DRM_DEBUG("Unknown parameter %d\n", param->param);
422427 return -EINVAL;
@@ -677,7 +682,7 @@ static int i915_load_modeset_init(struct drm_device *dev) · 254 unmodified lines
677682 if (ret)
678683 goto cleanup_uc;
679684
680− intel_modeset_gem_init(dev);
685+ intel_setup_overlay(dev_priv);
681686
682687 if (INTEL_INFO(dev_priv)->num_pipes == 0)
683688 return 0;
@@ -838,6 +843,11 @@ static void i915_workqueues_cleanup(struct drm_i915_private *dev_priv) · 154 unmodified lines
838843 * We don't keep the workarounds for pre-production hardware, so we expect our
839844 * driver to fail on these machines in one way or another. A little warning on
840845 * dmesg may help both the user and the bug triagers.
846+ *
847+ * Our policy for removing pre-production workarounds is to keep the
848+ * current gen workarounds as a guide to the bring-up of the next gen
849+ * (workarounds have a habit of persisting!). Anything older than that
850+ * should be removed along with the complications they introduce.
841851 */
842852 static void intel_detect_preproduction_hw(struct drm_i915_private *dev_priv)
843853 {
@@ -892,7 +902,6 @@ static int i915_driver_init_early(struct drm_i915_private *dev_priv, · 48 unmodified lines
892902 mutex_init(&dev_priv->backlight_lock);
893903 spin_lock_init(&dev_priv->uncore.lock);
894904
895− spin_lock_init(&dev_priv->mm.object_stat_lock);
896905 mutex_init(&dev_priv->sb_lock);
897906 mutex_init(&dev_priv->modeset_restore_lock);
898907 mutex_init(&dev_priv->av_mutex);
@@ -1682,8 +1691,6 @@ static int i915_drm_resume(struct drm_device *dev) · 783 unmodified lines
16821691
16831692 intel_csr_ucode_resume(dev_priv);
16841693
1685− i915_gem_resume(dev_priv);
1686−
16871694 i915_restore_state(dev_priv);
16881695 intel_pps_unlock_regs_wa(dev_priv);
16891696 intel_opregion_setup(dev_priv);
@@ -1704,14 +1711,7 @@ static int i915_drm_resume(struct drm_device *dev) · 14 unmodified lines
17041711
17051712 drm_mode_config_reset(dev);
17061713
1707− mutex_lock(&dev->struct_mutex);
1708− if (i915_gem_init_hw(dev_priv)) {
1709− DRM_ERROR("failed to re-initialize GPU, declaring wedged!\n");
1710− i915_gem_set_wedged(dev_priv);
1711− }
1712− mutex_unlock(&dev->struct_mutex);
1713−
1714− intel_guc_resume(dev_priv);
1714+ i915_gem_resume(dev_priv);
17151715
17161716 intel_modeset_init_hw(dev);
17171717 intel_init_clock_gating(dev_priv);
@@ -1745,8 +1745,6 @@ static int i915_drm_resume(struct drm_device *dev) · 27 unmodified lines
17451745
17461746 intel_opregion_notify_adapter(dev_priv, PCI_D0);
17471747
1748− intel_autoenable_gt_powersave(dev_priv);
1749−
17501748 enable_rpm_wakeref_asserts(dev_priv);
17511749
17521750 return 0;
@@ -1952,6 +1950,12 @@ error: · 199 unmodified lines
19521950 goto finish;
19531951 }
19541952
1953+static inline int intel_gt_reset_engine(struct drm_i915_private *dev_priv,
1954+ struct intel_engine_cs *engine)
1955+{
1956+ return intel_gpu_reset(dev_priv, intel_engine_flag(engine));
1957+}
1958+
19551959 /**
19561960 * i915_reset_engine - reset GPU engine to recover from a hang
19571961 * @engine: engine to reset
@@ -1986,10 +1990,14 @@ int i915_reset_engine(struct intel_engine_cs *engine, unsigned int flags) · 28 unmodified lines
19861990 goto out;
19871991 }
19881992
1989− ret = intel_gpu_reset(engine->i915, intel_engine_flag(engine));
1993+ if (!engine->i915->guc.execbuf_client)
1994+ ret = intel_gt_reset_engine(engine->i915, engine);
1995+ else
1996+ ret = intel_guc_reset_engine(&engine->i915->guc, engine);
19901997 if (ret) {
19911998 /* If we fail here, we expect to fallback to a global reset */
1992− DRM_DEBUG_DRIVER("Failed to reset %s, ret=%d\n",
1999+ DRM_DEBUG_DRIVER("%sFailed to reset %s, ret=%d\n",
2000+ engine->i915->guc.execbuf_client ? "GuC " : "",
19932001 engine->name, ret);
19942002 goto out;
19952003 }
@@ -2524,6 +2532,8 @@ static int intel_runtime_suspend(struct device *kdev) · 528 unmodified lines
25242532
25252533 intel_runtime_pm_disable_interrupts(dev_priv);
25262534
2535+ intel_uncore_suspend(dev_priv);
2536+
25272537 ret = 0;
25282538 if (IS_GEN9_LP(dev_priv)) {
25292539 bxt_display_core_uninit(dev_priv);
@@ -2536,6 +2546,8 @@ static int intel_runtime_suspend(struct device *kdev) · 6 unmodified lines
25362546
25372547 if (ret) {
25382548 DRM_ERROR("Runtime suspend failed, disabling it (%d)\n", ret);
2549+ intel_uncore_runtime_resume(dev_priv);
2550+
25392551 intel_runtime_pm_enable_interrupts(dev_priv);
25402552
25412553 enable_rpm_wakeref_asserts(dev_priv);
@@ -2543,8 +2555,6 @@ static int intel_runtime_suspend(struct device *kdev) · 1 unmodified line
25432555 return ret;
25442556 }
25452557
2546− intel_uncore_suspend(dev_priv);
2547−
25482558 enable_rpm_wakeref_asserts(dev_priv);
25492559 WARN_ON_ONCE(atomic_read(&dev_priv->runtime_pm.wakeref_count));
25502560
drivers/gpu/drm/i915/i915_drv.h+43−19
@@ -67,7 +67,6 @@ · 66 unmodified lines
6767 #include "i915_gem_fence_reg.h"
6868 #include "i915_gem_object.h"
6969 #include "i915_gem_gtt.h"
70−#include "i915_gem_render_state.h"
7170 #include "i915_gem_request.h"
7271 #include "i915_gem_timeline.h"
7372
@@ -80,8 +79,8 @@ · 6 unmodified lines
8079
8180 #define DRIVER_NAME "i915"
8281 #define DRIVER_DESC "Intel Graphics"
83−#define DRIVER_DATE "20171023"
84−#define DRIVER_TIMESTAMP 1508748913
82+#define DRIVER_DATE "20171117"
83+#define DRIVER_TIMESTAMP 1510958822
8584
8685 /* Use I915_STATE_WARN(x) and I915_STATE_WARN_ON() (rather than WARN() and
8786 * WARN_ON()) for hw state sanity checks to check for unexpected conditions
@@ -726,10 +725,12 @@ struct drm_i915_display_funcs { · 638 unmodified lines
726725 void (*crtc_disable)(struct intel_crtc_state *old_crtc_state,
727726 struct drm_atomic_state *old_state);
728727 void (*update_crtcs)(struct drm_atomic_state *state);
729− void (*audio_codec_enable)(struct drm_connector *connector,
730− struct intel_encoder *encoder,
731− const struct drm_display_mode *adjusted_mode);
732− void (*audio_codec_disable)(struct intel_encoder *encoder);
728+ void (*audio_codec_enable)(struct intel_encoder *encoder,
729+ const struct intel_crtc_state *crtc_state,
730+ const struct drm_connector_state *conn_state);
731+ void (*audio_codec_disable)(struct intel_encoder *encoder,
732+ const struct intel_crtc_state *old_crtc_state,
733+ const struct drm_connector_state *old_conn_state);
733734 void (*fdi_link_train)(struct intel_crtc *crtc,
734735 const struct intel_crtc_state *crtc_state);
735736 void (*init_clock_gating)(struct drm_i915_private *dev_priv);
@@ -884,6 +885,8 @@ struct intel_device_info { · 148 unmodified lines
884885 /* Slice/subslice/EU info */
885886 struct sseu_dev_info sseu;
886887
888+ u32 cs_timestamp_frequency_khz;
889+
887890 struct color_luts {
888891 u16 degamma_lut_size;
889892 u16 gamma_lut_size;
@@ -911,6 +914,12 @@ struct i915_gpu_state { · 21 unmodified lines
911914 struct intel_device_info device_info;
912915 struct i915_params params;
913916
917+ struct i915_error_uc {
918+ struct intel_uc_fw guc_fw;
919+ struct intel_uc_fw huc_fw;
920+ struct drm_i915_error_object *guc_log;
921+ } uc;
922+
914923 /* Generic register state */
915924 u32 eir;
916925 u32 pgtbl_er;
@@ -934,7 +943,6 @@ struct i915_gpu_state { · 17 unmodified lines
934943 struct intel_overlay_error_state *overlay;
935944 struct intel_display_error_state *display;
936945 struct drm_i915_error_object *semaphore;
937− struct drm_i915_error_object *guc_log;
938946
939947 struct drm_i915_error_engine {
940948 int engine_id;
@@ -1386,7 +1394,6 @@ struct intel_gen6_power_mgmt { · 445 unmodified lines
13861394 struct intel_rps rps;
13871395 struct intel_rc6 rc6;
13881396 struct intel_llc_pstate llc_pstate;
1389− struct delayed_work autoenable_work;
13901397 };
13911398
13921399 /* defined intel_pm.c */
@@ -1698,6 +1705,8 @@ enum modeset_restore { · 305 unmodified lines
16981705 #define DDC_PIN_D 0x06
16991706
17001707 struct ddi_vbt_port_info {
1708+ int max_tmds_clock;
1709+
17011710 /*
17021711 * This is an index in the HDMI/DVI DDI buffer translation table.
17031712 * The special value HDMI_LEVEL_SHIFT_UNKNOWN means the VBT didn't
@@ -2228,6 +2237,7 @@ struct i915_oa_ops { · 524 unmodified lines
22282237
22292238 struct intel_cdclk_state {
22302239 unsigned int cdclk, vco, ref;
2240+ u8 voltage_level;
22312241 };
22322242
22332243 struct drm_i915_private {
@@ -2339,6 +2349,7 @@ struct drm_i915_private { · 105 unmodified lines
23392349 unsigned int max_dotclk_freq;
23402350 unsigned int rawclk_freq;
23412351 unsigned int hpll_freq;
2352+ unsigned int fdi_pll_freq;
23422353 unsigned int czclk_freq;
23432354
23442355 struct {
@@ -2415,6 +2426,8 @@ struct drm_i915_private { · 70 unmodified lines
24152426 unsigned int active_crtcs;
24162427 /* minimum acceptable cdclk for each pipe */
24172428 int min_cdclk[I915_MAX_PIPES];
2429+ /* minimum acceptable voltage level for each pipe */
2430+ u8 min_voltage_level[I915_MAX_PIPES];
24182431
24192432 int dpio_phy_iosf_port[I915_NUM_PHYS_VLV];
24202433
@@ -3046,6 +3059,8 @@ intel_info(const struct drm_i915_private *dev_priv) · 625 unmodified lines
30463059 (INTEL_DEVID(dev_priv) & 0x00F0) == 0x00A0)
30473060 #define IS_CFL_GT2(dev_priv) (IS_COFFEELAKE(dev_priv) && \
30483061 (dev_priv)->info.gt == 2)
3062+#define IS_CFL_GT3(dev_priv) (IS_COFFEELAKE(dev_priv) && \
3063+ (dev_priv)->info.gt == 3)
30493064
30503065 #define IS_ALPHA_SUPPORT(intel_info) ((intel_info)->is_alpha_support)
30513066
@@ -3137,6 +3152,8 @@ intel_info(const struct drm_i915_private *dev_priv) · 85 unmodified lines
31373152
31383153 #define HAS_LOGICAL_RING_CONTEXTS(dev_priv) \
31393154 ((dev_priv)->info.has_logical_ring_contexts)
3155+#define HAS_LOGICAL_RING_PREEMPTION(dev_priv) \
3156+ ((dev_priv)->info.has_logical_ring_preemption)
31403157 #define USES_PPGTT(dev_priv) (i915_modparams.enable_ppgtt)
31413158 #define USES_FULL_PPGTT(dev_priv) (i915_modparams.enable_ppgtt >= 2)
31423159 #define USES_FULL_48BIT_PPGTT(dev_priv) (i915_modparams.enable_ppgtt == 3)
@@ -3315,7 +3332,9 @@ extern int i915_reset_engine(struct intel_engine_cs *engine, · 172 unmodified lines
33153332 unsigned int flags);
33163333
33173334 extern bool intel_has_reset_engine(struct drm_i915_private *dev_priv);
3318−extern int intel_guc_reset(struct drm_i915_private *dev_priv);
3335+extern int intel_reset_guc(struct drm_i915_private *dev_priv);
3336+extern int intel_guc_reset_engine(struct intel_guc *guc,
3337+ struct intel_engine_cs *engine);
33193338 extern void intel_engine_init_hangcheck(struct intel_engine_cs *engine);
33203339 extern void intel_hangcheck_init(struct drm_i915_private *dev_priv);
33213340 extern unsigned long i915_chipset_val(struct drm_i915_private *dev_priv);
@@ -4107,7 +4126,6 @@ void intel_device_info_dump(struct drm_i915_private *dev_priv); · 785 unmodified lines
41074126 /* modesetting */
41084127 extern void intel_modeset_init_hw(struct drm_device *dev);
41094128 extern int intel_modeset_init(struct drm_device *dev);
4110−extern void intel_modeset_gem_init(struct drm_device *dev);
41114129 extern void intel_modeset_cleanup(struct drm_device *dev);
41124130 extern int intel_connector_register(struct drm_connector *);
41134131 extern void intel_connector_unregister(struct drm_connector *);
@@ -4174,8 +4192,7 @@ bool bxt_ddi_phy_is_enabled(struct drm_i915_private *dev_priv, · 60 unmodified lines
41744192 enum dpio_phy phy);
41754193 bool bxt_ddi_phy_verify_state(struct drm_i915_private *dev_priv,
41764194 enum dpio_phy phy);
4177−uint8_t bxt_ddi_phy_calc_lane_lat_optim_mask(struct intel_encoder *encoder,
4178− uint8_t lane_count);
4195+uint8_t bxt_ddi_phy_calc_lane_lat_optim_mask(uint8_t lane_count);
41794196 void bxt_ddi_phy_set_lane_optim_mask(struct intel_encoder *encoder,
41804197 uint8_t lane_lat_optim_mask);
41814198 uint8_t bxt_ddi_phy_get_lane_lat_optim_mask(struct intel_encoder *encoder);
@@ -4184,18 +4201,25 @@ void chv_set_phy_signal_level(struct intel_encoder *encoder, · 2 unmodified lines
41844201 u32 deemph_reg_value, u32 margin_reg_value,
41854202 bool uniq_trans_scale);
41864203 void chv_data_lane_soft_reset(struct intel_encoder *encoder,
4204+ const struct intel_crtc_state *crtc_state,
41874205 bool reset);
4188−void chv_phy_pre_pll_enable(struct intel_encoder *encoder);
4189−void chv_phy_pre_encoder_enable(struct intel_encoder *encoder);
4206+void chv_phy_pre_pll_enable(struct intel_encoder *encoder,
4207+ const struct intel_crtc_state *crtc_state);
4208+void chv_phy_pre_encoder_enable(struct intel_encoder *encoder,
4209+ const struct intel_crtc_state *crtc_state);
41904210 void chv_phy_release_cl2_override(struct intel_encoder *encoder);
4191−void chv_phy_post_pll_disable(struct intel_encoder *encoder);
4211+void chv_phy_post_pll_disable(struct intel_encoder *encoder,
4212+ const struct intel_crtc_state *old_crtc_state);
41924213
41934214 void vlv_set_phy_signal_level(struct intel_encoder *encoder,
41944215 u32 demph_reg_value, u32 preemph_reg_value,
41954216 u32 uniqtranscale_reg_value, u32 tx3_demph);
4196−void vlv_phy_pre_pll_enable(struct intel_encoder *encoder);
4197−void vlv_phy_pre_encoder_enable(struct intel_encoder *encoder);
4198−void vlv_phy_reset_lanes(struct intel_encoder *encoder);
4217+void vlv_phy_pre_pll_enable(struct intel_encoder *encoder,
4218+ const struct intel_crtc_state *crtc_state);
4219+void vlv_phy_pre_encoder_enable(struct intel_encoder *encoder,
4220+ const struct intel_crtc_state *crtc_state);
4221+void vlv_phy_reset_lanes(struct intel_encoder *encoder,
4222+ const struct intel_crtc_state *old_crtc_state);
41994223
42004224 int intel_gpu_freq(struct drm_i915_private *dev_priv, int val);
42014225 int intel_freq_opcode(struct drm_i915_private *dev_priv, int val);
drivers/gpu/drm/i915/i915_gem.c+264−52
@@ -538,7 +538,7 @@ i915_gem_object_wait_priority(struct drm_i915_gem_object *obj, · 537 unmodified lines
538538 * @obj: i915 gem object
539539 * @flags: how to wait (under a lock, for all rendering or just for writes etc)
540540 * @timeout: how long to wait
541− * @rps: client (user process) to charge for any waitboosting
541+ * @rps_client: client (user process) to charge for any waitboosting
542542 */
543543 int
544544 i915_gem_object_wait(struct drm_i915_gem_object *obj,
@@ -1619,7 +1619,19 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data, · 1074 unmodified lines
16191619 if (err)
16201620 goto out;
16211621
1622− /* Flush and acquire obj->pages so that we are coherent through
1622+ /*
1623+ * Proxy objects do not control access to the backing storage, ergo
1624+ * they cannot be used as a means to manipulate the cache domain
1625+ * tracking for that backing storage. The proxy object is always
1626+ * considered to be outside of any cache domain.
1627+ */
1628+ if (i915_gem_object_is_proxy(obj)) {
1629+ err = -ENXIO;
1630+ goto out;
1631+ }
1632+
1633+ /*
1634+ * Flush and acquire obj->pages so that we are coherent through
16231635 * direct access in memory with previous cached writes through
16241636 * shmemfs and that our cache domain tracking remains valid.
16251637 * For example, if the obj->filp was moved to swap without us
@@ -1675,6 +1687,11 @@ i915_gem_sw_finish_ioctl(struct drm_device *dev, void *data, · 49 unmodified lines
16751687 if (!obj)
16761688 return -ENOENT;
16771689
1690+ /*
1691+ * Proxy objects are barred from CPU access, so there is no
1692+ * need to ban sw_finish as it is a nop.
1693+ */
1694+
16781695 /* Pinned buffers may be scanout, so flush the cache */
16791696 i915_gem_object_flush_if_display(obj);
16801697 i915_gem_object_put(obj);
@@ -1725,7 +1742,7 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data, · 44 unmodified lines
17251742 */
17261743 if (!obj->base.filp) {
17271744 i915_gem_object_put(obj);
1728− return -EINVAL;
1745+ return -ENXIO;
17291746 }
17301747
17311748 addr = vm_mmap(obj->base.filp, 0, args->size,
@@ -2669,7 +2686,8 @@ void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj, · 937 unmodified lines
26692686 void *ptr;
26702687 int ret;
26712688
2672− GEM_BUG_ON(!i915_gem_object_has_struct_page(obj));
2689+ if (unlikely(!i915_gem_object_has_struct_page(obj)))
2690+ return ERR_PTR(-ENXIO);
26732691
26742692 ret = mutex_lock_interruptible(&obj->mm.lock);
26752693 if (ret)
@@ -2915,13 +2933,23 @@ i915_gem_reset_prepare_engine(struct intel_engine_cs *engine) · 239 unmodified lines
29152933 * Prevent request submission to the hardware until we have
29162934 * completed the reset in i915_gem_reset_finish(). If a request
29172935 * is completed by one engine, it may then queue a request
2918− * to a second via its engine->irq_tasklet *just* as we are
2936+ * to a second via its execlists->tasklet *just* as we are
29192937 * calling engine->init_hw() and also writing the ELSP.
2920− * Turning off the engine->irq_tasklet until the reset is over
2938+ * Turning off the execlists->tasklet until the reset is over
29212939 * prevents the race.
29222940 */
2923− tasklet_kill(&engine->execlists.irq_tasklet);
2924− tasklet_disable(&engine->execlists.irq_tasklet);
2941+ tasklet_kill(&engine->execlists.tasklet);
2942+ tasklet_disable(&engine->execlists.tasklet);
2943+
2944+ /*
2945+ * We're using worker to queue preemption requests from the tasklet in
2946+ * GuC submission mode.
2947+ * Even though tasklet was disabled, we may still have a worker queued.
2948+ * Let's make sure that all workers scheduled before disabling the
2949+ * tasklet are completed before continuing with the reset.
2950+ */
2951+ if (engine->i915->guc.preempt_wq)
2952+ flush_workqueue(engine->i915->guc.preempt_wq);
29252953
29262954 if (engine->irq_seqno_barrier)
29272955 engine->irq_seqno_barrier(engine);
@@ -3100,7 +3128,7 @@ void i915_gem_reset(struct drm_i915_private *dev_priv) · 172 unmodified lines
31003128
31013129 void i915_gem_reset_finish_engine(struct intel_engine_cs *engine)
31023130 {
3103− tasklet_enable(&engine->execlists.irq_tasklet);
3131+ tasklet_enable(&engine->execlists.tasklet);
31043132 kthread_unpark(engine->breadcrumbs.signaler);
31053133
31063134 intel_uncore_forcewake_put(engine->i915, FORCEWAKE_ALL);
@@ -3278,13 +3306,20 @@ i915_gem_retire_work_handler(struct work_struct *work) · 171 unmodified lines
32783306 }
32793307 }
32803308
3309+static inline bool
3310+new_requests_since_last_retire(const struct drm_i915_private *i915)
3311+{
3312+ return (READ_ONCE(i915->gt.active_requests) ||
3313+ work_pending(&i915->gt.idle_work.work));
3314+}
3315+
32813316 static void
32823317 i915_gem_idle_work_handler(struct work_struct *work)
32833318 {
32843319 struct drm_i915_private *dev_priv =
32853320 container_of(work, typeof(*dev_priv), gt.idle_work.work);
3286− struct drm_device *dev = &dev_priv->drm;
32873321 bool rearm_hangcheck;
3322+ ktime_t end;
32883323
32893324 if (!READ_ONCE(dev_priv->gt.awake))
32903325 return;
@@ -3293,14 +3328,21 @@ i915_gem_idle_work_handler(struct work_struct *work) · 2 unmodified lines
32933328 * Wait for last execlists context complete, but bail out in case a
32943329 * new request is submitted.
32953330 */
3296− wait_for(intel_engines_are_idle(dev_priv), 10);
3297− if (READ_ONCE(dev_priv->gt.active_requests))
3298− return;
3331+ end = ktime_add_ms(ktime_get(), 200);
3332+ do {
3333+ if (new_requests_since_last_retire(dev_priv))
3334+ return;
3335+
3336+ if (intel_engines_are_idle(dev_priv))
3337+ break;
3338+
3339+ usleep_range(100, 500);
3340+ } while (ktime_before(ktime_get(), end));
32993341
33003342 rearm_hangcheck =
33013343 cancel_delayed_work_sync(&dev_priv->gpu_error.hangcheck_work);
33023344
3303− if (!mutex_trylock(&dev->struct_mutex)) {
3345+ if (!mutex_trylock(&dev_priv->drm.struct_mutex)) {
33043346 /* Currently busy, come back later */
33053347 mod_delayed_work(dev_priv->wq,
33063348 &dev_priv->gt.idle_work,
@@ -3312,16 +3354,23 @@ i915_gem_idle_work_handler(struct work_struct *work) · 5 unmodified lines
33123354 * New request retired after this work handler started, extend active
33133355 * period until next instance of the work.
33143356 */
3315− if (work_pending(work))
3316− goto out_unlock;
3317−
3318− if (dev_priv->gt.active_requests)
3357+ if (new_requests_since_last_retire(dev_priv))
33193358 goto out_unlock;
33203359
3321− if (wait_for(intel_engines_are_idle(dev_priv), 10))
3322− DRM_ERROR("Timeout waiting for engines to idle\n");
3360+ /*
3361+ * Be paranoid and flush a concurrent interrupt to make sure
3362+ * we don't reactivate any irq tasklets after parking.
3363+ *
3364+ * FIXME: Note that even though we have waited for execlists to be idle,
3365+ * there may still be an in-flight interrupt even though the CSB
3366+ * is now empty. synchronize_irq() makes sure that a residual interrupt
3367+ * is completed before we continue, but it doesn't prevent the HW from
3368+ * raising a spurious interrupt later. To complete the shield we should
3369+ * coordinate disabling the CS irq with flushing the interrupts.
3370+ */
3371+ synchronize_irq(dev_priv->drm.irq);
33233372
3324− intel_engines_mark_idle(dev_priv);
3373+ intel_engines_park(dev_priv);
33253374 i915_gem_timelines_mark_idle(dev_priv);
33263375
33273376 GEM_BUG_ON(!dev_priv->gt.awake);
@@ -3332,7 +3381,7 @@ i915_gem_idle_work_handler(struct work_struct *work) · 4 unmodified lines
33323381 gen6_rps_idle(dev_priv);
33333382 intel_runtime_pm_put(dev_priv);
33343383 out_unlock:
3335− mutex_unlock(&dev->struct_mutex);
3384+ mutex_unlock(&dev_priv->drm.struct_mutex);
33363385
33373386 out_rearm:
33383387 if (rearm_hangcheck) {
@@ -3857,6 +3906,15 @@ int i915_gem_set_caching_ioctl(struct drm_device *dev, void *data, · 518 unmodified lines
38573906 if (!obj)
38583907 return -ENOENT;
38593908
3909+ /*
3910+ * The caching mode of proxy object is handled by its generator, and
3911+ * not allowed to be changed by userspace.
3912+ */
3913+ if (i915_gem_object_is_proxy(obj)) {
3914+ ret = -ENXIO;
3915+ goto out;
3916+ }
3917+
38603918 if (obj->cache_level == level)
38613919 goto out;
38623920
@@ -4662,14 +4720,16 @@ void __i915_gem_object_release_unless_active(struct drm_i915_gem_object *obj) · 799 unmodified lines
46624720 i915_gem_object_put(obj);
46634721 }
46644722
4665−static void assert_kernel_context_is_current(struct drm_i915_private *dev_priv)
4723+static void assert_kernel_context_is_current(struct drm_i915_private *i915)
46664724 {
4725+ struct i915_gem_context *kernel_context = i915->kernel_context;
46674726 struct intel_engine_cs *engine;
46684727 enum intel_engine_id id;
46694728
4670− for_each_engine(engine, dev_priv, id)
4671− GEM_BUG_ON(engine->last_retired_context &&
4672− !i915_gem_context_is_kernel(engine->last_retired_context));
4729+ for_each_engine(engine, i915, id) {
4730+ GEM_BUG_ON(__i915_gem_active_peek(&engine->timeline->last_request));
4731+ GEM_BUG_ON(engine->last_retired_context != kernel_context);
4732+ }
46734733 }
46744734
46754735 void i915_gem_sanitize(struct drm_i915_private *i915)
@@ -4773,23 +4833,40 @@ err_unlock: · 97 unmodified lines
47734833 return ret;
47744834 }
47754835
4776−void i915_gem_resume(struct drm_i915_private *dev_priv)
4836+void i915_gem_resume(struct drm_i915_private *i915)
47774837 {
4778− struct drm_device *dev = &dev_priv->drm;
4838+ WARN_ON(i915->gt.awake);
47794839
4780− WARN_ON(dev_priv->gt.awake);
4840+ mutex_lock(&i915->drm.struct_mutex);
4841+ intel_uncore_forcewake_get(i915, FORCEWAKE_ALL);
47814842
4782− mutex_lock(&dev->struct_mutex);
4783− i915_gem_restore_gtt_mappings(dev_priv);
4784− i915_gem_restore_fences(dev_priv);
4843+ i915_gem_restore_gtt_mappings(i915);
4844+ i915_gem_restore_fences(i915);
47854845
47864846 /* As we didn't flush the kernel context before suspend, we cannot
47874847 * guarantee that the context image is complete. So let's just reset
47884848 * it and start again.
47894849 */
4790− dev_priv->gt.resume(dev_priv);
4850+ i915->gt.resume(i915);
47914851
4792− mutex_unlock(&dev->struct_mutex);
4852+ if (i915_gem_init_hw(i915))
4853+ goto err_wedged;
4854+
4855+ intel_guc_resume(i915);
4856+
4857+ /* Always reload a context for powersaving. */
4858+ if (i915_gem_switch_to_kernel_context(i915))
4859+ goto err_wedged;
4860+
4861+out_unlock:
4862+ intel_uncore_forcewake_put(i915, FORCEWAKE_ALL);
4863+ mutex_unlock(&i915->drm.struct_mutex);
4864+ return;
4865+
4866+err_wedged:
4867+ DRM_ERROR("failed to re-initialize GPU, declaring wedged!\n");
4868+ i915_gem_set_wedged(i915);
4869+ goto out_unlock;
47934870 }
47944871
47954872 void i915_gem_init_swizzling(struct drm_i915_private *dev_priv)
@@ -4906,18 +4983,15 @@ int i915_gem_init_hw(struct drm_i915_private *dev_priv) · 110 unmodified lines
49064983 goto out;
49074984 }
49084985
4909− /* Need to do basic initialisation of all rings first: */
4910− ret = __i915_gem_restart_engines(dev_priv);
4911− if (ret)
4912− goto out;
4913−
4914− intel_mocs_init_l3cc_table(dev_priv);
4915−
49164986 /* We can't enable contexts until all firmware is loaded */
49174987 ret = intel_uc_init_hw(dev_priv);
49184988 if (ret)
49194989 goto out;
49204990
4991+ intel_mocs_init_l3cc_table(dev_priv);
4992+
4993+ /* Only when the HW is re-initialised, can we replay the requests */
4994+ ret = __i915_gem_restart_engines(dev_priv);
49214995 out:
49224996 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
49234997 return ret;
@@ -4942,6 +5016,120 @@ bool intel_sanitize_semaphores(struct drm_i915_private *dev_priv, int value) · 18 unmodified lines
49425016 return true;
49435017 }
49445018
5019+static int __intel_engines_record_defaults(struct drm_i915_private *i915)
5020+{
5021+ struct i915_gem_context *ctx;
5022+ struct intel_engine_cs *engine;
5023+ enum intel_engine_id id;
5024+ int err;
5025+
5026+ /*
5027+ * As we reset the gpu during very early sanitisation, the current
5028+ * register state on the GPU should reflect its defaults values.
5029+ * We load a context onto the hw (with restore-inhibit), then switch
5030+ * over to a second context to save that default register state. We
5031+ * can then prime every new context with that state so they all start
5032+ * from the same default HW values.
5033+ */
5034+
5035+ ctx = i915_gem_context_create_kernel(i915, 0);
5036+ if (IS_ERR(ctx))
5037+ return PTR_ERR(ctx);
5038+
5039+ for_each_engine(engine, i915, id) {
5040+ struct drm_i915_gem_request *rq;
5041+
5042+ rq = i915_gem_request_alloc(engine, ctx);
5043+ if (IS_ERR(rq)) {
5044+ err = PTR_ERR(rq);
5045+ goto out_ctx;
5046+ }
5047+
5048+ err = i915_switch_context(rq);
5049+ if (engine->init_context)
5050+ err = engine->init_context(rq);
5051+
5052+ __i915_add_request(rq, true);
5053+ if (err)
5054+ goto err_active;
5055+ }
5056+
5057+ err = i915_gem_switch_to_kernel_context(i915);
5058+ if (err)
5059+ goto err_active;
5060+
5061+ err = i915_gem_wait_for_idle(i915, I915_WAIT_LOCKED);
5062+ if (err)
5063+ goto err_active;
5064+
5065+ assert_kernel_context_is_current(i915);
5066+
5067+ for_each_engine(engine, i915, id) {
5068+ struct i915_vma *state;
5069+
5070+ state = ctx->engine[id].state;
5071+ if (!state)
5072+ continue;
5073+
5074+ /*
5075+ * As we will hold a reference to the logical state, it will
5076+ * not be torn down with the context, and importantly the
5077+ * object will hold onto its vma (making it possible for a
5078+ * stray GTT write to corrupt our defaults). Unmap the vma
5079+ * from the GTT to prevent such accidents and reclaim the
5080+ * space.
5081+ */
5082+ err = i915_vma_unbind(state);
5083+ if (err)
5084+ goto err_active;
5085+
5086+ err = i915_gem_object_set_to_cpu_domain(state->obj, false);
5087+ if (err)
5088+ goto err_active;
5089+
5090+ engine->default_state = i915_gem_object_get(state->obj);
5091+ }
5092+
5093+ if (IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM)) {
5094+ unsigned int found = intel_engines_has_context_isolation(i915);
5095+
5096+ /*
5097+ * Make sure that classes with multiple engine instances all
5098+ * share the same basic configuration.
5099+ */
5100+ for_each_engine(engine, i915, id) {
5101+ unsigned int bit = BIT(engine->uabi_class);
5102+ unsigned int expected = engine->default_state ? bit : 0;
5103+
5104+ if ((found & bit) != expected) {
5105+ DRM_ERROR("mismatching default context state for class %d on engine %s\n",
5106+ engine->uabi_class, engine->name);
5107+ }
5108+ }
5109+ }
5110+
5111+out_ctx:
5112+ i915_gem_context_set_closed(ctx);
5113+ i915_gem_context_put(ctx);
5114+ return err;
5115+
5116+err_active:
5117+ /*
5118+ * If we have to abandon now, we expect the engines to be idle
5119+ * and ready to be torn-down. First try to flush any remaining
5120+ * request, ensure we are pointing at the kernel context and
5121+ * then remove it.
5122+ */
5123+ if (WARN_ON(i915_gem_switch_to_kernel_context(i915)))
5124+ goto out_ctx;
5125+
5126+ if (WARN_ON(i915_gem_wait_for_idle(i915, I915_WAIT_LOCKED)))
5127+ goto out_ctx;
5128+
5129+ i915_gem_contexts_lost(i915);
5130+ goto out_ctx;
5131+}
5132+
49455133 int i915_gem_init(struct drm_i915_private *dev_priv)
49465134 {
49475135 int ret;
@@ -4991,7 +5179,25 @@ int i915_gem_init(struct drm_i915_private *dev_priv) · 43 unmodified lines
49915179 if (ret)
49925180 goto out_unlock;
49935181
5182+ intel_init_gt_powersave(dev_priv);
5183+
49945184 ret = i915_gem_init_hw(dev_priv);
5185+ if (ret)
5186+ goto out_unlock;
5187+
5188+ /*
5189+ * Despite its name intel_init_clock_gating applies both display
5190+ * clock gating workarounds; GT mmio workarounds and the occasional
5191+ * GT power context workaround. Worse, sometimes it includes a context
5192+ * register workaround which we need to apply before we record the
5193+ * default HW state for all contexts.
5194+ *
5195+ * FIXME: break up the workarounds and apply them at the right time!
5196+ */
5197+ intel_init_clock_gating(dev_priv);
5198+
5199+ ret = __intel_engines_record_defaults(dev_priv);
5200+out_unlock:
49955201 if (ret == -EIO) {
49965202 /* Allow engine initialisation to fail by marking the GPU as
49975203 * wedged. But we only want to do this where the GPU is angry,
@@ -5003,8 +5209,6 @@ int i915_gem_init(struct drm_i915_private *dev_priv) · 5 unmodified lines
50035209 }
50045210 ret = 0;
50055211 }
5006−
5007−out_unlock:
50085212 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
50095213 mutex_unlock(&dev_priv->drm.struct_mutex);
50105214
@@ -5058,6 +5262,22 @@ i915_gem_load_init_fences(struct drm_i915_private *dev_priv) · 47 unmodified lines
50585262 i915_gem_detect_bit_6_swizzle(dev_priv);
50595263 }
50605264
5265+static void i915_gem_init__mm(struct drm_i915_private *i915)
5266+{
5267+ spin_lock_init(&i915->mm.object_stat_lock);
5268+ spin_lock_init(&i915->mm.obj_lock);
5269+ spin_lock_init(&i915->mm.free_lock);
5270+
5271+ init_llist_head(&i915->mm.free_list);
5272+
5273+ INIT_LIST_HEAD(&i915->mm.unbound_list);
5274+ INIT_LIST_HEAD(&i915->mm.bound_list);
5275+ INIT_LIST_HEAD(&i915->mm.fence_list);
5276+ INIT_LIST_HEAD(&i915->mm.userfault_list);
5277+
5278+ INIT_WORK(&i915->mm.free_work, __i915_gem_free_work);
5279+}
5280+
50615281 int
50625282 i915_gem_load_init(struct drm_i915_private *dev_priv)
50635283 {
@@ -5099,15 +5319,7 @@ i915_gem_load_init(struct drm_i915_private *dev_priv) · 35 unmodified lines
50995319 if (err)
51005320 goto err_priorities;
51015321
5102− INIT_WORK(&dev_priv->mm.free_work, __i915_gem_free_work);
5103−
5104− spin_lock_init(&dev_priv->mm.obj_lock);
5105− spin_lock_init(&dev_priv->mm.free_lock);
5106− init_llist_head(&dev_priv->mm.free_list);
5107− INIT_LIST_HEAD(&dev_priv->mm.unbound_list);
5108− INIT_LIST_HEAD(&dev_priv->mm.bound_list);
5109− INIT_LIST_HEAD(&dev_priv->mm.fence_list);
5110− INIT_LIST_HEAD(&dev_priv->mm.userfault_list);
5322+ i915_gem_init__mm(dev_priv);
51115323
51125324 INIT_DELAYED_WORK(&dev_priv->gt.retire_work,
51135325 i915_gem_retire_work_handler);
drivers/gpu/drm/i915/i915_gem.h+11−1
@@ -28,7 +28,11 @@ · 27 unmodified lines
2828 #include <linux/bug.h>
2929
3030 #ifdef CONFIG_DRM_I915_DEBUG_GEM
31−#define GEM_BUG_ON(expr) BUG_ON(expr)
31+#define GEM_BUG_ON(condition) do { if (unlikely((condition))) { \
32+ printk(KERN_ERR "GEM_BUG_ON(%s)\n", __stringify(condition)); \
33+ BUG(); \
34+ } \
35+ } while(0)
3236 #define GEM_WARN_ON(expr) WARN_ON(expr)
3337
3438 #define GEM_DEBUG_DECL(var) var
@@ -44,6 +48,12 @@ · 9 unmodified lines
4448 #define GEM_DEBUG_BUG_ON(expr)
4549 #endif
4650
51+#if IS_ENABLED(CONFIG_DRM_I915_TRACE_GEM)
52+#define GEM_TRACE(...) trace_printk(__VA_ARGS__)
53+#else
54+#define GEM_TRACE(...) do { } while (0)
55+#endif
56+
4757 #define I915_NUM_ENGINES 5
4858
4959 #endif /* __I915_GEM_H__ */
drivers/gpu/drm/i915/i915_gem_context.c+15−47
@@ -418,8 +418,8 @@ out: · 417 unmodified lines
418418 return ctx;
419419 }
420420
421−static struct i915_gem_context *
422−create_kernel_context(struct drm_i915_private *i915, int prio)
421+struct i915_gem_context *
422+i915_gem_context_create_kernel(struct drm_i915_private *i915, int prio)
423423 {
424424 struct i915_gem_context *ctx;
425425
@@ -473,7 +473,7 @@ int i915_gem_contexts_init(struct drm_i915_private *dev_priv) · 47 unmodified lines
473473 ida_init(&dev_priv->contexts.hw_ida);
474474
475475 /* lowest priority; idle task */
476− ctx = create_kernel_context(dev_priv, I915_PRIORITY_MIN);
476+ ctx = i915_gem_context_create_kernel(dev_priv, I915_PRIORITY_MIN);
477477 if (IS_ERR(ctx)) {
478478 DRM_ERROR("Failed to create default global context\n");
479479 err = PTR_ERR(ctx);
@@ -487,7 +487,7 @@ int i915_gem_contexts_init(struct drm_i915_private *dev_priv) · 7 unmodified lines
487487 dev_priv->kernel_context = ctx;
488488
489489 /* highest priority; preempting task */
490− ctx = create_kernel_context(dev_priv, INT_MAX);
490+ ctx = i915_gem_context_create_kernel(dev_priv, INT_MAX);
491491 if (IS_ERR(ctx)) {
492492 DRM_ERROR("Failed to create default preempt context\n");
493493 err = PTR_ERR(ctx);
@@ -522,28 +522,6 @@ void i915_gem_contexts_lost(struct drm_i915_private *dev_priv) · 28 unmodified lines
522522 engine->context_unpin(engine, engine->last_retired_context);
523523 engine->last_retired_context = NULL;
524524 }
525−
526− /* Force the GPU state to be restored on enabling */
527− if (!i915_modparams.enable_execlists) {
528− struct i915_gem_context *ctx;
529−
530− list_for_each_entry(ctx, &dev_priv->contexts.list, link) {
531− if (!i915_gem_context_is_default(ctx))
532− continue;
533−
534− for_each_engine(engine, dev_priv, id)
535− ctx->engine[engine->id].initialised = false;
536−
537− ctx->remap_slice = ALL_L3_SLICES(dev_priv);
538− }
539−
540− for_each_engine(engine, dev_priv, id) {
541− struct intel_context *kce =
542− &dev_priv->kernel_context->engine[engine->id];
543−
544− kce->initialised = true;
545− }
546− }
547525 }
548526
549527 void i915_gem_contexts_fini(struct drm_i915_private *i915)
@@ -718,9 +696,6 @@ static inline bool skip_rcs_switch(struct i915_hw_ppgtt *ppgtt, · 168 unmodified lines
718696 if (to->remap_slice)
719697 return false;
720698
721− if (!to->engine[RCS].initialised)
722− return false;
723−
724699 if (ppgtt && (intel_engine_flag(engine) & ppgtt->pd_dirty_rings))
725700 return false;
726701
@@ -795,11 +770,14 @@ static int do_rcs_switch(struct drm_i915_gem_request *req) · 68 unmodified lines
795770 return ret;
796771 }
797772
798− if (!to->engine[RCS].initialised || i915_gem_context_is_default(to))
799− /* NB: If we inhibit the restore, the context is not allowed to
800− * die because future work may end up depending on valid address
801− * space. This means we must enforce that a page table load
802− * occur when this occurs. */
773+ if (i915_gem_context_is_kernel(to))
774+ /*
775+ * The kernel context(s) is treated as pure scratch and is not
776+ * expected to retain any state (as we sacrifice it during
777+ * suspend and on resume it may be corrupted). This is ok,
778+ * as nothing actually executes using the kernel context; it
779+ * is purely used for flushing user contexts.
780+ */
803781 hw_flags = MI_RESTORE_INHIBIT;
804782 else if (ppgtt && intel_engine_flag(engine) & ppgtt->pd_dirty_rings)
805783 hw_flags = MI_FORCE_RESTORE;
@@ -843,15 +821,6 @@ static int do_rcs_switch(struct drm_i915_gem_request *req) · 37 unmodified lines
843821 to->remap_slice &= ~(1<<i);
844822 }
845823
846− if (!to->engine[RCS].initialised) {
847− if (engine->init_context) {
848− ret = engine->init_context(req);
849− if (ret)
850− return ret;
851− }
852− to->engine[RCS].initialised = true;
853− }
854−
855824 return 0;
856825 }
857826
@@ -899,7 +868,7 @@ int i915_switch_context(struct drm_i915_gem_request *req) · 41 unmodified lines
899868 return do_rcs_switch(req);
900869 }
901870
902−static bool engine_has_kernel_context(struct intel_engine_cs *engine)
871+static bool engine_has_idle_kernel_context(struct intel_engine_cs *engine)
903872 {
904873 struct i915_gem_timeline *timeline;
905874
@@ -915,8 +884,7 @@ static bool engine_has_kernel_context(struct intel_engine_cs *engine) · 9 unmodified lines
915884 return false;
916885 }
917886
918− return (!engine->last_retired_context ||
919− i915_gem_context_is_kernel(engine->last_retired_context));
887+ return intel_engine_has_kernel_context(engine);
920888 }
921889
922890 int i915_gem_switch_to_kernel_context(struct drm_i915_private *dev_priv)
@@ -933,7 +901,7 @@ int i915_gem_switch_to_kernel_context(struct drm_i915_private *dev_priv) · 10 unmodified lines
933901 struct drm_i915_gem_request *req;
934902 int ret;
935903
936− if (engine_has_kernel_context(engine))
904+ if (engine_has_idle_kernel_context(engine))
937905 continue;
938906
939907 req = i915_gem_request_alloc(engine, dev_priv->kernel_context);
drivers/gpu/drm/i915/i915_gem_context.h+3−1
@@ -157,7 +157,6 @@ struct i915_gem_context { · 156 unmodified lines
157157 u32 *lrc_reg_state;
158158 u64 lrc_desc;
159159 int pin_count;
160− bool initialised;
161160 } engine[I915_NUM_ENGINES];
162161
163162 /** ring_size: size for allocating the per-engine ring buffer */
@@ -292,6 +291,9 @@ int i915_gem_context_setparam_ioctl(struct drm_device *dev, void *data, · 128 unmodified lines
292291 int i915_gem_context_reset_stats_ioctl(struct drm_device *dev, void *data,
293292 struct drm_file *file);
294293
294+struct i915_gem_context *
295+i915_gem_context_create_kernel(struct drm_i915_private *i915, int prio);
296+
295297 static inline struct i915_gem_context *
296298 i915_gem_context_get(struct i915_gem_context *ctx)
297299 {
drivers/gpu/drm/i915/i915_gem_evict.c+3−1
@@ -46,7 +46,7 @@ static bool ggtt_is_idle(struct drm_i915_private *i915) · 45 unmodified lines
4646 return false;
4747
4848 for_each_engine(engine, i915, id) {
49− if (engine->last_retired_context != i915->kernel_context)
49+ if (!intel_engine_has_kernel_context(engine))
5050 return false;
5151 }
5252
@@ -73,6 +73,7 @@ static int ggtt_flush(struct drm_i915_private *i915) · 20 unmodified lines
7373 if (err)
7474 return err;
7575
76+ GEM_BUG_ON(!ggtt_is_idle(i915));
7677 return 0;
7778 }
7879
@@ -216,6 +217,7 @@ search_again: · 137 unmodified lines
216217 if (ret)
217218 return ret;
218219
220+ cond_resched();
219221 goto search_again;
220222 }
221223
drivers/gpu/drm/i915/i915_gem_execbuffer.c+43−23
@@ -2074,23 +2074,27 @@ static struct drm_syncobj ** · 2073 unmodified lines
20742074 get_fence_array(struct drm_i915_gem_execbuffer2 *args,
20752075 struct drm_file *file)
20762076 {
2077− const unsigned int nfences = args->num_cliprects;
2077+ const unsigned long nfences = args->num_cliprects;
20782078 struct drm_i915_gem_exec_fence __user *user;
20792079 struct drm_syncobj **fences;
2080− unsigned int n;
2080+ unsigned long n;
20812081 int err;
20822082
20832083 if (!(args->flags & I915_EXEC_FENCE_ARRAY))
20842084 return NULL;
20852085
2086− if (nfences > SIZE_MAX / sizeof(*fences))
2086+ /* Check multiplication overflow for access_ok() and kvmalloc_array() */
2087+ BUILD_BUG_ON(sizeof(size_t) > sizeof(unsigned long));
2088+ if (nfences > min_t(unsigned long,
2089+ ULONG_MAX / sizeof(*user),
2090+ SIZE_MAX / sizeof(*fences)))
20872091 return ERR_PTR(-EINVAL);
20882092
20892093 user = u64_to_user_ptr(args->cliprects_ptr);
2090− if (!access_ok(VERIFY_READ, user, nfences * 2 * sizeof(u32)))
2094+ if (!access_ok(VERIFY_READ, user, nfences * sizeof(*user)))
20912095 return ERR_PTR(-EFAULT);
20922096
2093− fences = kvmalloc_array(args->num_cliprects, sizeof(*fences),
2097+ fences = kvmalloc_array(nfences, sizeof(*fences),
20942098 __GFP_NOWARN | GFP_KERNEL);
20952099 if (!fences)
20962100 return ERR_PTR(-ENOMEM);
@@ -2447,6 +2451,26 @@ err_in_fence: · 350 unmodified lines
24472451 return err;
24482452 }
24492453
2454+static size_t eb_element_size(void)
2455+{
2456+ return (sizeof(struct drm_i915_gem_exec_object2) +
2457+ sizeof(struct i915_vma *) +
2458+ sizeof(unsigned int));
2459+}
2460+
2461+static bool check_buffer_count(size_t count)
2462+{
2463+ const size_t sz = eb_element_size();
2464+
2465+ /*
2466+ * When using LUT_HANDLE, we impose a limit of INT_MAX for the lookup
2467+ * array size (see eb_create()). Otherwise, we can accept an array as
2468+ * large as can be addressed (though use large arrays at your peril)!
2469+ */
2470+
2471+ return !(count < 1 || count > INT_MAX || count > SIZE_MAX / sz - 1);
2472+}
2473+
24502474 /*
24512475 * Legacy execbuffer just creates an exec2 list from the original exec object
24522476 * list array and passes it to the real function.
@@ -2455,18 +2479,16 @@ int · 2 unmodified lines
24552479 i915_gem_execbuffer(struct drm_device *dev, void *data,
24562480 struct drm_file *file)
24572481 {
2458− const size_t sz = (sizeof(struct drm_i915_gem_exec_object2) +
2459− sizeof(struct i915_vma *) +
2460− sizeof(unsigned int));
24612482 struct drm_i915_gem_execbuffer *args = data;
24622483 struct drm_i915_gem_execbuffer2 exec2;
24632484 struct drm_i915_gem_exec_object *exec_list = NULL;
24642485 struct drm_i915_gem_exec_object2 *exec2_list = NULL;
2486+ const size_t count = args->buffer_count;
24652487 unsigned int i;
24662488 int err;
24672489
2468− if (args->buffer_count < 1 || args->buffer_count > SIZE_MAX / sz - 1) {
2469− DRM_DEBUG("execbuf2 with %d buffers\n", args->buffer_count);
2490+ if (!check_buffer_count(count)) {
2491+ DRM_DEBUG("execbuf2 with %zd buffers\n", count);
24702492 return -EINVAL;
24712493 }
24722494
@@ -2485,9 +2507,9 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, · 12 unmodified lines
24852507 return -EINVAL;
24862508
24872509 /* Copy in the exec list from userland */
2488− exec_list = kvmalloc_array(args->buffer_count, sizeof(*exec_list),
2510+ exec_list = kvmalloc_array(count, sizeof(*exec_list),
24892511 __GFP_NOWARN | GFP_KERNEL);
2490− exec2_list = kvmalloc_array(args->buffer_count + 1, sz,
2512+ exec2_list = kvmalloc_array(count + 1, eb_element_size(),
24912513 __GFP_NOWARN | GFP_KERNEL);
24922514 if (exec_list == NULL || exec2_list == NULL) {
24932515 DRM_DEBUG("Failed to allocate exec list for %d buffers\n",
@@ -2498,7 +2520,7 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, · 4 unmodified lines
24982520 }
24992521 err = copy_from_user(exec_list,
25002522 u64_to_user_ptr(args->buffers_ptr),
2501− sizeof(*exec_list) * args->buffer_count);
2523+ sizeof(*exec_list) * count);
25022524 if (err) {
25032525 DRM_DEBUG("copy %d exec entries failed %d\n",
25042526 args->buffer_count, err);
@@ -2548,16 +2570,14 @@ int · 43 unmodified lines
25482570 i915_gem_execbuffer2(struct drm_device *dev, void *data,
25492571 struct drm_file *file)
25502572 {
2551− const size_t sz = (sizeof(struct drm_i915_gem_exec_object2) +
2552− sizeof(struct i915_vma *) +
2553− sizeof(unsigned int));
25542573 struct drm_i915_gem_execbuffer2 *args = data;
25552574 struct drm_i915_gem_exec_object2 *exec2_list;
25562575 struct drm_syncobj **fences = NULL;
2576+ const size_t count = args->buffer_count;
25572577 int err;
25582578
2559− if (args->buffer_count < 1 || args->buffer_count > SIZE_MAX / sz - 1) {
2560− DRM_DEBUG("execbuf2 with %d buffers\n", args->buffer_count);
2579+ if (!check_buffer_count(count)) {
2580+ DRM_DEBUG("execbuf2 with %zd buffers\n", count);
25612581 return -EINVAL;
25622582 }
25632583
@@ -2565,17 +2585,17 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data, · 1 unmodified line
25652585 return -EINVAL;
25662586
25672587 /* Allocate an extra slot for use by the command parser */
2568− exec2_list = kvmalloc_array(args->buffer_count + 1, sz,
2588+ exec2_list = kvmalloc_array(count + 1, eb_element_size(),
25692589 __GFP_NOWARN | GFP_KERNEL);
25702590 if (exec2_list == NULL) {
2571− DRM_DEBUG("Failed to allocate exec list for %d buffers\n",
2572− args->buffer_count);
2591+ DRM_DEBUG("Failed to allocate exec list for %zd buffers\n",
2592+ count);
25732593 return -ENOMEM;
25742594 }
25752595 if (copy_from_user(exec2_list,
25762596 u64_to_user_ptr(args->buffers_ptr),
2577− sizeof(*exec2_list) * args->buffer_count)) {
2578− DRM_DEBUG("copy %d exec entries failed\n", args->buffer_count);
2597+ sizeof(*exec2_list) * count)) {
2598+ DRM_DEBUG("copy %zd exec entries failed\n", count);
25792599 kvfree(exec2_list);
25802600 return -EFAULT;
25812601 }
drivers/gpu/drm/i915/i915_gem_gtt.c+52−23
@@ -454,6 +454,14 @@ static void vm_free_pages_release(struct i915_address_space *vm, · 453 unmodified lines
454454
455455 static void vm_free_page(struct i915_address_space *vm, struct page *page)
456456 {
457+ /*
458+ * On !llc, we need to change the pages back to WB. We only do so
459+ * in bulk, so we rarely need to change the page attributes here,
460+ * but doing so requires a stop_machine() from deep inside arch/x86/mm.
461+ * To make detection of the possible sleep more likely, use an
462+ * unconditional might_sleep() for everybody.
463+ */
464+ might_sleep();
457465 if (!pagevec_add(&vm->free_pages, page))
458466 vm_free_pages_release(vm, false);
459467 }
@@ -2248,35 +2256,62 @@ static bool needs_idle_maps(struct drm_i915_private *dev_priv) · 1788 unmodified lines
22482256 return IS_GEN5(dev_priv) && IS_MOBILE(dev_priv) && intel_vtd_active();
22492257 }
22502258
2251−void i915_check_and_clear_faults(struct drm_i915_private *dev_priv)
2259+static void gen6_check_and_clear_faults(struct drm_i915_private *dev_priv)
22522260 {
22532261 struct intel_engine_cs *engine;
22542262 enum intel_engine_id id;
2255−
2256− if (INTEL_INFO(dev_priv)->gen < 6)
2257− return;
2263+ u32 fault;
22582264
22592265 for_each_engine(engine, dev_priv, id) {
2260− u32 fault_reg;
2261− fault_reg = I915_READ(RING_FAULT_REG(engine));
2262− if (fault_reg & RING_FAULT_VALID) {
2266+ fault = I915_READ(RING_FAULT_REG(engine));
2267+ if (fault & RING_FAULT_VALID) {
22632268 DRM_DEBUG_DRIVER("Unexpected fault\n"
22642269 "\tAddr: 0x%08lx\n"
22652270 "\tAddress space: %s\n"
22662271 "\tSource ID: %d\n"
22672272 "\tType: %d\n",
2268− fault_reg & PAGE_MASK,
2269− fault_reg & RING_FAULT_GTTSEL_MASK ? "GGTT" : "PPGTT",
2270− RING_FAULT_SRCID(fault_reg),
2271− RING_FAULT_FAULT_TYPE(fault_reg));
2273+ fault & PAGE_MASK,
2274+ fault & RING_FAULT_GTTSEL_MASK ? "GGTT" : "PPGTT",
2275+ RING_FAULT_SRCID(fault),
2276+ RING_FAULT_FAULT_TYPE(fault));
22722277 I915_WRITE(RING_FAULT_REG(engine),
2273− fault_reg & ~RING_FAULT_VALID);
2278+ fault & ~RING_FAULT_VALID);
22742279 }
22752280 }
22762281
2277− /* Engine specific init may not have been done till this point. */
2278− if (dev_priv->engine[RCS])
2279− POSTING_READ(RING_FAULT_REG(dev_priv->engine[RCS]));
2282+ POSTING_READ(RING_FAULT_REG(dev_priv->engine[RCS]));
2283+}
2284+
2285+static void gen8_check_and_clear_faults(struct drm_i915_private *dev_priv)
2286+{
2287+ u32 fault = I915_READ(GEN8_RING_FAULT_REG);
2288+
2289+ if (fault & RING_FAULT_VALID) {
2290+ DRM_DEBUG_DRIVER("Unexpected fault\n"
2291+ "\tAddr: 0x%08lx\n"
2292+ "\tEngine ID: %d\n"
2293+ "\tSource ID: %d\n"
2294+ "\tType: %d\n",
2295+ fault & PAGE_MASK,
2296+ GEN8_RING_FAULT_ENGINE_ID(fault),
2297+ RING_FAULT_SRCID(fault),
2298+ RING_FAULT_FAULT_TYPE(fault));
2299+ I915_WRITE(GEN8_RING_FAULT_REG,
2300+ fault & ~RING_FAULT_VALID);
2301+ }
2302+
2303+ POSTING_READ(GEN8_RING_FAULT_REG);
2304+}
2305+
2306+void i915_check_and_clear_faults(struct drm_i915_private *dev_priv)
2307+{
2308+ /* From GEN8 onwards we only have one 'All Engine Fault Register' */
2309+ if (INTEL_GEN(dev_priv) >= 8)
2310+ gen8_check_and_clear_faults(dev_priv);
2311+ else if (INTEL_GEN(dev_priv) >= 6)
2312+ gen6_check_and_clear_faults(dev_priv);
2313+ else
2314+ return;
22802315 }
22812316
22822317 void i915_gem_suspend_gtt_mappings(struct drm_i915_private *dev_priv)
@@ -3041,7 +3076,7 @@ const struct intel_ppat_entry * · 758 unmodified lines
30413076 intel_ppat_get(struct drm_i915_private *i915, u8 value)
30423077 {
30433078 struct intel_ppat *ppat = &i915->ppat;
3044− struct intel_ppat_entry *entry;
3079+ struct intel_ppat_entry *entry = NULL;
30453080 unsigned int scanned, best_score;
30463081 int i;
30473082
@@ -3064,7 +3099,7 @@ intel_ppat_get(struct drm_i915_private *i915, u8 value) · 16 unmodified lines
30643099 }
30653100
30663101 if (scanned == ppat->max_entries) {
3067− if (!best_score)
3102+ if (!entry)
30683103 return ERR_PTR(-ENOSPC);
30693104
30703105 kref_get(&entry->ref);
@@ -3171,12 +3206,6 @@ static void cnl_setup_private_ppat(struct intel_ppat *ppat) · 100 unmodified lines
31713206 ppat->match = bdw_private_pat_match;
31723207 ppat->clear_value = GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(3);
31733208
3174− /* XXX: spec is unclear if this is still needed for CNL+ */
3175− if (!USES_PPGTT(ppat->i915)) {
3176− __alloc_ppat_entry(ppat, 0, GEN8_PPAT_UC);
3177− return;
3178− }
3179−
31803209 __alloc_ppat_entry(ppat, 0, GEN8_PPAT_WB | GEN8_PPAT_LLC);
31813210 __alloc_ppat_entry(ppat, 1, GEN8_PPAT_WC | GEN8_PPAT_LLCELLC);
31823211 __alloc_ppat_entry(ppat, 2, GEN8_PPAT_WT | GEN8_PPAT_LLCELLC);
drivers/gpu/drm/i915/i915_gem_object.h+9−2
@@ -53,8 +53,9 @@ struct i915_lut_handle { · 52 unmodified lines
5353
5454 struct drm_i915_gem_object_ops {
5555 unsigned int flags;
56−#define I915_GEM_OBJECT_HAS_STRUCT_PAGE BIT(0)
57−#define I915_GEM_OBJECT_IS_SHRINKABLE BIT(1)
56+#define I915_GEM_OBJECT_HAS_STRUCT_PAGE BIT(0)
57+#define I915_GEM_OBJECT_IS_SHRINKABLE BIT(1)
58+#define I915_GEM_OBJECT_IS_PROXY BIT(2)
5859
5960 /* Interface between the GEM object and its backing storage.
6061 * get_pages() is called once prior to the use of the associated set
@@ -361,6 +362,12 @@ i915_gem_object_is_shrinkable(const struct drm_i915_gem_object *obj) · 300 unmodified lines
361362 return obj->ops->flags & I915_GEM_OBJECT_IS_SHRINKABLE;
362363 }
363364
365+static inline bool
366+i915_gem_object_is_proxy(const struct drm_i915_gem_object *obj)
367+{
368+ return obj->ops->flags & I915_GEM_OBJECT_IS_PROXY;
369+}
370+
364371 static inline bool
365372 i915_gem_object_is_active(const struct drm_i915_gem_object *obj)
366373 {
drivers/gpu/drm/i915/i915_gem_render_state.c+47−94
@@ -26,10 +26,12 @@ · 25 unmodified lines
2626 */
2727
2828 #include "i915_drv.h"
29+#include "i915_gem_render_state.h"
2930 #include "intel_renderstate.h"
3031
3132 struct intel_render_state {
3233 const struct intel_renderstate_rodata *rodata;
34+ struct drm_i915_gem_object *obj;
3335 struct i915_vma *vma;
3436 u32 batch_offset;
3537 u32 batch_size;
@@ -40,6 +42,9 @@ struct intel_render_state { · 4 unmodified lines
4042 static const struct intel_renderstate_rodata *
4143 render_state_get_rodata(const struct intel_engine_cs *engine)
4244 {
45+ if (engine->id != RCS)
46+ return NULL;
47+
4348 switch (INTEL_GEN(engine->i915)) {
4449 case 6:
4550 return &gen6_null_state;
@@ -74,17 +79,16 @@ static int render_state_setup(struct intel_render_state *so, · 28 unmodified lines
7479 struct drm_i915_private *i915)
7580 {
7681 const struct intel_renderstate_rodata *rodata = so->rodata;
77− struct drm_i915_gem_object *obj = so->vma->obj;
7882 unsigned int i = 0, reloc_index = 0;
7983 unsigned int needs_clflush;
8084 u32 *d;
8185 int ret;
8286
83− ret = i915_gem_obj_prepare_shmem_write(obj, &needs_clflush);
87+ ret = i915_gem_obj_prepare_shmem_write(so->obj, &needs_clflush);
8488 if (ret)
8589 return ret;
8690
87− d = kmap_atomic(i915_gem_object_get_dirty_page(obj, 0));
91+ d = kmap_atomic(i915_gem_object_get_dirty_page(so->obj, 0));
8892
8993 while (i < rodata->batch_items) {
9094 u32 s = rodata->batch[i];
@@ -112,7 +116,7 @@ static int render_state_setup(struct intel_render_state *so, · 21 unmodified lines
112116 goto err;
113117 }
114118
115− so->batch_offset = so->vma->node.start;
119+ so->batch_offset = i915_ggtt_offset(so->vma);
116120 so->batch_size = rodata->batch_items * sizeof(u32);
117121
118122 while (i % CACHELINE_DWORDS)
@@ -160,9 +164,9 @@ static int render_state_setup(struct intel_render_state *so, · 41 unmodified lines
160164 drm_clflush_virt_range(d, i * sizeof(u32));
161165 kunmap_atomic(d);
162166
163− ret = i915_gem_object_set_to_gtt_domain(obj, false);
167+ ret = i915_gem_object_set_to_gtt_domain(so->obj, false);
164168 out:
165− i915_gem_obj_finish_shmem_access(obj);
169+ i915_gem_obj_finish_shmem_access(so->obj);
166170 return ret;
167171
168172 err:
@@ -173,112 +177,61 @@ err: · 4 unmodified lines
173177
174178 #undef OUT_BATCH
175179
176−int i915_gem_render_state_init(struct intel_engine_cs *engine)
180+int i915_gem_render_state_emit(struct drm_i915_gem_request *rq)
177181 {
178− struct intel_render_state *so;
179− const struct intel_renderstate_rodata *rodata;
180− struct drm_i915_gem_object *obj;
181− int ret;
182+ struct intel_engine_cs *engine = rq->engine;
183+ struct intel_render_state so = {}; /* keep the compiler happy */
184+ int err;
182185
183− if (engine->id != RCS)
186+ so.rodata = render_state_get_rodata(engine);
187+ if (!so.rodata)
184188 return 0;
185189
186− rodata = render_state_get_rodata(engine);
187− if (!rodata)
188− return 0;
189−
190− if (rodata->batch_items * 4 > PAGE_SIZE)
190+ if (so.rodata->batch_items * 4 > PAGE_SIZE)
191191 return -EINVAL;
192192
193− so = kmalloc(sizeof(*so), GFP_KERNEL);
194− if (!so)
195− return -ENOMEM;
196−
197− obj = i915_gem_object_create_internal(engine->i915, PAGE_SIZE);
198− if (IS_ERR(obj)) {
199− ret = PTR_ERR(obj);
200− goto err_free;
201− }
193+ so.obj = i915_gem_object_create_internal(engine->i915, PAGE_SIZE);
194+ if (IS_ERR(so.obj))
195+ return PTR_ERR(so.obj);
202196
203− so->vma = i915_vma_instance(obj, &engine->i915->ggtt.base, NULL);
204− if (IS_ERR(so->vma)) {
205− ret = PTR_ERR(so->vma);
197+ so.vma = i915_vma_instance(so.obj, &engine->i915->ggtt.base, NULL);
198+ if (IS_ERR(so.vma)) {
199+ err = PTR_ERR(so.vma);
206200 goto err_obj;
207201 }
208202
209− so->rodata = rodata;
210− engine->render_state = so;
211− return 0;
212−
213−err_obj:
214− i915_gem_object_put(obj);
215−err_free:
216− kfree(so);
217− return ret;
218−}
219−
220−int i915_gem_render_state_emit(struct drm_i915_gem_request *req)
221−{
222− struct intel_render_state *so;
223− int ret;
224−
225− lockdep_assert_held(&req->i915->drm.struct_mutex);
226−
227− so = req->engine->render_state;
228− if (!so)
229− return 0;
230−
231− /* Recreate the page after shrinking */
232− if (!i915_gem_object_has_pages(so->vma->obj))
233− so->batch_offset = -1;
234−
235− ret = i915_vma_pin(so->vma, 0, 0, PIN_GLOBAL | PIN_HIGH);
236− if (ret)
237− return ret;
203+ err = i915_vma_pin(so.vma, 0, 0, PIN_GLOBAL | PIN_HIGH);
204+ if (err)
205+ goto err_vma;
238206
239− if (so->vma->node.start != so->batch_offset) {
240− ret = render_state_setup(so, req->i915);
241− if (ret)
242− goto err_unpin;
243− }
207+ err = render_state_setup(&so, rq->i915);
208+ if (err)
209+ goto err_unpin;
244210
245− ret = req->engine->emit_flush(req, EMIT_INVALIDATE);
246− if (ret)
211+ err = engine->emit_flush(rq, EMIT_INVALIDATE);
212+ if (err)
247213 goto err_unpin;
248214
249− ret = req->engine->emit_bb_start(req,
250− so->batch_offset, so->batch_size,
251− I915_DISPATCH_SECURE);
252− if (ret)
215+ err = engine->emit_bb_start(rq,
216+ so.batch_offset, so.batch_size,
217+ I915_DISPATCH_SECURE);
218+ if (err)
253219 goto err_unpin;
254220
255− if (so->aux_size > 8) {
256− ret = req->engine->emit_bb_start(req,
257− so->aux_offset, so->aux_size,
258− I915_DISPATCH_SECURE);
259− if (ret)
221+ if (so.aux_size > 8) {
222+ err = engine->emit_bb_start(rq,
223+ so.aux_offset, so.aux_size,
224+ I915_DISPATCH_SECURE);
225+ if (err)
260226 goto err_unpin;
261227 }
262228
263− i915_vma_move_to_active(so->vma, req, 0);
229+ i915_vma_move_to_active(so.vma, rq, 0);
264230 err_unpin:
265− i915_vma_unpin(so->vma);
266− return ret;
267−}
268−
269−void i915_gem_render_state_fini(struct intel_engine_cs *engine)
270−{
271− struct intel_render_state *so;
272− struct drm_i915_gem_object *obj;
273−
274− so = fetch_and_zero(&engine->render_state);
275− if (!so)
276− return;
277−
278− obj = so->vma->obj;
279−
280− i915_vma_close(so->vma);
281− __i915_gem_object_release_unless_active(obj);
282−
283− kfree(so);
231+ i915_vma_unpin(so.vma);
232+err_vma:
233+ i915_vma_close(so.vma);
234+err_obj:
235+ __i915_gem_object_release_unless_active(so.obj);
236+ return err;
284237 }
drivers/gpu/drm/i915/i915_gem_render_state.h+1−3
@@ -26,8 +26,6 @@ · 25 unmodified lines
2626
2727 struct drm_i915_gem_request;
2828
29−int i915_gem_render_state_init(struct intel_engine_cs *engine);
30−int i915_gem_render_state_emit(struct drm_i915_gem_request *req);
31−void i915_gem_render_state_fini(struct intel_engine_cs *engine);
29+int i915_gem_render_state_emit(struct drm_i915_gem_request *rq);
3230
3331 #endif /* _I915_GEM_RENDER_STATE_H_ */
drivers/gpu/drm/i915/i915_gem_request.c+2−0
@@ -259,6 +259,8 @@ static void mark_busy(struct drm_i915_private *i915) · 258 unmodified lines
259259 if (INTEL_GEN(i915) >= 6)
260260 gen6_rps_busy(i915);
261261
262+ intel_engines_unpark(i915);
263+
262264 queue_delayed_work(i915->wq,
263265 &i915->gt.retire_work,
264266 round_jiffies_up_relative(HZ));
drivers/gpu/drm/i915/i915_gem_stolen.c+44−10
@@ -294,6 +294,18 @@ static void g4x_get_stolen_reserved(struct drm_i915_private *dev_priv, · 293 unmodified lines
294294 ELK_STOLEN_RESERVED);
295295 dma_addr_t stolen_top = dev_priv->mm.stolen_base + ggtt->stolen_size;
296296
297+ if ((reg_val & G4X_STOLEN_RESERVED_ENABLE) == 0) {
298+ *base = 0;
299+ *size = 0;
300+ return;
301+ }
302+
303+ /*
304+ * Whether ILK really reuses the ELK register for this is unclear.
305+ * Let's see if we catch anyone with this supposedly enabled on ILK.
306+ */
307+ WARN(IS_GEN5(dev_priv), "ILK stolen reserved found? 0x%08x\n", reg_val);
308+
297309 *base = (reg_val & G4X_STOLEN_RESERVED_ADDR2_MASK) << 16;
298310
299311 WARN_ON((reg_val & G4X_STOLEN_RESERVED_ADDR1_MASK) < *base);
@@ -313,6 +325,12 @@ static void gen6_get_stolen_reserved(struct drm_i915_private *dev_priv, · 13 unmodified lines
313325 {
314326 uint32_t reg_val = I915_READ(GEN6_STOLEN_RESERVED);
315327
328+ if ((reg_val & GEN6_STOLEN_RESERVED_ENABLE) == 0) {
329+ *base = 0;
330+ *size = 0;
331+ return;
332+ }
333+
316334 *base = reg_val & GEN6_STOLEN_RESERVED_ADDR_MASK;
317335
318336 switch (reg_val & GEN6_STOLEN_RESERVED_SIZE_MASK) {
@@ -339,6 +357,12 @@ static void gen7_get_stolen_reserved(struct drm_i915_private *dev_priv, · 20 unmodified lines
339357 {
340358 uint32_t reg_val = I915_READ(GEN6_STOLEN_RESERVED);
341359
360+ if ((reg_val & GEN6_STOLEN_RESERVED_ENABLE) == 0) {
361+ *base = 0;
362+ *size = 0;
363+ return;
364+ }
365+
342366 *base = reg_val & GEN7_STOLEN_RESERVED_ADDR_MASK;
343367
344368 switch (reg_val & GEN7_STOLEN_RESERVED_SIZE_MASK) {
@@ -359,6 +383,12 @@ static void chv_get_stolen_reserved(struct drm_i915_private *dev_priv, · 14 unmodified lines
359383 {
360384 uint32_t reg_val = I915_READ(GEN6_STOLEN_RESERVED);
361385
386+ if ((reg_val & GEN6_STOLEN_RESERVED_ENABLE) == 0) {
387+ *base = 0;
388+ *size = 0;
389+ return;
390+ }
391+
362392 *base = reg_val & GEN6_STOLEN_RESERVED_ADDR_MASK;
363393
364394 switch (reg_val & GEN8_STOLEN_RESERVED_SIZE_MASK) {
@@ -387,6 +417,12 @@ static void bdw_get_stolen_reserved(struct drm_i915_private *dev_priv, · 22 unmodified lines
387417 uint32_t reg_val = I915_READ(GEN6_STOLEN_RESERVED);
388418 dma_addr_t stolen_top;
389419
420+ if ((reg_val & GEN6_STOLEN_RESERVED_ENABLE) == 0) {
421+ *base = 0;
422+ *size = 0;
423+ return;
424+ }
425+
390426 stolen_top = dev_priv->mm.stolen_base + ggtt->stolen_size;
391427
392428 *base = reg_val & GEN6_STOLEN_RESERVED_ADDR_MASK;
@@ -436,14 +472,12 @@ int i915_gem_init_stolen(struct drm_i915_private *dev_priv) · 43 unmodified lines
436472 case 3:
437473 break;
438474 case 4:
439− if (IS_G4X(dev_priv))
440− g4x_get_stolen_reserved(dev_priv,
441− &reserved_base, &reserved_size);
442− break;
475+ if (!IS_G4X(dev_priv))
476+ break;
477+ /* fall through */
443478 case 5:
444− /* Assume the gen6 maximum for the older platforms. */
445− reserved_size = 1024 * 1024;
446− reserved_base = stolen_top - reserved_size;
479+ g4x_get_stolen_reserved(dev_priv,
480+ &reserved_base, &reserved_size);
447481 break;
448482 case 6:
449483 gen6_get_stolen_reserved(dev_priv,
@@ -473,9 +507,9 @@ int i915_gem_init_stolen(struct drm_i915_private *dev_priv) · 23 unmodified lines
473507 if (reserved_base < dev_priv->mm.stolen_base ||
474508 reserved_base + reserved_size > stolen_top) {
475509 dma_addr_t reserved_top = reserved_base + reserved_size;
476− DRM_DEBUG_KMS("Stolen reserved area [%pad - %pad] outside stolen memory [%pad - %pad]\n",
477− &reserved_base, &reserved_top,
478− &dev_priv->mm.stolen_base, &stolen_top);
510+ DRM_ERROR("Stolen reserved area [%pad - %pad] outside stolen memory [%pad - %pad]\n",
511+ &reserved_base, &reserved_top,
512+ &dev_priv->mm.stolen_base, &stolen_top);
479513 return 0;
480514 }
481515
drivers/gpu/drm/i915/i915_gem_tiling.c+9−0
@@ -345,6 +345,15 @@ i915_gem_set_tiling_ioctl(struct drm_device *dev, void *data, · 344 unmodified lines
345345 if (!obj)
346346 return -ENOENT;
347347
348+ /*
349+ * The tiling mode of proxy objects is handled by its generator, and
350+ * not allowed to be changed by userspace.
351+ */
352+ if (i915_gem_object_is_proxy(obj)) {
353+ err = -ENXIO;
354+ goto err;
355+ }
356+
348357 if (!i915_tiling_ok(obj, args->tiling_mode, args->stride)) {
349358 err = -EINVAL;
350359 goto err;
drivers/gpu/drm/i915/i915_gpu_error.c+82−20
@@ -30,6 +30,8 @@ · 29 unmodified lines
3030 #include <generated/utsrelease.h>
3131 #include <linux/stop_machine.h>
3232 #include <linux/zlib.h>
33+#include <drm/drm_print.h>
34+
3335 #include "i915_drv.h"
3436
3537 static const char *engine_str(int engine)
@@ -175,6 +177,21 @@ static void i915_error_puts(struct drm_i915_error_state_buf *e, · 139 unmodified lines
175177 #define err_printf(e, ...) i915_error_printf(e, __VA_ARGS__)
176178 #define err_puts(e, s) i915_error_puts(e, s)
177179
180+static void __i915_printfn_error(struct drm_printer *p, struct va_format *vaf)
181+{
182+ i915_error_vprintf(p->arg, vaf->fmt, *vaf->va);
183+}
184+
185+static inline struct drm_printer
186+i915_error_printer(struct drm_i915_error_state_buf *e)
187+{
188+ struct drm_printer p = {
189+ .printfn = __i915_printfn_error,
190+ .arg = e,
191+ };
192+ return p;
193+}
194+
178195 #ifdef CONFIG_DRM_I915_COMPRESS_ERROR
179196
180197 struct compress {
@@ -589,6 +606,21 @@ static void err_print_pciid(struct drm_i915_error_state_buf *m, · 408 unmodified lines
589606 pdev->subsystem_device);
590607 }
591608
609+static void err_print_uc(struct drm_i915_error_state_buf *m,
610+ const struct i915_error_uc *error_uc)
611+{
612+ struct drm_printer p = i915_error_printer(m);
613+ const struct i915_gpu_state *error =
614+ container_of(error_uc, typeof(*error), uc);
615+
616+ if (!error->device_info.has_guc)
617+ return;
618+
619+ intel_uc_fw_dump(&error_uc->guc_fw, &p);
620+ intel_uc_fw_dump(&error_uc->huc_fw, &p);
621+ print_error_obj(m, NULL, "GuC log buffer", error_uc->guc_log);
622+}
623+
592624 int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
593625 const struct i915_gpu_state *error)
594626 {
@@ -763,8 +795,6 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m, · 168 unmodified lines
763795
764796 print_error_obj(m, NULL, "Semaphores", error->semaphore);
765797
766− print_error_obj(m, NULL, "GuC log buffer", error->guc_log);
767−
768798 if (error->overlay)
769799 intel_overlay_print_error_state(m, error->overlay);
770800
@@ -773,6 +803,7 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m, · 2 unmodified lines
773803
774804 err_print_capabilities(m, &error->device_info);
775805 err_print_params(m, &error->params);
806+ err_print_uc(m, &error->uc);
776807
777808 if (m->bytes == 0 && m->err)
778809 return m->err;
@@ -831,6 +862,22 @@ static __always_inline void free_param(const char *type, void *x) · 52 unmodified lines
831862 kfree(*(void **)x);
832863 }
833864
865+static void cleanup_params(struct i915_gpu_state *error)
866+{
867+#define FREE(T, x, ...) free_param(#T, &error->params.x);
868+ I915_PARAMS_FOR_EACH(FREE);
869+#undef FREE
870+}
871+
872+static void cleanup_uc_state(struct i915_gpu_state *error)
873+{
874+ struct i915_error_uc *error_uc = &error->uc;
875+
876+ kfree(error_uc->guc_fw.path);
877+ kfree(error_uc->huc_fw.path);
878+ i915_error_object_free(error_uc->guc_log);
879+}
880+
834881 void __i915_gpu_state_free(struct kref *error_ref)
835882 {
836883 struct i915_gpu_state *error =
@@ -857,7 +904,6 @@ void __i915_gpu_state_free(struct kref *error_ref) · 20 unmodified lines
857904 }
858905
859906 i915_error_object_free(error->semaphore);
860− i915_error_object_free(error->guc_log);
861907
862908 for (i = 0; i < ARRAY_SIZE(error->active_bo); i++)
863909 kfree(error->active_bo[i]);
@@ -866,9 +912,8 @@ void __i915_gpu_state_free(struct kref *error_ref) · 2 unmodified lines
866912 kfree(error->overlay);
867913 kfree(error->display);
868914
869−#define FREE(T, x, ...) free_param(#T, &error->params.x);
870− I915_PARAMS_FOR_EACH(FREE);
871−#undef FREE
915+ cleanup_params(error);
916+ cleanup_uc_state(error);
872917
873918 kfree(error);
874919 }
@@ -1172,11 +1217,13 @@ static void error_record_engine_registers(struct i915_gpu_state *error, · 297 unmodified lines
11721217
11731218 if (INTEL_GEN(dev_priv) >= 6) {
11741219 ee->rc_psmi = I915_READ(RING_PSMI_CTL(engine->mmio_base));
1175− ee->fault_reg = I915_READ(RING_FAULT_REG(engine));
1176− if (INTEL_GEN(dev_priv) >= 8)
1220+ if (INTEL_GEN(dev_priv) >= 8) {
11771221 gen8_record_semaphore_state(error, engine, ee);
1178− else
1222+ ee->fault_reg = I915_READ(GEN8_RING_FAULT_REG);
1223+ } else {
11791224 gen6_record_semaphore_state(engine, ee);
1225+ ee->fault_reg = I915_READ(RING_FAULT_REG(engine));
1226+ }
11801227 }
11811228
11821229 if (INTEL_GEN(dev_priv) >= 4) {
@@ -1559,15 +1606,25 @@ static void i915_capture_pinned_buffers(struct drm_i915_private *dev_priv, · 376 unmodified lines
15591606 error->pinned_bo = bo;
15601607 }
15611608
1562−static void i915_gem_capture_guc_log_buffer(struct drm_i915_private *dev_priv,
1563− struct i915_gpu_state *error)
1609+static void capture_uc_state(struct i915_gpu_state *error)
15641610 {
1565− /* Capturing log buf contents won't be useful if logging was disabled */
1566− if (!dev_priv->guc.log.vma || (i915_modparams.guc_log_level < 0))
1611+ struct drm_i915_private *i915 = error->i915;
1612+ struct i915_error_uc *error_uc = &error->uc;
1613+
1614+ /* Capturing uC state won't be useful if there is no GuC */
1615+ if (!error->device_info.has_guc)
15671616 return;
15681617
1569− error->guc_log = i915_error_object_create(dev_priv,
1570− dev_priv->guc.log.vma);
1618+ error_uc->guc_fw = i915->guc.fw;
1619+ error_uc->huc_fw = i915->huc.fw;
1620+
1621+ /* Non-default firmware paths will be specified by the modparam.
1622+ * As modparams are generally accesible from the userspace make
1623+ * explicit copies of the firmware paths.
1624+ */
1625+ error_uc->guc_fw.path = kstrdup(i915->guc.fw.path, GFP_ATOMIC);
1626+ error_uc->huc_fw.path = kstrdup(i915->huc.fw.path, GFP_ATOMIC);
1627+ error_uc->guc_log = i915_error_object_create(i915, i915->guc.log.vma);
15711628 }
15721629
15731630 /* Capture all registers which don't fit into another category. */
@@ -1695,6 +1752,14 @@ static __always_inline void dup_param(const char *type, void *x) · 121 unmodified lines
16951752 *(void **)x = kstrdup(*(void **)x, GFP_ATOMIC);
16961753 }
16971754
1755+static void capture_params(struct i915_gpu_state *error)
1756+{
1757+ error->params = i915_modparams;
1758+#define DUP(T, x, ...) dup_param(#T, &error->params.x);
1759+ I915_PARAMS_FOR_EACH(DUP);
1760+#undef DUP
1761+}
1762+
16981763 static int capture(void *data)
16991764 {
17001765 struct i915_gpu_state *error = data;
@@ -1705,10 +1770,8 @@ static int capture(void *data) · 4 unmodified lines
17051770 ktime_to_timeval(ktime_sub(ktime_get(),
17061771 error->i915->gt.last_init_time));
17071772
1708− error->params = i915_modparams;
1709−#define DUP(T, x, ...) dup_param(#T, &error->params.x);
1710− I915_PARAMS_FOR_EACH(DUP);
1711−#undef DUP
1773+ capture_params(error);
1774+ capture_uc_state(error);
17121775
17131776 i915_capture_gen_state(error->i915, error);
17141777 i915_capture_reg_state(error->i915, error);
@@ -1716,7 +1779,6 @@ static int capture(void *data) · 1 unmodified line
17161779 i915_gem_record_rings(error->i915, error);
17171780 i915_capture_active_buffers(error->i915, error);
17181781 i915_capture_pinned_buffers(error->i915, error);
1719− i915_gem_capture_guc_log_buffer(error->i915, error);
17201782
17211783 error->overlay = intel_overlay_capture_error_state(error->i915);
17221784 error->display = intel_display_capture_error_state(error->i915);
drivers/gpu/drm/i915/i915_guc_reg.h+0−7
@@ -102,13 +102,6 @@ · 101 unmodified lines
102102 #define GUC_ENABLE_MIA_CLOCK_GATING (1<<15)
103103 #define GUC_GEN10_SHIM_WC_ENABLE (1<<21)
104104
105−#define GUC_SHIM_CONTROL_VALUE (GUC_DISABLE_SRAM_INIT_TO_ZEROES | \
106− GUC_ENABLE_READ_CACHE_LOGIC | \
107− GUC_ENABLE_MIA_CACHING | \
108− GUC_ENABLE_READ_CACHE_FOR_SRAM_DATA | \
109− GUC_ENABLE_READ_CACHE_FOR_WOPCM_DATA | \
110− GUC_ENABLE_MIA_CLOCK_GATING)
111−
112105 #define GUC_SEND_INTERRUPT _MMIO(0xc4c8)
113106 #define GUC_SEND_TRIGGER (1<<0)
114107
drivers/gpu/drm/i915/i915_irq.c+6−2
@@ -1068,6 +1068,9 @@ static void notify_ring(struct intel_engine_cs *engine) · 1067 unmodified lines
10681068 struct drm_i915_gem_request *rq = NULL;
10691069 struct intel_wait *wait;
10701070
1071+ if (!engine->breadcrumbs.irq_armed)
1072+ return;
1073+
10711074 atomic_inc(&engine->irq_count);
10721075 set_bit(ENGINE_IRQ_BREADCRUMB, &engine->irq_posted);
10731076
@@ -1101,7 +1104,8 @@ static void notify_ring(struct intel_engine_cs *engine) · 27 unmodified lines
11011104 if (wakeup)
11021105 wake_up_process(wait->tsk);
11031106 } else {
1104− __intel_engine_disarm_breadcrumbs(engine);
1107+ if (engine->breadcrumbs.irq_armed)
1108+ __intel_engine_disarm_breadcrumbs(engine);
11051109 }
11061110 spin_unlock(&engine->breadcrumbs.irq_lock);
11071111
@@ -1400,7 +1404,7 @@ gen8_cs_irq_handler(struct intel_engine_cs *engine, u32 iir, int test_shift) · 292 unmodified lines
14001404 }
14011405
14021406 if (tasklet)
1403− tasklet_hi_schedule(&execlists->irq_tasklet);
1407+ tasklet_hi_schedule(&execlists->tasklet);
14041408 }
14051409
14061410 static irqreturn_t gen8_gt_irq_ack(struct drm_i915_private *dev_priv,
drivers/gpu/drm/i915/i915_oa_bdw.c+2−2
@@ -85,9 +85,9 @@ show_test_oa_id(struct device *kdev, struct device_attribute *attr, char *buf) · 84 unmodified lines
8585 void
8686 i915_perf_load_test_config_bdw(struct drm_i915_private *dev_priv)
8787 {
88− strncpy(dev_priv->perf.oa.test_config.uuid,
88+ strlcpy(dev_priv->perf.oa.test_config.uuid,
8989 "d6de6f55-e526-4f79-a6a6-d7315c09044e",
90− UUID_STRING_LEN);
90+ sizeof(dev_priv->perf.oa.test_config.uuid));
9191 dev_priv->perf.oa.test_config.id = 1;
9292
9393 dev_priv->perf.oa.test_config.mux_regs = mux_config_test_oa;
drivers/gpu/drm/i915/i915_oa_bxt.c+2−2
@@ -83,9 +83,9 @@ show_test_oa_id(struct device *kdev, struct device_attribute *attr, char *buf) · 82 unmodified lines
8383 void
8484 i915_perf_load_test_config_bxt(struct drm_i915_private *dev_priv)
8585 {
86− strncpy(dev_priv->perf.oa.test_config.uuid,
86+ strlcpy(dev_priv->perf.oa.test_config.uuid,
8787 "5ee72f5c-092f-421e-8b70-225f7c3e9612",
88− UUID_STRING_LEN);
88+ sizeof(dev_priv->perf.oa.test_config.uuid));
8989 dev_priv->perf.oa.test_config.id = 1;
9090
9191 dev_priv->perf.oa.test_config.mux_regs = mux_config_test_oa;
drivers/gpu/drm/i915/i915_oa_cflgt2.c+2−2
@@ -84,9 +84,9 @@ show_test_oa_id(struct device *kdev, struct device_attribute *attr, char *buf) · 83 unmodified lines
8484 void
8585 i915_perf_load_test_config_cflgt2(struct drm_i915_private *dev_priv)
8686 {
87− strncpy(dev_priv->perf.oa.test_config.uuid,
87+ strlcpy(dev_priv->perf.oa.test_config.uuid,
8888 "74fb4902-d3d3-4237-9e90-cbdc68d0a446",
89− UUID_STRING_LEN);
89+ sizeof(dev_priv->perf.oa.test_config.uuid));
9090 dev_priv->perf.oa.test_config.id = 1;
9191
9292 dev_priv->perf.oa.test_config.mux_regs = mux_config_test_oa;
drivers/gpu/drm/i915/i915_oa_cflgt3.c+109−0
@@ -0,0 +1,109 @@
1+/*
2+ * Autogenerated file by GPU Top : https://github.com/rib/gputop
3+ * DO NOT EDIT manually!
4+ *
5+ *
6+ * Copyright (c) 2015 Intel Corporation
7+ *
8+ * Permission is hereby granted, free of charge, to any person obtaining a
9+ * copy of this software and associated documentation files (the "Software"),
10+ * to deal in the Software without restriction, including without limitation
11+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12+ * and/or sell copies of the Software, and to permit persons to whom the
13+ * Software is furnished to do so, subject to the following conditions:
14+ *
15+ * The above copyright notice and this permission notice (including the next
16+ * paragraph) shall be included in all copies or substantial portions of the
17+ * Software.
18+ *
19+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25+ * IN THE SOFTWARE.
26+ *
27+ */
28+
29+#include <linux/sysfs.h>
30+
31+#include "i915_drv.h"
32+#include "i915_oa_cflgt3.h"
33+
34+static const struct i915_oa_reg b_counter_config_test_oa[] = {
35+ { _MMIO(0x2740), 0x00000000 },
36+ { _MMIO(0x2744), 0x00800000 },
37+ { _MMIO(0x2714), 0xf0800000 },
38+ { _MMIO(0x2710), 0x00000000 },
39+ { _MMIO(0x2724), 0xf0800000 },
40+ { _MMIO(0x2720), 0x00000000 },
41+ { _MMIO(0x2770), 0x00000004 },
42+ { _MMIO(0x2774), 0x00000000 },
43+ { _MMIO(0x2778), 0x00000003 },
44+ { _MMIO(0x277c), 0x00000000 },
45+ { _MMIO(0x2780), 0x00000007 },
46+ { _MMIO(0x2784), 0x00000000 },
47+ { _MMIO(0x2788), 0x00100002 },
48+ { _MMIO(0x278c), 0x0000fff7 },
49+ { _MMIO(0x2790), 0x00100002 },
50+ { _MMIO(0x2794), 0x0000ffcf },
51+ { _MMIO(0x2798), 0x00100082 },
52+ { _MMIO(0x279c), 0x0000ffef },
53+ { _MMIO(0x27a0), 0x001000c2 },
54+ { _MMIO(0x27a4), 0x0000ffe7 },
55+ { _MMIO(0x27a8), 0x00100001 },
56+ { _MMIO(0x27ac), 0x0000ffe7 },
57+};
58+
59+static const struct i915_oa_reg flex_eu_config_test_oa[] = {
60+};
61+
62+static const struct i915_oa_reg mux_config_test_oa[] = {
63+ { _MMIO(0x9840), 0x00000080 },
64+ { _MMIO(0x9888), 0x11810000 },
65+ { _MMIO(0x9888), 0x07810013 },
66+ { _MMIO(0x9888), 0x1f810000 },
67+ { _MMIO(0x9888), 0x1d810000 },
68+ { _MMIO(0x9888), 0x1b930040 },
69+ { _MMIO(0x9888), 0x07e54000 },
70+ { _MMIO(0x9888), 0x1f908000 },
71+ { _MMIO(0x9888), 0x11900000 },
72+ { _MMIO(0x9888), 0x37900000 },
73+ { _MMIO(0x9888), 0x53900000 },
74+ { _MMIO(0x9888), 0x45900000 },
75+ { _MMIO(0x9888), 0x33900000 },
76+};
77+
78+static ssize_t
79+show_test_oa_id(struct device *kdev, struct device_attribute *attr, char *buf)
80+{
81+ return sprintf(buf, "1\n");
82+}
83+
84+void
85+i915_perf_load_test_config_cflgt3(struct drm_i915_private *dev_priv)
86+{
87+ strncpy(dev_priv->perf.oa.test_config.uuid,
88+ "577e8e2c-3fa0-4875-8743-3538d585e3b0",
89+ UUID_STRING_LEN);
90+ dev_priv->perf.oa.test_config.id = 1;
91+
92+ dev_priv->perf.oa.test_config.mux_regs = mux_config_test_oa;
93+ dev_priv->perf.oa.test_config.mux_regs_len = ARRAY_SIZE(mux_config_test_oa);
94+
95+ dev_priv->perf.oa.test_config.b_counter_regs = b_counter_config_test_oa;
96+ dev_priv->perf.oa.test_config.b_counter_regs_len = ARRAY_SIZE(b_counter_config_test_oa);
97+
98+ dev_priv->perf.oa.test_config.flex_regs = flex_eu_config_test_oa;
99+ dev_priv->perf.oa.test_config.flex_regs_len = ARRAY_SIZE(flex_eu_config_test_oa);
100+
101+ dev_priv->perf.oa.test_config.sysfs_metric.name = "577e8e2c-3fa0-4875-8743-3538d585e3b0";
102+ dev_priv->perf.oa.test_config.sysfs_metric.attrs = dev_priv->perf.oa.test_config.attrs;
103+
104+ dev_priv->perf.oa.test_config.attrs[0] = &dev_priv->perf.oa.test_config.sysfs_metric_id.attr;
105+
106+ dev_priv->perf.oa.test_config.sysfs_metric_id.attr.name = "id";
107+ dev_priv->perf.oa.test_config.sysfs_metric_id.attr.mode = 0444;
108+ dev_priv->perf.oa.test_config.sysfs_metric_id.show = show_test_oa_id;
109+}
drivers/gpu/drm/i915/i915_oa_cflgt3.h+34−0
@@ -0,0 +1,34 @@
1+/*
2+ * Autogenerated file by GPU Top : https://github.com/rib/gputop
3+ * DO NOT EDIT manually!
4+ *
5+ *
6+ * Copyright (c) 2015 Intel Corporation
7+ *
8+ * Permission is hereby granted, free of charge, to any person obtaining a
9+ * copy of this software and associated documentation files (the "Software"),
10+ * to deal in the Software without restriction, including without limitation
11+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12+ * and/or sell copies of the Software, and to permit persons to whom the
13+ * Software is furnished to do so, subject to the following conditions:
14+ *
15+ * The above copyright notice and this permission notice (including the next
16+ * paragraph) shall be included in all copies or substantial portions of the
17+ * Software.
18+ *
19+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25+ * IN THE SOFTWARE.
26+ *
27+ */
28+
29+#ifndef __I915_OA_CFLGT3_H__
30+#define __I915_OA_CFLGT3_H__
31+
32+extern void i915_perf_load_test_config_cflgt3(struct drm_i915_private *dev_priv);
33+
34+#endif
drivers/gpu/drm/i915/i915_oa_chv.c+2−2
@@ -84,9 +84,9 @@ show_test_oa_id(struct device *kdev, struct device_attribute *attr, char *buf) · 83 unmodified lines
8484 void
8585 i915_perf_load_test_config_chv(struct drm_i915_private *dev_priv)
8686 {
87− strncpy(dev_priv->perf.oa.test_config.uuid,
87+ strlcpy(dev_priv->perf.oa.test_config.uuid,
8888 "4a534b07-cba3-414d-8d60-874830e883aa",
89− UUID_STRING_LEN);
89+ sizeof(dev_priv->perf.oa.test_config.uuid));
9090 dev_priv->perf.oa.test_config.id = 1;
9191
9292 dev_priv->perf.oa.test_config.mux_regs = mux_config_test_oa;
drivers/gpu/drm/i915/i915_oa_cnl.c+121−0
@@ -0,0 +1,121 @@
1+/*
2+ * Autogenerated file by GPU Top : https://github.com/rib/gputop
3+ * DO NOT EDIT manually!
4+ *
5+ *
6+ * Copyright (c) 2015 Intel Corporation
7+ *
8+ * Permission is hereby granted, free of charge, to any person obtaining a
9+ * copy of this software and associated documentation files (the "Software"),
10+ * to deal in the Software without restriction, including without limitation
11+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12+ * and/or sell copies of the Software, and to permit persons to whom the
13+ * Software is furnished to do so, subject to the following conditions:
14+ *
15+ * The above copyright notice and this permission notice (including the next
16+ * paragraph) shall be included in all copies or substantial portions of the
17+ * Software.
18+ *
19+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25+ * IN THE SOFTWARE.
26+ *
27+ */
28+
29+#include <linux/sysfs.h>
30+
31+#include "i915_drv.h"
32+#include "i915_oa_cnl.h"
33+
34+static const struct i915_oa_reg b_counter_config_test_oa[] = {
35+ { _MMIO(0x2740), 0x00000000 },
36+ { _MMIO(0x2710), 0x00000000 },
37+ { _MMIO(0x2714), 0xf0800000 },
38+ { _MMIO(0x2720), 0x00000000 },
39+ { _MMIO(0x2724), 0xf0800000 },
40+ { _MMIO(0x2770), 0x00000004 },
41+ { _MMIO(0x2774), 0x0000ffff },
42+ { _MMIO(0x2778), 0x00000003 },
43+ { _MMIO(0x277c), 0x0000ffff },
44+ { _MMIO(0x2780), 0x00000007 },
45+ { _MMIO(0x2784), 0x0000ffff },
46+ { _MMIO(0x2788), 0x00100002 },
47+ { _MMIO(0x278c), 0x0000fff7 },
48+ { _MMIO(0x2790), 0x00100002 },
49+ { _MMIO(0x2794), 0x0000ffcf },
50+ { _MMIO(0x2798), 0x00100082 },
51+ { _MMIO(0x279c), 0x0000ffef },
52+ { _MMIO(0x27a0), 0x001000c2 },
53+ { _MMIO(0x27a4), 0x0000ffe7 },
54+ { _MMIO(0x27a8), 0x00100001 },
55+ { _MMIO(0x27ac), 0x0000ffe7 },
56+};
57+
58+static const struct i915_oa_reg flex_eu_config_test_oa[] = {
59+};
60+
61+static const struct i915_oa_reg mux_config_test_oa[] = {
62+ { _MMIO(0xd04), 0x00000200 },
63+ { _MMIO(0x9884), 0x00000007 },
64+ { _MMIO(0x9888), 0x17060000 },
65+ { _MMIO(0x9840), 0x00000000 },
66+ { _MMIO(0x9884), 0x00000007 },
67+ { _MMIO(0x9888), 0x13034000 },
68+ { _MMIO(0x9884), 0x00000007 },
69+ { _MMIO(0x9888), 0x07060066 },
70+ { _MMIO(0x9884), 0x00000007 },
71+ { _MMIO(0x9888), 0x05060000 },
72+ { _MMIO(0x9884), 0x00000007 },
73+ { _MMIO(0x9888), 0x0f080040 },
74+ { _MMIO(0x9884), 0x00000007 },
75+ { _MMIO(0x9888), 0x07091000 },
76+ { _MMIO(0x9884), 0x00000007 },
77+ { _MMIO(0x9888), 0x0f041000 },
78+ { _MMIO(0x9884), 0x00000007 },
79+ { _MMIO(0x9888), 0x1d004000 },
80+ { _MMIO(0x9884), 0x00000007 },
81+ { _MMIO(0x9888), 0x35000000 },
82+ { _MMIO(0x9884), 0x00000007 },
83+ { _MMIO(0x9888), 0x49000000 },
84+ { _MMIO(0x9884), 0x00000007 },
85+ { _MMIO(0x9888), 0x3d000000 },
86+ { _MMIO(0x9884), 0x00000007 },
87+ { _MMIO(0x9888), 0x31000000 },
88+};
89+
90+static ssize_t
91+show_test_oa_id(struct device *kdev, struct device_attribute *attr, char *buf)
92+{
93+ return sprintf(buf, "1\n");
94+}
95+
96+void
97+i915_perf_load_test_config_cnl(struct drm_i915_private *dev_priv)
98+{
99+ strncpy(dev_priv->perf.oa.test_config.uuid,
100+ "db41edd4-d8e7-4730-ad11-b9a2d6833503",
101+ UUID_STRING_LEN);
102+ dev_priv->perf.oa.test_config.id = 1;
103+
104+ dev_priv->perf.oa.test_config.mux_regs = mux_config_test_oa;
105+ dev_priv->perf.oa.test_config.mux_regs_len = ARRAY_SIZE(mux_config_test_oa);
106+
107+ dev_priv->perf.oa.test_config.b_counter_regs = b_counter_config_test_oa;
108+ dev_priv->perf.oa.test_config.b_counter_regs_len = ARRAY_SIZE(b_counter_config_test_oa);
109+
110+ dev_priv->perf.oa.test_config.flex_regs = flex_eu_config_test_oa;
111+ dev_priv->perf.oa.test_config.flex_regs_len = ARRAY_SIZE(flex_eu_config_test_oa);
112+
113+ dev_priv->perf.oa.test_config.sysfs_metric.name = "db41edd4-d8e7-4730-ad11-b9a2d6833503";
114+ dev_priv->perf.oa.test_config.sysfs_metric.attrs = dev_priv->perf.oa.test_config.attrs;
115+
116+ dev_priv->perf.oa.test_config.attrs[0] = &dev_priv->perf.oa.test_config.sysfs_metric_id.attr;
117+
118+ dev_priv->perf.oa.test_config.sysfs_metric_id.attr.name = "id";
119+ dev_priv->perf.oa.test_config.sysfs_metric_id.attr.mode = 0444;
120+ dev_priv->perf.oa.test_config.sysfs_metric_id.show = show_test_oa_id;
121+}
drivers/gpu/drm/i915/i915_oa_cnl.h+34−0
@@ -0,0 +1,34 @@
1+/*
2+ * Autogenerated file by GPU Top : https://github.com/rib/gputop
3+ * DO NOT EDIT manually!
4+ *
5+ *
6+ * Copyright (c) 2015 Intel Corporation
7+ *
8+ * Permission is hereby granted, free of charge, to any person obtaining a
9+ * copy of this software and associated documentation files (the "Software"),
10+ * to deal in the Software without restriction, including without limitation
11+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12+ * and/or sell copies of the Software, and to permit persons to whom the
13+ * Software is furnished to do so, subject to the following conditions:
14+ *
15+ * The above copyright notice and this permission notice (including the next
16+ * paragraph) shall be included in all copies or substantial portions of the
17+ * Software.
18+ *
19+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25+ * IN THE SOFTWARE.
26+ *
27+ */
28+
29+#ifndef __I915_OA_CNL_H__
30+#define __I915_OA_CNL_H__
31+
32+extern void i915_perf_load_test_config_cnl(struct drm_i915_private *dev_priv);
33+
34+#endif
drivers/gpu/drm/i915/i915_oa_glk.c+2−2
@@ -83,9 +83,9 @@ show_test_oa_id(struct device *kdev, struct device_attribute *attr, char *buf) · 82 unmodified lines
8383 void
8484 i915_perf_load_test_config_glk(struct drm_i915_private *dev_priv)
8585 {
86− strncpy(dev_priv->perf.oa.test_config.uuid,
86+ strlcpy(dev_priv->perf.oa.test_config.uuid,
8787 "dd3fd789-e783-4204-8cd0-b671bbccb0cf",
88− UUID_STRING_LEN);
88+ sizeof(dev_priv->perf.oa.test_config.uuid));
8989 dev_priv->perf.oa.test_config.id = 1;
9090
9191 dev_priv->perf.oa.test_config.mux_regs = mux_config_test_oa;
drivers/gpu/drm/i915/i915_oa_hsw.c+2−2
@@ -113,9 +113,9 @@ show_render_basic_id(struct device *kdev, struct device_attribute *attr, char *b · 112 unmodified lines
113113 void
114114 i915_perf_load_test_config_hsw(struct drm_i915_private *dev_priv)
115115 {
116− strncpy(dev_priv->perf.oa.test_config.uuid,
116+ strlcpy(dev_priv->perf.oa.test_config.uuid,
117117 "403d8832-1a27-4aa6-a64e-f5389ce7b212",
118− UUID_STRING_LEN);
118+ sizeof(dev_priv->perf.oa.test_config.uuid));
119119 dev_priv->perf.oa.test_config.id = 1;
120120
121121 dev_priv->perf.oa.test_config.mux_regs = mux_config_render_basic;
drivers/gpu/drm/i915/i915_oa_kblgt2.c+2−2
@@ -84,9 +84,9 @@ show_test_oa_id(struct device *kdev, struct device_attribute *attr, char *buf) · 83 unmodified lines
8484 void
8585 i915_perf_load_test_config_kblgt2(struct drm_i915_private *dev_priv)
8686 {
87− strncpy(dev_priv->perf.oa.test_config.uuid,
87+ strlcpy(dev_priv->perf.oa.test_config.uuid,
8888 "baa3c7e4-52b6-4b85-801e-465a94b746dd",
89− UUID_STRING_LEN);
89+ sizeof(dev_priv->perf.oa.test_config.uuid));
9090 dev_priv->perf.oa.test_config.id = 1;
9191
9292 dev_priv->perf.oa.test_config.mux_regs = mux_config_test_oa;
drivers/gpu/drm/i915/i915_oa_kblgt3.c+2−2
@@ -84,9 +84,9 @@ show_test_oa_id(struct device *kdev, struct device_attribute *attr, char *buf) · 83 unmodified lines
8484 void
8585 i915_perf_load_test_config_kblgt3(struct drm_i915_private *dev_priv)
8686 {
87− strncpy(dev_priv->perf.oa.test_config.uuid,
87+ strlcpy(dev_priv->perf.oa.test_config.uuid,
8888 "f1792f32-6db2-4b50-b4b2-557128f1688d",
89− UUID_STRING_LEN);
89+ sizeof(dev_priv->perf.oa.test_config.uuid));
9090 dev_priv->perf.oa.test_config.id = 1;
9191
9292 dev_priv->perf.oa.test_config.mux_regs = mux_config_test_oa;
drivers/gpu/drm/i915/i915_oa_sklgt2.c+2−2
@@ -83,9 +83,9 @@ show_test_oa_id(struct device *kdev, struct device_attribute *attr, char *buf) · 82 unmodified lines
8383 void
8484 i915_perf_load_test_config_sklgt2(struct drm_i915_private *dev_priv)
8585 {
86− strncpy(dev_priv->perf.oa.test_config.uuid,
86+ strlcpy(dev_priv->perf.oa.test_config.uuid,
8787 "1651949f-0ac0-4cb1-a06f-dafd74a407d1",
88− UUID_STRING_LEN);
88+ sizeof(dev_priv->perf.oa.test_config.uuid));
8989 dev_priv->perf.oa.test_config.id = 1;
9090
9191 dev_priv->perf.oa.test_config.mux_regs = mux_config_test_oa;
drivers/gpu/drm/i915/i915_oa_sklgt3.c+2−2
@@ -84,9 +84,9 @@ show_test_oa_id(struct device *kdev, struct device_attribute *attr, char *buf) · 83 unmodified lines
8484 void
8585 i915_perf_load_test_config_sklgt3(struct drm_i915_private *dev_priv)
8686 {
87− strncpy(dev_priv->perf.oa.test_config.uuid,
87+ strlcpy(dev_priv->perf.oa.test_config.uuid,
8888 "2b985803-d3c9-4629-8a4f-634bfecba0e8",
89− UUID_STRING_LEN);
89+ sizeof(dev_priv->perf.oa.test_config.uuid));
9090 dev_priv->perf.oa.test_config.id = 1;
9191
9292 dev_priv->perf.oa.test_config.mux_regs = mux_config_test_oa;
drivers/gpu/drm/i915/i915_oa_sklgt4.c+2−2
@@ -84,9 +84,9 @@ show_test_oa_id(struct device *kdev, struct device_attribute *attr, char *buf) · 83 unmodified lines
8484 void
8585 i915_perf_load_test_config_sklgt4(struct drm_i915_private *dev_priv)
8686 {
87− strncpy(dev_priv->perf.oa.test_config.uuid,
87+ strlcpy(dev_priv->perf.oa.test_config.uuid,
8888 "882fa433-1f4a-4a67-a962-c741888fe5f5",
89− UUID_STRING_LEN);
89+ sizeof(dev_priv->perf.oa.test_config.uuid));
9090 dev_priv->perf.oa.test_config.id = 1;
9191
9292 dev_priv->perf.oa.test_config.mux_regs = mux_config_test_oa;
drivers/gpu/drm/i915/i915_perf.c+70−25
@@ -207,6 +207,8 @@ · 206 unmodified lines
207207 #include "i915_oa_kblgt3.h"
208208 #include "i915_oa_glk.h"
209209 #include "i915_oa_cflgt2.h"
210+#include "i915_oa_cflgt3.h"
211+#include "i915_oa_cnl.h"
210212
211213 /* HW requires this to be a power of two, between 128k and 16M, though driver
212214 * is currently generally designed assuming the largest 16M size is used such
@@ -1851,7 +1853,7 @@ static int gen8_enable_metric_set(struct drm_i915_private *dev_priv, · 1638 unmodified lines
18511853 * be read back from automatically triggered reports, as part of the
18521854 * RPT_ID field.
18531855 */
1854− if (IS_GEN9(dev_priv)) {
1856+ if (IS_GEN9(dev_priv) || IS_GEN10(dev_priv)) {
18551857 I915_WRITE(GEN8_OA_DEBUG,
18561858 _MASKED_BIT_ENABLE(GEN9_OA_DEBUG_DISABLE_CLK_RATIO_REPORTS |
18571859 GEN9_OA_DEBUG_INCLUDE_CLK_RATIO));
@@ -1884,6 +1886,16 @@ static void gen8_disable_metric_set(struct drm_i915_private *dev_priv) · 26 unmodified lines
18841886
18851887 }
18861888
1889+static void gen10_disable_metric_set(struct drm_i915_private *dev_priv)
1890+{
1891+ /* Reset all contexts' slices/subslices configurations. */
1892+ gen8_configure_all_contexts(dev_priv, NULL, false);
1893+
1894+ /* Make sure we disable noa to save power. */
1895+ I915_WRITE(RPM_CONFIG1,
1896+ I915_READ(RPM_CONFIG1) & ~GEN10_GT_NOA_ENABLE);
1897+}
1898+
18871899 static void gen7_oa_enable(struct drm_i915_private *dev_priv)
18881900 {
18891901 /*
@@ -2934,6 +2946,10 @@ void i915_perf_register(struct drm_i915_private *dev_priv) · 1044 unmodified lines
29342946 } else if (IS_COFFEELAKE(dev_priv)) {
29352947 if (IS_CFL_GT2(dev_priv))
29362948 i915_perf_load_test_config_cflgt2(dev_priv);
2949+ if (IS_CFL_GT3(dev_priv))
2950+ i915_perf_load_test_config_cflgt3(dev_priv);
2951+ } else if (IS_CANNONLAKE(dev_priv)) {
2952+ i915_perf_load_test_config_cnl(dev_priv);
29372953 }
29382954
29392955 if (dev_priv->perf.oa.test_config.id == 0)
@@ -3019,11 +3035,18 @@ static bool gen8_is_valid_mux_addr(struct drm_i915_private *dev_priv, u32 addr) · 79 unmodified lines
30193035 (addr >= RPM_CONFIG0.reg && addr <= NOA_CONFIG(8).reg);
30203036 }
30213037
3038+static bool gen10_is_valid_mux_addr(struct drm_i915_private *dev_priv, u32 addr)
3039+{
3040+ return gen8_is_valid_mux_addr(dev_priv, addr) ||
3041+ (addr >= OA_PERFCNT3_LO.reg && addr <= OA_PERFCNT4_HI.reg);
3042+}
3043+
30223044 static bool hsw_is_valid_mux_addr(struct drm_i915_private *dev_priv, u32 addr)
30233045 {
30243046 return gen7_is_valid_mux_addr(dev_priv, addr) ||
30253047 (addr >= 0x25100 && addr <= 0x2FF90) ||
3026− addr == 0x9ec0;
3048+ (addr >= HSW_MBVID2_NOA0.reg && addr <= HSW_MBVID2_NOA9.reg) ||
3049+ addr == HSW_MBVID2_MISR0.reg;
30273050 }
30283051
30293052 static bool chv_is_valid_mux_addr(struct drm_i915_private *dev_priv, u32 addr)
@@ -3419,41 +3442,46 @@ void i915_perf_init(struct drm_i915_private *dev_priv) · 389 unmodified lines
34193442 * worth the complexity to maintain now that BDW+ enable
34203443 * execlist mode by default.
34213444 */
3422− dev_priv->perf.oa.ops.is_valid_b_counter_reg =
3423− gen7_is_valid_b_counter_addr;
3424− dev_priv->perf.oa.ops.is_valid_mux_reg =
3425− gen8_is_valid_mux_addr;
3426− dev_priv->perf.oa.ops.is_valid_flex_reg =
3427− gen8_is_valid_flex_addr;
3445+ dev_priv->perf.oa.oa_formats = gen8_plus_oa_formats;
34283446
34293447 dev_priv->perf.oa.ops.init_oa_buffer = gen8_init_oa_buffer;
3430− dev_priv->perf.oa.ops.enable_metric_set = gen8_enable_metric_set;
3431− dev_priv->perf.oa.ops.disable_metric_set = gen8_disable_metric_set;
34323448 dev_priv->perf.oa.ops.oa_enable = gen8_oa_enable;
34333449 dev_priv->perf.oa.ops.oa_disable = gen8_oa_disable;
34343450 dev_priv->perf.oa.ops.read = gen8_oa_read;
34353451 dev_priv->perf.oa.ops.oa_hw_tail_read = gen8_oa_hw_tail_read;
34363452
3437− dev_priv->perf.oa.oa_formats = gen8_plus_oa_formats;
3438−
3439− if (IS_GEN8(dev_priv)) {
3440− dev_priv->perf.oa.ctx_oactxctrl_offset = 0x120;
3441− dev_priv->perf.oa.ctx_flexeu0_offset = 0x2ce;
3442−
3443− dev_priv->perf.oa.timestamp_frequency = 12500000;
3453+ if (IS_GEN8(dev_priv) || IS_GEN9(dev_priv)) {
3454+ dev_priv->perf.oa.ops.is_valid_b_counter_reg =
3455+ gen7_is_valid_b_counter_addr;
3456+ dev_priv->perf.oa.ops.is_valid_mux_reg =
3457+ gen8_is_valid_mux_addr;
3458+ dev_priv->perf.oa.ops.is_valid_flex_reg =
3459+ gen8_is_valid_flex_addr;
34443460
3445− dev_priv->perf.oa.gen8_valid_ctx_bit = (1<<25);
34463461 if (IS_CHERRYVIEW(dev_priv)) {
34473462 dev_priv->perf.oa.ops.is_valid_mux_reg =
34483463 chv_is_valid_mux_addr;
34493464 }
3450− } else if (IS_GEN9(dev_priv)) {
3451− dev_priv->perf.oa.ctx_oactxctrl_offset = 0x128;
3452− dev_priv->perf.oa.ctx_flexeu0_offset = 0x3de;
34533465
3454− dev_priv->perf.oa.gen8_valid_ctx_bit = (1<<16);
3466+ dev_priv->perf.oa.ops.enable_metric_set = gen8_enable_metric_set;
3467+ dev_priv->perf.oa.ops.disable_metric_set = gen8_disable_metric_set;
3468+
3469+ if (IS_GEN8(dev_priv)) {
3470+ dev_priv->perf.oa.ctx_oactxctrl_offset = 0x120;
3471+ dev_priv->perf.oa.ctx_flexeu0_offset = 0x2ce;
3472+
3473+ dev_priv->perf.oa.gen8_valid_ctx_bit = (1<<25);
3474+ } else {
3475+ dev_priv->perf.oa.ctx_oactxctrl_offset = 0x128;
3476+ dev_priv->perf.oa.ctx_flexeu0_offset = 0x3de;
3477+
3478+ dev_priv->perf.oa.gen8_valid_ctx_bit = (1<<16);
3479+ }
34553480
34563481 switch (dev_priv->info.platform) {
3482+ case INTEL_BROADWELL:
3483+ dev_priv->perf.oa.timestamp_frequency = 12500000;
3484+ break;
34573485 case INTEL_BROXTON:
34583486 case INTEL_GEMINILAKE:
34593487 dev_priv->perf.oa.timestamp_frequency = 19200000;
@@ -3464,11 +3492,28 @@ void i915_perf_init(struct drm_i915_private *dev_priv) · 4 unmodified lines
34643492 dev_priv->perf.oa.timestamp_frequency = 12000000;
34653493 break;
34663494 default:
3467− /* Leave timestamp_frequency to 0 so we can
3468− * detect unsupported platforms.
3469− */
34703495 break;
34713496 }
3497+ } else if (IS_GEN10(dev_priv)) {
3498+ dev_priv->perf.oa.ops.is_valid_b_counter_reg =
3499+ gen7_is_valid_b_counter_addr;
3500+ dev_priv->perf.oa.ops.is_valid_mux_reg =
3501+ gen10_is_valid_mux_addr;
3502+ dev_priv->perf.oa.ops.is_valid_flex_reg =
3503+ gen8_is_valid_flex_addr;
3504+
3505+ dev_priv->perf.oa.ops.enable_metric_set = gen8_enable_metric_set;
3506+ dev_priv->perf.oa.ops.disable_metric_set = gen10_disable_metric_set;
3507+
3508+ dev_priv->perf.oa.ctx_oactxctrl_offset = 0x128;
3509+ dev_priv->perf.oa.ctx_flexeu0_offset = 0x3de;
3510+
3511+ dev_priv->perf.oa.gen8_valid_ctx_bit = (1<<16);
3512+
3513+ /* Default frequency, although we need to read it from
3514+ * the register as it might vary between parts.
3515+ */
3516+ dev_priv->perf.oa.timestamp_frequency = 12000000;
34723517 }
34733518 }
34743519
drivers/gpu/drm/i915/i915_reg.h+68−15
@@ -355,9 +355,6 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg) · 354 unmodified lines
355355 #define ECOCHK_PPGTT_WT_HSW (0x2<<3)
356356 #define ECOCHK_PPGTT_WB_HSW (0x3<<3)
357357
358−#define GEN8_CONFIG0 _MMIO(0xD00)
359−#define GEN9_DEFAULT_FIXES (1 << 3 | 1 << 2 | 1 << 1)
360−
361358 #define GAC_ECO_BITS _MMIO(0x14090)
362359 #define ECOBITS_SNB_BIT (1<<13)
363360 #define ECOBITS_PPGTT_CACHE64B (3<<8)
@@ -382,6 +379,7 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg) · 18 unmodified lines
382379 #define GEN8_STOLEN_RESERVED_2M (1 << 7)
383380 #define GEN8_STOLEN_RESERVED_4M (2 << 7)
384381 #define GEN8_STOLEN_RESERVED_8M (3 << 7)
382+#define GEN6_STOLEN_RESERVED_ENABLE (1 << 0)
385383
386384 /* VGA stuff */
387385
@@ -1109,16 +1107,50 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg) · 721 unmodified lines
11091107 #define OA_PERFCNT1_HI _MMIO(0x91BC)
11101108 #define OA_PERFCNT2_LO _MMIO(0x91C0)
11111109 #define OA_PERFCNT2_HI _MMIO(0x91C4)
1110+#define OA_PERFCNT3_LO _MMIO(0x91C8)
1111+#define OA_PERFCNT3_HI _MMIO(0x91CC)
1112+#define OA_PERFCNT4_LO _MMIO(0x91D8)
1113+#define OA_PERFCNT4_HI _MMIO(0x91DC)
11121114
11131115 #define OA_PERFMATRIX_LO _MMIO(0x91C8)
11141116 #define OA_PERFMATRIX_HI _MMIO(0x91CC)
11151117
11161118 /* RPM unit config (Gen8+) */
11171119 #define RPM_CONFIG0 _MMIO(0x0D00)
1118−#define RPM_CONFIG1 _MMIO(0x0D04)
1120+#define GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_SHIFT 3
1121+#define GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_MASK (1 << GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_SHIFT)
1122+#define GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_19_2_MHZ 0
1123+#define GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_24_MHZ 1
1124+#define GEN10_RPM_CONFIG0_CTC_SHIFT_PARAMETER_SHIFT 1
1125+#define GEN10_RPM_CONFIG0_CTC_SHIFT_PARAMETER_MASK (0x3 << GEN10_RPM_CONFIG0_CTC_SHIFT_PARAMETER_SHIFT)
11191126
1120−/* RPC unit config (Gen8+) */
1121−#define RPM_CONFIG _MMIO(0x0D08)
1127+#define RPM_CONFIG1 _MMIO(0x0D04)
1128+#define GEN10_GT_NOA_ENABLE (1 << 9)
1129+
1130+/* GPM unit config (Gen9+) */
1131+#define CTC_MODE _MMIO(0xA26C)
1132+#define CTC_SOURCE_PARAMETER_MASK 1
1133+#define CTC_SOURCE_CRYSTAL_CLOCK 0
1134+#define CTC_SOURCE_DIVIDE_LOGIC 1
1135+#define CTC_SHIFT_PARAMETER_SHIFT 1
1136+#define CTC_SHIFT_PARAMETER_MASK (0x3 << CTC_SHIFT_PARAMETER_SHIFT)
1137+
1138+/* RCP unit config (Gen8+) */
1139+#define RCP_CONFIG _MMIO(0x0D08)
1140+
1141+/* NOA (HSW) */
1142+#define HSW_MBVID2_NOA0 _MMIO(0x9E80)
1143+#define HSW_MBVID2_NOA1 _MMIO(0x9E84)
1144+#define HSW_MBVID2_NOA2 _MMIO(0x9E88)
1145+#define HSW_MBVID2_NOA3 _MMIO(0x9E8C)
1146+#define HSW_MBVID2_NOA4 _MMIO(0x9E90)
1147+#define HSW_MBVID2_NOA5 _MMIO(0x9E94)
1148+#define HSW_MBVID2_NOA6 _MMIO(0x9E98)
1149+#define HSW_MBVID2_NOA7 _MMIO(0x9E9C)
1150+#define HSW_MBVID2_NOA8 _MMIO(0x9EA0)
1151+#define HSW_MBVID2_NOA9 _MMIO(0x9EA4)
1152+
1153+#define HSW_MBVID2_MISR0 _MMIO(0x9EC0)
11221154
11231155 /* NOA (Gen8+) */
11241156 #define NOA_CONFIG(i) _MMIO(0x0D0C + (i) * 4)
@@ -2329,6 +2361,8 @@ enum i915_power_well_id { · 1204 unmodified lines
23292361 #define ARB_MODE_SWIZZLE_BDW (1<<1)
23302362 #define RENDER_HWS_PGA_GEN7 _MMIO(0x04080)
23312363 #define RING_FAULT_REG(engine) _MMIO(0x4094 + 0x100*(engine)->hw_id)
2364+#define GEN8_RING_FAULT_REG _MMIO(0x4094)
2365+#define GEN8_RING_FAULT_ENGINE_ID(x) (((x) >> 12) & 0x7)
23322366 #define RING_FAULT_GTTSEL_MASK (1<<11)
23332367 #define RING_FAULT_SRCID(x) (((x) >> 3) & 0xff)
23342368 #define RING_FAULT_FAULT_TYPE(x) (((x) >> 1) & 0x3)
@@ -2951,9 +2985,6 @@ enum i915_power_well_id { · 616 unmodified lines
29512985 #define ILK_DPFC_CHICKEN _MMIO(0x43224)
29522986 #define ILK_DPFC_DISABLE_DUMMY0 (1<<8)
29532987 #define ILK_DPFC_NUKE_ON_ANY_MODIFICATION (1<<23)
2954−#define GLK_SKIP_SEG_EN (1<<12)
2955−#define GLK_SKIP_SEG_COUNT_MASK (3<<10)
2956−#define GLK_SKIP_SEG_COUNT(x) ((x)<<10)
29572988 #define ILK_FBC_RT_BASE _MMIO(0x2128)
29582989 #define ILK_FBC_RT_VALID (1<<0)
29592990 #define SNB_FBC_FRONT_BUFFER (1<<1)
@@ -3398,6 +3429,7 @@ enum i915_power_well_id { · 438 unmodified lines
33983429 #define ELK_STOLEN_RESERVED _MMIO(MCHBAR_MIRROR_BASE + 0x48)
33993430 #define G4X_STOLEN_RESERVED_ADDR1_MASK (0xFFFF << 16)
34003431 #define G4X_STOLEN_RESERVED_ADDR2_MASK (0xFFF << 4)
3432+#define G4X_STOLEN_RESERVED_ENABLE (1 << 0)
34013433
34023434 /* Memory controller frequency in MCHBAR for Haswell (possible SNB+) */
34033435 #define DCLK _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5e04)
@@ -3819,6 +3851,7 @@ enum { · 415 unmodified lines
38193851 * GEN9 clock gating regs
38203852 */
38213853 #define GEN9_CLKGATE_DIS_0 _MMIO(0x46530)
3854+#define DARBF_GATING_DIS (1 << 27)
38223855 #define PWM2_GATING_DIS (1 << 14)
38233856 #define PWM1_GATING_DIS (1 << 13)
38243857
@@ -3837,6 +3870,7 @@ enum { · 12 unmodified lines
38373870 */
38383871 #define SLICE_UNIT_LEVEL_CLKGATE _MMIO(0x94d4)
38393872 #define SARBUNIT_CLKGATE_DIS (1 << 5)
3873+#define RCCUNIT_CLKGATE_DIS (1 << 7)
38403874
38413875 /*
38423876 * Display engine regs
@@ -6263,7 +6297,7 @@ enum { · 2420 unmodified lines
62636297 #define _PLANE_CTL_2_A 0x70280
62646298 #define _PLANE_CTL_3_A 0x70380
62656299 #define PLANE_CTL_ENABLE (1 << 31)
6266−#define PLANE_CTL_PIPE_GAMMA_ENABLE (1 << 30)
6300+#define PLANE_CTL_PIPE_GAMMA_ENABLE (1 << 30) /* Pre-GLK */
62676301 #define PLANE_CTL_FORMAT_MASK (0xf << 24)
62686302 #define PLANE_CTL_FORMAT_YUV422 ( 0 << 24)
62696303 #define PLANE_CTL_FORMAT_NV12 ( 1 << 24)
@@ -6273,7 +6307,7 @@ enum { · 3 unmodified lines
62736307 #define PLANE_CTL_FORMAT_AYUV ( 8 << 24)
62746308 #define PLANE_CTL_FORMAT_INDEXED ( 12 << 24)
62756309 #define PLANE_CTL_FORMAT_RGB_565 ( 14 << 24)
6276−#define PLANE_CTL_PIPE_CSC_ENABLE (1 << 23)
6310+#define PLANE_CTL_PIPE_CSC_ENABLE (1 << 23) /* Pre-GLK */
62776311 #define PLANE_CTL_KEY_ENABLE_MASK (0x3 << 21)
62786312 #define PLANE_CTL_KEY_ENABLE_SOURCE ( 1 << 21)
62796313 #define PLANE_CTL_KEY_ENABLE_DESTINATION ( 2 << 21)
@@ -6286,13 +6320,13 @@ enum { · 6 unmodified lines
62866320 #define PLANE_CTL_YUV422_VYUY ( 3 << 16)
62876321 #define PLANE_CTL_DECOMPRESSION_ENABLE (1 << 15)
62886322 #define PLANE_CTL_TRICKLE_FEED_DISABLE (1 << 14)
6289−#define PLANE_CTL_PLANE_GAMMA_DISABLE (1 << 13)
6323+#define PLANE_CTL_PLANE_GAMMA_DISABLE (1 << 13) /* Pre-GLK */
62906324 #define PLANE_CTL_TILED_MASK (0x7 << 10)
62916325 #define PLANE_CTL_TILED_LINEAR ( 0 << 10)
62926326 #define PLANE_CTL_TILED_X ( 1 << 10)
62936327 #define PLANE_CTL_TILED_Y ( 4 << 10)
62946328 #define PLANE_CTL_TILED_YF ( 5 << 10)
6295−#define PLANE_CTL_ALPHA_MASK (0x3 << 4)
6329+#define PLANE_CTL_ALPHA_MASK (0x3 << 4) /* Pre-GLK */
62966330 #define PLANE_CTL_ALPHA_DISABLE ( 0 << 4)
62976331 #define PLANE_CTL_ALPHA_SW_PREMULTIPLY ( 2 << 4)
62986332 #define PLANE_CTL_ALPHA_HW_PREMULTIPLY ( 3 << 4)
@@ -6332,6 +6366,10 @@ enum { · 33 unmodified lines
63326366 #define PLANE_COLOR_PIPE_GAMMA_ENABLE (1 << 30)
63336367 #define PLANE_COLOR_PIPE_CSC_ENABLE (1 << 23)
63346368 #define PLANE_COLOR_PLANE_GAMMA_DISABLE (1 << 13)
6369+#define PLANE_COLOR_ALPHA_MASK (0x3 << 4)
6370+#define PLANE_COLOR_ALPHA_DISABLE (0 << 4)
6371+#define PLANE_COLOR_ALPHA_SW_PREMULTIPLY (2 << 4)
6372+#define PLANE_COLOR_ALPHA_HW_PREMULTIPLY (3 << 4)
63356373 #define _PLANE_BUF_CFG_1_A 0x7027c
63366374 #define _PLANE_BUF_CFG_2_A 0x7037c
63376375 #define _PLANE_NV12_BUF_CFG_1_A 0x70278
@@ -7774,8 +7812,9 @@ enum { · 1436 unmodified lines
77747812 #define FORCEWAKE_ACK_MEDIA_GEN9 _MMIO(0x0D88)
77757813 #define FORCEWAKE_ACK_RENDER_GEN9 _MMIO(0x0D84)
77767814 #define FORCEWAKE_ACK_BLITTER_GEN9 _MMIO(0x130044)
7777−#define FORCEWAKE_KERNEL 0x1
7778−#define FORCEWAKE_USER 0x2
7815+#define FORCEWAKE_KERNEL BIT(0)
7816+#define FORCEWAKE_USER BIT(1)
7817+#define FORCEWAKE_KERNEL_FALLBACK BIT(15)
77797818 #define FORCEWAKE_MT_ACK _MMIO(0x130040)
77807819 #define ECOBUS _MMIO(0xa180)
77817820 #define FORCEWAKE_MT_ENABLE (1<<5)
@@ -7905,6 +7944,7 @@ enum { · 123 unmodified lines
79057944 #define GEN6_RC1_WAKE_RATE_LIMIT _MMIO(0xA098)
79067945 #define GEN6_RC6_WAKE_RATE_LIMIT _MMIO(0xA09C)
79077946 #define GEN6_RC6pp_WAKE_RATE_LIMIT _MMIO(0xA0A0)
7947+#define GEN10_MEDIA_WAKE_RATE_LIMIT _MMIO(0xA0A0)
79087948 #define GEN6_RC_EVALUATION_INTERVAL _MMIO(0xA0A8)
79097949 #define GEN6_RC_IDLE_HYSTERSIS _MMIO(0xA0AC)
79107950 #define GEN6_RC_SLEEP _MMIO(0xA0B0)
@@ -8036,11 +8076,18 @@ enum { · 125 unmodified lines
80368076 #define CHV_EU311_PG_ENABLE (1<<1)
80378077
80388078 #define GEN9_SLICE_PGCTL_ACK(slice) _MMIO(0x804c + (slice)*0x4)
8079+#define GEN10_SLICE_PGCTL_ACK(slice) _MMIO(0x804c + ((slice) / 3) * 0x34 + \
8080+ ((slice) % 3) * 0x4)
80398081 #define GEN9_PGCTL_SLICE_ACK (1 << 0)
80408082 #define GEN9_PGCTL_SS_ACK(subslice) (1 << (2 + (subslice)*2))
8083+#define GEN10_PGCTL_VALID_SS_MASK(slice) ((slice) == 0 ? 0x7F : 0x1F)
80418084
80428085 #define GEN9_SS01_EU_PGCTL_ACK(slice) _MMIO(0x805c + (slice)*0x8)
8086+#define GEN10_SS01_EU_PGCTL_ACK(slice) _MMIO(0x805c + ((slice) / 3) * 0x30 + \
8087+ ((slice) % 3) * 0x8)
80438088 #define GEN9_SS23_EU_PGCTL_ACK(slice) _MMIO(0x8060 + (slice)*0x8)
8089+#define GEN10_SS23_EU_PGCTL_ACK(slice) _MMIO(0x8060 + ((slice) / 3) * 0x30 + \
8090+ ((slice) % 3) * 0x8)
80448091 #define GEN9_PGCTL_SSA_EU08_ACK (1 << 0)
80458092 #define GEN9_PGCTL_SSA_EU19_ACK (1 << 2)
80468093 #define GEN9_PGCTL_SSA_EU210_ACK (1 << 4)
@@ -8837,6 +8884,12 @@ enum skl_power_gate { · 790 unmodified lines
88378884 #define ILK_TIMESTAMP_HI _MMIO(0x70070)
88388885 #define IVB_TIMESTAMP_CTR _MMIO(0x44070)
88398886
8887+#define GEN9_TIMESTAMP_OVERRIDE _MMIO(0x44074)
8888+#define GEN9_TIMESTAMP_OVERRIDE_US_COUNTER_DIVIDER_SHIFT 0
8889+#define GEN9_TIMESTAMP_OVERRIDE_US_COUNTER_DIVIDER_MASK 0x3ff
8890+#define GEN9_TIMESTAMP_OVERRIDE_US_COUNTER_DENOMINATOR_SHIFT 12
8891+#define GEN9_TIMESTAMP_OVERRIDE_US_COUNTER_DENOMINATOR_MASK (0xf << 12)
8892+
88408893 #define _PIPE_FRMTMSTMP_A 0x70048
88418894 #define PIPE_FRMTMSTMP(pipe) \
88428895 _MMIO_PIPE2(pipe, _PIPE_FRMTMSTMP_A)
drivers/gpu/drm/i915/i915_selftest.h+1−1
@@ -99,6 +99,6 @@ __printf(2, 3) · 98 unmodified lines
9999 bool __igt_timeout(unsigned long timeout, const char *fmt, ...);
100100
101101 #define igt_timeout(t, fmt, ...) \
102− __igt_timeout((t), KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__)
102+ __igt_timeout((t), KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__)
103103
104104 #endif /* !__I915_SELFTEST_H__ */
drivers/gpu/drm/i915/i915_utils.h+5−2
@@ -83,8 +83,11 @@ · 82 unmodified lines
8383 (typeof(ptr))(__v & -BIT(n)); \
8484 })
8585
86−#define ptr_pack_bits(ptr, bits, n) \
87− ((typeof(ptr))((unsigned long)(ptr) | (bits)))
86+#define ptr_pack_bits(ptr, bits, n) ({ \
87+ unsigned long __bits = (bits); \
88+ GEM_BUG_ON(__bits & -BIT(n)); \
89+ ((typeof(ptr))((unsigned long)(ptr) | __bits)); \
90+})
8891
8992 #define page_mask_bits(ptr) ptr_mask_bits(ptr, PAGE_SHIFT)
9093 #define page_unmask_bits(ptr) ptr_unmask_bits(ptr, PAGE_SHIFT)
drivers/gpu/drm/i915/i915_vma.c+5−1
@@ -640,15 +640,17 @@ int __i915_vma_do_pin(struct i915_vma *vma, · 639 unmodified lines
640640 if (ret)
641641 goto err_unpin;
642642 }
643+ GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
643644
644645 ret = i915_vma_bind(vma, vma->obj->cache_level, flags);
645646 if (ret)
646647 goto err_remove;
647648
649+ GEM_BUG_ON((vma->flags & I915_VMA_BIND_MASK) == 0);
650+
648651 if ((bound ^ vma->flags) & I915_VMA_GLOBAL_BIND)
649652 __i915_vma_set_map_and_fenceable(vma);
650653
651− GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
652654 GEM_BUG_ON(i915_vma_misplaced(vma, size, alignment, flags));
653655 return 0;
654656
@@ -656,6 +658,7 @@ err_remove: · 1 unmodified line
656658 if ((bound & I915_VMA_BIND_MASK) == 0) {
657659 i915_vma_remove(vma);
658660 GEM_BUG_ON(vma->pages);
661+ GEM_BUG_ON(vma->flags & I915_VMA_BIND_MASK);
659662 }
660663 err_unpin:
661664 __i915_vma_unpin(vma);
@@ -740,6 +743,7 @@ int i915_vma_unbind(struct i915_vma *vma) · 78 unmodified lines
740743 /* First wait upon any activity as retiring the request may
741744 * have side-effects such as unpinning or even unbinding this vma.
742745 */
746+ might_sleep();
743747 active = i915_vma_get_active(vma);
744748 if (active) {
745749 int idx;
drivers/gpu/drm/i915/intel_audio.c+111−91
@@ -102,13 +102,13 @@ static const struct dp_aud_n_m dp_aud_n_m[] = { · 101 unmodified lines
102102 };
103103
104104 static const struct dp_aud_n_m *
105−audio_config_dp_get_n_m(struct intel_crtc *intel_crtc, int rate)
105+audio_config_dp_get_n_m(const struct intel_crtc_state *crtc_state, int rate)
106106 {
107107 int i;
108108
109109 for (i = 0; i < ARRAY_SIZE(dp_aud_n_m); i++) {
110110 if (rate == dp_aud_n_m[i].sample_rate &&
111− intel_crtc->config->port_clock == dp_aud_n_m[i].clock)
111+ crtc_state->port_clock == dp_aud_n_m[i].clock)
112112 return &dp_aud_n_m[i];
113113 }
114114
@@ -157,8 +157,10 @@ static const struct { · 42 unmodified lines
157157 };
158158
159159 /* get AUD_CONFIG_PIXEL_CLOCK_HDMI_* value for mode */
160−static u32 audio_config_hdmi_pixel_clock(const struct drm_display_mode *adjusted_mode)
160+static u32 audio_config_hdmi_pixel_clock(const struct intel_crtc_state *crtc_state)
161161 {
162+ const struct drm_display_mode *adjusted_mode =
163+ &crtc_state->base.adjusted_mode;
162164 int i;
163165
164166 for (i = 0; i < ARRAY_SIZE(hdmi_audio_clock); i++) {
@@ -179,9 +181,11 @@ static u32 audio_config_hdmi_pixel_clock(const struct drm_display_mode *adjusted · 14 unmodified lines
179181 return hdmi_audio_clock[i].config;
180182 }
181183
182−static int audio_config_hdmi_get_n(const struct drm_display_mode *adjusted_mode,
184+static int audio_config_hdmi_get_n(const struct intel_crtc_state *crtc_state,
183185 int rate)
184186 {
187+ const struct drm_display_mode *adjusted_mode =
188+ &crtc_state->base.adjusted_mode;
185189 int i;
186190
187191 for (i = 0; i < ARRAY_SIZE(hdmi_aud_ncts); i++) {
@@ -220,7 +224,9 @@ static bool intel_eld_uptodate(struct drm_connector *connector, · 32 unmodified lines
220224 return true;
221225 }
222226
223−static void g4x_audio_codec_disable(struct intel_encoder *encoder)
227+static void g4x_audio_codec_disable(struct intel_encoder *encoder,
228+ const struct intel_crtc_state *old_crtc_state,
229+ const struct drm_connector_state *old_conn_state)
224230 {
225231 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
226232 uint32_t eldv, tmp;
@@ -239,11 +245,12 @@ static void g4x_audio_codec_disable(struct intel_encoder *encoder) · 12 unmodified lines
239245 I915_WRITE(G4X_AUD_CNTL_ST, tmp);
240246 }
241247
242−static void g4x_audio_codec_enable(struct drm_connector *connector,
243− struct intel_encoder *encoder,
244− const struct drm_display_mode *adjusted_mode)
248+static void g4x_audio_codec_enable(struct intel_encoder *encoder,
249+ const struct intel_crtc_state *crtc_state,
250+ const struct drm_connector_state *conn_state)
245251 {
246− struct drm_i915_private *dev_priv = to_i915(connector->dev);
252+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
253+ struct drm_connector *connector = conn_state->connector;
247254 uint8_t *eld = connector->eld;
248255 uint32_t eldv;
249256 uint32_t tmp;
@@ -279,16 +286,20 @@ static void g4x_audio_codec_enable(struct drm_connector *connector, · 29 unmodified lines
279286 }
280287
281288 static void
282−hsw_dp_audio_config_update(struct intel_crtc *intel_crtc, enum port port,
283− const struct drm_display_mode *adjusted_mode)
289+hsw_dp_audio_config_update(struct intel_encoder *encoder,
290+ const struct intel_crtc_state *crtc_state)
284291 {
285− struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev);
292+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
286293 struct i915_audio_component *acomp = dev_priv->audio_component;
287− int rate = acomp ? acomp->aud_sample_rate[port] : 0;
288− const struct dp_aud_n_m *nm = audio_config_dp_get_n_m(intel_crtc, rate);
289− enum pipe pipe = intel_crtc->pipe;
294+ struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
295+ enum port port = encoder->port;
296+ enum pipe pipe = crtc->pipe;
297+ const struct dp_aud_n_m *nm;
298+ int rate;
290299 u32 tmp;
291300
301+ rate = acomp ? acomp->aud_sample_rate[port] : 0;
302+ nm = audio_config_dp_get_n_m(crtc_state, rate);
292303 if (nm)
293304 DRM_DEBUG_KMS("using Maud %u, Naud %u\n", nm->m, nm->n);
294305 else
@@ -323,23 +334,26 @@ hsw_dp_audio_config_update(struct intel_crtc *intel_crtc, enum port port, · 28 unmodified lines
323334 }
324335
325336 static void
326−hsw_hdmi_audio_config_update(struct intel_crtc *intel_crtc, enum port port,
327− const struct drm_display_mode *adjusted_mode)
337+hsw_hdmi_audio_config_update(struct intel_encoder *encoder,
338+ const struct intel_crtc_state *crtc_state)
328339 {
329− struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev);
340+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
330341 struct i915_audio_component *acomp = dev_priv->audio_component;
331− int rate = acomp ? acomp->aud_sample_rate[port] : 0;
332− enum pipe pipe = intel_crtc->pipe;
333− int n;
342+ struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
343+ enum port port = encoder->port;
344+ enum pipe pipe = crtc->pipe;
345+ int n, rate;
334346 u32 tmp;
335347
348+ rate = acomp ? acomp->aud_sample_rate[port] : 0;
349+
336350 tmp = I915_READ(HSW_AUD_CFG(pipe));
337351 tmp &= ~AUD_CONFIG_N_VALUE_INDEX;
338352 tmp &= ~AUD_CONFIG_PIXEL_CLOCK_HDMI_MASK;
339353 tmp &= ~AUD_CONFIG_N_PROG_ENABLE;
340− tmp |= audio_config_hdmi_pixel_clock(adjusted_mode);
354+ tmp |= audio_config_hdmi_pixel_clock(crtc_state);
341355
342− n = audio_config_hdmi_get_n(adjusted_mode, rate);
356+ n = audio_config_hdmi_get_n(crtc_state, rate);
343357 if (n != 0) {
344358 DRM_DEBUG_KMS("using N %d\n", n);
345359
@@ -363,20 +377,22 @@ hsw_hdmi_audio_config_update(struct intel_crtc *intel_crtc, enum port port, · 17 unmodified lines
363377 }
364378
365379 static void
366−hsw_audio_config_update(struct intel_crtc *intel_crtc, enum port port,
367− const struct drm_display_mode *adjusted_mode)
380+hsw_audio_config_update(struct intel_encoder *encoder,
381+ const struct intel_crtc_state *crtc_state)
368382 {
369− if (intel_crtc_has_dp_encoder(intel_crtc->config))
370− hsw_dp_audio_config_update(intel_crtc, port, adjusted_mode);
383+ if (intel_crtc_has_dp_encoder(crtc_state))
384+ hsw_dp_audio_config_update(encoder, crtc_state);
371385 else
372− hsw_hdmi_audio_config_update(intel_crtc, port, adjusted_mode);
386+ hsw_hdmi_audio_config_update(encoder, crtc_state);
373387 }
374388
375−static void hsw_audio_codec_disable(struct intel_encoder *encoder)
389+static void hsw_audio_codec_disable(struct intel_encoder *encoder,
390+ const struct intel_crtc_state *old_crtc_state,
391+ const struct drm_connector_state *old_conn_state)
376392 {
377393 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
378− struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
379− enum pipe pipe = intel_crtc->pipe;
394+ struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->base.crtc);
395+ enum pipe pipe = crtc->pipe;
380396 uint32_t tmp;
381397
382398 DRM_DEBUG_KMS("Disable audio codec on pipe %c\n", pipe_name(pipe));
@@ -389,7 +405,7 @@ static void hsw_audio_codec_disable(struct intel_encoder *encoder) · 6 unmodified lines
389405 tmp |= AUD_CONFIG_N_PROG_ENABLE;
390406 tmp &= ~AUD_CONFIG_UPPER_N_MASK;
391407 tmp &= ~AUD_CONFIG_LOWER_N_MASK;
392− if (intel_crtc_has_dp_encoder(intel_crtc->config))
408+ if (intel_crtc_has_dp_encoder(old_crtc_state))
393409 tmp |= AUD_CONFIG_N_VALUE_INDEX;
394410 I915_WRITE(HSW_AUD_CFG(pipe), tmp);
395411
@@ -402,14 +418,14 @@ static void hsw_audio_codec_disable(struct intel_encoder *encoder) · 6 unmodified lines
402418 mutex_unlock(&dev_priv->av_mutex);
403419 }
404420
405−static void hsw_audio_codec_enable(struct drm_connector *connector,
406− struct intel_encoder *intel_encoder,
407− const struct drm_display_mode *adjusted_mode)
421+static void hsw_audio_codec_enable(struct intel_encoder *encoder,
422+ const struct intel_crtc_state *crtc_state,
423+ const struct drm_connector_state *conn_state)
408424 {
409− struct drm_i915_private *dev_priv = to_i915(connector->dev);
410− struct intel_crtc *intel_crtc = to_intel_crtc(intel_encoder->base.crtc);
411− enum pipe pipe = intel_crtc->pipe;
412− enum port port = intel_encoder->port;
425+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
426+ struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
427+ struct drm_connector *connector = conn_state->connector;
428+ enum pipe pipe = crtc->pipe;
413429 const uint8_t *eld = connector->eld;
414430 uint32_t tmp;
415431 int len, i;
@@ -448,17 +464,19 @@ static void hsw_audio_codec_enable(struct drm_connector *connector, · 32 unmodified lines
448464 I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
449465
450466 /* Enable timestamps */
451− hsw_audio_config_update(intel_crtc, port, adjusted_mode);
467+ hsw_audio_config_update(encoder, crtc_state);
452468
453469 mutex_unlock(&dev_priv->av_mutex);
454470 }
455471
456−static void ilk_audio_codec_disable(struct intel_encoder *intel_encoder)
472+static void ilk_audio_codec_disable(struct intel_encoder *encoder,
473+ const struct intel_crtc_state *old_crtc_state,
474+ const struct drm_connector_state *old_conn_state)
457475 {
458− struct drm_i915_private *dev_priv = to_i915(intel_encoder->base.dev);
459− struct intel_crtc *intel_crtc = to_intel_crtc(intel_encoder->base.crtc);
460− enum pipe pipe = intel_crtc->pipe;
461− enum port port = intel_encoder->port;
476+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
477+ struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->base.crtc);
478+ enum pipe pipe = crtc->pipe;
479+ enum port port = encoder->port;
462480 uint32_t tmp, eldv;
463481 i915_reg_t aud_config, aud_cntrl_st2;
464482
@@ -485,7 +503,7 @@ static void ilk_audio_codec_disable(struct intel_encoder *intel_encoder) · 20 unmodified lines
485503 tmp |= AUD_CONFIG_N_PROG_ENABLE;
486504 tmp &= ~AUD_CONFIG_UPPER_N_MASK;
487505 tmp &= ~AUD_CONFIG_LOWER_N_MASK;
488− if (intel_crtc_has_dp_encoder(intel_crtc->config))
506+ if (intel_crtc_has_dp_encoder(old_crtc_state))
489507 tmp |= AUD_CONFIG_N_VALUE_INDEX;
490508 I915_WRITE(aud_config, tmp);
491509
@@ -497,14 +515,15 @@ static void ilk_audio_codec_disable(struct intel_encoder *intel_encoder) · 5 unmodified lines
497515 I915_WRITE(aud_cntrl_st2, tmp);
498516 }
499517
500−static void ilk_audio_codec_enable(struct drm_connector *connector,
501− struct intel_encoder *intel_encoder,
502− const struct drm_display_mode *adjusted_mode)
518+static void ilk_audio_codec_enable(struct intel_encoder *encoder,
519+ const struct intel_crtc_state *crtc_state,
520+ const struct drm_connector_state *conn_state)
503521 {
504− struct drm_i915_private *dev_priv = to_i915(connector->dev);
505− struct intel_crtc *intel_crtc = to_intel_crtc(intel_encoder->base.crtc);
506− enum pipe pipe = intel_crtc->pipe;
507− enum port port = intel_encoder->port;
522+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
523+ struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
524+ struct drm_connector *connector = conn_state->connector;
525+ enum pipe pipe = crtc->pipe;
526+ enum port port = encoder->port;
508527 uint8_t *eld = connector->eld;
509528 uint32_t tmp, eldv;
510529 int len, i;
@@ -568,36 +587,36 @@ static void ilk_audio_codec_enable(struct drm_connector *connector, · 57 unmodified lines
568587 tmp &= ~AUD_CONFIG_N_VALUE_INDEX;
569588 tmp &= ~AUD_CONFIG_N_PROG_ENABLE;
570589 tmp &= ~AUD_CONFIG_PIXEL_CLOCK_HDMI_MASK;
571− if (intel_crtc_has_dp_encoder(intel_crtc->config))
590+ if (intel_crtc_has_dp_encoder(crtc_state))
572591 tmp |= AUD_CONFIG_N_VALUE_INDEX;
573592 else
574− tmp |= audio_config_hdmi_pixel_clock(adjusted_mode);
593+ tmp |= audio_config_hdmi_pixel_clock(crtc_state);
575594 I915_WRITE(aud_config, tmp);
576595 }
577596
578597 /**
579598 * intel_audio_codec_enable - Enable the audio codec for HD audio
580− * @intel_encoder: encoder on which to enable audio
599+ * @encoder: encoder on which to enable audio
581600 * @crtc_state: pointer to the current crtc state.
582601 * @conn_state: pointer to the current connector state.
583602 *
584603 * The enable sequences may only be performed after enabling the transcoder and
585604 * port, and after completed link training.
586605 */
587−void intel_audio_codec_enable(struct intel_encoder *intel_encoder,
606+void intel_audio_codec_enable(struct intel_encoder *encoder,
588607 const struct intel_crtc_state *crtc_state,
589608 const struct drm_connector_state *conn_state)
590609 {
591− struct drm_encoder *encoder = &intel_encoder->base;
592− const struct drm_display_mode *adjusted_mode = &crtc_state->base.adjusted_mode;
593− struct drm_connector *connector;
594− struct drm_i915_private *dev_priv = to_i915(encoder->dev);
610+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
595611 struct i915_audio_component *acomp = dev_priv->audio_component;
596− enum port port = intel_encoder->port;
597− enum pipe pipe = to_intel_crtc(crtc_state->base.crtc)->pipe;
612+ struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
613+ struct drm_connector *connector = conn_state->connector;
614+ const struct drm_display_mode *adjusted_mode =
615+ &crtc_state->base.adjusted_mode;
616+ enum port port = encoder->port;
617+ enum pipe pipe = crtc->pipe;
598618
599− connector = conn_state->connector;
600− if (!connector || !connector->eld[0])
619+ if (!connector->eld[0])
601620 return;
602621
603622 DRM_DEBUG_DRIVER("ELD on [CONNECTOR:%d:%s], [ENCODER:%d:%s]\n",
@@ -609,19 +628,20 @@ void intel_audio_codec_enable(struct intel_encoder *intel_encoder, · 5 unmodified lines
609628 connector->eld[6] = drm_av_sync_delay(connector, adjusted_mode) / 2;
610629
611630 if (dev_priv->display.audio_codec_enable)
612− dev_priv->display.audio_codec_enable(connector, intel_encoder,
613− adjusted_mode);
631+ dev_priv->display.audio_codec_enable(encoder,
632+ crtc_state,
633+ conn_state);
614634
615635 mutex_lock(&dev_priv->av_mutex);
616− intel_encoder->audio_connector = connector;
636+ encoder->audio_connector = connector;
617637
618638 /* referred in audio callbacks */
619− dev_priv->av_enc_map[pipe] = intel_encoder;
639+ dev_priv->av_enc_map[pipe] = encoder;
620640 mutex_unlock(&dev_priv->av_mutex);
621641
622642 if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify) {
623643 /* audio drivers expect pipe = -1 to indicate Non-MST cases */
624− if (intel_encoder->type != INTEL_OUTPUT_DP_MST)
644+ if (!intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST))
625645 pipe = -1;
626646 acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr,
627647 (int) port, (int) pipe);
@@ -629,36 +649,41 @@ void intel_audio_codec_enable(struct intel_encoder *intel_encoder, · 1 unmodified line
629649
630650 intel_lpe_audio_notify(dev_priv, pipe, port, connector->eld,
631651 crtc_state->port_clock,
632− intel_encoder->type == INTEL_OUTPUT_DP);
652+ intel_crtc_has_dp_encoder(crtc_state));
633653 }
634654
635655 /**
636656 * intel_audio_codec_disable - Disable the audio codec for HD audio
637− * @intel_encoder: encoder on which to disable audio
657+ * @encoder: encoder on which to disable audio
658+ * @old_crtc_state: pointer to the old crtc state.
659+ * @old_conn_state: pointer to the old connector state.
638660 *
639661 * The disable sequences must be performed before disabling the transcoder or
640662 * port.
641663 */
642−void intel_audio_codec_disable(struct intel_encoder *intel_encoder)
664+void intel_audio_codec_disable(struct intel_encoder *encoder,
665+ const struct intel_crtc_state *old_crtc_state,
666+ const struct drm_connector_state *old_conn_state)
643667 {
644− struct drm_encoder *encoder = &intel_encoder->base;
645− struct drm_i915_private *dev_priv = to_i915(encoder->dev);
668+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
646669 struct i915_audio_component *acomp = dev_priv->audio_component;
647− enum port port = intel_encoder->port;
648− struct intel_crtc *crtc = to_intel_crtc(encoder->crtc);
670+ struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->base.crtc);
671+ enum port port = encoder->port;
649672 enum pipe pipe = crtc->pipe;
650673
651674 if (dev_priv->display.audio_codec_disable)
652− dev_priv->display.audio_codec_disable(intel_encoder);
675+ dev_priv->display.audio_codec_disable(encoder,
676+ old_crtc_state,
677+ old_conn_state);
653678
654679 mutex_lock(&dev_priv->av_mutex);
655− intel_encoder->audio_connector = NULL;
680+ encoder->audio_connector = NULL;
656681 dev_priv->av_enc_map[pipe] = NULL;
657682 mutex_unlock(&dev_priv->av_mutex);
658683
659684 if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify) {
660685 /* audio drivers expect pipe = -1 to indicate Non-MST cases */
661− if (intel_encoder->type != INTEL_OUTPUT_DP_MST)
686+ if (!intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DP_MST))
662687 pipe = -1;
663688 acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr,
664689 (int) port, (int) pipe);
@@ -793,10 +818,9 @@ static int i915_audio_component_sync_audio_rate(struct device *kdev, int port, · 128 unmodified lines
793818 int pipe, int rate)
794819 {
795820 struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
796− struct intel_encoder *intel_encoder;
797− struct intel_crtc *crtc;
798− struct drm_display_mode *adjusted_mode;
799821 struct i915_audio_component *acomp = dev_priv->audio_component;
822+ struct intel_encoder *encoder;
823+ struct intel_crtc *crtc;
800824 int err = 0;
801825
802826 if (!HAS_DDI(dev_priv))
@@ -806,23 +830,19 @@ static int i915_audio_component_sync_audio_rate(struct device *kdev, int port, · 3 unmodified lines
806830 mutex_lock(&dev_priv->av_mutex);
807831
808832 /* 1. get the pipe */
809− intel_encoder = get_saved_enc(dev_priv, port, pipe);
810− if (!intel_encoder || !intel_encoder->base.crtc) {
833+ encoder = get_saved_enc(dev_priv, port, pipe);
834+ if (!encoder || !encoder->base.crtc) {
811835 DRM_DEBUG_KMS("Not valid for port %c\n", port_name(port));
812836 err = -ENODEV;
813837 goto unlock;
814838 }
815839
816− /* pipe passed from the audio driver will be -1 for Non-MST case */
817− crtc = to_intel_crtc(intel_encoder->base.crtc);
818− pipe = crtc->pipe;
819−
820− adjusted_mode = &crtc->config->base.adjusted_mode;
840+ crtc = to_intel_crtc(encoder->base.crtc);
821841
822842 /* port must be valid now, otherwise the pipe will be invalid */
823843 acomp->aud_sample_rate[port] = rate;
824844
825− hsw_audio_config_update(crtc, port, adjusted_mode);
845+ hsw_audio_config_update(encoder, crtc->config);
826846
827847 unlock:
828848 mutex_unlock(&dev_priv->av_mutex);
drivers/gpu/drm/i915/intel_bios.c+24−0
@@ -1234,6 +1234,30 @@ static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port, · 1233 unmodified lines
12341234 info->hdmi_level_shift = hdmi_level_shift;
12351235 }
12361236
1237+ if (bdb_version >= 204) {
1238+ int max_tmds_clock;
1239+
1240+ switch (child->hdmi_max_data_rate) {
1241+ default:
1242+ MISSING_CASE(child->hdmi_max_data_rate);
1243+ /* fall through */
1244+ case HDMI_MAX_DATA_RATE_PLATFORM:
1245+ max_tmds_clock = 0;
1246+ break;
1247+ case HDMI_MAX_DATA_RATE_297:
1248+ max_tmds_clock = 297000;
1249+ break;
1250+ case HDMI_MAX_DATA_RATE_165:
1251+ max_tmds_clock = 165000;
1252+ break;
1253+ }
1254+
1255+ if (max_tmds_clock)
1256+ DRM_DEBUG_KMS("VBT HDMI max TMDS clock for port %c: %d kHz\n",
1257+ port_name(port), max_tmds_clock);
1258+ info->max_tmds_clock = max_tmds_clock;
1259+ }
1260+
12371261 /* Parse the I_boost config for SKL and above */
12381262 if (bdb_version >= 196 && child->iboost) {
12391263 info->dp_boost_level = translate_iboost(child->dp_iboost_level);
drivers/gpu/drm/i915/intel_breadcrumbs.c+43−11
@@ -123,7 +123,7 @@ static void intel_breadcrumbs_fake_irq(struct timer_list *t) · 122 unmodified lines
123123 */
124124
125125 spin_lock_irq(&b->irq_lock);
126− if (!__intel_breadcrumbs_wakeup(b))
126+ if (b->irq_armed && !__intel_breadcrumbs_wakeup(b))
127127 __intel_engine_disarm_breadcrumbs(engine);
128128 spin_unlock_irq(&b->irq_lock);
129129 if (!b->irq_armed)
@@ -145,6 +145,14 @@ static void intel_breadcrumbs_fake_irq(struct timer_list *t) · 15 unmodified lines
145145
146146 static void irq_enable(struct intel_engine_cs *engine)
147147 {
148+ /*
149+ * FIXME: Ideally we want this on the API boundary, but for the
150+ * sake of testing with mock breadcrumbs (no HW so unable to
151+ * enable irqs) we place it deep within the bowels, at the point
152+ * of no return.
153+ */
154+ GEM_BUG_ON(!intel_irqs_enabled(engine->i915));
155+
148156 /* Enabling the IRQ may miss the generation of the interrupt, but
149157 * we still need to force the barrier before reading the seqno,
150158 * just in case.
@@ -171,15 +179,37 @@ void __intel_engine_disarm_breadcrumbs(struct intel_engine_cs *engine) · 20 unmodified lines
171179
172180 lockdep_assert_held(&b->irq_lock);
173181 GEM_BUG_ON(b->irq_wait);
182+ GEM_BUG_ON(!b->irq_armed);
174183
175− if (b->irq_enabled) {
184+ GEM_BUG_ON(!b->irq_enabled);
185+ if (!--b->irq_enabled)
176186 irq_disable(engine);
177− b->irq_enabled = false;
178− }
179187
180188 b->irq_armed = false;
181189 }
182190
191+void intel_engine_pin_breadcrumbs_irq(struct intel_engine_cs *engine)
192+{
193+ struct intel_breadcrumbs *b = &engine->breadcrumbs;
194+
195+ spin_lock_irq(&b->irq_lock);
196+ if (!b->irq_enabled++)
197+ irq_enable(engine);
198+ GEM_BUG_ON(!b->irq_enabled); /* no overflow! */
199+ spin_unlock_irq(&b->irq_lock);
200+}
201+
202+void intel_engine_unpin_breadcrumbs_irq(struct intel_engine_cs *engine)
203+{
204+ struct intel_breadcrumbs *b = &engine->breadcrumbs;
205+
206+ spin_lock_irq(&b->irq_lock);
207+ GEM_BUG_ON(!b->irq_enabled); /* no underflow! */
208+ if (!--b->irq_enabled)
209+ irq_disable(engine);
210+ spin_unlock_irq(&b->irq_lock);
211+}
212+
183213 void intel_engine_disarm_breadcrumbs(struct intel_engine_cs *engine)
184214 {
185215 struct intel_breadcrumbs *b = &engine->breadcrumbs;
@@ -197,7 +227,8 @@ void intel_engine_disarm_breadcrumbs(struct intel_engine_cs *engine) · 11 unmodified lines
197227
198228 spin_lock(&b->irq_lock);
199229 first = fetch_and_zero(&b->irq_wait);
200− __intel_engine_disarm_breadcrumbs(engine);
230+ if (b->irq_armed)
231+ __intel_engine_disarm_breadcrumbs(engine);
201232 spin_unlock(&b->irq_lock);
202233
203234 rbtree_postorder_for_each_entry_safe(wait, n, &b->waiters, node) {
@@ -241,6 +272,7 @@ static bool __intel_breadcrumbs_enable_irq(struct intel_breadcrumbs *b) · 37 unmodified lines
241272 struct intel_engine_cs *engine =
242273 container_of(b, struct intel_engine_cs, breadcrumbs);
243274 struct drm_i915_private *i915 = engine->i915;
275+ bool enabled;
244276
245277 lockdep_assert_held(&b->irq_lock);
246278 if (b->irq_armed)
@@ -252,7 +284,6 @@ static bool __intel_breadcrumbs_enable_irq(struct intel_breadcrumbs *b) · 5 unmodified lines
252284 * the irq.
253285 */
254286 b->irq_armed = true;
255− GEM_BUG_ON(b->irq_enabled);
256287
257288 if (I915_SELFTEST_ONLY(b->mock)) {
258289 /* For our mock objects we want to avoid interaction
@@ -273,14 +304,15 @@ static bool __intel_breadcrumbs_enable_irq(struct intel_breadcrumbs *b) · 14 unmodified lines
273304 */
274305
275306 /* No interrupts? Kick the waiter every jiffie! */
276− if (intel_irqs_enabled(i915)) {
277− if (!test_bit(engine->id, &i915->gpu_error.test_irq_rings))
278− irq_enable(engine);
279− b->irq_enabled = true;
307+ enabled = false;
308+ if (!b->irq_enabled++ &&
309+ !test_bit(engine->id, &i915->gpu_error.test_irq_rings)) {
310+ irq_enable(engine);
311+ enabled = true;
280312 }
281313
282314 enable_fake_irq(b);
283− return true;
315+ return enabled;
284316 }
285317
286318 static inline struct intel_wait *to_wait(struct rb_node *node)
drivers/gpu/drm/i915/intel_cdclk.c+285−106
@@ -437,13 +437,45 @@ static int vlv_calc_cdclk(struct drm_i915_private *dev_priv, int min_cdclk) · 436 unmodified lines
437437 return 200000;
438438 }
439439
440+static u8 vlv_calc_voltage_level(struct drm_i915_private *dev_priv, int cdclk)
441+{
442+ if (IS_VALLEYVIEW(dev_priv)) {
443+ if (cdclk >= 320000) /* jump to highest voltage for 400MHz too */
444+ return 2;
445+ else if (cdclk >= 266667)
446+ return 1;
447+ else
448+ return 0;
449+ } else {
450+ /*
451+ * Specs are full of misinformation, but testing on actual
452+ * hardware has shown that we just need to write the desired
453+ * CCK divider into the Punit register.
454+ */
455+ return DIV_ROUND_CLOSEST(dev_priv->hpll_freq << 1, cdclk) - 1;
456+ }
457+}
458+
440459 static void vlv_get_cdclk(struct drm_i915_private *dev_priv,
441460 struct intel_cdclk_state *cdclk_state)
442461 {
462+ u32 val;
463+
443464 cdclk_state->vco = vlv_get_hpll_vco(dev_priv);
444465 cdclk_state->cdclk = vlv_get_cck_clock(dev_priv, "cdclk",
445466 CCK_DISPLAY_CLOCK_CONTROL,
446467 cdclk_state->vco);
468+
469+ mutex_lock(&dev_priv->pcu_lock);
470+ val = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ);
471+ mutex_unlock(&dev_priv->pcu_lock);
472+
473+ if (IS_VALLEYVIEW(dev_priv))
474+ cdclk_state->voltage_level = (val & DSPFREQGUAR_MASK) >>
475+ DSPFREQGUAR_SHIFT;
476+ else
477+ cdclk_state->voltage_level = (val & DSPFREQGUAR_MASK_CHV) >>
478+ DSPFREQGUAR_SHIFT_CHV;
447479 }
448480
449481 static void vlv_program_pfi_credits(struct drm_i915_private *dev_priv)
@@ -486,7 +518,19 @@ static void vlv_set_cdclk(struct drm_i915_private *dev_priv, · 36 unmodified lines
486518 const struct intel_cdclk_state *cdclk_state)
487519 {
488520 int cdclk = cdclk_state->cdclk;
489− u32 val, cmd;
521+ u32 val, cmd = cdclk_state->voltage_level;
522+
523+ switch (cdclk) {
524+ case 400000:
525+ case 333333:
526+ case 320000:
527+ case 266667:
528+ case 200000:
529+ break;
530+ default:
531+ MISSING_CASE(cdclk);
532+ return;
533+ }
490534
491535 /* There are cases where we can end up here with power domains
492536 * off and a CDCLK frequency other than the minimum, like when
@@ -496,13 +540,6 @@ static void vlv_set_cdclk(struct drm_i915_private *dev_priv, · 3 unmodified lines
496540 */
497541 intel_display_power_get(dev_priv, POWER_DOMAIN_PIPE_A);
498542
499− if (cdclk >= 320000) /* jump to highest voltage for 400MHz too */
500− cmd = 2;
501− else if (cdclk == 266667)
502− cmd = 1;
503− else
504− cmd = 0;
505−
506543 mutex_lock(&dev_priv->pcu_lock);
507544 val = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ);
508545 val &= ~DSPFREQGUAR_MASK;
@@ -562,7 +599,7 @@ static void chv_set_cdclk(struct drm_i915_private *dev_priv, · 53 unmodified lines
562599 const struct intel_cdclk_state *cdclk_state)
563600 {
564601 int cdclk = cdclk_state->cdclk;
565− u32 val, cmd;
602+ u32 val, cmd = cdclk_state->voltage_level;
566603
567604 switch (cdclk) {
568605 case 333333:
@@ -583,13 +620,6 @@ static void chv_set_cdclk(struct drm_i915_private *dev_priv, · 14 unmodified lines
583620 */
584621 intel_display_power_get(dev_priv, POWER_DOMAIN_PIPE_A);
585622
586− /*
587− * Specs are full of misinformation, but testing on actual
588− * hardware has shown that we just need to write the desired
589− * CCK divider into the Punit register.
590− */
591− cmd = DIV_ROUND_CLOSEST(dev_priv->hpll_freq << 1, cdclk) - 1;
592−
593623 mutex_lock(&dev_priv->pcu_lock);
594624 val = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ);
595625 val &= ~DSPFREQGUAR_MASK_CHV;
@@ -621,6 +651,21 @@ static int bdw_calc_cdclk(int min_cdclk) · 25 unmodified lines
621651 return 337500;
622652 }
623653
654+static u8 bdw_calc_voltage_level(int cdclk)
655+{
656+ switch (cdclk) {
657+ default:
658+ case 337500:
659+ return 2;
660+ case 450000:
661+ return 0;
662+ case 540000:
663+ return 1;
664+ case 675000:
665+ return 3;
666+ }
667+}
668+
624669 static void bdw_get_cdclk(struct drm_i915_private *dev_priv,
625670 struct intel_cdclk_state *cdclk_state)
626671 {
@@ -639,13 +684,20 @@ static void bdw_get_cdclk(struct drm_i915_private *dev_priv, · 12 unmodified lines
639684 cdclk_state->cdclk = 337500;
640685 else
641686 cdclk_state->cdclk = 675000;
687+
688+ /*
689+ * Can't read this out :( Let's assume it's
690+ * at least what the CDCLK frequency requires.
691+ */
692+ cdclk_state->voltage_level =
693+ bdw_calc_voltage_level(cdclk_state->cdclk);
642694 }
643695
644696 static void bdw_set_cdclk(struct drm_i915_private *dev_priv,
645697 const struct intel_cdclk_state *cdclk_state)
646698 {
647699 int cdclk = cdclk_state->cdclk;
648− uint32_t val, data;
700+ uint32_t val;
649701 int ret;
650702
651703 if (WARN((I915_READ(LCPLL_CTL) &
@@ -681,25 +733,21 @@ static void bdw_set_cdclk(struct drm_i915_private *dev_priv, · 29 unmodified lines
681733 val &= ~LCPLL_CLK_FREQ_MASK;
682734
683735 switch (cdclk) {
736+ default:
737+ MISSING_CASE(cdclk);
738+ /* fall through */
739+ case 337500:
740+ val |= LCPLL_CLK_FREQ_337_5_BDW;
741+ break;
684742 case 450000:
685743 val |= LCPLL_CLK_FREQ_450;
686− data = 0;
687744 break;
688745 case 540000:
689746 val |= LCPLL_CLK_FREQ_54O_BDW;
690− data = 1;
691− break;
692− case 337500:
693− val |= LCPLL_CLK_FREQ_337_5_BDW;
694− data = 2;
695747 break;
696748 case 675000:
697749 val |= LCPLL_CLK_FREQ_675_BDW;
698− data = 3;
699750 break;
700− default:
701− WARN(1, "invalid cdclk frequency\n");
702− return;
703751 }
704752
705753 I915_WRITE(LCPLL_CTL, val);
@@ -713,16 +761,13 @@ static void bdw_set_cdclk(struct drm_i915_private *dev_priv, · 7 unmodified lines
713761 DRM_ERROR("Switching back to LCPLL failed\n");
714762
715763 mutex_lock(&dev_priv->pcu_lock);
716− sandybridge_pcode_write(dev_priv, HSW_PCODE_DE_WRITE_FREQ_REQ, data);
764+ sandybridge_pcode_write(dev_priv, HSW_PCODE_DE_WRITE_FREQ_REQ,
765+ cdclk_state->voltage_level);
717766 mutex_unlock(&dev_priv->pcu_lock);
718767
719768 I915_WRITE(CDCLK_FREQ, DIV_ROUND_CLOSEST(cdclk, 1000) - 1);
720769
721770 intel_update_cdclk(dev_priv);
722−
723− WARN(cdclk != dev_priv->cdclk.hw.cdclk,
724− "cdclk requested %d kHz but got %d kHz\n",
725− cdclk, dev_priv->cdclk.hw.cdclk);
726771 }
727772
728773 static int skl_calc_cdclk(int min_cdclk, int vco)
@@ -748,6 +793,24 @@ static int skl_calc_cdclk(int min_cdclk, int vco) · 19 unmodified lines
748793 }
749794 }
750795
796+static u8 skl_calc_voltage_level(int cdclk)
797+{
798+ switch (cdclk) {
799+ default:
800+ case 308571:
801+ case 337500:
802+ return 0;
803+ case 450000:
804+ case 432000:
805+ return 1;
806+ case 540000:
807+ return 2;
808+ case 617143:
809+ case 675000:
810+ return 3;
811+ }
812+}
813+
751814 static void skl_dpll0_update(struct drm_i915_private *dev_priv,
752815 struct intel_cdclk_state *cdclk_state)
753816 {
@@ -798,7 +861,7 @@ static void skl_get_cdclk(struct drm_i915_private *dev_priv, · 44 unmodified lines
798861 cdclk_state->cdclk = cdclk_state->ref;
799862
800863 if (cdclk_state->vco == 0)
801− return;
864+ goto out;
802865
803866 cdctl = I915_READ(CDCLK_CTL);
804867
@@ -839,6 +902,14 @@ static void skl_get_cdclk(struct drm_i915_private *dev_priv, · 34 unmodified lines
839902 break;
840903 }
841904 }
905+
906+ out:
907+ /*
908+ * Can't read this out :( Let's assume it's
909+ * at least what the CDCLK frequency requires.
910+ */
911+ cdclk_state->voltage_level =
912+ skl_calc_voltage_level(cdclk_state->cdclk);
842913 }
843914
844915 /* convert from kHz to .1 fixpoint MHz with -1MHz offset */
@@ -923,11 +994,9 @@ static void skl_set_cdclk(struct drm_i915_private *dev_priv, · 78 unmodified lines
923994 {
924995 int cdclk = cdclk_state->cdclk;
925996 int vco = cdclk_state->vco;
926− u32 freq_select, pcu_ack;
997+ u32 freq_select;
927998 int ret;
928999
929− WARN_ON((cdclk == 24000) != (vco == 0));
930−
9311000 mutex_lock(&dev_priv->pcu_lock);
9321001 ret = skl_pcode_request(dev_priv, SKL_PCODE_CDCLK_CONTROL,
9331002 SKL_CDCLK_PREPARE_FOR_CHANGE,
@@ -942,25 +1011,24 @@ static void skl_set_cdclk(struct drm_i915_private *dev_priv, · 8 unmodified lines
9421011
9431012 /* set CDCLK_CTL */
9441013 switch (cdclk) {
1014+ default:
1015+ WARN_ON(cdclk != dev_priv->cdclk.hw.ref);
1016+ WARN_ON(vco != 0);
1017+ /* fall through */
1018+ case 308571:
1019+ case 337500:
1020+ freq_select = CDCLK_FREQ_337_308;
1021+ break;
9451022 case 450000:
9461023 case 432000:
9471024 freq_select = CDCLK_FREQ_450_432;
948− pcu_ack = 1;
9491025 break;
9501026 case 540000:
9511027 freq_select = CDCLK_FREQ_540;
952− pcu_ack = 2;
953− break;
954− case 308571:
955− case 337500:
956− default:
957− freq_select = CDCLK_FREQ_337_308;
958− pcu_ack = 0;
9591028 break;
9601029 case 617143:
9611030 case 675000:
9621031 freq_select = CDCLK_FREQ_675_617;
963− pcu_ack = 3;
9641032 break;
9651033 }
9661034
@@ -976,7 +1044,8 @@ static void skl_set_cdclk(struct drm_i915_private *dev_priv, · 9 unmodified lines
9761044
9771045 /* inform PCU of the change */
9781046 mutex_lock(&dev_priv->pcu_lock);
979− sandybridge_pcode_write(dev_priv, SKL_PCODE_CDCLK_CONTROL, pcu_ack);
1047+ sandybridge_pcode_write(dev_priv, SKL_PCODE_CDCLK_CONTROL,
1048+ cdclk_state->voltage_level);
9801049 mutex_unlock(&dev_priv->pcu_lock);
9811050
9821051 intel_update_cdclk(dev_priv);
@@ -995,6 +1064,8 @@ static void skl_sanitize_cdclk(struct drm_i915_private *dev_priv) · 12 unmodified lines
9951064 goto sanitize;
9961065
9971066 intel_update_cdclk(dev_priv);
1067+ intel_dump_cdclk_state(&dev_priv->cdclk.hw, "Current CDCLK");
1068+
9981069 /* Is PLL enabled and locked ? */
9991070 if (dev_priv->cdclk.hw.vco == 0 ||
10001071 dev_priv->cdclk.hw.cdclk == dev_priv->cdclk.hw.ref)
@@ -1055,6 +1126,7 @@ void skl_init_cdclk(struct drm_i915_private *dev_priv) · 54 unmodified lines
10551126 if (cdclk_state.vco == 0)
10561127 cdclk_state.vco = 8100000;
10571128 cdclk_state.cdclk = skl_calc_cdclk(0, cdclk_state.vco);
1129+ cdclk_state.voltage_level = skl_calc_voltage_level(cdclk_state.cdclk);
10581130
10591131 skl_set_cdclk(dev_priv, &cdclk_state);
10601132 }
@@ -1072,6 +1144,7 @@ void skl_uninit_cdclk(struct drm_i915_private *dev_priv) · 11 unmodified lines
10721144
10731145 cdclk_state.cdclk = cdclk_state.ref;
10741146 cdclk_state.vco = 0;
1147+ cdclk_state.voltage_level = skl_calc_voltage_level(cdclk_state.cdclk);
10751148
10761149 skl_set_cdclk(dev_priv, &cdclk_state);
10771150 }
@@ -1100,6 +1173,11 @@ static int glk_calc_cdclk(int min_cdclk) · 22 unmodified lines
11001173 return 79200;
11011174 }
11021175
1176+static u8 bxt_calc_voltage_level(int cdclk)
1177+{
1178+ return DIV_ROUND_UP(cdclk, 25000);
1179+}
1180+
11031181 static int bxt_de_pll_vco(struct drm_i915_private *dev_priv, int cdclk)
11041182 {
11051183 int ratio;
@@ -1110,6 +1188,7 @@ static int bxt_de_pll_vco(struct drm_i915_private *dev_priv, int cdclk) · 4 unmodified lines
11101188 switch (cdclk) {
11111189 default:
11121190 MISSING_CASE(cdclk);
1191+ /* fall through */
11131192 case 144000:
11141193 case 288000:
11151194 case 384000:
@@ -1134,6 +1213,7 @@ static int glk_de_pll_vco(struct drm_i915_private *dev_priv, int cdclk) · 18 unmodified lines
11341213 switch (cdclk) {
11351214 default:
11361215 MISSING_CASE(cdclk);
1216+ /* fall through */
11371217 case 79200:
11381218 case 158400:
11391219 case 316800:
@@ -1174,7 +1254,7 @@ static void bxt_get_cdclk(struct drm_i915_private *dev_priv, · 34 unmodified lines
11741254 cdclk_state->cdclk = cdclk_state->ref;
11751255
11761256 if (cdclk_state->vco == 0)
1177− return;
1257+ goto out;
11781258
11791259 divider = I915_READ(CDCLK_CTL) & BXT_CDCLK_CD2X_DIV_SEL_MASK;
11801260
@@ -1198,6 +1278,14 @@ static void bxt_get_cdclk(struct drm_i915_private *dev_priv, · 17 unmodified lines
11981278 }
11991279
12001280 cdclk_state->cdclk = DIV_ROUND_CLOSEST(cdclk_state->vco, div);
1281+
1282+ out:
1283+ /*
1284+ * Can't read this out :( Let's assume it's
1285+ * at least what the CDCLK frequency requires.
1286+ */
1287+ cdclk_state->voltage_level =
1288+ bxt_calc_voltage_level(cdclk_state->cdclk);
12011289 }
12021290
12031291 static void bxt_de_pll_disable(struct drm_i915_private *dev_priv)
@@ -1246,24 +1334,22 @@ static void bxt_set_cdclk(struct drm_i915_private *dev_priv, · 42 unmodified lines
12461334
12471335 /* cdclk = vco / 2 / div{1,1.5,2,4} */
12481336 switch (DIV_ROUND_CLOSEST(vco, cdclk)) {
1249− case 8:
1250− divider = BXT_CDCLK_CD2X_DIV_SEL_4;
1251− break;
1252− case 4:
1253− divider = BXT_CDCLK_CD2X_DIV_SEL_2;
1337+ default:
1338+ WARN_ON(cdclk != dev_priv->cdclk.hw.ref);
1339+ WARN_ON(vco != 0);
1340+ /* fall through */
1341+ case 2:
1342+ divider = BXT_CDCLK_CD2X_DIV_SEL_1;
12541343 break;
12551344 case 3:
12561345 WARN(IS_GEMINILAKE(dev_priv), "Unsupported divider\n");
12571346 divider = BXT_CDCLK_CD2X_DIV_SEL_1_5;
12581347 break;
1259− case 2:
1260− divider = BXT_CDCLK_CD2X_DIV_SEL_1;
1348+ case 4:
1349+ divider = BXT_CDCLK_CD2X_DIV_SEL_2;
12611350 break;
1262− default:
1263− WARN_ON(cdclk != dev_priv->cdclk.hw.ref);
1264− WARN_ON(vco != 0);
1265−
1266− divider = BXT_CDCLK_CD2X_DIV_SEL_1;
1351+ case 8:
1352+ divider = BXT_CDCLK_CD2X_DIV_SEL_4;
12671353 break;
12681354 }
12691355
@@ -1302,7 +1388,7 @@ static void bxt_set_cdclk(struct drm_i915_private *dev_priv, · 32 unmodified lines
13021388
13031389 mutex_lock(&dev_priv->pcu_lock);
13041390 ret = sandybridge_pcode_write(dev_priv, HSW_PCODE_DE_WRITE_FREQ_REQ,
1305− DIV_ROUND_UP(cdclk, 25000));
1391+ cdclk_state->voltage_level);
13061392 mutex_unlock(&dev_priv->pcu_lock);
13071393
13081394 if (ret) {
@@ -1319,6 +1405,7 @@ static void bxt_sanitize_cdclk(struct drm_i915_private *dev_priv) · 10 unmodified lines
13191405 u32 cdctl, expected;
13201406
13211407 intel_update_cdclk(dev_priv);
1408+ intel_dump_cdclk_state(&dev_priv->cdclk.hw, "Current CDCLK");
13221409
13231410 if (dev_priv->cdclk.hw.vco == 0 ||
13241411 dev_priv->cdclk.hw.cdclk == dev_priv->cdclk.hw.ref)
@@ -1394,6 +1481,7 @@ void bxt_init_cdclk(struct drm_i915_private *dev_priv) · 69 unmodified lines
13941481 cdclk_state.cdclk = bxt_calc_cdclk(0);
13951482 cdclk_state.vco = bxt_de_pll_vco(dev_priv, cdclk_state.cdclk);
13961483 }
1484+ cdclk_state.voltage_level = bxt_calc_voltage_level(cdclk_state.cdclk);
13971485
13981486 bxt_set_cdclk(dev_priv, &cdclk_state);
13991487 }
@@ -1411,6 +1499,7 @@ void bxt_uninit_cdclk(struct drm_i915_private *dev_priv) · 11 unmodified lines
14111499
14121500 cdclk_state.cdclk = cdclk_state.ref;
14131501 cdclk_state.vco = 0;
1502+ cdclk_state.voltage_level = bxt_calc_voltage_level(cdclk_state.cdclk);
14141503
14151504 bxt_set_cdclk(dev_priv, &cdclk_state);
14161505 }
@@ -1425,6 +1514,19 @@ static int cnl_calc_cdclk(int min_cdclk) · 8 unmodified lines
14251514 return 168000;
14261515 }
14271516
1517+static u8 cnl_calc_voltage_level(int cdclk)
1518+{
1519+ switch (cdclk) {
1520+ default:
1521+ case 168000:
1522+ return 0;
1523+ case 336000:
1524+ return 1;
1525+ case 528000:
1526+ return 2;
1527+ }
1528+}
1529+
14281530 static void cnl_cdclk_pll_update(struct drm_i915_private *dev_priv,
14291531 struct intel_cdclk_state *cdclk_state)
14301532 {
@@ -1458,7 +1560,7 @@ static void cnl_get_cdclk(struct drm_i915_private *dev_priv, · 27 unmodified lines
14581560 cdclk_state->cdclk = cdclk_state->ref;
14591561
14601562 if (cdclk_state->vco == 0)
1461− return;
1563+ goto out;
14621564
14631565 divider = I915_READ(CDCLK_CTL) & BXT_CDCLK_CD2X_DIV_SEL_MASK;
14641566
@@ -1475,6 +1577,14 @@ static void cnl_get_cdclk(struct drm_i915_private *dev_priv, · 10 unmodified lines
14751577 }
14761578
14771579 cdclk_state->cdclk = DIV_ROUND_CLOSEST(cdclk_state->vco, div);
1580+
1581+ out:
1582+ /*
1583+ * Can't read this out :( Let's assume it's
1584+ * at least what the CDCLK frequency requires.
1585+ */
1586+ cdclk_state->voltage_level =
1587+ cnl_calc_voltage_level(cdclk_state->cdclk);
14781588 }
14791589
14801590 static void cnl_cdclk_pll_disable(struct drm_i915_private *dev_priv)
@@ -1515,7 +1625,7 @@ static void cnl_set_cdclk(struct drm_i915_private *dev_priv, · 34 unmodified lines
15151625 {
15161626 int cdclk = cdclk_state->cdclk;
15171627 int vco = cdclk_state->vco;
1518− u32 val, divider, pcu_ack;
1628+ u32 val, divider;
15191629 int ret;
15201630
15211631 mutex_lock(&dev_priv->pcu_lock);
@@ -1532,30 +1642,15 @@ static void cnl_set_cdclk(struct drm_i915_private *dev_priv, · 10 unmodified lines
15321642
15331643 /* cdclk = vco / 2 / div{1,2} */
15341644 switch (DIV_ROUND_CLOSEST(vco, cdclk)) {
1535− case 4:
1536− divider = BXT_CDCLK_CD2X_DIV_SEL_2;
1537− break;
1538− case 2:
1539− divider = BXT_CDCLK_CD2X_DIV_SEL_1;
1540− break;
15411645 default:
15421646 WARN_ON(cdclk != dev_priv->cdclk.hw.ref);
15431647 WARN_ON(vco != 0);
1544−
1648+ /* fall through */
1649+ case 2:
15451650 divider = BXT_CDCLK_CD2X_DIV_SEL_1;
15461651 break;
1547− }
1548−
1549− switch (cdclk) {
1550− case 528000:
1551− pcu_ack = 2;
1552− break;
1553− case 336000:
1554− pcu_ack = 1;
1555− break;
1556− case 168000:
1557− default:
1558− pcu_ack = 0;
1652+ case 4:
1653+ divider = BXT_CDCLK_CD2X_DIV_SEL_2;
15591654 break;
15601655 }
15611656
@@ -1576,10 +1671,17 @@ static void cnl_set_cdclk(struct drm_i915_private *dev_priv, · 14 unmodified lines
15761671
15771672 /* inform PCU of the change */
15781673 mutex_lock(&dev_priv->pcu_lock);
1579− sandybridge_pcode_write(dev_priv, SKL_PCODE_CDCLK_CONTROL, pcu_ack);
1674+ sandybridge_pcode_write(dev_priv, SKL_PCODE_CDCLK_CONTROL,
1675+ cdclk_state->voltage_level);
15801676 mutex_unlock(&dev_priv->pcu_lock);
15811677
15821678 intel_update_cdclk(dev_priv);
1679+
1680+ /*
1681+ * Can't read out the voltage level :(
1682+ * Let's just assume everything is as expected.
1683+ */
1684+ dev_priv->cdclk.hw.voltage_level = cdclk_state->voltage_level;
15831685 }
15841686
15851687 static int cnl_cdclk_pll_vco(struct drm_i915_private *dev_priv, int cdclk)
@@ -1592,6 +1694,7 @@ static int cnl_cdclk_pll_vco(struct drm_i915_private *dev_priv, int cdclk) · 6 unmodified lines
15921694 switch (cdclk) {
15931695 default:
15941696 MISSING_CASE(cdclk);
1697+ /* fall through */
15951698 case 168000:
15961699 case 336000:
15971700 ratio = dev_priv->cdclk.hw.ref == 19200 ? 35 : 28;
@@ -1609,6 +1712,7 @@ static void cnl_sanitize_cdclk(struct drm_i915_private *dev_priv) · 11 unmodified lines
16091712 u32 cdctl, expected;
16101713
16111714 intel_update_cdclk(dev_priv);
1715+ intel_dump_cdclk_state(&dev_priv->cdclk.hw, "Current CDCLK");
16121716
16131717 if (dev_priv->cdclk.hw.vco == 0 ||
16141718 dev_priv->cdclk.hw.cdclk == dev_priv->cdclk.hw.ref)
@@ -1668,6 +1772,7 @@ void cnl_init_cdclk(struct drm_i915_private *dev_priv) · 53 unmodified lines
16681772
16691773 cdclk_state.cdclk = cnl_calc_cdclk(0);
16701774 cdclk_state.vco = cnl_cdclk_pll_vco(dev_priv, cdclk_state.cdclk);
1775+ cdclk_state.voltage_level = cnl_calc_voltage_level(cdclk_state.cdclk);
16711776
16721777 cnl_set_cdclk(dev_priv, &cdclk_state);
16731778 }
@@ -1685,22 +1790,48 @@ void cnl_uninit_cdclk(struct drm_i915_private *dev_priv) · 11 unmodified lines
16851790
16861791 cdclk_state.cdclk = cdclk_state.ref;
16871792 cdclk_state.vco = 0;
1793+ cdclk_state.voltage_level = cnl_calc_voltage_level(cdclk_state.cdclk);
16881794
16891795 cnl_set_cdclk(dev_priv, &cdclk_state);
16901796 }
16911797
16921798 /**
1693− * intel_cdclk_state_compare - Determine if two CDCLK states differ
1799+ * intel_cdclk_needs_modeset - Determine if two CDCLK states require a modeset on all pipes
16941800 * @a: first CDCLK state
16951801 * @b: second CDCLK state
16961802 *
16971803 * Returns:
1698− * True if the CDCLK states are identical, false if they differ.
1804+ * True if the CDCLK states require pipes to be off during reprogramming, false if not.
16991805 */
1700−bool intel_cdclk_state_compare(const struct intel_cdclk_state *a,
1806+bool intel_cdclk_needs_modeset(const struct intel_cdclk_state *a,
17011807 const struct intel_cdclk_state *b)
17021808 {
1703− return memcmp(a, b, sizeof(*a)) == 0;
1809+ return a->cdclk != b->cdclk ||
1810+ a->vco != b->vco ||
1811+ a->ref != b->ref;
1812+}
1813+
1814+/**
1815+ * intel_cdclk_changed - Determine if two CDCLK states are different
1816+ * @a: first CDCLK state
1817+ * @b: second CDCLK state
1818+ *
1819+ * Returns:
1820+ * True if the CDCLK states don't match, false if they do.
1821+ */
1822+bool intel_cdclk_changed(const struct intel_cdclk_state *a,
1823+ const struct intel_cdclk_state *b)
1824+{
1825+ return intel_cdclk_needs_modeset(a, b) ||
1826+ a->voltage_level != b->voltage_level;
1827+}
1828+
1829+void intel_dump_cdclk_state(const struct intel_cdclk_state *cdclk_state,
1830+ const char *context)
1831+{
1832+ DRM_DEBUG_DRIVER("%s %d kHz, VCO %d kHz, ref %d kHz, voltage level %d\n",
1833+ context, cdclk_state->cdclk, cdclk_state->vco,
1834+ cdclk_state->ref, cdclk_state->voltage_level);
17041835 }
17051836
17061837 /**
@@ -1714,29 +1845,28 @@ bool intel_cdclk_state_compare(const struct intel_cdclk_state *a, · 7 unmodified lines
17141845 void intel_set_cdclk(struct drm_i915_private *dev_priv,
17151846 const struct intel_cdclk_state *cdclk_state)
17161847 {
1717− if (intel_cdclk_state_compare(&dev_priv->cdclk.hw, cdclk_state))
1848+ if (!intel_cdclk_changed(&dev_priv->cdclk.hw, cdclk_state))
17181849 return;
17191850
17201851 if (WARN_ON_ONCE(!dev_priv->display.set_cdclk))
17211852 return;
17221853
1723− DRM_DEBUG_DRIVER("Changing CDCLK to %d kHz, VCO %d kHz, ref %d kHz\n",
1724− cdclk_state->cdclk, cdclk_state->vco,
1725− cdclk_state->ref);
1854+ intel_dump_cdclk_state(cdclk_state, "Changing CDCLK to");
17261855
17271856 dev_priv->display.set_cdclk(dev_priv, cdclk_state);
1857+
1858+ if (WARN(intel_cdclk_changed(&dev_priv->cdclk.hw, cdclk_state),
1859+ "cdclk state doesn't match!\n")) {
1860+ intel_dump_cdclk_state(&dev_priv->cdclk.hw, "[hw state]");
1861+ intel_dump_cdclk_state(cdclk_state, "[sw state]");
1862+ }
17281863 }
17291864
17301865 static int intel_pixel_rate_to_cdclk(struct drm_i915_private *dev_priv,
17311866 int pixel_rate)
17321867 {
17331868 if (INTEL_GEN(dev_priv) >= 10)
1734− /*
1735− * FIXME: Switch to DIV_ROUND_UP(pixel_rate, 2)
1736− * once DDI clock voltage requirements are
1737− * handled correctly.
1738− */
1739− return pixel_rate;
1869+ return DIV_ROUND_UP(pixel_rate, 2);
17401870 else if (IS_GEMINILAKE(dev_priv))
17411871 /*
17421872 * FIXME: Avoid using a pixel clock that is more than 99% of the cdclk
@@ -1829,6 +1959,43 @@ static int intel_compute_min_cdclk(struct drm_atomic_state *state) · 86 unmodified lines
18291959 return min_cdclk;
18301960 }
18311961
1962+/*
1963+ * Note that this functions assumes that 0 is
1964+ * the lowest voltage value, and higher values
1965+ * correspond to increasingly higher voltages.
1966+ *
1967+ * Should that relationship no longer hold on
1968+ * future platforms this code will need to be
1969+ * adjusted.
1970+ */
1971+static u8 cnl_compute_min_voltage_level(struct intel_atomic_state *state)
1972+{
1973+ struct drm_i915_private *dev_priv = to_i915(state->base.dev);
1974+ struct intel_crtc *crtc;
1975+ struct intel_crtc_state *crtc_state;
1976+ u8 min_voltage_level;
1977+ int i;
1978+ enum pipe pipe;
1979+
1980+ memcpy(state->min_voltage_level, dev_priv->min_voltage_level,
1981+ sizeof(state->min_voltage_level));
1982+
1983+ for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
1984+ if (crtc_state->base.enable)
1985+ state->min_voltage_level[i] =
1986+ crtc_state->min_voltage_level;
1987+ else
1988+ state->min_voltage_level[i] = 0;
1989+ }
1990+
1991+ min_voltage_level = 0;
1992+ for_each_pipe(dev_priv, pipe)
1993+ min_voltage_level = max(state->min_voltage_level[pipe],
1994+ min_voltage_level);
1995+
1996+ return min_voltage_level;
1997+}
1998+
18321999 static int vlv_modeset_calc_cdclk(struct drm_atomic_state *state)
18332000 {
18342001 struct drm_i915_private *dev_priv = to_i915(state->dev);
@@ -1842,11 +2009,15 @@ static int vlv_modeset_calc_cdclk(struct drm_atomic_state *state) · 7 unmodified lines
18422009 cdclk = vlv_calc_cdclk(dev_priv, min_cdclk);
18432010
18442011 intel_state->cdclk.logical.cdclk = cdclk;
2012+ intel_state->cdclk.logical.voltage_level =
2013+ vlv_calc_voltage_level(dev_priv, cdclk);
18452014
18462015 if (!intel_state->active_crtcs) {
18472016 cdclk = vlv_calc_cdclk(dev_priv, 0);
18482017
18492018 intel_state->cdclk.actual.cdclk = cdclk;
2019+ intel_state->cdclk.actual.voltage_level =
2020+ vlv_calc_voltage_level(dev_priv, cdclk);
18502021 } else {
18512022 intel_state->cdclk.actual =
18522023 intel_state->cdclk.logical;
@@ -1871,11 +2042,15 @@ static int bdw_modeset_calc_cdclk(struct drm_atomic_state *state) · 18 unmodified lines
18712042 cdclk = bdw_calc_cdclk(min_cdclk);
18722043
18732044 intel_state->cdclk.logical.cdclk = cdclk;
2045+ intel_state->cdclk.logical.voltage_level =
2046+ bdw_calc_voltage_level(cdclk);
18742047
18752048 if (!intel_state->active_crtcs) {
18762049 cdclk = bdw_calc_cdclk(0);
18772050
18782051 intel_state->cdclk.actual.cdclk = cdclk;
2052+ intel_state->cdclk.actual.voltage_level =
2053+ bdw_calc_voltage_level(cdclk);
18792054 } else {
18802055 intel_state->cdclk.actual =
18812056 intel_state->cdclk.logical;
@@ -1906,12 +2081,16 @@ static int skl_modeset_calc_cdclk(struct drm_atomic_state *state) · 24 unmodified lines
19062081
19072082 intel_state->cdclk.logical.vco = vco;
19082083 intel_state->cdclk.logical.cdclk = cdclk;
2084+ intel_state->cdclk.logical.voltage_level =
2085+ skl_calc_voltage_level(cdclk);
19092086
19102087 if (!intel_state->active_crtcs) {
19112088 cdclk = skl_calc_cdclk(0, vco);
19122089
19132090 intel_state->cdclk.actual.vco = vco;
19142091 intel_state->cdclk.actual.cdclk = cdclk;
2092+ intel_state->cdclk.actual.voltage_level =
2093+ skl_calc_voltage_level(cdclk);
19152094 } else {
19162095 intel_state->cdclk.actual =
19172096 intel_state->cdclk.logical;
@@ -1940,6 +2119,8 @@ static int bxt_modeset_calc_cdclk(struct drm_atomic_state *state) · 22 unmodified lines
19402119
19412120 intel_state->cdclk.logical.vco = vco;
19422121 intel_state->cdclk.logical.cdclk = cdclk;
2122+ intel_state->cdclk.logical.voltage_level =
2123+ bxt_calc_voltage_level(cdclk);
19432124
19442125 if (!intel_state->active_crtcs) {
19452126 if (IS_GEMINILAKE(dev_priv)) {
@@ -1952,6 +2133,8 @@ static int bxt_modeset_calc_cdclk(struct drm_atomic_state *state) · 6 unmodified lines
19522133
19532134 intel_state->cdclk.actual.vco = vco;
19542135 intel_state->cdclk.actual.cdclk = cdclk;
2136+ intel_state->cdclk.actual.voltage_level =
2137+ bxt_calc_voltage_level(cdclk);
19552138 } else {
19562139 intel_state->cdclk.actual =
19572140 intel_state->cdclk.logical;
@@ -1975,6 +2158,9 @@ static int cnl_modeset_calc_cdclk(struct drm_atomic_state *state) · 17 unmodified lines
19752158
19762159 intel_state->cdclk.logical.vco = vco;
19772160 intel_state->cdclk.logical.cdclk = cdclk;
2161+ intel_state->cdclk.logical.voltage_level =
2162+ max(cnl_calc_voltage_level(cdclk),
2163+ cnl_compute_min_voltage_level(intel_state));
19782164
19792165 if (!intel_state->active_crtcs) {
19802166 cdclk = cnl_calc_cdclk(0);
@@ -1982,6 +2168,8 @@ static int cnl_modeset_calc_cdclk(struct drm_atomic_state *state) · 1 unmodified line
19822168
19832169 intel_state->cdclk.actual.vco = vco;
19842170 intel_state->cdclk.actual.cdclk = cdclk;
2171+ intel_state->cdclk.actual.voltage_level =
2172+ cnl_calc_voltage_level(cdclk);
19852173 } else {
19862174 intel_state->cdclk.actual =
19872175 intel_state->cdclk.logical;
@@ -1995,12 +2183,7 @@ static int intel_compute_max_dotclk(struct drm_i915_private *dev_priv) · 7 unmodified lines
19952183 int max_cdclk_freq = dev_priv->max_cdclk_freq;
19962184
19972185 if (INTEL_GEN(dev_priv) >= 10)
1998− /*
1999− * FIXME: Allow '2 * max_cdclk_freq'
2000− * once DDI clock voltage requirements are
2001− * handled correctly.
2002− */
2003− return max_cdclk_freq;
2186+ return 2 * max_cdclk_freq;
20042187 else if (IS_GEMINILAKE(dev_priv))
20052188 /*
20062189 * FIXME: Limiting to 99% as a temporary workaround. See
@@ -2099,10 +2282,6 @@ void intel_update_cdclk(struct drm_i915_private *dev_priv) · 92 unmodified lines
20992282 {
21002283 dev_priv->display.get_cdclk(dev_priv, &dev_priv->cdclk.hw);
21012284
2102− DRM_DEBUG_DRIVER("Current CD clock rate: %d kHz, VCO: %d kHz, ref: %d kHz\n",
2103− dev_priv->cdclk.hw.cdclk, dev_priv->cdclk.hw.vco,
2104− dev_priv->cdclk.hw.ref);
2105−
21062285 /*
21072286 * 9:0 CMBUS [sic] CDCLK frequency (cdfreq):
21082287 * Programmng [sic] note: bit[9:2] should be programmed to the number
drivers/gpu/drm/i915/intel_color.c+2−2
@@ -370,7 +370,7 @@ static void haswell_load_luts(struct drm_crtc_state *crtc_state) · 369 unmodified lines
370370 */
371371 if (IS_HASWELL(dev_priv) && intel_crtc_state->ips_enabled &&
372372 (intel_crtc_state->gamma_mode == GAMMA_MODE_MODE_SPLIT)) {
373− hsw_disable_ips(intel_crtc);
373+ hsw_disable_ips(intel_crtc_state);
374374 reenable_ips = true;
375375 }
376376
@@ -380,7 +380,7 @@ static void haswell_load_luts(struct drm_crtc_state *crtc_state) · 3 unmodified lines
380380 i9xx_load_luts(crtc_state);
381381
382382 if (reenable_ips)
383− hsw_enable_ips(intel_crtc);
383+ hsw_enable_ips(intel_crtc_state);
384384 }
385385
386386 static void bdw_load_degamma_lut(struct drm_crtc_state *state)
drivers/gpu/drm/i915/intel_crt.c+21−25
@@ -119,6 +119,8 @@ static unsigned int intel_crt_get_flags(struct intel_encoder *encoder) · 118 unmodified lines
119119 static void intel_crt_get_config(struct intel_encoder *encoder,
120120 struct intel_crtc_state *pipe_config)
121121 {
122+ pipe_config->output_types |= BIT(INTEL_OUTPUT_ANALOG);
123+
122124 pipe_config->base.adjusted_mode.flags |= intel_crt_get_flags(encoder);
123125
124126 pipe_config->base.adjusted_mode.crtc_clock = pipe_config->port_clock;
@@ -217,11 +219,9 @@ static void hsw_disable_crt(struct intel_encoder *encoder, · 92 unmodified lines
217219 const struct intel_crtc_state *old_crtc_state,
218220 const struct drm_connector_state *old_conn_state)
219221 {
220− struct drm_crtc *crtc = old_crtc_state->base.crtc;
221− struct drm_i915_private *dev_priv = to_i915(crtc->dev);
222− struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
222+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
223223
224− WARN_ON(!intel_crtc->config->has_pch_encoder);
224+ WARN_ON(!old_crtc_state->has_pch_encoder);
225225
226226 intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, false);
227227 }
@@ -245,46 +245,42 @@ static void hsw_post_disable_crt(struct intel_encoder *encoder, · 17 unmodified lines
245245 }
246246
247247 static void hsw_pre_pll_enable_crt(struct intel_encoder *encoder,
248− const struct intel_crtc_state *pipe_config,
248+ const struct intel_crtc_state *crtc_state,
249249 const struct drm_connector_state *conn_state)
250250 {
251− struct drm_crtc *crtc = pipe_config->base.crtc;
252− struct drm_i915_private *dev_priv = to_i915(crtc->dev);
253− struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
251+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
254252
255− WARN_ON(!intel_crtc->config->has_pch_encoder);
253+ WARN_ON(!crtc_state->has_pch_encoder);
256254
257255 intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, false);
258256 }
259257
260258 static void hsw_pre_enable_crt(struct intel_encoder *encoder,
261− const struct intel_crtc_state *pipe_config,
259+ const struct intel_crtc_state *crtc_state,
262260 const struct drm_connector_state *conn_state)
263261 {
264− struct drm_crtc *crtc = pipe_config->base.crtc;
265− struct drm_i915_private *dev_priv = to_i915(crtc->dev);
266− struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
267− int pipe = intel_crtc->pipe;
262+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
263+ struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
264+ enum pipe pipe = crtc->pipe;
268265
269− WARN_ON(!intel_crtc->config->has_pch_encoder);
266+ WARN_ON(!crtc_state->has_pch_encoder);
270267
271268 intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, false);
272269
273− dev_priv->display.fdi_link_train(intel_crtc, pipe_config);
270+ dev_priv->display.fdi_link_train(crtc, crtc_state);
274271 }
275272
276273 static void hsw_enable_crt(struct intel_encoder *encoder,
277− const struct intel_crtc_state *pipe_config,
274+ const struct intel_crtc_state *crtc_state,
278275 const struct drm_connector_state *conn_state)
279276 {
280− struct drm_crtc *crtc = pipe_config->base.crtc;
281− struct drm_i915_private *dev_priv = to_i915(crtc->dev);
282− struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
283− int pipe = intel_crtc->pipe;
277+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
278+ struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
279+ enum pipe pipe = crtc->pipe;
284280
285− WARN_ON(!intel_crtc->config->has_pch_encoder);
281+ WARN_ON(!crtc_state->has_pch_encoder);
286282
287− intel_crt_set_dpms(encoder, pipe_config, DRM_MODE_DPMS_ON);
283+ intel_crt_set_dpms(encoder, crtc_state, DRM_MODE_DPMS_ON);
288284
289285 intel_wait_for_vblank(dev_priv, pipe);
290286 intel_wait_for_vblank(dev_priv, pipe);
@@ -293,10 +289,10 @@ static void hsw_enable_crt(struct intel_encoder *encoder, · 2 unmodified lines
293289 }
294290
295291 static void intel_enable_crt(struct intel_encoder *encoder,
296− const struct intel_crtc_state *pipe_config,
292+ const struct intel_crtc_state *crtc_state,
297293 const struct drm_connector_state *conn_state)
298294 {
299− intel_crt_set_dpms(encoder, pipe_config, DRM_MODE_DPMS_ON);
295+ intel_crt_set_dpms(encoder, crtc_state, DRM_MODE_DPMS_ON);
300296 }
301297
302298 static enum drm_mode_status
drivers/gpu/drm/i915/intel_csr.c+3−2
@@ -37,8 +37,8 @@ · 36 unmodified lines
3737 #define I915_CSR_GLK "i915/glk_dmc_ver1_04.bin"
3838 #define GLK_CSR_VERSION_REQUIRED CSR_VERSION(1, 4)
3939
40−#define I915_CSR_CNL "i915/cnl_dmc_ver1_04.bin"
41−#define CNL_CSR_VERSION_REQUIRED CSR_VERSION(1, 4)
40+#define I915_CSR_CNL "i915/cnl_dmc_ver1_06.bin"
41+#define CNL_CSR_VERSION_REQUIRED CSR_VERSION(1, 6)
4242
4343 #define I915_CSR_KBL "i915/kbl_dmc_ver1_01.bin"
4444 MODULE_FIRMWARE(I915_CSR_KBL);
@@ -198,6 +198,7 @@ intel_get_stepping_info(struct drm_i915_private *dev_priv) · 153 unmodified lines
198198 si = bxt_stepping_info;
199199 } else {
200200 size = 0;
201+ si = NULL;
201202 }
202203
203204 if (INTEL_REVID(dev_priv) < size)
drivers/gpu/drm/i915/intel_ddi.c+184−139
@@ -492,24 +492,6 @@ static const struct cnl_ddi_buf_trans cnl_ddi_translations_edp_1_05V[] = { · 491 unmodified lines
492492 { 0x2, 0x7F, 0x3F, 0x00, 0x00 }, /* 400 400 0.0 */
493493 };
494494
495−enum port intel_ddi_get_encoder_port(struct intel_encoder *encoder)
496−{
497− switch (encoder->type) {
498− case INTEL_OUTPUT_DP_MST:
499− return enc_to_mst(&encoder->base)->primary->port;
500− case INTEL_OUTPUT_DP:
501− case INTEL_OUTPUT_EDP:
502− case INTEL_OUTPUT_HDMI:
503− case INTEL_OUTPUT_UNKNOWN:
504− return enc_to_dig_port(&encoder->base)->port;
505− case INTEL_OUTPUT_ANALOG:
506− return PORT_E;
507− default:
508− MISSING_CASE(encoder->type);
509− return PORT_A;
510− }
511−}
512−
513495 static const struct ddi_buf_trans *
514496 bdw_get_buf_trans_edp(struct drm_i915_private *dev_priv, int *n_entries)
515497 {
@@ -811,31 +793,24 @@ static int intel_ddi_hdmi_level(struct drm_i915_private *dev_priv, enum port por · 295 unmodified lines
811793 * values in advance. This function programs the correct values for
812794 * DP/eDP/FDI use cases.
813795 */
814−static void intel_prepare_dp_ddi_buffers(struct intel_encoder *encoder)
796+static void intel_prepare_dp_ddi_buffers(struct intel_encoder *encoder,
797+ const struct intel_crtc_state *crtc_state)
815798 {
816799 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
817800 u32 iboost_bit = 0;
818801 int i, n_entries;
819− enum port port = intel_ddi_get_encoder_port(encoder);
802+ enum port port = encoder->port;
820803 const struct ddi_buf_trans *ddi_translations;
821804
822− switch (encoder->type) {
823− case INTEL_OUTPUT_EDP:
805+ if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_ANALOG))
806+ ddi_translations = intel_ddi_get_buf_trans_fdi(dev_priv,
807+ &n_entries);
808+ else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP))
824809 ddi_translations = intel_ddi_get_buf_trans_edp(dev_priv, port,
825810 &n_entries);
826− break;
827− case INTEL_OUTPUT_DP:
811+ else
828812 ddi_translations = intel_ddi_get_buf_trans_dp(dev_priv, port,
829813 &n_entries);
830− break;
831− case INTEL_OUTPUT_ANALOG:
832− ddi_translations = intel_ddi_get_buf_trans_fdi(dev_priv,
833− &n_entries);
834− break;
835− default:
836− MISSING_CASE(encoder->type);
837− return;
838− }
839814
840815 /* If we're boosting the current, set bit 31 of trans1 */
841816 if (IS_GEN9_BC(dev_priv) &&
@@ -861,7 +836,7 @@ static void intel_prepare_hdmi_ddi_buffers(struct intel_encoder *encoder, · 19 unmodified lines
861836 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
862837 u32 iboost_bit = 0;
863838 int n_entries;
864− enum port port = intel_ddi_get_encoder_port(encoder);
839+ enum port port = encoder->port;
865840 const struct ddi_buf_trans *ddi_translations;
866841
867842 ddi_translations = intel_ddi_get_buf_trans_hdmi(dev_priv, &n_entries);
@@ -937,7 +912,7 @@ void hsw_fdi_link_train(struct intel_crtc *crtc, · 69 unmodified lines
937912
938913 for_each_encoder_on_crtc(dev, &crtc->base, encoder) {
939914 WARN_ON(encoder->type != INTEL_OUTPUT_ANALOG);
940− intel_prepare_dp_ddi_buffers(encoder);
915+ intel_prepare_dp_ddi_buffers(encoder, crtc_state);
941916 }
942917
943918 /* Set the FDI_RX_MISC pwrdn lanes and the 2 workarounds listed at the
@@ -1448,19 +1423,16 @@ static void hsw_ddi_clock_get(struct intel_encoder *encoder, · 504 unmodified lines
14481423 ddi_dotclock_get(pipe_config);
14491424 }
14501425
1451−static int bxt_calc_pll_link(struct drm_i915_private *dev_priv,
1452− enum intel_dpll_id pll_id)
1426+static int bxt_calc_pll_link(struct intel_crtc_state *crtc_state)
14531427 {
1454− struct intel_shared_dpll *pll;
14551428 struct intel_dpll_hw_state *state;
14561429 struct dpll clock;
14571430
14581431 /* For DDI ports we always use a shared PLL. */
1459− if (WARN_ON(pll_id == DPLL_ID_PRIVATE))
1432+ if (WARN_ON(!crtc_state->shared_dpll))
14601433 return 0;
14611434
1462− pll = &dev_priv->shared_dplls[pll_id];
1463− state = &pll->state.hw_state;
1435+ state = &crtc_state->dpll_hw_state;
14641436
14651437 clock.m1 = 2;
14661438 clock.m2 = (state->pll0 & PORT_PLL_M2_MASK) << 22;
@@ -1474,19 +1446,15 @@ static int bxt_calc_pll_link(struct drm_i915_private *dev_priv, · 7 unmodified lines
14741446 }
14751447
14761448 static void bxt_ddi_clock_get(struct intel_encoder *encoder,
1477− struct intel_crtc_state *pipe_config)
1449+ struct intel_crtc_state *pipe_config)
14781450 {
1479− struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1480− enum port port = intel_ddi_get_encoder_port(encoder);
1481− enum intel_dpll_id pll_id = port;
1482−
1483− pipe_config->port_clock = bxt_calc_pll_link(dev_priv, pll_id);
1451+ pipe_config->port_clock = bxt_calc_pll_link(pipe_config);
14841452
14851453 ddi_dotclock_get(pipe_config);
14861454 }
14871455
1488−void intel_ddi_clock_get(struct intel_encoder *encoder,
1489− struct intel_crtc_state *pipe_config)
1456+static void intel_ddi_clock_get(struct intel_encoder *encoder,
1457+ struct intel_crtc_state *pipe_config)
14901458 {
14911459 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
14921460
@@ -1504,33 +1472,34 @@ void intel_ddi_set_pipe_settings(const struct intel_crtc_state *crtc_state) · 11 unmodified lines
15041472 {
15051473 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
15061474 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
1507− struct intel_encoder *encoder = intel_ddi_get_crtc_encoder(crtc);
15081475 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
1509− int type = encoder->type;
1510− uint32_t temp;
1476+ u32 temp;
15111477
1512− if (type == INTEL_OUTPUT_DP || type == INTEL_OUTPUT_EDP || type == INTEL_OUTPUT_DP_MST) {
1513− WARN_ON(transcoder_is_dsi(cpu_transcoder));
1478+ if (!intel_crtc_has_dp_encoder(crtc_state))
1479+ return;
15141480
1515− temp = TRANS_MSA_SYNC_CLK;
1516− switch (crtc_state->pipe_bpp) {
1517− case 18:
1518− temp |= TRANS_MSA_6_BPC;
1519− break;
1520− case 24:
1521− temp |= TRANS_MSA_8_BPC;
1522− break;
1523− case 30:
1524− temp |= TRANS_MSA_10_BPC;
1525− break;
1526− case 36:
1527− temp |= TRANS_MSA_12_BPC;
1528− break;
1529− default:
1530− BUG();
1531− }
1532− I915_WRITE(TRANS_MSA_MISC(cpu_transcoder), temp);
1481+ WARN_ON(transcoder_is_dsi(cpu_transcoder));
1482+
1483+ temp = TRANS_MSA_SYNC_CLK;
1484+ switch (crtc_state->pipe_bpp) {
1485+ case 18:
1486+ temp |= TRANS_MSA_6_BPC;
1487+ break;
1488+ case 24:
1489+ temp |= TRANS_MSA_8_BPC;
1490+ break;
1491+ case 30:
1492+ temp |= TRANS_MSA_10_BPC;
1493+ break;
1494+ case 36:
1495+ temp |= TRANS_MSA_12_BPC;
1496+ break;
1497+ default:
1498+ MISSING_CASE(crtc_state->pipe_bpp);
1499+ break;
15331500 }
1501+
1502+ I915_WRITE(TRANS_MSA_MISC(cpu_transcoder), temp);
15341503 }
15351504
15361505 void intel_ddi_set_vc_payload_alloc(const struct intel_crtc_state *crtc_state,
@@ -1540,6 +1509,7 @@ void intel_ddi_set_vc_payload_alloc(const struct intel_crtc_state *crtc_state, · 3 unmodified lines
15401509 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
15411510 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
15421511 uint32_t temp;
1512+
15431513 temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
15441514 if (state == true)
15451515 temp |= TRANS_DDI_DP_VC_PAYLOAD_ALLOC;
@@ -1555,8 +1525,7 @@ void intel_ddi_enable_transcoder_func(const struct intel_crtc_state *crtc_state) · 9 unmodified lines
15551525 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
15561526 enum pipe pipe = crtc->pipe;
15571527 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
1558− enum port port = intel_ddi_get_encoder_port(encoder);
1559− int type = encoder->type;
1528+ enum port port = encoder->port;
15601529 uint32_t temp;
15611530
15621531 /* Enable TRANS_DDI_FUNC_CTL for the pipe to work in HDMI mode */
@@ -1611,7 +1580,7 @@ void intel_ddi_enable_transcoder_func(const struct intel_crtc_state *crtc_state) · 48 unmodified lines
16111580 }
16121581 }
16131582
1614− if (type == INTEL_OUTPUT_HDMI) {
1583+ if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
16151584 if (crtc_state->has_hdmi_sink)
16161585 temp |= TRANS_DDI_MODE_SELECT_HDMI;
16171586 else
@@ -1621,19 +1590,15 @@ void intel_ddi_enable_transcoder_func(const struct intel_crtc_state *crtc_state) · 3 unmodified lines
16211590 temp |= TRANS_DDI_HDMI_SCRAMBLING_MASK;
16221591 if (crtc_state->hdmi_high_tmds_clock_ratio)
16231592 temp |= TRANS_DDI_HIGH_TMDS_CHAR_RATE;
1624− } else if (type == INTEL_OUTPUT_ANALOG) {
1593+ } else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_ANALOG)) {
16251594 temp |= TRANS_DDI_MODE_SELECT_FDI;
16261595 temp |= (crtc_state->fdi_lanes - 1) << 1;
1627− } else if (type == INTEL_OUTPUT_DP ||
1628− type == INTEL_OUTPUT_EDP) {
1629− temp |= TRANS_DDI_MODE_SELECT_DP_SST;
1630− temp |= DDI_PORT_WIDTH(crtc_state->lane_count);
1631− } else if (type == INTEL_OUTPUT_DP_MST) {
1596+ } else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST)) {
16321597 temp |= TRANS_DDI_MODE_SELECT_DP_MST;
16331598 temp |= DDI_PORT_WIDTH(crtc_state->lane_count);
16341599 } else {
1635− WARN(1, "Invalid encoder type %d for pipe %c\n",
1636− encoder->type, pipe_name(pipe));
1600+ temp |= TRANS_DDI_MODE_SELECT_DP_SST;
1601+ temp |= DDI_PORT_WIDTH(crtc_state->lane_count);
16371602 }
16381603
16391604 I915_WRITE(TRANS_DDI_FUNC_CTL(cpu_transcoder), temp);
@@ -1656,7 +1621,7 @@ bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector) · 16 unmodified lines
16561621 struct drm_i915_private *dev_priv = to_i915(dev);
16571622 struct intel_encoder *encoder = intel_connector->encoder;
16581623 int type = intel_connector->base.connector_type;
1659− enum port port = intel_ddi_get_encoder_port(encoder);
1624+ enum port port = encoder->port;
16601625 enum pipe pipe = 0;
16611626 enum transcoder cpu_transcoder;
16621627 uint32_t tmp;
@@ -1715,9 +1680,9 @@ bool intel_ddi_get_hw_state(struct intel_encoder *encoder, · 52 unmodified lines
17151680 {
17161681 struct drm_device *dev = encoder->base.dev;
17171682 struct drm_i915_private *dev_priv = to_i915(dev);
1718− enum port port = intel_ddi_get_encoder_port(encoder);
1683+ enum port port = encoder->port;
1684+ enum pipe p;
17191685 u32 tmp;
1720− int i;
17211686 bool ret;
17221687
17231688 if (!intel_display_power_get_if_enabled(dev_priv,
@@ -1752,15 +1717,17 @@ bool intel_ddi_get_hw_state(struct intel_encoder *encoder, · 28 unmodified lines
17521717 goto out;
17531718 }
17541719
1755− for (i = TRANSCODER_A; i <= TRANSCODER_C; i++) {
1756− tmp = I915_READ(TRANS_DDI_FUNC_CTL(i));
1720+ for_each_pipe(dev_priv, p) {
1721+ enum transcoder cpu_transcoder = (enum transcoder) p;
1722+
1723+ tmp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
17571724
17581725 if ((tmp & TRANS_DDI_PORT_MASK) == TRANS_DDI_SELECT_PORT(port)) {
17591726 if ((tmp & TRANS_DDI_MODE_SELECT_MASK) ==
17601727 TRANS_DDI_MODE_SELECT_DP_MST)
17611728 goto out;
17621729
1763− *pipe = i;
1730+ *pipe = p;
17641731 ret = true;
17651732
17661733 goto out;
@@ -1800,7 +1767,7 @@ void intel_ddi_enable_pipe_clock(const struct intel_crtc_state *crtc_state) · 33 unmodified lines
18001767 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
18011768 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
18021769 struct intel_encoder *encoder = intel_ddi_get_crtc_encoder(crtc);
1803− enum port port = intel_ddi_get_encoder_port(encoder);
1770+ enum port port = encoder->port;
18041771 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
18051772
18061773 if (cpu_transcoder != TRANSCODER_EDP)
@@ -1836,8 +1803,8 @@ static void skl_ddi_set_iboost(struct intel_encoder *encoder, · 29 unmodified lines
18361803 int level, enum intel_output_type type)
18371804 {
18381805 struct intel_digital_port *intel_dig_port = enc_to_dig_port(&encoder->base);
1839− struct drm_i915_private *dev_priv = to_i915(intel_dig_port->base.base.dev);
1840− enum port port = intel_dig_port->port;
1806+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1807+ enum port port = encoder->port;
18411808 uint8_t iboost;
18421809
18431810 if (type == INTEL_OUTPUT_HDMI)
@@ -1939,8 +1906,8 @@ static void cnl_ddi_vswing_program(struct intel_encoder *encoder, · 95 unmodified lines
19391906 int level, enum intel_output_type type)
19401907 {
19411908 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1942− enum port port = intel_ddi_get_encoder_port(encoder);
19431909 const struct cnl_ddi_buf_trans *ddi_translations;
1910+ enum port port = encoder->port;
19441911 int n_entries, ln;
19451912 u32 val;
19461913
@@ -2003,7 +1970,7 @@ static void cnl_ddi_vswing_sequence(struct intel_encoder *encoder, · 56 unmodified lines
20031970 int level, enum intel_output_type type)
20041971 {
20051972 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2006− enum port port = intel_ddi_get_encoder_port(encoder);
1973+ enum port port = encoder->port;
20071974 int width, rate, ln;
20081975 u32 val;
20091976
@@ -2122,7 +2089,7 @@ static void intel_ddi_clk_select(struct intel_encoder *encoder, · 112 unmodified lines
21222089 const struct intel_shared_dpll *pll)
21232090 {
21242091 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2125− enum port port = intel_ddi_get_encoder_port(encoder);
2092+ enum port port = encoder->port;
21262093 uint32_t val;
21272094
21282095 if (WARN_ON(!pll))
@@ -2161,7 +2128,7 @@ static void intel_ddi_clk_select(struct intel_encoder *encoder, · 32 unmodified lines
21612128 static void intel_ddi_clk_disable(struct intel_encoder *encoder)
21622129 {
21632130 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2164− enum port port = intel_ddi_get_encoder_port(encoder);
2131+ enum port port = encoder->port;
21652132
21662133 if (IS_CANNONLAKE(dev_priv))
21672134 I915_WRITE(DPCLKA_CFGCR0, I915_READ(DPCLKA_CFGCR0) |
@@ -2179,7 +2146,7 @@ static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder, · 11 unmodified lines
21792146 {
21802147 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
21812148 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2182− enum port port = intel_ddi_get_encoder_port(encoder);
2149+ enum port port = encoder->port;
21832150 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
21842151 bool is_mst = intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST);
21852152 int level = intel_ddi_dp_level(intel_dp);
@@ -2200,7 +2167,7 @@ static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder, · 14 unmodified lines
22002167 else if (IS_GEN9_LP(dev_priv))
22012168 bxt_ddi_vswing_sequence(encoder, level, encoder->type);
22022169 else
2203− intel_prepare_dp_ddi_buffers(encoder);
2170+ intel_prepare_dp_ddi_buffers(encoder, crtc_state);
22042171
22052172 intel_ddi_init_dp_buf_reg(encoder);
22062173 if (!is_mst)
@@ -2217,7 +2184,7 @@ static void intel_ddi_pre_enable_hdmi(struct intel_encoder *encoder, · 10 unmodified lines
22172184 struct intel_digital_port *intel_dig_port = enc_to_dig_port(&encoder->base);
22182185 struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
22192186 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2220− enum port port = intel_ddi_get_encoder_port(encoder);
2187+ enum port port = encoder->port;
22212188 int level = intel_ddi_hdmi_level(dev_priv, port);
22222189 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
22232190
@@ -2249,6 +2216,19 @@ static void intel_ddi_pre_enable(struct intel_encoder *encoder, · 25 unmodified lines
22492216 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
22502217 enum pipe pipe = crtc->pipe;
22512218
2219+ /*
2220+ * When called from DP MST code:
2221+ * - conn_state will be NULL
2222+ * - encoder will be the main encoder (ie. mst->primary)
2223+ * - the main connector associated with this port
2224+ * won't be active or linked to a crtc
2225+ * - crtc_state will be the state of the first stream to
2226+ * be activated on this port, and it may not be the same
2227+ * stream that will be deactivated last, but each stream
2228+ * should have a state that is identical when it comes to
2229+ * the DP link parameteres
2230+ */
2231+
22522232 WARN_ON(crtc_state->has_pch_encoder);
22532233
22542234 intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);
@@ -2262,7 +2242,7 @@ static void intel_ddi_pre_enable(struct intel_encoder *encoder, · 7 unmodified lines
22622242 static void intel_disable_ddi_buf(struct intel_encoder *encoder)
22632243 {
22642244 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2265− enum port port = intel_ddi_get_encoder_port(encoder);
2245+ enum port port = encoder->port;
22662246 bool wait = false;
22672247 u32 val;
22682248
@@ -2289,12 +2269,7 @@ static void intel_ddi_post_disable_dp(struct intel_encoder *encoder, · 20 unmodified lines
22892269 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
22902270 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
22912271 struct intel_dp *intel_dp = &dig_port->dp;
2292− /*
2293− * old_crtc_state and old_conn_state are NULL when called from
2294− * DP_MST. The main connector associated with this port is never
2295− * bound to a crtc for MST.
2296− */
2297− bool is_mst = !old_crtc_state;
2272+ bool is_mst = intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DP_MST);
22982273
22992274 /*
23002275 * Power down sink before disabling the port, otherwise we end
@@ -2338,12 +2313,19 @@ static void intel_ddi_post_disable(struct intel_encoder *encoder, · 37 unmodified lines
23382313 const struct drm_connector_state *old_conn_state)
23392314 {
23402315 /*
2341− * old_crtc_state and old_conn_state are NULL when called from
2342− * DP_MST. The main connector associated with this port is never
2343− * bound to a crtc for MST.
2316+ * When called from DP MST code:
2317+ * - old_conn_state will be NULL
2318+ * - encoder will be the main encoder (ie. mst->primary)
2319+ * - the main connector associated with this port
2320+ * won't be active or linked to a crtc
2321+ * - old_crtc_state will be the state of the last stream to
2322+ * be deactivated on this port, and it may not be the same
2323+ * stream that was activated last, but each stream
2324+ * should have a state that is identical when it comes to
2325+ * the DP link parameteres
23442326 */
2345− if (old_crtc_state &&
2346− intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_HDMI))
2327+
2328+ if (intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_HDMI))
23472329 intel_ddi_post_disable_hdmi(encoder,
23482330 old_crtc_state, old_conn_state);
23492331 else
@@ -2391,7 +2373,7 @@ static void intel_enable_ddi_dp(struct intel_encoder *encoder, · 41 unmodified lines
23912373 {
23922374 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
23932375 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2394− enum port port = intel_ddi_get_encoder_port(encoder);
2376+ enum port port = encoder->port;
23952377
23962378 if (port == PORT_A && INTEL_GEN(dev_priv) < 9)
23972379 intel_dp_stop_link_train(intel_dp);
@@ -2410,7 +2392,7 @@ static void intel_enable_ddi_hdmi(struct intel_encoder *encoder, · 12 unmodified lines
24102392 {
24112393 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
24122394 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
2413− enum port port = intel_ddi_get_encoder_port(encoder);
2395+ enum port port = encoder->port;
24142396
24152397 intel_hdmi_handle_sink_scrambling(encoder,
24162398 conn_state->connector,
@@ -2445,7 +2427,8 @@ static void intel_disable_ddi_dp(struct intel_encoder *encoder, · 28 unmodified lines
24452427 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
24462428
24472429 if (old_crtc_state->has_audio)
2448− intel_audio_codec_disable(encoder);
2430+ intel_audio_codec_disable(encoder,
2431+ old_crtc_state, old_conn_state);
24492432
24502433 intel_edp_drrs_disable(intel_dp, old_crtc_state);
24512434 intel_psr_disable(intel_dp, old_crtc_state);
@@ -2457,7 +2440,8 @@ static void intel_disable_ddi_hdmi(struct intel_encoder *encoder, · 5 unmodified lines
24572440 const struct drm_connector_state *old_conn_state)
24582441 {
24592442 if (old_crtc_state->has_audio)
2460− intel_audio_codec_disable(encoder);
2443+ intel_audio_codec_disable(encoder,
2444+ old_crtc_state, old_conn_state);
24612445
24622446 intel_hdmi_handle_sink_scrambling(encoder,
24632447 old_conn_state->connector,
@@ -2488,7 +2472,7 @@ void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp) · 24 unmodified lines
24882472 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
24892473 struct drm_i915_private *dev_priv =
24902474 to_i915(intel_dig_port->base.base.dev);
2491− enum port port = intel_dig_port->port;
2475+ enum port port = intel_dig_port->base.port;
24922476 uint32_t val;
24932477 bool wait = false;
24942478
@@ -2542,11 +2526,18 @@ bool intel_ddi_is_audio_enabled(struct drm_i915_private *dev_priv, · 47 unmodified lines
25422526 return false;
25432527 }
25442528
2529+void intel_ddi_compute_min_voltage_level(struct drm_i915_private *dev_priv,
2530+ struct intel_crtc_state *crtc_state)
2531+{
2532+ if (IS_CANNONLAKE(dev_priv) && crtc_state->port_clock > 594000)
2533+ crtc_state->min_voltage_level = 2;
2534+}
2535+
25452536 void intel_ddi_get_config(struct intel_encoder *encoder,
25462537 struct intel_crtc_state *pipe_config)
25472538 {
25482539 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2549− struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
2540+ struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->base.crtc);
25502541 enum transcoder cpu_transcoder = pipe_config->cpu_transcoder;
25512542 struct intel_digital_port *intel_dig_port;
25522543 u32 temp, flags = 0;
@@ -2599,12 +2590,23 @@ void intel_ddi_get_config(struct intel_encoder *encoder, · 46 unmodified lines
25992590 pipe_config->hdmi_high_tmds_clock_ratio = true;
26002591 /* fall through */
26012592 case TRANS_DDI_MODE_SELECT_DVI:
2593+ pipe_config->output_types |= BIT(INTEL_OUTPUT_HDMI);
26022594 pipe_config->lane_count = 4;
26032595 break;
26042596 case TRANS_DDI_MODE_SELECT_FDI:
2597+ pipe_config->output_types |= BIT(INTEL_OUTPUT_ANALOG);
26052598 break;
26062599 case TRANS_DDI_MODE_SELECT_DP_SST:
2600+ if (encoder->type == INTEL_OUTPUT_EDP)
2601+ pipe_config->output_types |= BIT(INTEL_OUTPUT_EDP);
2602+ else
2603+ pipe_config->output_types |= BIT(INTEL_OUTPUT_DP);
2604+ pipe_config->lane_count =
2605+ ((temp & DDI_PORT_WIDTH_MASK) >> DDI_PORT_WIDTH_SHIFT) + 1;
2606+ intel_dp_get_m_n(intel_crtc, pipe_config);
2607+ break;
26072608 case TRANS_DDI_MODE_SELECT_DP_MST:
2609+ pipe_config->output_types |= BIT(INTEL_OUTPUT_DP_MST);
26082610 pipe_config->lane_count =
26092611 ((temp & DDI_PORT_WIDTH_MASK) >> DDI_PORT_WIDTH_SHIFT) + 1;
26102612 intel_dp_get_m_n(intel_crtc, pipe_config);
@@ -2641,6 +2643,26 @@ void intel_ddi_get_config(struct intel_encoder *encoder, · 30 unmodified lines
26412643 if (IS_GEN9_LP(dev_priv))
26422644 pipe_config->lane_lat_optim_mask =
26432645 bxt_ddi_phy_get_lane_lat_optim_mask(encoder);
2646+
2647+ intel_ddi_compute_min_voltage_level(dev_priv, pipe_config);
2648+}
2649+
2650+static enum intel_output_type
2651+intel_ddi_compute_output_type(struct intel_encoder *encoder,
2652+ struct intel_crtc_state *crtc_state,
2653+ struct drm_connector_state *conn_state)
2654+{
2655+ switch (conn_state->connector->connector_type) {
2656+ case DRM_MODE_CONNECTOR_HDMIA:
2657+ return INTEL_OUTPUT_HDMI;
2658+ case DRM_MODE_CONNECTOR_eDP:
2659+ return INTEL_OUTPUT_EDP;
2660+ case DRM_MODE_CONNECTOR_DisplayPort:
2661+ return INTEL_OUTPUT_DP;
2662+ default:
2663+ MISSING_CASE(conn_state->connector->connector_type);
2664+ return INTEL_OUTPUT_UNUSED;
2665+ }
26442666 }
26452667
26462668 static bool intel_ddi_compute_config(struct intel_encoder *encoder,
@@ -2648,24 +2670,22 @@ static bool intel_ddi_compute_config(struct intel_encoder *encoder, · 1 unmodified line
26482670 struct drm_connector_state *conn_state)
26492671 {
26502672 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2651− int type = encoder->type;
2652− int port = intel_ddi_get_encoder_port(encoder);
2673+ enum port port = encoder->port;
26532674 int ret;
26542675
2655− WARN(type == INTEL_OUTPUT_UNKNOWN, "compute_config() on unknown output!\n");
2656−
26572676 if (port == PORT_A)
26582677 pipe_config->cpu_transcoder = TRANSCODER_EDP;
26592678
2660− if (type == INTEL_OUTPUT_HDMI)
2679+ if (intel_crtc_has_type(pipe_config, INTEL_OUTPUT_HDMI))
26612680 ret = intel_hdmi_compute_config(encoder, pipe_config, conn_state);
26622681 else
26632682 ret = intel_dp_compute_config(encoder, pipe_config, conn_state);
26642683
26652684 if (IS_GEN9_LP(dev_priv) && ret)
26662685 pipe_config->lane_lat_optim_mask =
2667− bxt_ddi_phy_calc_lane_lat_optim_mask(encoder,
2668− pipe_config->lane_count);
2686+ bxt_ddi_phy_calc_lane_lat_optim_mask(pipe_config->lane_count);
2687+
2688+ intel_ddi_compute_min_voltage_level(dev_priv, pipe_config);
26692689
26702690 return ret;
26712691
@@ -2680,7 +2700,7 @@ static struct intel_connector * · 8 unmodified lines
26802700 intel_ddi_init_dp_connector(struct intel_digital_port *intel_dig_port)
26812701 {
26822702 struct intel_connector *connector;
2683− enum port port = intel_dig_port->port;
2703+ enum port port = intel_dig_port->base.port;
26842704
26852705 connector = intel_connector_alloc();
26862706 if (!connector)
@@ -2699,7 +2719,7 @@ static struct intel_connector * · 12 unmodified lines
26992719 intel_ddi_init_hdmi_connector(struct intel_digital_port *intel_dig_port)
27002720 {
27012721 struct intel_connector *connector;
2702− enum port port = intel_dig_port->port;
2722+ enum port port = intel_dig_port->base.port;
27032723
27042724 connector = intel_connector_alloc();
27052725 if (!connector)
@@ -2711,6 +2731,34 @@ intel_ddi_init_hdmi_connector(struct intel_digital_port *intel_dig_port) · 5 unmodified lines
27112731 return connector;
27122732 }
27132733
2734+static bool intel_ddi_a_force_4_lanes(struct intel_digital_port *dport)
2735+{
2736+ struct drm_i915_private *dev_priv = to_i915(dport->base.base.dev);
2737+
2738+ if (dport->base.port != PORT_A)
2739+ return false;
2740+
2741+ if (dport->saved_port_bits & DDI_A_4_LANES)
2742+ return false;
2743+
2744+ /* Broxton/Geminilake: Bspec says that DDI_A_4_LANES is the only
2745+ * supported configuration
2746+ */
2747+ if (IS_GEN9_LP(dev_priv))
2748+ return true;
2749+
2750+ /* Cannonlake: Most of SKUs don't support DDI_E, and the only
2751+ * one who does also have a full A/E split called
2752+ * DDI_F what makes DDI_E useless. However for this
2753+ * case let's trust VBT info.
2754+ */
2755+ if (IS_CANNONLAKE(dev_priv) &&
2756+ !intel_bios_is_port_present(dev_priv, PORT_E))
2757+ return true;
2758+
2759+ return false;
2760+}
2761+
27142762 void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
27152763 {
27162764 struct intel_digital_port *intel_dig_port;
@@ -2777,6 +2825,7 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port) · 60 unmodified lines
27772825 drm_encoder_init(&dev_priv->drm, encoder, &intel_ddi_funcs,
27782826 DRM_MODE_ENCODER_TMDS, "DDI %c", port_name(port));
27792827
2828+ intel_encoder->compute_output_type = intel_ddi_compute_output_type;
27802829 intel_encoder->compute_config = intel_ddi_compute_config;
27812830 intel_encoder->enable = intel_enable_ddi;
27822831 if (IS_GEN9_LP(dev_priv))
@@ -2789,7 +2838,6 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port) · 6 unmodified lines
27892838 intel_encoder->suspend = intel_dp_encoder_suspend;
27902839 intel_encoder->get_power_domains = intel_ddi_get_power_domains;
27912840
2792− intel_dig_port->port = port;
27932841 intel_dig_port->saved_port_bits = I915_READ(DDI_BUF_CTL(port)) &
27942842 (DDI_BUF_PORT_REVERSAL |
27952843 DDI_A_4_LANES);
@@ -2820,23 +2868,20 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port) · 24 unmodified lines
28202868 }
28212869
28222870 /*
2823− * Bspec says that DDI_A_4_LANES is the only supported configuration
2824− * for Broxton. Yet some BIOS fail to set this bit on port A if eDP
2825− * wasn't lit up at boot. Force this bit on in our internal
2826− * configuration so that we use the proper lane count for our
2827− * calculations.
2871+ * Some BIOS might fail to set this bit on port A if eDP
2872+ * wasn't lit up at boot. Force this bit set when needed
2873+ * so we use the proper lane count for our calculations.
28282874 */
2829− if (IS_GEN9_LP(dev_priv) && port == PORT_A) {
2830− if (!(intel_dig_port->saved_port_bits & DDI_A_4_LANES)) {
2831− DRM_DEBUG_KMS("BXT BIOS forgot to set DDI_A_4_LANES for port A; fixing\n");
2832− intel_dig_port->saved_port_bits |= DDI_A_4_LANES;
2833− max_lanes = 4;
2834− }
2875+ if (intel_ddi_a_force_4_lanes(intel_dig_port)) {
2876+ DRM_DEBUG_KMS("Forcing DDI_A_4_LANES for port A\n");
2877+ intel_dig_port->saved_port_bits |= DDI_A_4_LANES;
2878+ max_lanes = 4;
28352879 }
28362880
2881+ intel_dig_port->dp.output_reg = INVALID_MMIO_REG;
28372882 intel_dig_port->max_lanes = max_lanes;
28382883
2839− intel_encoder->type = INTEL_OUTPUT_UNKNOWN;
2884+ intel_encoder->type = INTEL_OUTPUT_DDI;
28402885 intel_encoder->power_domain = intel_port_to_power_domain(port);
28412886 intel_encoder->port = port;
28422887 intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
drivers/gpu/drm/i915/intel_device_info.c+110−11
@@ -235,16 +235,6 @@ static void gen9_sseu_info_init(struct drm_i915_private *dev_priv) · 234 unmodified lines
235235 #define IS_SS_DISABLED(ss) (!(sseu->subslice_mask & BIT(ss)))
236236 info->has_pooled_eu = hweight8(sseu->subslice_mask) == 3;
237237
238− /*
239− * There is a HW issue in 2x6 fused down parts that requires
240− * Pooled EU to be enabled as a WA. The pool configuration
241− * changes depending upon which subslice is fused down. This
242− * doesn't affect if the device has all 3 subslices enabled.
243− */
244− /* WaEnablePooledEuFor2x6:bxt */
245− info->has_pooled_eu |= (hweight8(sseu->subslice_mask) == 2 &&
246− IS_BXT_REVID(dev_priv, 0, BXT_REVID_B_LAST));
247−
248238 sseu->min_eu_in_pool = 0;
249239 if (info->has_pooled_eu) {
250240 if (IS_SS_DISABLED(2) || IS_SS_DISABLED(0))
@@ -329,6 +319,107 @@ static void broadwell_sseu_info_init(struct drm_i915_private *dev_priv) · 78 unmodified lines
329319 sseu->has_eu_pg = 0;
330320 }
331321
322+static u32 read_reference_ts_freq(struct drm_i915_private *dev_priv)
323+{
324+ u32 ts_override = I915_READ(GEN9_TIMESTAMP_OVERRIDE);
325+ u32 base_freq, frac_freq;
326+
327+ base_freq = ((ts_override & GEN9_TIMESTAMP_OVERRIDE_US_COUNTER_DIVIDER_MASK) >>
328+ GEN9_TIMESTAMP_OVERRIDE_US_COUNTER_DIVIDER_SHIFT) + 1;
329+ base_freq *= 1000;
330+
331+ frac_freq = ((ts_override &
332+ GEN9_TIMESTAMP_OVERRIDE_US_COUNTER_DENOMINATOR_MASK) >>
333+ GEN9_TIMESTAMP_OVERRIDE_US_COUNTER_DENOMINATOR_SHIFT);
334+ frac_freq = 1000 / (frac_freq + 1);
335+
336+ return base_freq + frac_freq;
337+}
338+
339+static u32 read_timestamp_frequency(struct drm_i915_private *dev_priv)
340+{
341+ u32 f12_5_mhz = 12500;
342+ u32 f19_2_mhz = 19200;
343+ u32 f24_mhz = 24000;
344+
345+ if (INTEL_GEN(dev_priv) <= 4) {
346+ /* PRMs say:
347+ *
348+ * "The value in this register increments once every 16
349+ * hclks." (through the “Clocking Configuration”
350+ * (“CLKCFG”) MCHBAR register)
351+ */
352+ return dev_priv->rawclk_freq / 16;
353+ } else if (INTEL_GEN(dev_priv) <= 8) {
354+ /* PRMs say:
355+ *
356+ * "The PCU TSC counts 10ns increments; this timestamp
357+ * reflects bits 38:3 of the TSC (i.e. 80ns granularity,
358+ * rolling over every 1.5 hours).
359+ */
360+ return f12_5_mhz;
361+ } else if (INTEL_GEN(dev_priv) <= 9) {
362+ u32 ctc_reg = I915_READ(CTC_MODE);
363+ u32 freq = 0;
364+
365+ if ((ctc_reg & CTC_SOURCE_PARAMETER_MASK) == CTC_SOURCE_DIVIDE_LOGIC) {
366+ freq = read_reference_ts_freq(dev_priv);
367+ } else {
368+ freq = IS_GEN9_LP(dev_priv) ? f19_2_mhz : f24_mhz;
369+
370+ /* Now figure out how the command stream's timestamp
371+ * register increments from this frequency (it might
372+ * increment only every few clock cycle).
373+ */
374+ freq >>= 3 - ((ctc_reg & CTC_SHIFT_PARAMETER_MASK) >>
375+ CTC_SHIFT_PARAMETER_SHIFT);
376+ }
377+
378+ return freq;
379+ } else if (INTEL_GEN(dev_priv) <= 10) {
380+ u32 ctc_reg = I915_READ(CTC_MODE);
381+ u32 freq = 0;
382+ u32 rpm_config_reg = 0;
383+
384+ /* First figure out the reference frequency. There are 2 ways
385+ * we can compute the frequency, either through the
386+ * TIMESTAMP_OVERRIDE register or through RPM_CONFIG. CTC_MODE
387+ * tells us which one we should use.
388+ */
389+ if ((ctc_reg & CTC_SOURCE_PARAMETER_MASK) == CTC_SOURCE_DIVIDE_LOGIC) {
390+ freq = read_reference_ts_freq(dev_priv);
391+ } else {
392+ u32 crystal_clock;
393+
394+ rpm_config_reg = I915_READ(RPM_CONFIG0);
395+ crystal_clock = (rpm_config_reg &
396+ GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_MASK) >>
397+ GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_SHIFT;
398+ switch (crystal_clock) {
399+ case GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_19_2_MHZ:
400+ freq = f19_2_mhz;
401+ break;
402+ case GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_24_MHZ:
403+ freq = f24_mhz;
404+ break;
405+ }
406+ }
407+
408+ /* Now figure out how the command stream's timestamp register
409+ * increments from this frequency (it might increment only
410+ * every few clock cycle).
411+ */
412+ freq >>= 3 - ((rpm_config_reg &
413+ GEN10_RPM_CONFIG0_CTC_SHIFT_PARAMETER_MASK) >>
414+ GEN10_RPM_CONFIG0_CTC_SHIFT_PARAMETER_SHIFT);
415+
416+ return freq;
417+ }
418+
419+ DRM_ERROR("Unknown gen, unable to compute command stream timestamp frequency\n");
420+ return 0;
421+}
422+
332423 /*
333424 * Determine various intel_device_info fields at runtime.
334425 *
@@ -347,7 +438,10 @@ void intel_device_info_runtime_init(struct drm_i915_private *dev_priv) · 12 unmodified lines
347438 struct intel_device_info *info = mkwrite_device_info(dev_priv);
348439 enum pipe pipe;
349440
350− if (INTEL_GEN(dev_priv) >= 9) {
441+ if (INTEL_GEN(dev_priv) >= 10) {
442+ for_each_pipe(dev_priv, pipe)
443+ info->num_scalers[pipe] = 2;
444+ } else if (INTEL_GEN(dev_priv) == 9) {
351445 info->num_scalers[PIPE_A] = 2;
352446 info->num_scalers[PIPE_B] = 2;
353447 info->num_scalers[PIPE_C] = 1;
@@ -447,6 +541,9 @@ void intel_device_info_runtime_init(struct drm_i915_private *dev_priv) · 93 unmodified lines
447541 else if (INTEL_GEN(dev_priv) >= 10)
448542 gen10_sseu_info_init(dev_priv);
449543
544+ /* Initialize command stream timestamp frequency */
545+ info->cs_timestamp_frequency_khz = read_timestamp_frequency(dev_priv);
546+
450547 DRM_DEBUG_DRIVER("slice mask: %04x\n", info->sseu.slice_mask);
451548 DRM_DEBUG_DRIVER("slice total: %u\n", hweight8(info->sseu.slice_mask));
452549 DRM_DEBUG_DRIVER("subslice total: %u\n",
@@ -462,4 +559,6 @@ void intel_device_info_runtime_init(struct drm_i915_private *dev_priv) · 9 unmodified lines
462559 info->sseu.has_subslice_pg ? "y" : "n");
463560 DRM_DEBUG_DRIVER("has EU power gating: %s\n",
464561 info->sseu.has_eu_pg ? "y" : "n");
562+ DRM_DEBUG_DRIVER("CS timestamp frequency: %u kHz\n",
563+ info->cs_timestamp_frequency_khz);
465564 }
drivers/gpu/drm/i915/intel_display.c+201−87
@@ -219,10 +219,8 @@ intel_fdi_link_freq(struct drm_i915_private *dev_priv, · 218 unmodified lines
219219 {
220220 if (HAS_DDI(dev_priv))
221221 return pipe_config->port_clock; /* SPLL */
222− else if (IS_GEN5(dev_priv))
223− return ((I915_READ(FDI_PLL_BIOS_0) & FDI_PLL_FB_CLOCK_MASK) + 2) * 10000;
224222 else
225− return 270000;
223+ return dev_priv->fdi_pll_freq;
226224 }
227225
228226 static const struct intel_limit intel_limits_i8xx_dac = {
@@ -1703,7 +1701,7 @@ void vlv_wait_port_ready(struct drm_i915_private *dev_priv, · 1474 unmodified lines
17031701 u32 port_mask;
17041702 i915_reg_t dpll_reg;
17051703
1706− switch (dport->port) {
1704+ switch (dport->base.port) {
17071705 case PORT_B:
17081706 port_mask = DPLL_PORTB_READY_MASK;
17091707 dpll_reg = DPLL(0);
@@ -1725,7 +1723,8 @@ void vlv_wait_port_ready(struct drm_i915_private *dev_priv, · 15 unmodified lines
17251723 dpll_reg, port_mask, expected_mask,
17261724 1000))
17271725 WARN(1, "timed out waiting for port %c ready: got 0x%x, expected 0x%x\n",
1728− port_name(dport->port), I915_READ(dpll_reg) & port_mask, expected_mask);
1726+ port_name(dport->base.port),
1727+ I915_READ(dpll_reg) & port_mask, expected_mask);
17291728 }
17301729
17311730 static void ironlake_enable_pch_transcoder(struct drm_i915_private *dev_priv,
@@ -1873,8 +1872,6 @@ enum pipe intel_crtc_pch_transcoder(struct intel_crtc *crtc) · 141 unmodified lines
18731872 {
18741873 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
18751874
1876− WARN_ON(!crtc->config->has_pch_encoder);
1877−
18781875 if (HAS_PCH_LPT(dev_priv))
18791876 return PIPE_A;
18801877 else
@@ -3433,20 +3430,11 @@ static u32 skl_plane_ctl_format(uint32_t pixel_format) · 1552 unmodified lines
34333430 case DRM_FORMAT_RGB565:
34343431 return PLANE_CTL_FORMAT_RGB_565;
34353432 case DRM_FORMAT_XBGR8888:
3433+ case DRM_FORMAT_ABGR8888:
34363434 return PLANE_CTL_FORMAT_XRGB_8888 | PLANE_CTL_ORDER_RGBX;
34373435 case DRM_FORMAT_XRGB8888:
3438− return PLANE_CTL_FORMAT_XRGB_8888;
3439− /*
3440− * XXX: For ARBG/ABGR formats we default to expecting scanout buffers
3441− * to be already pre-multiplied. We need to add a knob (or a different
3442− * DRM_FORMAT) for user-space to configure that.
3443− */
3444− case DRM_FORMAT_ABGR8888:
3445− return PLANE_CTL_FORMAT_XRGB_8888 | PLANE_CTL_ORDER_RGBX |
3446− PLANE_CTL_ALPHA_SW_PREMULTIPLY;
34473436 case DRM_FORMAT_ARGB8888:
3448− return PLANE_CTL_FORMAT_XRGB_8888 |
3449− PLANE_CTL_ALPHA_SW_PREMULTIPLY;
3437+ return PLANE_CTL_FORMAT_XRGB_8888;
34503438 case DRM_FORMAT_XRGB2101010:
34513439 return PLANE_CTL_FORMAT_XRGB_2101010;
34523440 case DRM_FORMAT_XBGR2101010:
@@ -3466,6 +3454,33 @@ static u32 skl_plane_ctl_format(uint32_t pixel_format) · 13 unmodified lines
34663454 return 0;
34673455 }
34683456
3457+/*
3458+ * XXX: For ARBG/ABGR formats we default to expecting scanout buffers
3459+ * to be already pre-multiplied. We need to add a knob (or a different
3460+ * DRM_FORMAT) for user-space to configure that.
3461+ */
3462+static u32 skl_plane_ctl_alpha(uint32_t pixel_format)
3463+{
3464+ switch (pixel_format) {
3465+ case DRM_FORMAT_ABGR8888:
3466+ case DRM_FORMAT_ARGB8888:
3467+ return PLANE_CTL_ALPHA_SW_PREMULTIPLY;
3468+ default:
3469+ return PLANE_CTL_ALPHA_DISABLE;
3470+ }
3471+}
3472+
3473+static u32 glk_plane_color_ctl_alpha(uint32_t pixel_format)
3474+{
3475+ switch (pixel_format) {
3476+ case DRM_FORMAT_ABGR8888:
3477+ case DRM_FORMAT_ARGB8888:
3478+ return PLANE_COLOR_ALPHA_SW_PREMULTIPLY;
3479+ default:
3480+ return PLANE_COLOR_ALPHA_DISABLE;
3481+ }
3482+}
3483+
34693484 static u32 skl_plane_ctl_tiling(uint64_t fb_modifier)
34703485 {
34713486 switch (fb_modifier) {
@@ -3522,7 +3537,8 @@ u32 skl_plane_ctl(const struct intel_crtc_state *crtc_state, · 50 unmodified lines
35223537
35233538 plane_ctl = PLANE_CTL_ENABLE;
35243539
3525− if (!IS_GEMINILAKE(dev_priv) && !IS_CANNONLAKE(dev_priv)) {
3540+ if (INTEL_GEN(dev_priv) < 10 && !IS_GEMINILAKE(dev_priv)) {
3541+ plane_ctl |= skl_plane_ctl_alpha(fb->format->format);
35263542 plane_ctl |=
35273543 PLANE_CTL_PIPE_GAMMA_ENABLE |
35283544 PLANE_CTL_PIPE_CSC_ENABLE |
@@ -3541,6 +3557,20 @@ u32 skl_plane_ctl(const struct intel_crtc_state *crtc_state, · 12 unmodified lines
35413557 return plane_ctl;
35423558 }
35433559
3560+u32 glk_plane_color_ctl(const struct intel_crtc_state *crtc_state,
3561+ const struct intel_plane_state *plane_state)
3562+{
3563+ const struct drm_framebuffer *fb = plane_state->base.fb;
3564+ u32 plane_color_ctl = 0;
3565+
3566+ plane_color_ctl |= PLANE_COLOR_PIPE_GAMMA_ENABLE;
3567+ plane_color_ctl |= PLANE_COLOR_PIPE_CSC_ENABLE;
3568+ plane_color_ctl |= PLANE_COLOR_PLANE_GAMMA_DISABLE;
3569+ plane_color_ctl |= glk_plane_color_ctl_alpha(fb->format->format);
3570+
3571+ return plane_color_ctl;
3572+}
3573+
35443574 static int
35453575 __intel_display_resume(struct drm_device *dev,
35463576 struct drm_atomic_state *state,
@@ -4483,7 +4513,7 @@ intel_trans_dp_port_sel(struct intel_crtc *crtc) · 936 unmodified lines
44834513 for_each_encoder_on_crtc(dev, &crtc->base, encoder) {
44844514 if (encoder->type == INTEL_OUTPUT_DP ||
44854515 encoder->type == INTEL_OUTPUT_EDP)
4486− return enc_to_dig_port(&encoder->base)->port;
4516+ return encoder->port;
44874517 }
44884518
44894519 return -1;
@@ -4834,8 +4864,9 @@ static void ironlake_pfit_enable(struct intel_crtc *crtc) · 344 unmodified lines
48344864 }
48354865 }
48364866
4837−void hsw_enable_ips(struct intel_crtc *crtc)
4867+void hsw_enable_ips(const struct intel_crtc_state *crtc_state)
48384868 {
4869+ struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
48394870 struct drm_device *dev = crtc->base.dev;
48404871 struct drm_i915_private *dev_priv = to_i915(dev);
48414872
@@ -4873,12 +4904,13 @@ void hsw_enable_ips(struct intel_crtc *crtc) · 31 unmodified lines
48734904 }
48744905 }
48754906
4876−void hsw_disable_ips(struct intel_crtc *crtc)
4907+void hsw_disable_ips(const struct intel_crtc_state *crtc_state)
48774908 {
4909+ struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
48784910 struct drm_device *dev = crtc->base.dev;
48794911 struct drm_i915_private *dev_priv = to_i915(dev);
48804912
4881− if (!crtc->config->ips_enabled)
4913+ if (!crtc_state->ips_enabled)
48824914 return;
48834915
48844916 assert_plane_enabled(dev_priv, crtc->plane);
@@ -4926,7 +4958,8 @@ static void intel_crtc_dpms_overlay_disable(struct intel_crtc *intel_crtc) · 41 unmodified lines
49264958 * completely hide the primary plane.
49274959 */
49284960 static void
4929−intel_post_enable_primary(struct drm_crtc *crtc)
4961+intel_post_enable_primary(struct drm_crtc *crtc,
4962+ const struct intel_crtc_state *new_crtc_state)
49304963 {
49314964 struct drm_device *dev = crtc->dev;
49324965 struct drm_i915_private *dev_priv = to_i915(dev);
@@ -4939,7 +4972,7 @@ intel_post_enable_primary(struct drm_crtc *crtc) · 6 unmodified lines
49394972 * when going from primary only to sprite only and vice
49404973 * versa.
49414974 */
4942− hsw_enable_ips(intel_crtc);
4975+ hsw_enable_ips(new_crtc_state);
49434976
49444977 /*
49454978 * Gen2 reports pipe underruns whenever all planes are disabled.
@@ -4958,7 +4991,8 @@ intel_post_enable_primary(struct drm_crtc *crtc) · 12 unmodified lines
49584991
49594992 /* FIXME move all this to pre_plane_update() with proper state tracking */
49604993 static void
4961−intel_pre_disable_primary(struct drm_crtc *crtc)
4994+intel_pre_disable_primary(struct drm_crtc *crtc,
4995+ const struct intel_crtc_state *old_crtc_state)
49624996 {
49634997 struct drm_device *dev = crtc->dev;
49644998 struct drm_i915_private *dev_priv = to_i915(dev);
@@ -4980,7 +5014,7 @@ intel_pre_disable_primary(struct drm_crtc *crtc) · 15 unmodified lines
49805014 * when going from primary only to sprite only and vice
49815015 * versa.
49825016 */
4983− hsw_disable_ips(intel_crtc);
5017+ hsw_disable_ips(old_crtc_state);
49845018 }
49855019
49865020 /* FIXME get rid of this and use pre_plane_update */
@@ -4992,7 +5026,7 @@ intel_pre_disable_primary_noatomic(struct drm_crtc *crtc) · 5 unmodified lines
49925026 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
49935027 int pipe = intel_crtc->pipe;
49945028
4995− intel_pre_disable_primary(crtc);
5029+ intel_pre_disable_primary(crtc, to_intel_crtc_state(crtc->state));
49965030
49975031 /*
49985032 * Vblank time updates from the shadow to live plane control register
@@ -5036,7 +5070,7 @@ static void intel_post_plane_update(struct intel_crtc_state *old_crtc_state) · 37 unmodified lines
50365070 if (primary_state->base.visible &&
50375071 (needs_modeset(&pipe_config->base) ||
50385072 !old_primary_state->base.visible))
5039− intel_post_enable_primary(&crtc->base);
5073+ intel_post_enable_primary(&crtc->base, pipe_config);
50405074 }
50415075 }
50425076
@@ -5065,7 +5099,7 @@ static void intel_pre_plane_update(struct intel_crtc_state *old_crtc_state, · 22 unmodified lines
50655099
50665100 if (old_primary_state->base.visible &&
50675101 (modeset || !primary_state->base.visible))
5068− intel_pre_disable_primary(&crtc->base);
5102+ intel_pre_disable_primary(&crtc->base, old_crtc_state);
50695103 }
50705104
50715105 /*
@@ -5939,6 +5973,7 @@ static void intel_crtc_disable_noatomic(struct drm_crtc *crtc, · 867 unmodified lines
59395973
59405974 dev_priv->active_crtcs &= ~(1 << intel_crtc->pipe);
59415975 dev_priv->min_cdclk[intel_crtc->pipe] = 0;
5976+ dev_priv->min_voltage_level[intel_crtc->pipe] = 0;
59425977 }
59435978
59445979 /*
@@ -7633,7 +7668,7 @@ static void ironlake_init_pch_refclk(struct drm_i915_private *dev_priv) · 1688 unmodified lines
76337668 break;
76347669 case INTEL_OUTPUT_EDP:
76357670 has_panel = true;
7636− if (enc_to_dig_port(&encoder->base)->port == PORT_A)
7671+ if (encoder->port == PORT_A)
76377672 has_cpu_edp = true;
76387673 break;
76397674 default:
@@ -8426,7 +8461,7 @@ skylake_get_initial_plane_config(struct intel_crtc *crtc, · 786 unmodified lines
84268461 {
84278462 struct drm_device *dev = crtc->base.dev;
84288463 struct drm_i915_private *dev_priv = to_i915(dev);
8429− u32 val, base, offset, stride_mult, tiling;
8464+ u32 val, base, offset, stride_mult, tiling, alpha;
84308465 int pipe = crtc->pipe;
84318466 int fourcc, pixel_format;
84328467 unsigned int aligned_height;
@@ -8448,9 +8483,16 @@ skylake_get_initial_plane_config(struct intel_crtc *crtc, · 15 unmodified lines
84488483 goto error;
84498484
84508485 pixel_format = val & PLANE_CTL_FORMAT_MASK;
8486+
8487+ if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv)) {
8488+ alpha = I915_READ(PLANE_COLOR_CTL(pipe, 0));
8489+ alpha &= PLANE_COLOR_ALPHA_MASK;
8490+ } else {
8491+ alpha = val & PLANE_CTL_ALPHA_MASK;
8492+ }
8493+
84518494 fourcc = skl_format_to_fourcc(pixel_format,
8452− val & PLANE_CTL_ORDER_RGBX,
8453− val & PLANE_CTL_ALPHA_MASK);
8495+ val & PLANE_CTL_ORDER_RGBX, alpha);
84548496 fb->format = drm_format_info(fourcc);
84558497
84568498 tiling = val & PLANE_CTL_TILED_MASK;
@@ -8857,7 +8899,9 @@ static void hsw_restore_lcpll(struct drm_i915_private *dev_priv) · 400 unmodified lines
88578899 }
88588900
88598901 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
8902+
88608903 intel_update_cdclk(dev_priv);
8904+ intel_dump_cdclk_state(&dev_priv->cdclk.hw, "Current CDCLK");
88618905 }
88628906
88638907 /*
@@ -9231,10 +9275,6 @@ static bool haswell_get_pipe_config(struct intel_crtc *crtc, · 367 unmodified lines
92319275 ironlake_get_pfit_config(crtc, pipe_config);
92329276 }
92339277
9234− if (IS_HASWELL(dev_priv))
9235− pipe_config->ips_enabled = hsw_crtc_supports_ips(crtc) &&
9236− (I915_READ(IPS_CTL) & IPS_ENABLE);
9237−
92389278 if (pipe_config->cpu_transcoder != TRANSCODER_EDP &&
92399279 !transcoder_is_dsi(pipe_config->cpu_transcoder)) {
92409280 pipe_config->pixel_multiplier =
@@ -10578,7 +10618,7 @@ static const char * const output_type_str[] = { · 1337 unmodified lines
1057810618 OUTPUT_TYPE(DP),
1057910619 OUTPUT_TYPE(EDP),
1058010620 OUTPUT_TYPE(DSI),
10581− OUTPUT_TYPE(UNKNOWN),
10621+ OUTPUT_TYPE(DDI),
1058210622 OUTPUT_TYPE(DP_MST),
1058310623 };
1058410624
@@ -10749,13 +10789,13 @@ static bool check_digital_port_conflicts(struct drm_atomic_state *state) · 164 unmodified lines
1074910789
1075010790 switch (encoder->type) {
1075110791 unsigned int port_mask;
10752− case INTEL_OUTPUT_UNKNOWN:
10792+ case INTEL_OUTPUT_DDI:
1075310793 if (WARN_ON(!HAS_DDI(to_i915(dev))))
1075410794 break;
1075510795 case INTEL_OUTPUT_DP:
1075610796 case INTEL_OUTPUT_HDMI:
1075710797 case INTEL_OUTPUT_EDP:
10758− port_mask = 1 << enc_to_dig_port(&encoder->base)->port;
10798+ port_mask = 1 << encoder->port;
1075910799
1076010800 /* the same port mustn't appear more than once */
1076110801 if (used_ports & port_mask)
@@ -10765,7 +10805,7 @@ static bool check_digital_port_conflicts(struct drm_atomic_state *state) · 3 unmodified lines
1076510805 break;
1076610806 case INTEL_OUTPUT_DP_MST:
1076710807 used_mst_ports |=
10768− 1 << enc_to_mst(&encoder->base)->primary->port;
10808+ 1 << encoder->port;
1076910809 break;
1077010810 default:
1077110811 break;
@@ -10882,7 +10922,12 @@ intel_modeset_pipe_config(struct drm_crtc *crtc, · 110 unmodified lines
1088210922 * Determine output_types before calling the .compute_config()
1088310923 * hooks so that the hooks can use this information safely.
1088410924 */
10885− pipe_config->output_types |= 1 << encoder->type;
10925+ if (encoder->compute_output_type)
10926+ pipe_config->output_types |=
10927+ BIT(encoder->compute_output_type(encoder, pipe_config,
10928+ connector_state));
10929+ else
10930+ pipe_config->output_types |= BIT(encoder->type);
1088610931 }
1088710932
1088810933 encoder_retry:
@@ -11071,6 +11116,9 @@ intel_pipe_config_compare(struct drm_i915_private *dev_priv, · 182 unmodified lines
1107111116 bool adjust)
1107211117 {
1107311118 bool ret = true;
11119+ bool fixup_inherited = adjust &&
11120+ (current_config->base.mode.private_flags & I915_MODE_FLAG_INHERITED) &&
11121+ !(pipe_config->base.mode.private_flags & I915_MODE_FLAG_INHERITED);
1107411122
1107511123 #define PIPE_CONF_CHECK_X(name) \
1107611124 if (current_config->name != pipe_config->name) { \
@@ -11090,6 +11138,31 @@ intel_pipe_config_compare(struct drm_i915_private *dev_priv, · 13 unmodified lines
1109011138 ret = false; \
1109111139 }
1109211140
11141+#define PIPE_CONF_CHECK_BOOL(name) \
11142+ if (current_config->name != pipe_config->name) { \
11143+ pipe_config_err(adjust, __stringify(name), \
11144+ "(expected %s, found %s)\n", \
11145+ yesno(current_config->name), \
11146+ yesno(pipe_config->name)); \
11147+ ret = false; \
11148+ }
11149+
11150+/*
11151+ * Checks state where we only read out the enabling, but not the entire
11152+ * state itself (like full infoframes or ELD for audio). These states
11153+ * require a full modeset on bootup to fix up.
11154+ */
11155+#define PIPE_CONF_CHECK_BOOL_INCOMPLETE(name) \
11156+ if (!fixup_inherited || (!current_config->name && !pipe_config->name)) { \
11157+ PIPE_CONF_CHECK_BOOL(name); \
11158+ } else { \
11159+ pipe_config_err(adjust, __stringify(name), \
11160+ "unable to verify whether state matches exactly, forcing modeset (expected %s, found %s)\n", \
11161+ yesno(current_config->name), \
11162+ yesno(pipe_config->name)); \
11163+ ret = false; \
11164+ }
11165+
1109311166 #define PIPE_CONF_CHECK_P(name) \
1109411167 if (current_config->name != pipe_config->name) { \
1109511168 pipe_config_err(adjust, __stringify(name), \
@@ -11175,7 +11248,7 @@ intel_pipe_config_compare(struct drm_i915_private *dev_priv, · 79 unmodified lines
1117511248
1117611249 PIPE_CONF_CHECK_I(cpu_transcoder);
1117711250
11178− PIPE_CONF_CHECK_I(has_pch_encoder);
11251+ PIPE_CONF_CHECK_BOOL(has_pch_encoder);
1117911252 PIPE_CONF_CHECK_I(fdi_lanes);
1118011253 PIPE_CONF_CHECK_M_N(fdi_m_n);
1118111254
@@ -11207,17 +11280,17 @@ intel_pipe_config_compare(struct drm_i915_private *dev_priv, · 25 unmodified lines
1120711280 PIPE_CONF_CHECK_I(base.adjusted_mode.crtc_vsync_end);
1120811281
1120911282 PIPE_CONF_CHECK_I(pixel_multiplier);
11210− PIPE_CONF_CHECK_I(has_hdmi_sink);
11283+ PIPE_CONF_CHECK_BOOL(has_hdmi_sink);
1121111284 if ((INTEL_GEN(dev_priv) < 8 && !IS_HASWELL(dev_priv)) ||
1121211285 IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
11213− PIPE_CONF_CHECK_I(limited_color_range);
11286+ PIPE_CONF_CHECK_BOOL(limited_color_range);
1121411287
11215− PIPE_CONF_CHECK_I(hdmi_scrambling);
11216− PIPE_CONF_CHECK_I(hdmi_high_tmds_clock_ratio);
11217− PIPE_CONF_CHECK_I(has_infoframe);
11218− PIPE_CONF_CHECK_I(ycbcr420);
11288+ PIPE_CONF_CHECK_BOOL(hdmi_scrambling);
11289+ PIPE_CONF_CHECK_BOOL(hdmi_high_tmds_clock_ratio);
11290+ PIPE_CONF_CHECK_BOOL_INCOMPLETE(has_infoframe);
11291+ PIPE_CONF_CHECK_BOOL(ycbcr420);
1121911292
11220− PIPE_CONF_CHECK_I(has_audio);
11293+ PIPE_CONF_CHECK_BOOL_INCOMPLETE(has_audio);
1122111294
1122211295 PIPE_CONF_CHECK_FLAGS(base.adjusted_mode.flags,
1122311296 DRM_MODE_FLAG_INTERLACE);
@@ -11243,7 +11316,7 @@ intel_pipe_config_compare(struct drm_i915_private *dev_priv, · 19 unmodified lines
1124311316 PIPE_CONF_CHECK_I(pipe_src_w);
1124411317 PIPE_CONF_CHECK_I(pipe_src_h);
1124511318
11246− PIPE_CONF_CHECK_I(pch_pfit.enabled);
11319+ PIPE_CONF_CHECK_BOOL(pch_pfit.enabled);
1124711320 if (current_config->pch_pfit.enabled) {
1124811321 PIPE_CONF_CHECK_X(pch_pfit.pos);
1124911322 PIPE_CONF_CHECK_X(pch_pfit.size);
@@ -11253,11 +11326,7 @@ intel_pipe_config_compare(struct drm_i915_private *dev_priv, · 3 unmodified lines
1125311326 PIPE_CONF_CHECK_CLOCK_FUZZY(pixel_rate);
1125411327 }
1125511328
11256− /* BDW+ don't expose a synchronous way to read the state */
11257− if (IS_HASWELL(dev_priv))
11258− PIPE_CONF_CHECK_I(ips_enabled);
11259−
11260− PIPE_CONF_CHECK_I(double_wide);
11329+ PIPE_CONF_CHECK_BOOL(double_wide);
1126111330
1126211331 PIPE_CONF_CHECK_P(shared_dpll);
1126311332 PIPE_CONF_CHECK_X(dpll_hw_state.dpll);
@@ -11291,8 +11360,12 @@ intel_pipe_config_compare(struct drm_i915_private *dev_priv, · 27 unmodified lines
1129111360 PIPE_CONF_CHECK_CLOCK_FUZZY(base.adjusted_mode.crtc_clock);
1129211361 PIPE_CONF_CHECK_CLOCK_FUZZY(port_clock);
1129311362
11363+ PIPE_CONF_CHECK_I(min_voltage_level);
11364+
1129411365 #undef PIPE_CONF_CHECK_X
1129511366 #undef PIPE_CONF_CHECK_I
11367+#undef PIPE_CONF_CHECK_BOOL
11368+#undef PIPE_CONF_CHECK_BOOL_INCOMPLETE
1129611369 #undef PIPE_CONF_CHECK_P
1129711370 #undef PIPE_CONF_CHECK_FLAGS
1129811371 #undef PIPE_CONF_CHECK_CLOCK_FUZZY
@@ -11559,10 +11632,8 @@ verify_crtc_state(struct drm_crtc *crtc, · 260 unmodified lines
1155911632 "Encoder connected to wrong pipe %c\n",
1156011633 pipe_name(pipe));
1156111634
11562− if (active) {
11563− pipe_config->output_types |= 1 << encoder->type;
11635+ if (active)
1156411636 encoder->get_config(encoder, pipe_config);
11565− }
1156611637 }
1156711638
1156811639 intel_crtc_compute_pixel_rate(pipe_config);
@@ -11933,16 +12004,16 @@ static int intel_modeset_checks(struct drm_atomic_state *state) · 364 unmodified lines
1193312004 * holding all the crtc locks, even if we don't end up
1193412005 * touching the hardware
1193512006 */
11936− if (!intel_cdclk_state_compare(&dev_priv->cdclk.logical,
11937− &intel_state->cdclk.logical)) {
12007+ if (intel_cdclk_changed(&dev_priv->cdclk.logical,
12008+ &intel_state->cdclk.logical)) {
1193812009 ret = intel_lock_all_pipes(state);
1193912010 if (ret < 0)
1194012011 return ret;
1194112012 }
1194212013
1194312014 /* All pipes must be switched off while we change the cdclk. */
11944− if (!intel_cdclk_state_compare(&dev_priv->cdclk.actual,
11945− &intel_state->cdclk.actual)) {
12015+ if (intel_cdclk_needs_modeset(&dev_priv->cdclk.actual,
12016+ &intel_state->cdclk.actual)) {
1194612017 ret = intel_modeset_all_pipes(state);
1194712018 if (ret < 0)
1194812019 return ret;
@@ -11951,6 +12022,9 @@ static int intel_modeset_checks(struct drm_atomic_state *state) · 2 unmodified lines
1195112022 DRM_DEBUG_KMS("New cdclk calculated to be logical %u kHz, actual %u kHz\n",
1195212023 intel_state->cdclk.logical.cdclk,
1195312024 intel_state->cdclk.actual.cdclk);
12025+ DRM_DEBUG_KMS("New voltage level calculated to be logical %u, actual %u\n",
12026+ intel_state->cdclk.logical.voltage_level,
12027+ intel_state->cdclk.actual.voltage_level);
1195412028 } else {
1195512029 to_intel_atomic_state(state)->cdclk.logical = dev_priv->cdclk.logical;
1195612030 }
@@ -12519,6 +12593,9 @@ static int intel_atomic_commit(struct drm_device *dev, · 562 unmodified lines
1251912593 if (intel_state->modeset) {
1252012594 memcpy(dev_priv->min_cdclk, intel_state->min_cdclk,
1252112595 sizeof(intel_state->min_cdclk));
12596+ memcpy(dev_priv->min_voltage_level,
12597+ intel_state->min_voltage_level,
12598+ sizeof(intel_state->min_voltage_level));
1252212599 dev_priv->active_crtcs = intel_state->active_crtcs;
1252312600 dev_priv->cdclk.logical = intel_state->cdclk.logical;
1252412601 dev_priv->cdclk.actual = intel_state->cdclk.actual;
@@ -12756,7 +12833,7 @@ skl_max_scale(struct intel_crtc *intel_crtc, struct intel_crtc_state *crtc_state · 231 unmodified lines
1275612833 crtc_clock = crtc_state->base.adjusted_mode.crtc_clock;
1275712834 max_dotclk = to_intel_atomic_state(crtc_state->base.state)->cdclk.logical.cdclk;
1275812835
12759− if (IS_GEMINILAKE(dev_priv))
12836+ if (IS_GEMINILAKE(dev_priv) || INTEL_GEN(dev_priv) >= 10)
1276012837 max_dotclk *= 2;
1276112838
1276212839 if (WARN_ON_ONCE(!crtc_clock || max_dotclk < crtc_clock))
@@ -12820,6 +12897,9 @@ intel_check_primary_plane(struct intel_plane *plane, · 57 unmodified lines
1282012897 state->ctl = i9xx_plane_ctl(crtc_state, state);
1282112898 }
1282212899
12900+ if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
12901+ state->color_ctl = glk_plane_color_ctl(crtc_state, state);
12902+
1282312903 return 0;
1282412904 }
1282512905
@@ -12864,6 +12944,7 @@ out: · 38 unmodified lines
1286412944 static void intel_finish_crtc_commit(struct drm_crtc *crtc,
1286512945 struct drm_crtc_state *old_crtc_state)
1286612946 {
12947+ struct drm_i915_private *dev_priv = to_i915(crtc->dev);
1286712948 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1286812949 struct intel_atomic_state *old_intel_state =
1286912950 to_intel_atomic_state(old_crtc_state->state);
@@ -12871,6 +12952,20 @@ static void intel_finish_crtc_commit(struct drm_crtc *crtc, · 1 unmodified line
1287112952 intel_atomic_get_new_crtc_state(old_intel_state, intel_crtc);
1287212953
1287312954 intel_pipe_update_end(new_crtc_state);
12955+
12956+ if (new_crtc_state->update_pipe &&
12957+ !needs_modeset(&new_crtc_state->base) &&
12958+ old_crtc_state->mode.private_flags & I915_MODE_FLAG_INHERITED) {
12959+ if (!IS_GEN2(dev_priv))
12960+ intel_set_cpu_fifo_underrun_reporting(dev_priv, intel_crtc->pipe, true);
12961+
12962+ if (new_crtc_state->has_pch_encoder) {
12963+ enum pipe pch_transcoder =
12964+ intel_crtc_pch_transcoder(intel_crtc);
12965+
12966+ intel_set_pch_fifo_underrun_reporting(dev_priv, pch_transcoder, true);
12967+ }
12968+ }
1287412969 }
1287512970
1287612971 /**
@@ -14352,6 +14447,7 @@ void intel_modeset_init_hw(struct drm_device *dev) · 1475 unmodified lines
1435214447 struct drm_i915_private *dev_priv = to_i915(dev);
1435314448
1435414449 intel_update_cdclk(dev_priv);
14450+ intel_dump_cdclk_state(&dev_priv->cdclk.hw, "Current CDCLK");
1435514451 dev_priv->cdclk.logical = dev_priv->cdclk.actual = dev_priv->cdclk.hw;
1435614452 }
1435714453
@@ -14431,6 +14527,8 @@ retry: · 73 unmodified lines
1443114527
1443214528 cs->wm.need_postvbl_update = true;
1443314529 dev_priv->display.optimize_watermarks(intel_state, cs);
14530+
14531+ to_intel_crtc_state(crtc->state)->wm = cs->wm;
1443414532 }
1443514533
1443614534 put_state:
@@ -14440,6 +14538,22 @@ fail: · 3 unmodified lines
1444014538 drm_modeset_acquire_fini(&ctx);
1444114539 }
1444214540
14541+static void intel_update_fdi_pll_freq(struct drm_i915_private *dev_priv)
14542+{
14543+ if (IS_GEN5(dev_priv)) {
14544+ u32 fdi_pll_clk =
14545+ I915_READ(FDI_PLL_BIOS_0) & FDI_PLL_FB_CLOCK_MASK;
14546+
14547+ dev_priv->fdi_pll_freq = (fdi_pll_clk + 2) * 10000;
14548+ } else if (IS_GEN6(dev_priv) || IS_IVYBRIDGE(dev_priv)) {
14549+ dev_priv->fdi_pll_freq = 270000;
14550+ } else {
14551+ return;
14552+ }
14553+
14554+ DRM_DEBUG_DRIVER("FDI PLL freq=%d\n", dev_priv->fdi_pll_freq);
14555+}
14556+
1444314557 int intel_modeset_init(struct drm_device *dev)
1444414558 {
1444514559 struct drm_i915_private *dev_priv = to_i915(dev);
@@ -14527,6 +14641,7 @@ int intel_modeset_init(struct drm_device *dev) · 81 unmodified lines
1452714641 }
1452814642
1452914643 intel_shared_dpll_init(dev);
14644+ intel_update_fdi_pll_freq(dev_priv);
1453014645
1453114646 intel_update_czclk(dev_priv);
1453214647 intel_modeset_init_hw(dev);
@@ -14716,7 +14831,7 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc, · 183 unmodified lines
1471614831 enum transcoder cpu_transcoder = crtc->config->cpu_transcoder;
1471714832
1471814833 /* Clear any frame start delays used for debugging left by the BIOS */
14719− if (!transcoder_is_dsi(cpu_transcoder)) {
14834+ if (crtc->active && !transcoder_is_dsi(cpu_transcoder)) {
1472014835 i915_reg_t reg = PIPECONF(cpu_transcoder);
1472114836
1472214837 I915_WRITE(reg,
@@ -14949,7 +15064,6 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev) · 226 unmodified lines
1494915064 crtc_state = to_intel_crtc_state(crtc->base.state);
1495015065
1495115066 encoder->base.crtc = &crtc->base;
14952− crtc_state->output_types |= 1 << encoder->type;
1495315067 encoder->get_config(encoder, crtc_state);
1495415068 } else {
1495515069 encoder->base.crtc = NULL;
@@ -15028,6 +15142,8 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev) · 72 unmodified lines
1502815142 }
1502915143
1503015144 dev_priv->min_cdclk[crtc->pipe] = min_cdclk;
15145+ dev_priv->min_voltage_level[crtc->pipe] =
15146+ crtc_state->min_voltage_level;
1503115147
1503215148 intel_pipe_config_sanity_check(dev_priv, crtc_state);
1503315149 }
@@ -15051,6 +15167,23 @@ get_encoder_power_domains(struct drm_i915_private *dev_priv) · 17 unmodified lines
1505115167 }
1505215168 }
1505315169
15170+static void intel_early_display_was(struct drm_i915_private *dev_priv)
15171+{
15172+ /* Display WA #1185 WaDisableDARBFClkGating:cnl,glk */
15173+ if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
15174+ I915_WRITE(GEN9_CLKGATE_DIS_0, I915_READ(GEN9_CLKGATE_DIS_0) |
15175+ DARBF_GATING_DIS);
15176+
15177+ if (IS_HASWELL(dev_priv)) {
15178+ /*
15179+ * WaRsPkgCStateDisplayPMReq:hsw
15180+ * System hang if this isn't done before disabling all planes!
15181+ */
15182+ I915_WRITE(CHICKEN_PAR1_1,
15183+ I915_READ(CHICKEN_PAR1_1) | FORCE_ARB_IDLE_PLANES);
15184+ }
15185+}
15186+
1505415187 /* Scan out the current hw modeset state,
1505515188 * and sanitizes it to the current state
1505615189 */
@@ -15064,15 +15197,7 @@ intel_modeset_setup_hw_state(struct drm_device *dev, · 7 unmodified lines
1506415197 struct intel_encoder *encoder;
1506515198 int i;
1506615199
15067− if (IS_HASWELL(dev_priv)) {
15068− /*
15069− * WaRsPkgCStateDisplayPMReq:hsw
15070− * System hang if this isn't done before disabling all planes!
15071− */
15072− I915_WRITE(CHICKEN_PAR1_1,
15073− I915_READ(CHICKEN_PAR1_1) | FORCE_ARB_IDLE_PLANES);
15074− }
15075−
15200+ intel_early_display_was(dev_priv);
1507615201 intel_modeset_readout_hw_state(dev);
1507715202
1507815203 /* HW state is read out, now we need to sanitize this mess. */
@@ -15164,17 +15289,6 @@ void intel_display_resume(struct drm_device *dev) · 85 unmodified lines
1516415289 drm_atomic_state_put(state);
1516515290 }
1516615291
15167−void intel_modeset_gem_init(struct drm_device *dev)
15168−{
15169− struct drm_i915_private *dev_priv = to_i915(dev);
15170−
15171− intel_init_gt_powersave(dev_priv);
15172−
15173− intel_init_clock_gating(dev_priv);
15174−
15175− intel_setup_overlay(dev_priv);
15176−}
15177−
1517815292 int intel_connector_register(struct drm_connector *connector)
1517915293 {
1518015294 struct intel_connector *intel_connector = to_intel_connector(connector);
drivers/gpu/drm/i915/intel_dp.c+238−278
@@ -129,11 +129,13 @@ static struct intel_dp *intel_attached_dp(struct drm_connector *connector) · 128 unmodified lines
129129 return enc_to_intel_dp(&intel_attached_encoder(connector)->base);
130130 }
131131
132−static void intel_dp_link_down(struct intel_dp *intel_dp);
132+static void intel_dp_link_down(struct intel_encoder *encoder,
133+ const struct intel_crtc_state *old_crtc_state);
133134 static bool edp_panel_vdd_on(struct intel_dp *intel_dp);
134135 static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync);
135−static void vlv_init_panel_power_sequencer(struct intel_dp *intel_dp);
136−static void vlv_steal_power_sequencer(struct drm_device *dev,
136+static void vlv_init_panel_power_sequencer(struct intel_encoder *encoder,
137+ const struct intel_crtc_state *crtc_state);
138+static void vlv_steal_power_sequencer(struct drm_i915_private *dev_priv,
137139 enum pipe pipe);
138140 static void intel_dp_unset_edid(struct intel_dp *intel_dp);
139141
@@ -221,7 +223,7 @@ intel_dp_set_source_rates(struct intel_dp *intel_dp) · 81 unmodified lines
221223 {
222224 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
223225 struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
224− enum port port = dig_port->port;
226+ enum port port = dig_port->base.port;
225227 const int *source_rates;
226228 int size;
227229 u32 voltage;
@@ -427,24 +429,19 @@ static void intel_dp_unpack_aux(uint32_t src, uint8_t *dst, int dst_bytes) · 199 unmodified lines
427429 }
428430
429431 static void
430−intel_dp_init_panel_power_sequencer(struct drm_device *dev,
431− struct intel_dp *intel_dp);
432+intel_dp_init_panel_power_sequencer(struct intel_dp *intel_dp);
432433 static void
433−intel_dp_init_panel_power_sequencer_registers(struct drm_device *dev,
434− struct intel_dp *intel_dp,
434+intel_dp_init_panel_power_sequencer_registers(struct intel_dp *intel_dp,
435435 bool force_disable_vdd);
436436 static void
437−intel_dp_pps_init(struct drm_device *dev, struct intel_dp *intel_dp);
437+intel_dp_pps_init(struct intel_dp *intel_dp);
438438
439439 static void pps_lock(struct intel_dp *intel_dp)
440440 {
441− struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
442− struct intel_encoder *encoder = &intel_dig_port->base;
443− struct drm_device *dev = encoder->base.dev;
444− struct drm_i915_private *dev_priv = to_i915(dev);
441+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
445442
446443 /*
447− * See vlv_power_sequencer_reset() why we need
444+ * See intel_power_sequencer_reset() why we need
448445 * a power domain reference here.
449446 */
450447 intel_display_power_get(dev_priv, intel_dp->aux_power_domain);
@@ -454,10 +451,7 @@ static void pps_lock(struct intel_dp *intel_dp) · 3 unmodified lines
454451
455452 static void pps_unlock(struct intel_dp *intel_dp)
456453 {
457− struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
458− struct intel_encoder *encoder = &intel_dig_port->base;
459− struct drm_device *dev = encoder->base.dev;
460− struct drm_i915_private *dev_priv = to_i915(dev);
454+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
461455
462456 mutex_unlock(&dev_priv->pps_mutex);
463457
@@ -467,8 +461,8 @@ static void pps_unlock(struct intel_dp *intel_dp) · 3 unmodified lines
467461 static void
468462 vlv_power_sequencer_kick(struct intel_dp *intel_dp)
469463 {
464+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
470465 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
471− struct drm_i915_private *dev_priv = to_i915(intel_dig_port->base.base.dev);
472466 enum pipe pipe = intel_dp->pps_pipe;
473467 bool pll_enabled, release_cl_override = false;
474468 enum dpio_phy phy = DPIO_PHY(pipe);
@@ -477,11 +471,11 @@ vlv_power_sequencer_kick(struct intel_dp *intel_dp) · 2 unmodified lines
477471
478472 if (WARN(I915_READ(intel_dp->output_reg) & DP_PORT_EN,
479473 "skipping pipe %c power seqeuncer kick due to port %c being active\n",
480− pipe_name(pipe), port_name(intel_dig_port->port)))
474+ pipe_name(pipe), port_name(intel_dig_port->base.port)))
481475 return;
482476
483477 DRM_DEBUG_KMS("kicking pipe %c power sequencer for port %c\n",
484− pipe_name(pipe), port_name(intel_dig_port->port));
478+ pipe_name(pipe), port_name(intel_dig_port->base.port));
485479
486480 /* Preserve the BIOS-computed detected bit. This is
487481 * supposed to be read-only.
@@ -578,9 +572,8 @@ static enum pipe vlv_find_free_pps(struct drm_i915_private *dev_priv) · 90 unmodified lines
578572 static enum pipe
579573 vlv_power_sequencer_pipe(struct intel_dp *intel_dp)
580574 {
575+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
581576 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
582− struct drm_device *dev = intel_dig_port->base.base.dev;
583− struct drm_i915_private *dev_priv = to_i915(dev);
584577 enum pipe pipe;
585578
586579 lockdep_assert_held(&dev_priv->pps_mutex);
@@ -603,16 +596,16 @@ vlv_power_sequencer_pipe(struct intel_dp *intel_dp) · 16 unmodified lines
603596 if (WARN_ON(pipe == INVALID_PIPE))
604597 pipe = PIPE_A;
605598
606− vlv_steal_power_sequencer(dev, pipe);
599+ vlv_steal_power_sequencer(dev_priv, pipe);
607600 intel_dp->pps_pipe = pipe;
608601
609602 DRM_DEBUG_KMS("picked pipe %c power sequencer for port %c\n",
610603 pipe_name(intel_dp->pps_pipe),
611− port_name(intel_dig_port->port));
604+ port_name(intel_dig_port->base.port));
612605
613606 /* init power sequencer on this pipe and port */
614− intel_dp_init_panel_power_sequencer(dev, intel_dp);
615− intel_dp_init_panel_power_sequencer_registers(dev, intel_dp, true);
607+ intel_dp_init_panel_power_sequencer(intel_dp);
608+ intel_dp_init_panel_power_sequencer_registers(intel_dp, true);
616609
617610 /*
618611 * Even vdd force doesn't work until we've made
@@ -626,9 +619,7 @@ vlv_power_sequencer_pipe(struct intel_dp *intel_dp) · 7 unmodified lines
626619 static int
627620 bxt_power_sequencer_idx(struct intel_dp *intel_dp)
628621 {
629− struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
630− struct drm_device *dev = intel_dig_port->base.base.dev;
631− struct drm_i915_private *dev_priv = to_i915(dev);
622+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
632623
633624 lockdep_assert_held(&dev_priv->pps_mutex);
634625
@@ -649,7 +640,7 @@ bxt_power_sequencer_idx(struct intel_dp *intel_dp) · 14 unmodified lines
649640 * Only the HW needs to be reprogrammed, the SW state is fixed and
650641 * has been setup during connector init.
651642 */
652− intel_dp_init_panel_power_sequencer_registers(dev, intel_dp, false);
643+ intel_dp_init_panel_power_sequencer_registers(intel_dp, false);
653644
654645 return 0;
655646 }
@@ -701,10 +692,9 @@ vlv_initial_pps_pipe(struct drm_i915_private *dev_priv, · 45 unmodified lines
701692 static void
702693 vlv_initial_power_sequencer_setup(struct intel_dp *intel_dp)
703694 {
695+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
704696 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
705− struct drm_device *dev = intel_dig_port->base.base.dev;
706− struct drm_i915_private *dev_priv = to_i915(dev);
707− enum port port = intel_dig_port->port;
697+ enum port port = intel_dig_port->base.port;
708698
709699 lockdep_assert_held(&dev_priv->pps_mutex);
710700
@@ -731,13 +721,12 @@ vlv_initial_power_sequencer_setup(struct intel_dp *intel_dp) · 20 unmodified lines
731721 DRM_DEBUG_KMS("initial power sequencer for port %c: pipe %c\n",
732722 port_name(port), pipe_name(intel_dp->pps_pipe));
733723
734− intel_dp_init_panel_power_sequencer(dev, intel_dp);
735− intel_dp_init_panel_power_sequencer_registers(dev, intel_dp, false);
724+ intel_dp_init_panel_power_sequencer(intel_dp);
725+ intel_dp_init_panel_power_sequencer_registers(intel_dp, false);
736726 }
737727
738728 void intel_power_sequencer_reset(struct drm_i915_private *dev_priv)
739729 {
740− struct drm_device *dev = &dev_priv->drm;
741730 struct intel_encoder *encoder;
742731
743732 if (WARN_ON(!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv) &&
@@ -754,15 +743,20 @@ void intel_power_sequencer_reset(struct drm_i915_private *dev_priv) · 10 unmodified lines
754743 * should use them always.
755744 */
756745
757− for_each_intel_encoder(dev, encoder) {
746+ for_each_intel_encoder(&dev_priv->drm, encoder) {
758747 struct intel_dp *intel_dp;
759748
760749 if (encoder->type != INTEL_OUTPUT_DP &&
761− encoder->type != INTEL_OUTPUT_EDP)
750+ encoder->type != INTEL_OUTPUT_EDP &&
751+ encoder->type != INTEL_OUTPUT_DDI)
762752 continue;
763753
764754 intel_dp = enc_to_intel_dp(&encoder->base);
765755
756+ /* Skip pure DVI/HDMI DDI encoders */
757+ if (!i915_mmio_reg_valid(intel_dp->output_reg))
758+ continue;
759+
766760 WARN_ON(intel_dp->active_pipe != INVALID_PIPE);
767761
768762 if (encoder->type != INTEL_OUTPUT_EDP)
@@ -783,10 +777,10 @@ struct pps_registers { · 14 unmodified lines
783777 i915_reg_t pp_div;
784778 };
785779
786−static void intel_pps_get_registers(struct drm_i915_private *dev_priv,
787− struct intel_dp *intel_dp,
780+static void intel_pps_get_registers(struct intel_dp *intel_dp,
788781 struct pps_registers *regs)
789782 {
783+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
790784 int pps_idx = 0;
791785
792786 memset(regs, 0, sizeof(*regs));
@@ -809,8 +803,7 @@ _pp_ctrl_reg(struct intel_dp *intel_dp) · 16 unmodified lines
809803 {
810804 struct pps_registers regs;
811805
812− intel_pps_get_registers(to_i915(intel_dp_to_dev(intel_dp)), intel_dp,
813− &regs);
806+ intel_pps_get_registers(intel_dp, &regs);
814807
815808 return regs.pp_ctrl;
816809 }
@@ -820,8 +813,7 @@ _pp_stat_reg(struct intel_dp *intel_dp) · 3 unmodified lines
820813 {
821814 struct pps_registers regs;
822815
823− intel_pps_get_registers(to_i915(intel_dp_to_dev(intel_dp)), intel_dp,
824− &regs);
816+ intel_pps_get_registers(intel_dp, &regs);
825817
826818 return regs.pp_stat;
827819 }
@@ -833,8 +825,7 @@ static int edp_notify_handler(struct notifier_block *this, unsigned long code, · 5 unmodified lines
833825 {
834826 struct intel_dp *intel_dp = container_of(this, typeof(* intel_dp),
835827 edp_notifier);
836− struct drm_device *dev = intel_dp_to_dev(intel_dp);
837− struct drm_i915_private *dev_priv = to_i915(dev);
828+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
838829
839830 if (!intel_dp_is_edp(intel_dp) || code != SYS_RESTART)
840831 return 0;
@@ -864,8 +855,7 @@ static int edp_notify_handler(struct notifier_block *this, unsigned long code, · 23 unmodified lines
864855
865856 static bool edp_have_panel_power(struct intel_dp *intel_dp)
866857 {
867− struct drm_device *dev = intel_dp_to_dev(intel_dp);
868− struct drm_i915_private *dev_priv = to_i915(dev);
858+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
869859
870860 lockdep_assert_held(&dev_priv->pps_mutex);
871861
@@ -878,8 +868,7 @@ static bool edp_have_panel_power(struct intel_dp *intel_dp) · 6 unmodified lines
878868
879869 static bool edp_have_panel_vdd(struct intel_dp *intel_dp)
880870 {
881− struct drm_device *dev = intel_dp_to_dev(intel_dp);
882− struct drm_i915_private *dev_priv = to_i915(dev);
871+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
883872
884873 lockdep_assert_held(&dev_priv->pps_mutex);
885874
@@ -893,8 +882,7 @@ static bool edp_have_panel_vdd(struct intel_dp *intel_dp) · 7 unmodified lines
893882 static void
894883 intel_dp_check_edp(struct intel_dp *intel_dp)
895884 {
896− struct drm_device *dev = intel_dp_to_dev(intel_dp);
897− struct drm_i915_private *dev_priv = to_i915(dev);
885+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
898886
899887 if (!intel_dp_is_edp(intel_dp))
900888 return;
@@ -910,9 +898,7 @@ intel_dp_check_edp(struct intel_dp *intel_dp) · 9 unmodified lines
910898 static uint32_t
911899 intel_dp_aux_wait_done(struct intel_dp *intel_dp, bool has_aux_irq)
912900 {
913− struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
914− struct drm_device *dev = intel_dig_port->base.base.dev;
915− struct drm_i915_private *dev_priv = to_i915(dev);
901+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
916902 i915_reg_t ch_ctl = intel_dp->aux_ch_ctl_reg;
917903 uint32_t status;
918904 bool done;
@@ -959,7 +945,7 @@ static uint32_t ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index) · 40 unmodified lines
959945 * like to run at 2MHz. So, take the cdclk or PCH rawclk value and
960946 * divide by 2000 and use that
961947 */
962− if (intel_dig_port->port == PORT_A)
948+ if (intel_dig_port->base.port == PORT_A)
963949 return DIV_ROUND_CLOSEST(dev_priv->cdclk.hw.cdclk, 2000);
964950 else
965951 return DIV_ROUND_CLOSEST(dev_priv->rawclk_freq, 2000);
@@ -970,7 +956,7 @@ static uint32_t hsw_get_aux_clock_divider(struct intel_dp *intel_dp, int index) · 4 unmodified lines
970956 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
971957 struct drm_i915_private *dev_priv = to_i915(intel_dig_port->base.base.dev);
972958
973− if (intel_dig_port->port != PORT_A && HAS_PCH_LPT_H(dev_priv)) {
959+ if (intel_dig_port->base.port != PORT_A && HAS_PCH_LPT_H(dev_priv)) {
974960 /* Workaround for non-ULT HSW */
975961 switch (index) {
976962 case 0: return 63;
@@ -1440,7 +1426,7 @@ static void intel_aux_reg_init(struct intel_dp *intel_dp) · 463 unmodified lines
14401426 {
14411427 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
14421428 enum port port = intel_aux_port(dev_priv,
1443− dp_to_dig_port(intel_dp)->port);
1429+ dp_to_dig_port(intel_dp)->base.port);
14441430 int i;
14451431
14461432 intel_dp->aux_ch_ctl_reg = intel_aux_ctl_reg(dev_priv, port);
@@ -1458,7 +1444,7 @@ static void · 11 unmodified lines
14581444 intel_dp_aux_init(struct intel_dp *intel_dp)
14591445 {
14601446 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
1461− enum port port = intel_dig_port->port;
1447+ enum port port = intel_dig_port->base.port;
14621448
14631449 intel_aux_reg_init(intel_dp);
14641450 drm_dp_aux_init(&intel_dp->aux);
@@ -1479,8 +1465,7 @@ static void · 14 unmodified lines
14791465 intel_dp_set_clock(struct intel_encoder *encoder,
14801466 struct intel_crtc_state *pipe_config)
14811467 {
1482− struct drm_device *dev = encoder->base.dev;
1483− struct drm_i915_private *dev_priv = to_i915(dev);
1468+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
14841469 const struct dp_link_dpll *divisor = NULL;
14851470 int i, count = 0;
14861471
@@ -1628,7 +1613,7 @@ intel_dp_compute_config(struct intel_encoder *encoder, · 141 unmodified lines
16281613 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
16291614 struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
16301615 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
1631− enum port port = dp_to_dig_port(intel_dp)->port;
1616+ enum port port = encoder->port;
16321617 struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->base.crtc);
16331618 struct intel_connector *intel_connector = intel_dp->attached_connector;
16341619 struct intel_digital_connector_state *intel_conn_state =
@@ -1849,11 +1834,10 @@ void intel_dp_set_link_params(struct intel_dp *intel_dp, · 214 unmodified lines
18491834 static void intel_dp_prepare(struct intel_encoder *encoder,
18501835 const struct intel_crtc_state *pipe_config)
18511836 {
1852− struct drm_device *dev = encoder->base.dev;
1853− struct drm_i915_private *dev_priv = to_i915(dev);
1837+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
18541838 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
1855− enum port port = dp_to_dig_port(intel_dp)->port;
1856− struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
1839+ enum port port = encoder->port;
1840+ struct intel_crtc *crtc = to_intel_crtc(pipe_config->base.crtc);
18571841 const struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
18581842
18591843 intel_dp_set_link_params(intel_dp, pipe_config->port_clock,
@@ -1940,20 +1924,18 @@ static void intel_dp_prepare(struct intel_encoder *encoder, · 80 unmodified lines
19401924 #define IDLE_CYCLE_MASK (PP_ON | PP_SEQUENCE_MASK | PP_CYCLE_DELAY_ACTIVE | PP_SEQUENCE_STATE_MASK)
19411925 #define IDLE_CYCLE_VALUE (0 | PP_SEQUENCE_NONE | 0 | PP_SEQUENCE_STATE_OFF_IDLE)
19421926
1943−static void intel_pps_verify_state(struct drm_i915_private *dev_priv,
1944− struct intel_dp *intel_dp);
1927+static void intel_pps_verify_state(struct intel_dp *intel_dp);
19451928
19461929 static void wait_panel_status(struct intel_dp *intel_dp,
19471930 u32 mask,
19481931 u32 value)
19491932 {
1950− struct drm_device *dev = intel_dp_to_dev(intel_dp);
1951− struct drm_i915_private *dev_priv = to_i915(dev);
1933+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
19521934 i915_reg_t pp_stat_reg, pp_ctrl_reg;
19531935
19541936 lockdep_assert_held(&dev_priv->pps_mutex);
19551937
1956− intel_pps_verify_state(dev_priv, intel_dp);
1938+ intel_pps_verify_state(intel_dp);
19571939
19581940 pp_stat_reg = _pp_stat_reg(intel_dp);
19591941 pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
@@ -2024,8 +2006,7 @@ static void edp_wait_backlight_off(struct intel_dp *intel_dp) · 64 unmodified lines
20242006
20252007 static u32 ironlake_get_pp_control(struct intel_dp *intel_dp)
20262008 {
2027− struct drm_device *dev = intel_dp_to_dev(intel_dp);
2028− struct drm_i915_private *dev_priv = to_i915(dev);
2009+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
20292010 u32 control;
20302011
20312012 lockdep_assert_held(&dev_priv->pps_mutex);
@@ -2046,9 +2027,8 @@ static u32 ironlake_get_pp_control(struct intel_dp *intel_dp) · 14 unmodified lines
20462027 */
20472028 static bool edp_panel_vdd_on(struct intel_dp *intel_dp)
20482029 {
2049− struct drm_device *dev = intel_dp_to_dev(intel_dp);
2030+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
20502031 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
2051− struct drm_i915_private *dev_priv = to_i915(dev);
20522032 u32 pp;
20532033 i915_reg_t pp_stat_reg, pp_ctrl_reg;
20542034 bool need_to_disable = !intel_dp->want_panel_vdd;
@@ -2067,7 +2047,7 @@ static bool edp_panel_vdd_on(struct intel_dp *intel_dp) · 12 unmodified lines
20672047 intel_display_power_get(dev_priv, intel_dp->aux_power_domain);
20682048
20692049 DRM_DEBUG_KMS("Turning eDP port %c VDD on\n",
2070− port_name(intel_dig_port->port));
2050+ port_name(intel_dig_port->base.port));
20712051
20722052 if (!edp_have_panel_power(intel_dp))
20732053 wait_panel_power_cycle(intel_dp);
@@ -2087,7 +2067,7 @@ static bool edp_panel_vdd_on(struct intel_dp *intel_dp) · 13 unmodified lines
20872067 */
20882068 if (!edp_have_panel_power(intel_dp)) {
20892069 DRM_DEBUG_KMS("eDP port %c panel power wasn't enabled\n",
2090− port_name(intel_dig_port->port));
2070+ port_name(intel_dig_port->base.port));
20912071 msleep(intel_dp->panel_power_up_delay);
20922072 }
20932073
@@ -2113,13 +2093,12 @@ void intel_edp_panel_vdd_on(struct intel_dp *intel_dp) · 19 unmodified lines
21132093 pps_unlock(intel_dp);
21142094
21152095 I915_STATE_WARN(!vdd, "eDP port %c VDD already requested on\n",
2116− port_name(dp_to_dig_port(intel_dp)->port));
2096+ port_name(dp_to_dig_port(intel_dp)->base.port));
21172097 }
21182098
21192099 static void edp_panel_vdd_off_sync(struct intel_dp *intel_dp)
21202100 {
2121− struct drm_device *dev = intel_dp_to_dev(intel_dp);
2122− struct drm_i915_private *dev_priv = to_i915(dev);
2101+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
21232102 struct intel_digital_port *intel_dig_port =
21242103 dp_to_dig_port(intel_dp);
21252104 u32 pp;
@@ -2133,7 +2112,7 @@ static void edp_panel_vdd_off_sync(struct intel_dp *intel_dp) · 7 unmodified lines
21332112 return;
21342113
21352114 DRM_DEBUG_KMS("Turning eDP port %c VDD off\n",
2136− port_name(intel_dig_port->port));
2115+ port_name(intel_dig_port->base.port));
21372116
21382117 pp = ironlake_get_pp_control(intel_dp);
21392118 pp &= ~EDP_FORCE_VDD;
@@ -2193,7 +2172,7 @@ static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync) · 53 unmodified lines
21932172 return;
21942173
21952174 I915_STATE_WARN(!intel_dp->want_panel_vdd, "eDP port %c VDD not forced on",
2196− port_name(dp_to_dig_port(intel_dp)->port));
2175+ port_name(dp_to_dig_port(intel_dp)->base.port));
21972176
21982177 intel_dp->want_panel_vdd = false;
21992178
@@ -2205,8 +2184,7 @@ static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync) · 5 unmodified lines
22052184
22062185 static void edp_panel_on(struct intel_dp *intel_dp)
22072186 {
2208− struct drm_device *dev = intel_dp_to_dev(intel_dp);
2209− struct drm_i915_private *dev_priv = to_i915(dev);
2187+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
22102188 u32 pp;
22112189 i915_reg_t pp_ctrl_reg;
22122190
@@ -2216,11 +2194,11 @@ static void edp_panel_on(struct intel_dp *intel_dp) · 3 unmodified lines
22162194 return;
22172195
22182196 DRM_DEBUG_KMS("Turn eDP port %c panel power on\n",
2219− port_name(dp_to_dig_port(intel_dp)->port));
2197+ port_name(dp_to_dig_port(intel_dp)->base.port));
22202198
22212199 if (WARN(edp_have_panel_power(intel_dp),
22222200 "eDP port %c panel power already on\n",
2223− port_name(dp_to_dig_port(intel_dp)->port)))
2201+ port_name(dp_to_dig_port(intel_dp)->base.port)))
22242202 return;
22252203
22262204 wait_panel_power_cycle(intel_dp);
@@ -2264,8 +2242,7 @@ void intel_edp_panel_on(struct intel_dp *intel_dp) · 37 unmodified lines
22642242
22652243 static void edp_panel_off(struct intel_dp *intel_dp)
22662244 {
2267− struct drm_device *dev = intel_dp_to_dev(intel_dp);
2268− struct drm_i915_private *dev_priv = to_i915(dev);
2245+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
22692246 u32 pp;
22702247 i915_reg_t pp_ctrl_reg;
22712248
@@ -2275,10 +2252,10 @@ static void edp_panel_off(struct intel_dp *intel_dp) · 3 unmodified lines
22752252 return;
22762253
22772254 DRM_DEBUG_KMS("Turn eDP port %c panel power off\n",
2278− port_name(dp_to_dig_port(intel_dp)->port));
2255+ port_name(dp_to_dig_port(intel_dp)->base.port));
22792256
22802257 WARN(!intel_dp->want_panel_vdd, "Need eDP port %c VDD to turn off panel\n",
2281− port_name(dp_to_dig_port(intel_dp)->port));
2258+ port_name(dp_to_dig_port(intel_dp)->base.port));
22822259
22832260 pp = ironlake_get_pp_control(intel_dp);
22842261 /* We need to switch off panel power _and_ force vdd, for otherwise some
@@ -2313,9 +2290,7 @@ void intel_edp_panel_off(struct intel_dp *intel_dp) · 28 unmodified lines
23132290 /* Enable backlight in the panel power control. */
23142291 static void _intel_edp_backlight_on(struct intel_dp *intel_dp)
23152292 {
2316− struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
2317− struct drm_device *dev = intel_dig_port->base.base.dev;
2318− struct drm_i915_private *dev_priv = to_i915(dev);
2293+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
23192294 u32 pp;
23202295 i915_reg_t pp_ctrl_reg;
23212296
@@ -2358,8 +2333,7 @@ void intel_edp_backlight_on(const struct intel_crtc_state *crtc_state, · 36 unmodified lines
23582333 /* Disable backlight in the panel power control. */
23592334 static void _intel_edp_backlight_off(struct intel_dp *intel_dp)
23602335 {
2361− struct drm_device *dev = intel_dp_to_dev(intel_dp);
2362− struct drm_i915_private *dev_priv = to_i915(dev);
2336+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
23632337 u32 pp;
23642338 i915_reg_t pp_ctrl_reg;
23652339
@@ -2430,7 +2404,7 @@ static void assert_dp_port(struct intel_dp *intel_dp, bool state) · 64 unmodified lines
24302404
24312405 I915_STATE_WARN(cur_state != state,
24322406 "DP port %c state assertion failure (expected %s, current %s)\n",
2433− port_name(dig_port->port),
2407+ port_name(dig_port->base.port),
24342408 onoff(state), onoff(cur_state));
24352409 }
24362410 #define assert_dp_port_disabled(d) assert_dp_port((d), false)
@@ -2486,10 +2460,10 @@ static void ironlake_edp_pll_on(struct intel_dp *intel_dp, · 49 unmodified lines
24862460 udelay(200);
24872461 }
24882462
2489−static void ironlake_edp_pll_off(struct intel_dp *intel_dp)
2463+static void ironlake_edp_pll_off(struct intel_dp *intel_dp,
2464+ const struct intel_crtc_state *old_crtc_state)
24902465 {
2491− struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
2492− struct intel_crtc *crtc = to_intel_crtc(intel_dig_port->base.base.crtc);
2466+ struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->base.crtc);
24932467 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
24942468
24952469 assert_pipe_disabled(dev_priv, crtc->pipe);
@@ -2505,6 +2479,21 @@ static void ironlake_edp_pll_off(struct intel_dp *intel_dp) · 9 unmodified lines
25052479 udelay(200);
25062480 }
25072481
2482+static bool downstream_hpd_needs_d0(struct intel_dp *intel_dp)
2483+{
2484+ /*
2485+ * DPCD 1.2+ should support BRANCH_DEVICE_CTRL, and thus
2486+ * be capable of signalling downstream hpd with a long pulse.
2487+ * Whether or not that means D3 is safe to use is not clear,
2488+ * but let's assume so until proven otherwise.
2489+ *
2490+ * FIXME should really check all downstream ports...
2491+ */
2492+ return intel_dp->dpcd[DP_DPCD_REV] == 0x11 &&
2493+ intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] & DP_DWN_STRM_PORT_PRESENT &&
2494+ intel_dp->downstream_ports[0] & DP_DS_PORT_HPD;
2495+}
2496+
25082497 /* If the sink supports it, try to set the power state appropriately */
25092498 void intel_dp_sink_dpms(struct intel_dp *intel_dp, int mode)
25102499 {
@@ -2515,6 +2504,9 @@ void intel_dp_sink_dpms(struct intel_dp *intel_dp, int mode) · 4 unmodified lines
25152504 return;
25162505
25172506 if (mode != DRM_MODE_DPMS_ON) {
2507+ if (downstream_hpd_needs_d0(intel_dp))
2508+ return;
2509+
25182510 ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_SET_POWER,
25192511 DP_SET_POWER_D3);
25202512 } else {
@@ -2544,10 +2536,9 @@ void intel_dp_sink_dpms(struct intel_dp *intel_dp, int mode) · 23 unmodified lines
25442536 static bool intel_dp_get_hw_state(struct intel_encoder *encoder,
25452537 enum pipe *pipe)
25462538 {
2539+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
25472540 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2548− enum port port = dp_to_dig_port(intel_dp)->port;
2549− struct drm_device *dev = encoder->base.dev;
2550− struct drm_i915_private *dev_priv = to_i915(dev);
2541+ enum port port = encoder->port;
25512542 u32 tmp;
25522543 bool ret;
25532544
@@ -2596,12 +2587,16 @@ out: · 42 unmodified lines
25962587 static void intel_dp_get_config(struct intel_encoder *encoder,
25972588 struct intel_crtc_state *pipe_config)
25982589 {
2590+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
25992591 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
26002592 u32 tmp, flags = 0;
2601− struct drm_device *dev = encoder->base.dev;
2602− struct drm_i915_private *dev_priv = to_i915(dev);
2603− enum port port = dp_to_dig_port(intel_dp)->port;
2604− struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
2593+ enum port port = encoder->port;
2594+ struct intel_crtc *crtc = to_intel_crtc(pipe_config->base.crtc);
2595+
2596+ if (encoder->type == INTEL_OUTPUT_EDP)
2597+ pipe_config->output_types |= BIT(INTEL_OUTPUT_EDP);
2598+ else
2599+ pipe_config->output_types |= BIT(INTEL_OUTPUT_DP);
26052600
26062601 tmp = I915_READ(intel_dp->output_reg);
26072602
@@ -2680,7 +2675,8 @@ static void intel_disable_dp(struct intel_encoder *encoder, · 72 unmodified lines
26802675 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
26812676
26822677 if (old_crtc_state->has_audio)
2683− intel_audio_codec_disable(encoder);
2678+ intel_audio_codec_disable(encoder,
2679+ old_crtc_state, old_conn_state);
26842680
26852681 /* Make sure the panel is off before trying to change the mode. But also
26862682 * ensure that we have vdd while we switch off the panel. */
@@ -2694,12 +2690,10 @@ static void g4x_disable_dp(struct intel_encoder *encoder, · 7 unmodified lines
26942690 const struct intel_crtc_state *old_crtc_state,
26952691 const struct drm_connector_state *old_conn_state)
26962692 {
2697− struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2698−
26992693 intel_disable_dp(encoder, old_crtc_state, old_conn_state);
27002694
27012695 /* disable the port before the pipe on g4x */
2702− intel_dp_link_down(intel_dp);
2696+ intel_dp_link_down(encoder, old_crtc_state);
27032697 }
27042698
27052699 static void ilk_disable_dp(struct intel_encoder *encoder,
@@ -2725,38 +2719,34 @@ static void ilk_post_disable_dp(struct intel_encoder *encoder, · 19 unmodified lines
27252719 const struct drm_connector_state *old_conn_state)
27262720 {
27272721 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2728− enum port port = dp_to_dig_port(intel_dp)->port;
2722+ enum port port = encoder->port;
27292723
2730− intel_dp_link_down(intel_dp);
2724+ intel_dp_link_down(encoder, old_crtc_state);
27312725
27322726 /* Only ilk+ has port A */
27332727 if (port == PORT_A)
2734− ironlake_edp_pll_off(intel_dp);
2728+ ironlake_edp_pll_off(intel_dp, old_crtc_state);
27352729 }
27362730
27372731 static void vlv_post_disable_dp(struct intel_encoder *encoder,
27382732 const struct intel_crtc_state *old_crtc_state,
27392733 const struct drm_connector_state *old_conn_state)
27402734 {
2741− struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2742−
2743− intel_dp_link_down(intel_dp);
2735+ intel_dp_link_down(encoder, old_crtc_state);
27442736 }
27452737
27462738 static void chv_post_disable_dp(struct intel_encoder *encoder,
27472739 const struct intel_crtc_state *old_crtc_state,
27482740 const struct drm_connector_state *old_conn_state)
27492741 {
2750− struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2751− struct drm_device *dev = encoder->base.dev;
2752− struct drm_i915_private *dev_priv = to_i915(dev);
2742+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
27532743
2754− intel_dp_link_down(intel_dp);
2744+ intel_dp_link_down(encoder, old_crtc_state);
27552745
27562746 mutex_lock(&dev_priv->sb_lock);
27572747
27582748 /* Assert data lane reset */
2759− chv_data_lane_soft_reset(encoder, true);
2749+ chv_data_lane_soft_reset(encoder, old_crtc_state, true);
27602750
27612751 mutex_unlock(&dev_priv->sb_lock);
27622752 }
@@ -2766,10 +2756,9 @@ _intel_dp_set_link_train(struct intel_dp *intel_dp, · 3 unmodified lines
27662756 uint32_t *DP,
27672757 uint8_t dp_train_pat)
27682758 {
2759+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
27692760 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
2770− struct drm_device *dev = intel_dig_port->base.base.dev;
2771− struct drm_i915_private *dev_priv = to_i915(dev);
2772− enum port port = intel_dig_port->port;
2761+ enum port port = intel_dig_port->base.port;
27732762
27742763 if (dp_train_pat & DP_TRAINING_PATTERN_MASK)
27752764 DRM_DEBUG_KMS("Using DP training pattern TPS%d\n",
@@ -2852,8 +2841,7 @@ _intel_dp_set_link_train(struct intel_dp *intel_dp, · 76 unmodified lines
28522841 static void intel_dp_enable_port(struct intel_dp *intel_dp,
28532842 const struct intel_crtc_state *old_crtc_state)
28542843 {
2855− struct drm_device *dev = intel_dp_to_dev(intel_dp);
2856− struct drm_i915_private *dev_priv = to_i915(dev);
2844+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
28572845
28582846 /* enable with pattern 1 (as per spec) */
28592847
@@ -2877,10 +2865,9 @@ static void intel_enable_dp(struct intel_encoder *encoder, · 17 unmodified lines
28772865 const struct intel_crtc_state *pipe_config,
28782866 const struct drm_connector_state *conn_state)
28792867 {
2868+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
28802869 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2881− struct drm_device *dev = encoder->base.dev;
2882− struct drm_i915_private *dev_priv = to_i915(dev);
2883− struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
2870+ struct intel_crtc *crtc = to_intel_crtc(pipe_config->base.crtc);
28842871 uint32_t dp_reg = I915_READ(intel_dp->output_reg);
28852872 enum pipe pipe = crtc->pipe;
28862873
@@ -2890,7 +2877,7 @@ static void intel_enable_dp(struct intel_encoder *encoder, · 3 unmodified lines
28902877 pps_lock(intel_dp);
28912878
28922879 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
2893− vlv_init_panel_power_sequencer(intel_dp);
2880+ vlv_init_panel_power_sequencer(encoder, pipe_config);
28942881
28952882 intel_dp_enable_port(intel_dp, pipe_config);
28962883
@@ -2944,7 +2931,7 @@ static void g4x_pre_enable_dp(struct intel_encoder *encoder, · 47 unmodified lines
29442931 const struct drm_connector_state *conn_state)
29452932 {
29462933 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2947− enum port port = dp_to_dig_port(intel_dp)->port;
2934+ enum port port = encoder->port;
29482935
29492936 intel_dp_prepare(encoder, pipe_config);
29502937
@@ -2977,22 +2964,21 @@ static void vlv_detach_power_sequencer(struct intel_dp *intel_dp) · 26 unmodified lines
29772964 * from a port.
29782965 */
29792966 DRM_DEBUG_KMS("detaching pipe %c power sequencer from port %c\n",
2980− pipe_name(pipe), port_name(intel_dig_port->port));
2967+ pipe_name(pipe), port_name(intel_dig_port->base.port));
29812968 I915_WRITE(pp_on_reg, 0);
29822969 POSTING_READ(pp_on_reg);
29832970
29842971 intel_dp->pps_pipe = INVALID_PIPE;
29852972 }
29862973
2987−static void vlv_steal_power_sequencer(struct drm_device *dev,
2974+static void vlv_steal_power_sequencer(struct drm_i915_private *dev_priv,
29882975 enum pipe pipe)
29892976 {
2990− struct drm_i915_private *dev_priv = to_i915(dev);
29912977 struct intel_encoder *encoder;
29922978
29932979 lockdep_assert_held(&dev_priv->pps_mutex);
29942980
2995− for_each_intel_encoder(dev, encoder) {
2981+ for_each_intel_encoder(&dev_priv->drm, encoder) {
29962982 struct intel_dp *intel_dp;
29972983 enum port port;
29982984
@@ -3001,7 +2987,7 @@ static void vlv_steal_power_sequencer(struct drm_device *dev, · 2 unmodified lines
30012987 continue;
30022988
30032989 intel_dp = enc_to_intel_dp(&encoder->base);
3004− port = dp_to_dig_port(intel_dp)->port;
2990+ port = dp_to_dig_port(intel_dp)->base.port;
30052991
30062992 WARN(intel_dp->active_pipe == pipe,
30072993 "stealing pipe %c power sequencer from active (e)DP port %c\n",
@@ -3018,13 +3004,12 @@ static void vlv_steal_power_sequencer(struct drm_device *dev, · 10 unmodified lines
30183004 }
30193005 }
30203006
3021−static void vlv_init_panel_power_sequencer(struct intel_dp *intel_dp)
3007+static void vlv_init_panel_power_sequencer(struct intel_encoder *encoder,
3008+ const struct intel_crtc_state *crtc_state)
30223009 {
3023− struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
3024− struct intel_encoder *encoder = &intel_dig_port->base;
3025− struct drm_device *dev = encoder->base.dev;
3026− struct drm_i915_private *dev_priv = to_i915(dev);
3027− struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
3010+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
3011+ struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
3012+ struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
30283013
30293014 lockdep_assert_held(&dev_priv->pps_mutex);
30303015
@@ -3044,7 +3029,7 @@ static void vlv_init_panel_power_sequencer(struct intel_dp *intel_dp) · 13 unmodified lines
30443029 * We may be stealing the power
30453030 * sequencer from another port.
30463031 */
3047− vlv_steal_power_sequencer(dev, crtc->pipe);
3032+ vlv_steal_power_sequencer(dev_priv, crtc->pipe);
30483033
30493034 intel_dp->active_pipe = crtc->pipe;
30503035
@@ -3055,18 +3040,18 @@ static void vlv_init_panel_power_sequencer(struct intel_dp *intel_dp) · 4 unmodified lines
30553040 intel_dp->pps_pipe = crtc->pipe;
30563041
30573042 DRM_DEBUG_KMS("initializing pipe %c power sequencer for port %c\n",
3058− pipe_name(intel_dp->pps_pipe), port_name(intel_dig_port->port));
3043+ pipe_name(intel_dp->pps_pipe), port_name(encoder->port));
30593044
30603045 /* init power sequencer on this pipe and port */
3061− intel_dp_init_panel_power_sequencer(dev, intel_dp);
3062− intel_dp_init_panel_power_sequencer_registers(dev, intel_dp, true);
3046+ intel_dp_init_panel_power_sequencer(intel_dp);
3047+ intel_dp_init_panel_power_sequencer_registers(intel_dp, true);
30633048 }
30643049
30653050 static void vlv_pre_enable_dp(struct intel_encoder *encoder,
30663051 const struct intel_crtc_state *pipe_config,
30673052 const struct drm_connector_state *conn_state)
30683053 {
3069− vlv_phy_pre_encoder_enable(encoder);
3054+ vlv_phy_pre_encoder_enable(encoder, pipe_config);
30703055
30713056 intel_enable_dp(encoder, pipe_config, conn_state);
30723057 }
@@ -3077,14 +3062,14 @@ static void vlv_dp_pre_pll_enable(struct intel_encoder *encoder, · 4 unmodified lines
30773062 {
30783063 intel_dp_prepare(encoder, pipe_config);
30793064
3080− vlv_phy_pre_pll_enable(encoder);
3065+ vlv_phy_pre_pll_enable(encoder, pipe_config);
30813066 }
30823067
30833068 static void chv_pre_enable_dp(struct intel_encoder *encoder,
30843069 const struct intel_crtc_state *pipe_config,
30853070 const struct drm_connector_state *conn_state)
30863071 {
3087− chv_phy_pre_encoder_enable(encoder);
3072+ chv_phy_pre_encoder_enable(encoder, pipe_config);
30883073
30893074 intel_enable_dp(encoder, pipe_config, conn_state);
30903075
@@ -3098,14 +3083,14 @@ static void chv_dp_pre_pll_enable(struct intel_encoder *encoder, · 7 unmodified lines
30983083 {
30993084 intel_dp_prepare(encoder, pipe_config);
31003085
3101− chv_phy_pre_pll_enable(encoder);
3086+ chv_phy_pre_pll_enable(encoder, pipe_config);
31023087 }
31033088
31043089 static void chv_dp_post_pll_disable(struct intel_encoder *encoder,
3105− const struct intel_crtc_state *pipe_config,
3106− const struct drm_connector_state *conn_state)
3090+ const struct intel_crtc_state *old_crtc_state,
3091+ const struct drm_connector_state *old_conn_state)
31073092 {
3108− chv_phy_post_pll_disable(encoder);
3093+ chv_phy_post_pll_disable(encoder, old_crtc_state);
31093094 }
31103095
31113096 /*
@@ -3153,7 +3138,7 @@ uint8_t · 41 unmodified lines
31533138 intel_dp_voltage_max(struct intel_dp *intel_dp)
31543139 {
31553140 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
3156− enum port port = dp_to_dig_port(intel_dp)->port;
3141+ enum port port = dp_to_dig_port(intel_dp)->base.port;
31573142
31583143 if (INTEL_GEN(dev_priv) >= 9) {
31593144 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
@@ -3172,7 +3157,7 @@ uint8_t · 12 unmodified lines
31723157 intel_dp_pre_emphasis_max(struct intel_dp *intel_dp, uint8_t voltage_swing)
31733158 {
31743159 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
3175− enum port port = dp_to_dig_port(intel_dp)->port;
3160+ enum port port = dp_to_dig_port(intel_dp)->base.port;
31763161
31773162 if (INTEL_GEN(dev_priv) >= 9) {
31783163 switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
@@ -3505,10 +3490,9 @@ gen7_edp_signal_levels(uint8_t train_set) · 326 unmodified lines
35053490 void
35063491 intel_dp_set_signal_levels(struct intel_dp *intel_dp)
35073492 {
3493+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
35083494 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
3509− enum port port = intel_dig_port->port;
3510− struct drm_device *dev = intel_dig_port->base.base.dev;
3511− struct drm_i915_private *dev_priv = to_i915(dev);
3495+ enum port port = intel_dig_port->base.port;
35123496 uint32_t signal_levels, mask = 0;
35133497 uint8_t train_set = intel_dp->train_set[0];
35143498
@@ -3563,10 +3547,9 @@ intel_dp_program_link_training_pattern(struct intel_dp *intel_dp, · 48 unmodified lines
35633547
35643548 void intel_dp_set_idle_link_train(struct intel_dp *intel_dp)
35653549 {
3550+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
35663551 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
3567− struct drm_device *dev = intel_dig_port->base.base.dev;
3568− struct drm_i915_private *dev_priv = to_i915(dev);
3569− enum port port = intel_dig_port->port;
3552+ enum port port = intel_dig_port->base.port;
35703553 uint32_t val;
35713554
35723555 if (!HAS_DDI(dev_priv))
@@ -3595,13 +3578,13 @@ void intel_dp_set_idle_link_train(struct intel_dp *intel_dp) · 22 unmodified lines
35953578 }
35963579
35973580 static void
3598−intel_dp_link_down(struct intel_dp *intel_dp)
3581+intel_dp_link_down(struct intel_encoder *encoder,
3582+ const struct intel_crtc_state *old_crtc_state)
35993583 {
3600− struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
3601− struct intel_crtc *crtc = to_intel_crtc(intel_dig_port->base.base.crtc);
3602− enum port port = intel_dig_port->port;
3603− struct drm_device *dev = intel_dig_port->base.base.dev;
3604− struct drm_i915_private *dev_priv = to_i915(dev);
3584+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
3585+ struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
3586+ struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->base.crtc);
3587+ enum port port = encoder->port;
36053588 uint32_t DP = intel_dp->DP;
36063589
36073590 if (WARN_ON(HAS_DDI(dev_priv)))
@@ -3747,11 +3730,11 @@ intel_edp_init_dpcd(struct intel_dp *intel_dp) · 139 unmodified lines
37473730 if (drm_dp_dpcd_read(&intel_dp->aux, DP_EDP_DPCD_REV,
37483731 intel_dp->edp_dpcd, sizeof(intel_dp->edp_dpcd)) ==
37493732 sizeof(intel_dp->edp_dpcd))
3750− DRM_DEBUG_KMS("EDP DPCD : %*ph\n", (int) sizeof(intel_dp->edp_dpcd),
3733+ DRM_DEBUG_KMS("eDP DPCD: %*ph\n", (int) sizeof(intel_dp->edp_dpcd),
37513734 intel_dp->edp_dpcd);
37523735
3753− /* Intermediate frequency support */
3754− if (intel_dp->edp_dpcd[0] >= 0x03) { /* eDp v1.4 or higher */
3736+ /* Read the eDP 1.4+ supported link rates. */
3737+ if (intel_dp->edp_dpcd[0] >= DP_EDP_14) {
37553738 __le16 sink_rates[DP_MAX_SUPPORTED_RATES];
37563739 int i;
37573740
@@ -3775,6 +3758,10 @@ intel_edp_init_dpcd(struct intel_dp *intel_dp) · 17 unmodified lines
37753758 intel_dp->num_sink_rates = i;
37763759 }
37773760
3761+ /*
3762+ * Use DP_LINK_RATE_SET if DP_SUPPORTED_LINK_RATES are available,
3763+ * default to DP_MAX_LINK_RATE and DP_LINK_BW_SET otherwise.
3764+ */
37783765 if (intel_dp->num_sink_rates)
37793766 intel_dp->use_rate_select = true;
37803767 else
@@ -3874,11 +3861,12 @@ intel_dp_configure_mst(struct intel_dp *intel_dp) · 93 unmodified lines
38743861 intel_dp->is_mst);
38753862 }
38763863
3877−static int intel_dp_sink_crc_stop(struct intel_dp *intel_dp)
3864+static int intel_dp_sink_crc_stop(struct intel_dp *intel_dp,
3865+ struct intel_crtc_state *crtc_state, bool disable_wa)
38783866 {
38793867 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
38803868 struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
3881− struct intel_crtc *intel_crtc = to_intel_crtc(dig_port->base.base.crtc);
3869+ struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
38823870 u8 buf;
38833871 int ret = 0;
38843872 int count = 0;
@@ -3914,15 +3902,17 @@ static int intel_dp_sink_crc_stop(struct intel_dp *intel_dp) · 29 unmodified lines
39143902 }
39153903
39163904 out:
3917− hsw_enable_ips(intel_crtc);
3905+ if (disable_wa)
3906+ hsw_enable_ips(crtc_state);
39183907 return ret;
39193908 }
39203909
3921−static int intel_dp_sink_crc_start(struct intel_dp *intel_dp)
3910+static int intel_dp_sink_crc_start(struct intel_dp *intel_dp,
3911+ struct intel_crtc_state *crtc_state)
39223912 {
39233913 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
39243914 struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
3925− struct intel_crtc *intel_crtc = to_intel_crtc(dig_port->base.base.crtc);
3915+ struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
39263916 u8 buf;
39273917 int ret;
39283918
@@ -3936,16 +3926,16 @@ static int intel_dp_sink_crc_start(struct intel_dp *intel_dp) · 7 unmodified lines
39363926 return -EIO;
39373927
39383928 if (buf & DP_TEST_SINK_START) {
3939− ret = intel_dp_sink_crc_stop(intel_dp);
3929+ ret = intel_dp_sink_crc_stop(intel_dp, crtc_state, false);
39403930 if (ret)
39413931 return ret;
39423932 }
39433933
3944− hsw_disable_ips(intel_crtc);
3934+ hsw_disable_ips(crtc_state);
39453935
39463936 if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_SINK,
39473937 buf | DP_TEST_SINK_START) < 0) {
3948− hsw_enable_ips(intel_crtc);
3938+ hsw_enable_ips(crtc_state);
39493939 return -EIO;
39503940 }
39513941
@@ -3953,16 +3943,16 @@ static int intel_dp_sink_crc_start(struct intel_dp *intel_dp) · 1 unmodified line
39533943 return 0;
39543944 }
39553945
3956−int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc)
3946+int intel_dp_sink_crc(struct intel_dp *intel_dp, struct intel_crtc_state *crtc_state, u8 *crc)
39573947 {
39583948 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
39593949 struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
3960− struct intel_crtc *intel_crtc = to_intel_crtc(dig_port->base.base.crtc);
3950+ struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
39613951 u8 buf;
39623952 int count, ret;
39633953 int attempts = 6;
39643954
3965− ret = intel_dp_sink_crc_start(intel_dp);
3955+ ret = intel_dp_sink_crc_start(intel_dp, crtc_state);
39663956 if (ret)
39673957 return ret;
39683958
@@ -3990,7 +3980,7 @@ int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc) · 21 unmodified lines
39903980 }
39913981
39923982 stop:
3993− intel_dp_sink_crc_stop(intel_dp);
3983+ intel_dp_sink_crc_stop(intel_dp, crtc_state, true);
39943984 return ret;
39953985 }
39963986
@@ -4285,11 +4275,11 @@ intel_dp_retrain_link(struct intel_dp *intel_dp) · 288 unmodified lines
42854275 static void
42864276 intel_dp_check_link_status(struct intel_dp *intel_dp)
42874277 {
4278+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
42884279 struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base;
4289− struct drm_device *dev = intel_dp_to_dev(intel_dp);
42904280 u8 link_status[DP_LINK_STATUS_SIZE];
42914281
4292− WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
4282+ WARN_ON(!drm_modeset_is_locked(&dev_priv->drm.mode_config.connection_mutex));
42934283
42944284 if (!intel_dp_get_link_status(intel_dp, link_status)) {
42954285 DRM_ERROR("Failed to get link status\n");
@@ -4335,8 +4325,7 @@ intel_dp_check_link_status(struct intel_dp *intel_dp) · 39 unmodified lines
43354325 static bool
43364326 intel_dp_short_pulse(struct intel_dp *intel_dp)
43374327 {
4338− struct drm_device *dev = intel_dp_to_dev(intel_dp);
4339− struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base;
4328+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
43404329 u8 sink_irq_vector = 0;
43414330 u8 old_sink_count = intel_dp->sink_count;
43424331 bool ret;
@@ -4375,13 +4364,13 @@ intel_dp_short_pulse(struct intel_dp *intel_dp) · 32 unmodified lines
43754364 DRM_DEBUG_DRIVER("CP or sink specific irq unhandled\n");
43764365 }
43774366
4378− drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
4367+ drm_modeset_lock(&dev_priv->drm.mode_config.connection_mutex, NULL);
43794368 intel_dp_check_link_status(intel_dp);
4380− drm_modeset_unlock(&dev->mode_config.connection_mutex);
4369+ drm_modeset_unlock(&dev_priv->drm.mode_config.connection_mutex);
43814370 if (intel_dp->compliance.test_type == DP_TEST_LINK_TRAINING) {
43824371 DRM_DEBUG_KMS("Link Training Compliance Test requested\n");
43834372 /* Send a Hotplug Uevent to userspace to start modeset */
4384− drm_kms_helper_hotplug_event(intel_encoder->base.dev);
4373+ drm_kms_helper_hotplug_event(&dev_priv->drm);
43854374 }
43864375
43874376 return true;
@@ -4445,8 +4434,7 @@ intel_dp_detect_dpcd(struct intel_dp *intel_dp) · 57 unmodified lines
44454434 static enum drm_connector_status
44464435 edp_detect(struct intel_dp *intel_dp)
44474436 {
4448− struct drm_device *dev = intel_dp_to_dev(intel_dp);
4449− struct drm_i915_private *dev_priv = to_i915(dev);
4437+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
44504438 enum drm_connector_status status;
44514439
44524440 status = intel_panel_detect(dev_priv);
@@ -4461,7 +4449,7 @@ static bool ibx_digital_port_connected(struct drm_i915_private *dev_priv, · 8 unmodified lines
44614449 {
44624450 u32 bit;
44634451
4464− switch (port->port) {
4452+ switch (port->base.port) {
44654453 case PORT_B:
44664454 bit = SDE_PORTB_HOTPLUG;
44674455 break;
@@ -4472,7 +4460,7 @@ static bool ibx_digital_port_connected(struct drm_i915_private *dev_priv, · 4 unmodified lines
44724460 bit = SDE_PORTD_HOTPLUG;
44734461 break;
44744462 default:
4475− MISSING_CASE(port->port);
4463+ MISSING_CASE(port->base.port);
44764464 return false;
44774465 }
44784466
@@ -4484,7 +4472,7 @@ static bool cpt_digital_port_connected(struct drm_i915_private *dev_priv, · 5 unmodified lines
44844472 {
44854473 u32 bit;
44864474
4487− switch (port->port) {
4475+ switch (port->base.port) {
44884476 case PORT_B:
44894477 bit = SDE_PORTB_HOTPLUG_CPT;
44904478 break;
@@ -4495,7 +4483,7 @@ static bool cpt_digital_port_connected(struct drm_i915_private *dev_priv, · 4 unmodified lines
44954483 bit = SDE_PORTD_HOTPLUG_CPT;
44964484 break;
44974485 default:
4498− MISSING_CASE(port->port);
4486+ MISSING_CASE(port->base.port);
44994487 return false;
45004488 }
45014489
@@ -4507,7 +4495,7 @@ static bool spt_digital_port_connected(struct drm_i915_private *dev_priv, · 5 unmodified lines
45074495 {
45084496 u32 bit;
45094497
4510− switch (port->port) {
4498+ switch (port->base.port) {
45114499 case PORT_A:
45124500 bit = SDE_PORTA_HOTPLUG_SPT;
45134501 break;
@@ -4526,7 +4514,7 @@ static bool g4x_digital_port_connected(struct drm_i915_private *dev_priv, · 12 unmodified lines
45264514 {
45274515 u32 bit;
45284516
4529− switch (port->port) {
4517+ switch (port->base.port) {
45304518 case PORT_B:
45314519 bit = PORTB_HOTPLUG_LIVE_STATUS_G4X;
45324520 break;
@@ -4537,7 +4525,7 @@ static bool g4x_digital_port_connected(struct drm_i915_private *dev_priv, · 4 unmodified lines
45374525 bit = PORTD_HOTPLUG_LIVE_STATUS_G4X;
45384526 break;
45394527 default:
4540− MISSING_CASE(port->port);
4528+ MISSING_CASE(port->base.port);
45414529 return false;
45424530 }
45434531
@@ -4549,7 +4537,7 @@ static bool gm45_digital_port_connected(struct drm_i915_private *dev_priv, · 5 unmodified lines
45494537 {
45504538 u32 bit;
45514539
4552− switch (port->port) {
4540+ switch (port->base.port) {
45534541 case PORT_B:
45544542 bit = PORTB_HOTPLUG_LIVE_STATUS_GM45;
45554543 break;
@@ -4560,7 +4548,7 @@ static bool gm45_digital_port_connected(struct drm_i915_private *dev_priv, · 4 unmodified lines
45604548 bit = PORTD_HOTPLUG_LIVE_STATUS_GM45;
45614549 break;
45624550 default:
4563− MISSING_CASE(port->port);
4551+ MISSING_CASE(port->base.port);
45644552 return false;
45654553 }
45664554
@@ -4570,7 +4558,7 @@ static bool gm45_digital_port_connected(struct drm_i915_private *dev_priv, · 3 unmodified lines
45704558 static bool ilk_digital_port_connected(struct drm_i915_private *dev_priv,
45714559 struct intel_digital_port *port)
45724560 {
4573− if (port->port == PORT_A)
4561+ if (port->base.port == PORT_A)
45744562 return I915_READ(DEISR) & DE_DP_A_HOTPLUG;
45754563 else
45764564 return ibx_digital_port_connected(dev_priv, port);
@@ -4579,7 +4567,7 @@ static bool ilk_digital_port_connected(struct drm_i915_private *dev_priv, · 2 unmodified lines
45794567 static bool snb_digital_port_connected(struct drm_i915_private *dev_priv,
45804568 struct intel_digital_port *port)
45814569 {
4582− if (port->port == PORT_A)
4570+ if (port->base.port == PORT_A)
45834571 return I915_READ(DEISR) & DE_DP_A_HOTPLUG;
45844572 else
45854573 return cpt_digital_port_connected(dev_priv, port);
@@ -4588,7 +4576,7 @@ static bool snb_digital_port_connected(struct drm_i915_private *dev_priv, · 2 unmodified lines
45884576 static bool ivb_digital_port_connected(struct drm_i915_private *dev_priv,
45894577 struct intel_digital_port *port)
45904578 {
4591− if (port->port == PORT_A)
4579+ if (port->base.port == PORT_A)
45924580 return I915_READ(DEISR) & DE_DP_A_HOTPLUG_IVB;
45934581 else
45944582 return cpt_digital_port_connected(dev_priv, port);
@@ -4597,7 +4585,7 @@ static bool ivb_digital_port_connected(struct drm_i915_private *dev_priv, · 2 unmodified lines
45974585 static bool bdw_digital_port_connected(struct drm_i915_private *dev_priv,
45984586 struct intel_digital_port *port)
45994587 {
4600− if (port->port == PORT_A)
4588+ if (port->base.port == PORT_A)
46014589 return I915_READ(GEN8_DE_PORT_ISR) & GEN8_PORT_DP_A_HOTPLUG;
46024590 else
46034591 return cpt_digital_port_connected(dev_priv, port);
@@ -4702,24 +4690,21 @@ intel_dp_unset_edid(struct intel_dp *intel_dp) · 98 unmodified lines
47024690 }
47034691
47044692 static int
4705−intel_dp_long_pulse(struct intel_connector *intel_connector)
4693+intel_dp_long_pulse(struct intel_connector *connector)
47064694 {
4707− struct drm_connector *connector = &intel_connector->base;
4708− struct intel_dp *intel_dp = intel_attached_dp(connector);
4709− struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
4710− struct intel_encoder *intel_encoder = &intel_dig_port->base;
4711− struct drm_device *dev = connector->dev;
4695+ struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
4696+ struct intel_dp *intel_dp = intel_attached_dp(&connector->base);
47124697 enum drm_connector_status status;
47134698 u8 sink_irq_vector = 0;
47144699
4715− WARN_ON(!drm_modeset_is_locked(&connector->dev->mode_config.connection_mutex));
4700+ WARN_ON(!drm_modeset_is_locked(&dev_priv->drm.mode_config.connection_mutex));
47164701
4717− intel_display_power_get(to_i915(dev), intel_dp->aux_power_domain);
4702+ intel_display_power_get(dev_priv, intel_dp->aux_power_domain);
47184703
47194704 /* Can't disconnect eDP, but you can close the lid... */
47204705 if (intel_dp_is_edp(intel_dp))
47214706 status = edp_detect(intel_dp);
4722− else if (intel_digital_port_connected(to_i915(dev),
4707+ else if (intel_digital_port_connected(dev_priv,
47234708 dp_to_dig_port(intel_dp)))
47244709 status = intel_dp_detect_dpcd(intel_dp);
47254710 else
@@ -4740,9 +4725,6 @@ intel_dp_long_pulse(struct intel_connector *intel_connector) · 14 unmodified lines
47404725 goto out;
47414726 }
47424727
4743− if (intel_encoder->type != INTEL_OUTPUT_EDP)
4744− intel_encoder->type = INTEL_OUTPUT_DP;
4745−
47464728 if (intel_dp->reset_link_params) {
47474729 /* Initial max link lane count */
47484730 intel_dp->max_link_lane_count = intel_dp_max_common_lane_count(intel_dp);
@@ -4793,7 +4775,7 @@ intel_dp_long_pulse(struct intel_connector *intel_connector) · 44 unmodified lines
47934775 intel_dp->aux.i2c_defer_count = 0;
47944776
47954777 intel_dp_set_edid(intel_dp);
4796− if (intel_dp_is_edp(intel_dp) || intel_connector->detect_edid)
4778+ if (intel_dp_is_edp(intel_dp) || connector->detect_edid)
47974779 status = connector_status_connected;
47984780 intel_dp->detect_done = true;
47994781
@@ -4816,7 +4798,7 @@ out: · 16 unmodified lines
48164798 if (status != connector_status_connected && !intel_dp->is_mst)
48174799 intel_dp_unset_edid(intel_dp);
48184800
4819− intel_display_power_put(to_i915(dev), intel_dp->aux_power_domain);
4801+ intel_display_power_put(dev_priv, intel_dp->aux_power_domain);
48204802 return status;
48214803 }
48224804
@@ -4859,9 +4841,6 @@ intel_dp_force(struct drm_connector *connector) · 36 unmodified lines
48594841 intel_dp_set_edid(intel_dp);
48604842
48614843 intel_display_power_put(dev_priv, intel_dp->aux_power_domain);
4862−
4863− if (intel_encoder->type != INTEL_OUTPUT_EDP)
4864− intel_encoder->type = INTEL_OUTPUT_DP;
48654844 }
48664845
48674846 static int intel_dp_get_modes(struct drm_connector *connector)
@@ -4986,9 +4965,7 @@ void intel_dp_encoder_suspend(struct intel_encoder *intel_encoder) · 118 unmodified lines
49864965
49874966 static void intel_edp_panel_vdd_sanitize(struct intel_dp *intel_dp)
49884967 {
4989− struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
4990− struct drm_device *dev = intel_dig_port->base.base.dev;
4991− struct drm_i915_private *dev_priv = to_i915(dev);
4968+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
49924969
49934970 lockdep_assert_held(&dev_priv->pps_mutex);
49944971
@@ -5041,7 +5018,7 @@ void intel_dp_encoder_reset(struct drm_encoder *encoder) · 46 unmodified lines
50415018
50425019 if (intel_dp_is_edp(intel_dp)) {
50435020 /* Reinit the power sequencer, in case BIOS did something with it. */
5044− intel_dp_pps_init(encoder->dev, intel_dp);
5021+ intel_dp_pps_init(intel_dp);
50455022 intel_edp_panel_vdd_sanitize(intel_dp);
50465023 }
50475024
@@ -5076,14 +5053,9 @@ enum irqreturn · 28 unmodified lines
50765053 intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)
50775054 {
50785055 struct intel_dp *intel_dp = &intel_dig_port->dp;
5079− struct drm_device *dev = intel_dig_port->base.base.dev;
5080− struct drm_i915_private *dev_priv = to_i915(dev);
5056+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
50815057 enum irqreturn ret = IRQ_NONE;
50825058
5083− if (intel_dig_port->base.type != INTEL_OUTPUT_EDP &&
5084− intel_dig_port->base.type != INTEL_OUTPUT_HDMI)
5085− intel_dig_port->base.type = INTEL_OUTPUT_DP;
5086−
50875059 if (long_hpd && intel_dig_port->base.type == INTEL_OUTPUT_EDP) {
50885060 /*
50895061 * vdd off can generate a long pulse on eDP which
@@ -5092,12 +5064,12 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd) · 2 unmodified lines
50925064 * "vdd off -> long hpd -> vdd on -> detect -> vdd off -> ..."
50935065 */
50945066 DRM_DEBUG_KMS("ignoring long hpd on eDP port %c\n",
5095− port_name(intel_dig_port->port));
5067+ port_name(intel_dig_port->base.port));
50965068 return IRQ_HANDLED;
50975069 }
50985070
50995071 DRM_DEBUG_KMS("got hpd irq on port %c - %s\n",
5100− port_name(intel_dig_port->port),
5072+ port_name(intel_dig_port->base.port),
51015073 long_hpd ? "long" : "short");
51025074
51035075 if (long_hpd) {
@@ -5185,13 +5157,13 @@ static void intel_dp_init_panel_power_timestamps(struct intel_dp *intel_dp) · 81 unmodified lines
51855157 }
51865158
51875159 static void
5188−intel_pps_readout_hw_state(struct drm_i915_private *dev_priv,
5189− struct intel_dp *intel_dp, struct edp_power_seq *seq)
5160+intel_pps_readout_hw_state(struct intel_dp *intel_dp, struct edp_power_seq *seq)
51905161 {
5162+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
51915163 u32 pp_on, pp_off, pp_div = 0, pp_ctl = 0;
51925164 struct pps_registers regs;
51935165
5194− intel_pps_get_registers(dev_priv, intel_dp, &regs);
5166+ intel_pps_get_registers(intel_dp, &regs);
51955167
51965168 /* Workaround: Need to write PP_CONTROL with the unlock key as
51975169 * the very first thing. */
@@ -5235,13 +5207,12 @@ intel_pps_dump_state(const char *state_name, const struct edp_power_seq *seq) · 37 unmodified lines
52355207 }
52365208
52375209 static void
5238−intel_pps_verify_state(struct drm_i915_private *dev_priv,
5239− struct intel_dp *intel_dp)
5210+intel_pps_verify_state(struct intel_dp *intel_dp)
52405211 {
52415212 struct edp_power_seq hw;
52425213 struct edp_power_seq *sw = &intel_dp->pps_delays;
52435214
5244− intel_pps_readout_hw_state(dev_priv, intel_dp, &hw);
5215+ intel_pps_readout_hw_state(intel_dp, &hw);
52455216
52465217 if (hw.t1_t3 != sw->t1_t3 || hw.t8 != sw->t8 || hw.t9 != sw->t9 ||
52475218 hw.t10 != sw->t10 || hw.t11_t12 != sw->t11_t12) {
@@ -5252,10 +5223,9 @@ intel_pps_verify_state(struct drm_i915_private *dev_priv, · 4 unmodified lines
52525223 }
52535224
52545225 static void
5255−intel_dp_init_panel_power_sequencer(struct drm_device *dev,
5256− struct intel_dp *intel_dp)
5226+intel_dp_init_panel_power_sequencer(struct intel_dp *intel_dp)
52575227 {
5258− struct drm_i915_private *dev_priv = to_i915(dev);
5228+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
52595229 struct edp_power_seq cur, vbt, spec,
52605230 *final = &intel_dp->pps_delays;
52615231
@@ -5265,7 +5235,7 @@ intel_dp_init_panel_power_sequencer(struct drm_device *dev, · 3 unmodified lines
52655235 if (final->t11_t12 != 0)
52665236 return;
52675237
5268− intel_pps_readout_hw_state(dev_priv, intel_dp, &cur);
5238+ intel_pps_readout_hw_state(intel_dp, &cur);
52695239
52705240 intel_pps_dump_state("cur", &cur);
52715241
@@ -5339,20 +5309,19 @@ intel_dp_init_panel_power_sequencer(struct drm_device *dev, · 67 unmodified lines
53395309 }
53405310
53415311 static void
5342−intel_dp_init_panel_power_sequencer_registers(struct drm_device *dev,
5343− struct intel_dp *intel_dp,
5312+intel_dp_init_panel_power_sequencer_registers(struct intel_dp *intel_dp,
53445313 bool force_disable_vdd)
53455314 {
5346− struct drm_i915_private *dev_priv = to_i915(dev);
5315+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
53475316 u32 pp_on, pp_off, pp_div, port_sel = 0;
53485317 int div = dev_priv->rawclk_freq / 1000;
53495318 struct pps_registers regs;
5350− enum port port = dp_to_dig_port(intel_dp)->port;
5319+ enum port port = dp_to_dig_port(intel_dp)->base.port;
53515320 const struct edp_power_seq *seq = &intel_dp->pps_delays;
53525321
53535322 lockdep_assert_held(&dev_priv->pps_mutex);
53545323
5355− intel_pps_get_registers(dev_priv, intel_dp, &regs);
5324+ intel_pps_get_registers(intel_dp, &regs);
53565325
53575326 /*
53585327 * On some VLV machines the BIOS can leave the VDD
@@ -5424,16 +5393,15 @@ intel_dp_init_panel_power_sequencer_registers(struct drm_device *dev, · 65 unmodified lines
54245393 I915_READ(regs.pp_div));
54255394 }
54265395
5427−static void intel_dp_pps_init(struct drm_device *dev,
5428− struct intel_dp *intel_dp)
5396+static void intel_dp_pps_init(struct intel_dp *intel_dp)
54295397 {
5430− struct drm_i915_private *dev_priv = to_i915(dev);
5398+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
54315399
54325400 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
54335401 vlv_initial_power_sequencer_setup(intel_dp);
54345402 } else {
5435− intel_dp_init_panel_power_sequencer(dev, intel_dp);
5436− intel_dp_init_panel_power_sequencer_registers(dev, intel_dp, false);
5403+ intel_dp_init_panel_power_sequencer(intel_dp);
5404+ intel_dp_init_panel_power_sequencer_registers(intel_dp, false);
54375405 }
54385406 }
54395407
@@ -5472,7 +5440,6 @@ static void intel_dp_set_drrs_state(struct drm_i915_private *dev_priv, · 32 unmodified lines
54725440
54735441 dig_port = dp_to_dig_port(intel_dp);
54745442 encoder = &dig_port->base;
5475− intel_crtc = to_intel_crtc(encoder->base.crtc);
54765443
54775444 if (!intel_crtc) {
54785445 DRM_DEBUG_KMS("DRRS: intel_crtc not initialized\n");
@@ -5545,8 +5512,7 @@ static void intel_dp_set_drrs_state(struct drm_i915_private *dev_priv, · 66 unmodified lines
55455512 void intel_edp_drrs_enable(struct intel_dp *intel_dp,
55465513 const struct intel_crtc_state *crtc_state)
55475514 {
5548− struct drm_device *dev = intel_dp_to_dev(intel_dp);
5549− struct drm_i915_private *dev_priv = to_i915(dev);
5515+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
55505516
55515517 if (!crtc_state->has_drrs) {
55525518 DRM_DEBUG_KMS("Panel doesn't support DRRS\n");
@@ -5581,8 +5547,7 @@ unlock: · 28 unmodified lines
55815547 void intel_edp_drrs_disable(struct intel_dp *intel_dp,
55825548 const struct intel_crtc_state *old_crtc_state)
55835549 {
5584− struct drm_device *dev = intel_dp_to_dev(intel_dp);
5585− struct drm_i915_private *dev_priv = to_i915(dev);
5550+ struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
55865551
55875552 if (!old_crtc_state->has_drrs)
55885553 return;
@@ -5765,7 +5730,7 @@ void intel_edp_drrs_flush(struct drm_i915_private *dev_priv, · 176 unmodified lines
57655730
57665731 /**
57675732 * intel_dp_drrs_init - Init basic DRRS work and mutex.
5768− * @intel_connector: eDP connector
5733+ * @connector: eDP connector
57695734 * @fixed_mode: preferred mode of panel
57705735 *
57715736 * This function is called only once at driver load to initialize basic
@@ -5777,12 +5742,10 @@ void intel_edp_drrs_flush(struct drm_i915_private *dev_priv, · 5 unmodified lines
57775742 * from VBT setting).
57785743 */
57795744 static struct drm_display_mode *
5780−intel_dp_drrs_init(struct intel_connector *intel_connector,
5781− struct drm_display_mode *fixed_mode)
5745+intel_dp_drrs_init(struct intel_connector *connector,
5746+ struct drm_display_mode *fixed_mode)
57825747 {
5783− struct drm_connector *connector = &intel_connector->base;
5784− struct drm_device *dev = connector->dev;
5785− struct drm_i915_private *dev_priv = to_i915(dev);
5748+ struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
57865749 struct drm_display_mode *downclock_mode = NULL;
57875750
57885751 INIT_DELAYED_WORK(&dev_priv->drrs.work, intel_edp_drrs_downclock_work);
@@ -5798,8 +5761,8 @@ intel_dp_drrs_init(struct intel_connector *intel_connector, · 9 unmodified lines
57985761 return NULL;
57995762 }
58005763
5801− downclock_mode = intel_find_panel_downclock
5802− (dev_priv, fixed_mode, connector);
5764+ downclock_mode = intel_find_panel_downclock(dev_priv, fixed_mode,
5765+ &connector->base);
58035766
58045767 if (!downclock_mode) {
58055768 DRM_DEBUG_KMS("Downclock mode is not found. DRRS not supported\n");
@@ -5816,11 +5779,9 @@ intel_dp_drrs_init(struct intel_connector *intel_connector, · 10 unmodified lines
58165779 static bool intel_edp_init_connector(struct intel_dp *intel_dp,
58175780 struct intel_connector *intel_connector)
58185781 {
5819− struct drm_connector *connector = &intel_connector->base;
5820− struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
5821− struct intel_encoder *intel_encoder = &intel_dig_port->base;
5822− struct drm_device *dev = intel_encoder->base.dev;
5782+ struct drm_device *dev = intel_dp_to_dev(intel_dp);
58235783 struct drm_i915_private *dev_priv = to_i915(dev);
5784+ struct drm_connector *connector = &intel_connector->base;
58245785 struct drm_display_mode *fixed_mode = NULL;
58255786 struct drm_display_mode *alt_fixed_mode = NULL;
58265787 struct drm_display_mode *downclock_mode = NULL;
@@ -5838,7 +5799,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp, · 11 unmodified lines
58385799 * eDP and LVDS bail out early in this case to prevent interfering
58395800 * with an already powered-on LVDS power sequencer.
58405801 */
5841− if (intel_get_lvds_encoder(dev)) {
5802+ if (intel_get_lvds_encoder(&dev_priv->drm)) {
58425803 WARN_ON(!(HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv)));
58435804 DRM_INFO("LVDS was detected, not registering eDP\n");
58445805
@@ -5848,7 +5809,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp, · 3 unmodified lines
58485809 pps_lock(intel_dp);
58495810
58505811 intel_dp_init_panel_power_timestamps(intel_dp);
5851− intel_dp_pps_init(dev, intel_dp);
5812+ intel_dp_pps_init(intel_dp);
58525813 intel_edp_panel_vdd_sanitize(intel_dp);
58535814
58545815 pps_unlock(intel_dp);
@@ -5948,9 +5909,9 @@ intel_dp_init_connector_port_info(struct intel_digital_port *intel_dig_port) · 93 unmodified lines
59485909 struct intel_encoder *encoder = &intel_dig_port->base;
59495910 struct intel_dp *intel_dp = &intel_dig_port->dp;
59505911
5951− encoder->hpd_pin = intel_hpd_pin(intel_dig_port->port);
5912+ encoder->hpd_pin = intel_hpd_pin(encoder->port);
59525913
5953− switch (intel_dig_port->port) {
5914+ switch (encoder->port) {
59545915 case PORT_A:
59555916 intel_dp->aux_power_domain = POWER_DOMAIN_AUX_A;
59565917 break;
@@ -5968,7 +5929,7 @@ intel_dp_init_connector_port_info(struct intel_digital_port *intel_dig_port) · 11 unmodified lines
59685929 intel_dp->aux_power_domain = POWER_DOMAIN_AUX_D;
59695930 break;
59705931 default:
5971− MISSING_CASE(intel_dig_port->port);
5932+ MISSING_CASE(encoder->port);
59725933 }
59735934 }
59745935
@@ -6004,7 +5965,7 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port, · 29 unmodified lines
60045965 struct intel_encoder *intel_encoder = &intel_dig_port->base;
60055966 struct drm_device *dev = intel_encoder->base.dev;
60065967 struct drm_i915_private *dev_priv = to_i915(dev);
6007− enum port port = intel_dig_port->port;
5968+ enum port port = intel_encoder->port;
60085969 int type;
60095970
60105971 /* Initialize the work for modeset in case of link train failure */
@@ -6174,7 +6135,6 @@ bool intel_dp_init(struct drm_i915_private *dev_priv, · 163 unmodified lines
61746135 intel_encoder->disable = g4x_disable_dp;
61756136 }
61766137
6177− intel_dig_port->port = port;
61786138 intel_dig_port->dp.output_reg = output_reg;
61796139 intel_dig_port->max_lanes = 4;
61806140
drivers/gpu/drm/i915/intel_dp_mst.c+31−48
@@ -34,6 +34,7 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder, · 33 unmodified lines
3434 struct intel_crtc_state *pipe_config,
3535 struct drm_connector_state *conn_state)
3636 {
37+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
3738 struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
3839 struct intel_digital_port *intel_dig_port = intel_mst->primary;
3940 struct intel_dp *intel_dp = &intel_dig_port->dp;
@@ -87,6 +88,12 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder, · 47 unmodified lines
8788
8889 pipe_config->dp_m_n.tu = slots;
8990
91+ if (IS_GEN9_LP(dev_priv))
92+ pipe_config->lane_lat_optim_mask =
93+ bxt_ddi_phy_calc_lane_lat_optim_mask(pipe_config->lane_count);
94+
95+ intel_ddi_compute_min_voltage_level(dev_priv, pipe_config);
96+
9097 return true;
9198 }
9299
@@ -142,7 +149,8 @@ static void intel_mst_disable_dp(struct intel_encoder *encoder, · 49 unmodified lines
142149 DRM_ERROR("failed to update payload %d\n", ret);
143150 }
144151 if (old_crtc_state->has_audio)
145− intel_audio_codec_disable(encoder);
152+ intel_audio_codec_disable(encoder,
153+ old_crtc_state, old_conn_state);
146154 }
147155
148156 static void intel_mst_post_disable_dp(struct intel_encoder *encoder,
@@ -172,13 +180,27 @@ static void intel_mst_post_disable_dp(struct intel_encoder *encoder, · 23 unmodified lines
172180 intel_dp->active_mst_links--;
173181
174182 intel_mst->connector = NULL;
175− if (intel_dp->active_mst_links == 0) {
183+ if (intel_dp->active_mst_links == 0)
176184 intel_dig_port->base.post_disable(&intel_dig_port->base,
177− NULL, NULL);
178− }
185+ old_crtc_state, NULL);
186+
179187 DRM_DEBUG_KMS("active links %d\n", intel_dp->active_mst_links);
180188 }
181189
190+static void intel_mst_pre_pll_enable_dp(struct intel_encoder *encoder,
191+ const struct intel_crtc_state *pipe_config,
192+ const struct drm_connector_state *conn_state)
193+{
194+ struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
195+ struct intel_digital_port *intel_dig_port = intel_mst->primary;
196+ struct intel_dp *intel_dp = &intel_dig_port->dp;
197+
198+ if (intel_dp->active_mst_links == 0 &&
199+ intel_dig_port->base.pre_pll_enable)
200+ intel_dig_port->base.pre_pll_enable(&intel_dig_port->base,
201+ pipe_config, NULL);
202+}
203+
182204 static void intel_mst_pre_enable_dp(struct intel_encoder *encoder,
183205 const struct intel_crtc_state *pipe_config,
184206 const struct drm_connector_state *conn_state)
@@ -187,7 +209,7 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder, · 2 unmodified lines
187209 struct intel_digital_port *intel_dig_port = intel_mst->primary;
188210 struct intel_dp *intel_dp = &intel_dig_port->dp;
189211 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
190− enum port port = intel_dig_port->port;
212+ enum port port = intel_dig_port->base.port;
191213 struct intel_connector *connector =
192214 to_intel_connector(conn_state->connector);
193215 int ret;
@@ -231,7 +253,7 @@ static void intel_mst_enable_dp(struct intel_encoder *encoder, · 37 unmodified lines
231253 struct intel_digital_port *intel_dig_port = intel_mst->primary;
232254 struct intel_dp *intel_dp = &intel_dig_port->dp;
233255 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
234− enum port port = intel_dig_port->port;
256+ enum port port = intel_dig_port->base.port;
235257 int ret;
236258
237259 DRM_DEBUG_KMS("active links %d\n", intel_dp->active_mst_links);
@@ -265,48 +287,8 @@ static void intel_dp_mst_enc_get_config(struct intel_encoder *encoder, · 27 unmodified lines
265287 {
266288 struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
267289 struct intel_digital_port *intel_dig_port = intel_mst->primary;
268− struct intel_crtc *crtc = to_intel_crtc(pipe_config->base.crtc);
269− struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
270− enum transcoder cpu_transcoder = pipe_config->cpu_transcoder;
271− u32 temp, flags = 0;
272−
273− pipe_config->has_audio =
274− intel_ddi_is_audio_enabled(dev_priv, crtc);
275−
276− temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
277− if (temp & TRANS_DDI_PHSYNC)
278− flags |= DRM_MODE_FLAG_PHSYNC;
279− else
280− flags |= DRM_MODE_FLAG_NHSYNC;
281− if (temp & TRANS_DDI_PVSYNC)
282− flags |= DRM_MODE_FLAG_PVSYNC;
283− else
284− flags |= DRM_MODE_FLAG_NVSYNC;
285−
286− switch (temp & TRANS_DDI_BPC_MASK) {
287− case TRANS_DDI_BPC_6:
288− pipe_config->pipe_bpp = 18;
289− break;
290− case TRANS_DDI_BPC_8:
291− pipe_config->pipe_bpp = 24;
292− break;
293− case TRANS_DDI_BPC_10:
294− pipe_config->pipe_bpp = 30;
295− break;
296− case TRANS_DDI_BPC_12:
297− pipe_config->pipe_bpp = 36;
298− break;
299− default:
300− break;
301− }
302− pipe_config->base.adjusted_mode.flags |= flags;
303−
304− pipe_config->lane_count =
305− ((temp & DDI_PORT_WIDTH_MASK) >> DDI_PORT_WIDTH_SHIFT) + 1;
306−
307− intel_dp_get_m_n(crtc, pipe_config);
308290
309− intel_ddi_clock_get(&intel_dig_port->base, pipe_config);
291+ intel_ddi_get_config(&intel_dig_port->base, pipe_config);
310292 }
311293
312294 static int intel_dp_mst_get_ddc_modes(struct drm_connector *connector)
@@ -570,13 +552,14 @@ intel_dp_create_fake_mst_encoder(struct intel_digital_port *intel_dig_port, enum · 257 unmodified lines
570552
571553 intel_encoder->type = INTEL_OUTPUT_DP_MST;
572554 intel_encoder->power_domain = intel_dig_port->base.power_domain;
573− intel_encoder->port = intel_dig_port->port;
555+ intel_encoder->port = intel_dig_port->base.port;
574556 intel_encoder->crtc_mask = 0x7;
575557 intel_encoder->cloneable = 0;
576558
577559 intel_encoder->compute_config = intel_dp_mst_compute_config;
578560 intel_encoder->disable = intel_mst_disable_dp;
579561 intel_encoder->post_disable = intel_mst_post_disable_dp;
562+ intel_encoder->pre_pll_enable = intel_mst_pre_pll_enable_dp;
580563 intel_encoder->pre_enable = intel_mst_pre_enable_dp;
581564 intel_encoder->enable = intel_mst_enable_dp;
582565 intel_encoder->get_hw_state = intel_dp_mst_enc_get_hw_state;
drivers/gpu/drm/i915/intel_dpio_phy.c+59−63
@@ -466,21 +466,21 @@ void bxt_ddi_phy_init(struct drm_i915_private *dev_priv, enum dpio_phy phy) · 465 unmodified lines
466466
467467 lockdep_assert_held(&dev_priv->power_domains.lock);
468468
469− if (rcomp_phy != -1) {
469+ was_enabled = true;
470+ if (rcomp_phy != -1)
470471 was_enabled = bxt_ddi_phy_is_enabled(dev_priv, rcomp_phy);
471472
472− /*
473− * We need to copy the GRC calibration value from rcomp_phy,
474− * so make sure it's powered up.
475− */
476− if (!was_enabled)
477− _bxt_ddi_phy_init(dev_priv, rcomp_phy);
478− }
473+ /*
474+ * We need to copy the GRC calibration value from rcomp_phy,
475+ * so make sure it's powered up.
476+ */
477+ if (!was_enabled)
478+ _bxt_ddi_phy_init(dev_priv, rcomp_phy);
479479
480480 _bxt_ddi_phy_init(dev_priv, phy);
481481
482− if (rcomp_phy != -1 && !was_enabled)
483− bxt_ddi_phy_uninit(dev_priv, phy_info->rcomp_phy);
482+ if (!was_enabled)
483+ bxt_ddi_phy_uninit(dev_priv, rcomp_phy);
484484 }
485485
486486 static bool __printf(6, 7)
@@ -567,8 +567,7 @@ bool bxt_ddi_phy_verify_state(struct drm_i915_private *dev_priv, · 80 unmodified lines
567567 }
568568
569569 uint8_t
570−bxt_ddi_phy_calc_lane_lat_optim_mask(struct intel_encoder *encoder,
571− uint8_t lane_count)
570+bxt_ddi_phy_calc_lane_lat_optim_mask(uint8_t lane_count)
572571 {
573572 switch (lane_count) {
574573 case 1:
@@ -587,9 +586,8 @@ bxt_ddi_phy_calc_lane_lat_optim_mask(struct intel_encoder *encoder, · 12 unmodified lines
587586 void bxt_ddi_phy_set_lane_optim_mask(struct intel_encoder *encoder,
588587 uint8_t lane_lat_optim_mask)
589588 {
590− struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
591− struct drm_i915_private *dev_priv = to_i915(dport->base.base.dev);
592− enum port port = dport->port;
589+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
590+ enum port port = encoder->port;
593591 enum dpio_phy phy;
594592 enum dpio_channel ch;
595593 int lane;
@@ -614,9 +612,8 @@ void bxt_ddi_phy_set_lane_optim_mask(struct intel_encoder *encoder, · 18 unmodified lines
614612 uint8_t
615613 bxt_ddi_phy_get_lane_lat_optim_mask(struct intel_encoder *encoder)
616614 {
617− struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
618− struct drm_i915_private *dev_priv = to_i915(dport->base.base.dev);
619− enum port port = dport->port;
615+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
616+ enum port port = encoder->port;
620617 enum dpio_phy phy;
621618 enum dpio_channel ch;
622619 int lane;
@@ -642,7 +639,7 @@ void chv_set_phy_signal_level(struct intel_encoder *encoder, · 19 unmodified lines
642639 {
643640 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
644641 struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
645− struct intel_crtc *intel_crtc = to_intel_crtc(dport->base.base.crtc);
642+ struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
646643 enum dpio_channel ch = vlv_dport_to_channel(dport);
647644 enum pipe pipe = intel_crtc->pipe;
648645 u32 val;
@@ -734,11 +731,12 @@ void chv_set_phy_signal_level(struct intel_encoder *encoder, · 85 unmodified lines
734731 }
735732
736733 void chv_data_lane_soft_reset(struct intel_encoder *encoder,
734+ const struct intel_crtc_state *crtc_state,
737735 bool reset)
738736 {
739737 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
740738 enum dpio_channel ch = vlv_dport_to_channel(enc_to_dig_port(&encoder->base));
741− struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
739+ struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
742740 enum pipe pipe = crtc->pipe;
743741 uint32_t val;
744742
@@ -777,17 +775,16 @@ void chv_data_lane_soft_reset(struct intel_encoder *encoder, · 32 unmodified lines
777775 }
778776 }
779777
780−void chv_phy_pre_pll_enable(struct intel_encoder *encoder)
778+void chv_phy_pre_pll_enable(struct intel_encoder *encoder,
779+ const struct intel_crtc_state *crtc_state)
781780 {
782781 struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
783− struct drm_device *dev = encoder->base.dev;
784− struct drm_i915_private *dev_priv = to_i915(dev);
785− struct intel_crtc *intel_crtc =
786− to_intel_crtc(encoder->base.crtc);
782+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
783+ struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
787784 enum dpio_channel ch = vlv_dport_to_channel(dport);
788− enum pipe pipe = intel_crtc->pipe;
785+ enum pipe pipe = crtc->pipe;
789786 unsigned int lane_mask =
790− intel_dp_unused_lane_mask(intel_crtc->config->lane_count);
787+ intel_dp_unused_lane_mask(crtc_state->lane_count);
791788 u32 val;
792789
793790 /*
@@ -803,7 +800,7 @@ void chv_phy_pre_pll_enable(struct intel_encoder *encoder) · 9 unmodified lines
803800 mutex_lock(&dev_priv->sb_lock);
804801
805802 /* Assert data lane reset */
806− chv_data_lane_soft_reset(encoder, true);
803+ chv_data_lane_soft_reset(encoder, crtc_state, true);
807804
808805 /* program left/right clock distribution */
809806 if (pipe != PIPE_B) {
@@ -833,7 +830,7 @@ void chv_phy_pre_pll_enable(struct intel_encoder *encoder) · 23 unmodified lines
833830 val |= CHV_PCS_USEDCLKCHANNEL;
834831 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW8(ch), val);
835832
836− if (intel_crtc->config->lane_count > 2) {
833+ if (crtc_state->lane_count > 2) {
837834 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW8(ch));
838835 val |= CHV_PCS_USEDCLKCHANNEL_OVRRIDE;
839836 if (pipe != PIPE_B)
@@ -858,16 +855,15 @@ void chv_phy_pre_pll_enable(struct intel_encoder *encoder) · 18 unmodified lines
858855 mutex_unlock(&dev_priv->sb_lock);
859856 }
860857
861−void chv_phy_pre_encoder_enable(struct intel_encoder *encoder)
858+void chv_phy_pre_encoder_enable(struct intel_encoder *encoder,
859+ const struct intel_crtc_state *crtc_state)
862860 {
863861 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
864862 struct intel_digital_port *dport = dp_to_dig_port(intel_dp);
865− struct drm_device *dev = encoder->base.dev;
866− struct drm_i915_private *dev_priv = to_i915(dev);
867− struct intel_crtc *intel_crtc =
868− to_intel_crtc(encoder->base.crtc);
863+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
864+ struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
869865 enum dpio_channel ch = vlv_dport_to_channel(dport);
870− int pipe = intel_crtc->pipe;
866+ enum pipe pipe = crtc->pipe;
871867 int data, i, stagger;
872868 u32 val;
873869
@@ -878,16 +874,16 @@ void chv_phy_pre_encoder_enable(struct intel_encoder *encoder) · 4 unmodified lines
878874 val &= ~DPIO_LANEDESKEW_STRAP_OVRD;
879875 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW11(ch), val);
880876
881− if (intel_crtc->config->lane_count > 2) {
877+ if (crtc_state->lane_count > 2) {
882878 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW11(ch));
883879 val &= ~DPIO_LANEDESKEW_STRAP_OVRD;
884880 vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW11(ch), val);
885881 }
886882
887883 /* Program Tx lane latency optimal setting*/
888− for (i = 0; i < intel_crtc->config->lane_count; i++) {
884+ for (i = 0; i < crtc_state->lane_count; i++) {
889885 /* Set the upar bit */
890− if (intel_crtc->config->lane_count == 1)
886+ if (crtc_state->lane_count == 1)
891887 data = 0x0;
892888 else
893889 data = (i == 1) ? 0x0 : 0x1;
@@ -896,13 +892,13 @@ void chv_phy_pre_encoder_enable(struct intel_encoder *encoder) · 2 unmodified lines
896892 }
897893
898894 /* Data lane stagger programming */
899− if (intel_crtc->config->port_clock > 270000)
895+ if (crtc_state->port_clock > 270000)
900896 stagger = 0x18;
901− else if (intel_crtc->config->port_clock > 135000)
897+ else if (crtc_state->port_clock > 135000)
902898 stagger = 0xd;
903− else if (intel_crtc->config->port_clock > 67500)
899+ else if (crtc_state->port_clock > 67500)
904900 stagger = 0x7;
905− else if (intel_crtc->config->port_clock > 33750)
901+ else if (crtc_state->port_clock > 33750)
906902 stagger = 0x4;
907903 else
908904 stagger = 0x2;
@@ -911,7 +907,7 @@ void chv_phy_pre_encoder_enable(struct intel_encoder *encoder) · 2 unmodified lines
911907 val |= DPIO_TX2_STAGGER_MASK(0x1f);
912908 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW11(ch), val);
913909
914− if (intel_crtc->config->lane_count > 2) {
910+ if (crtc_state->lane_count > 2) {
915911 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW11(ch));
916912 val |= DPIO_TX2_STAGGER_MASK(0x1f);
917913 vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW11(ch), val);
@@ -924,7 +920,7 @@ void chv_phy_pre_encoder_enable(struct intel_encoder *encoder) · 6 unmodified lines
924920 DPIO_TX1_STAGGER_MULT(6) |
925921 DPIO_TX2_STAGGER_MULT(0));
926922
927− if (intel_crtc->config->lane_count > 2) {
923+ if (crtc_state->lane_count > 2) {
928924 vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW12(ch),
929925 DPIO_LANESTAGGER_STRAP(stagger) |
930926 DPIO_LANESTAGGER_STRAP_OVRD |
@@ -934,7 +930,7 @@ void chv_phy_pre_encoder_enable(struct intel_encoder *encoder) · 3 unmodified lines
934930 }
935931
936932 /* Deassert data lane reset */
937− chv_data_lane_soft_reset(encoder, false);
933+ chv_data_lane_soft_reset(encoder, crtc_state, false);
938934
939935 mutex_unlock(&dev_priv->sb_lock);
940936 }
@@ -950,10 +946,11 @@ void chv_phy_release_cl2_override(struct intel_encoder *encoder) · 9 unmodified lines
950946 }
951947 }
952948
953−void chv_phy_post_pll_disable(struct intel_encoder *encoder)
949+void chv_phy_post_pll_disable(struct intel_encoder *encoder,
950+ const struct intel_crtc_state *old_crtc_state)
954951 {
955952 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
956− enum pipe pipe = to_intel_crtc(encoder->base.crtc)->pipe;
953+ enum pipe pipe = to_intel_crtc(old_crtc_state->base.crtc)->pipe;
957954 u32 val;
958955
959956 mutex_lock(&dev_priv->sb_lock);
@@ -991,7 +988,7 @@ void vlv_set_phy_signal_level(struct intel_encoder *encoder, · 31 unmodified lines
991988 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
992989 struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
993990 enum dpio_channel port = vlv_dport_to_channel(dport);
994− int pipe = intel_crtc->pipe;
991+ enum pipe pipe = intel_crtc->pipe;
995992
996993 mutex_lock(&dev_priv->sb_lock);
997994 vlv_dpio_write(dev_priv, pipe, VLV_TX_DW5(port), 0x00000000);
@@ -1009,15 +1006,14 @@ void vlv_set_phy_signal_level(struct intel_encoder *encoder, · 11 unmodified lines
10091006 mutex_unlock(&dev_priv->sb_lock);
10101007 }
10111008
1012−void vlv_phy_pre_pll_enable(struct intel_encoder *encoder)
1009+void vlv_phy_pre_pll_enable(struct intel_encoder *encoder,
1010+ const struct intel_crtc_state *crtc_state)
10131011 {
10141012 struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
1015− struct drm_device *dev = encoder->base.dev;
1016− struct drm_i915_private *dev_priv = to_i915(dev);
1017− struct intel_crtc *intel_crtc =
1018− to_intel_crtc(encoder->base.crtc);
1013+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1014+ struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
10191015 enum dpio_channel port = vlv_dport_to_channel(dport);
1020− int pipe = intel_crtc->pipe;
1016+ enum pipe pipe = crtc->pipe;
10211017
10221018 /* Program Tx lane resets to default */
10231019 mutex_lock(&dev_priv->sb_lock);
@@ -1037,15 +1033,15 @@ void vlv_phy_pre_pll_enable(struct intel_encoder *encoder) · 13 unmodified lines
10371033 mutex_unlock(&dev_priv->sb_lock);
10381034 }
10391035
1040−void vlv_phy_pre_encoder_enable(struct intel_encoder *encoder)
1036+void vlv_phy_pre_encoder_enable(struct intel_encoder *encoder,
1037+ const struct intel_crtc_state *crtc_state)
10411038 {
10421039 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
10431040 struct intel_digital_port *dport = dp_to_dig_port(intel_dp);
1044− struct drm_device *dev = encoder->base.dev;
1045− struct drm_i915_private *dev_priv = to_i915(dev);
1046− struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
1041+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1042+ struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
10471043 enum dpio_channel port = vlv_dport_to_channel(dport);
1048− int pipe = intel_crtc->pipe;
1044+ enum pipe pipe = crtc->pipe;
10491045 u32 val;
10501046
10511047 mutex_lock(&dev_priv->sb_lock);
@@ -1067,14 +1063,14 @@ void vlv_phy_pre_encoder_enable(struct intel_encoder *encoder) · 15 unmodified lines
10671063 mutex_unlock(&dev_priv->sb_lock);
10681064 }
10691065
1070−void vlv_phy_reset_lanes(struct intel_encoder *encoder)
1066+void vlv_phy_reset_lanes(struct intel_encoder *encoder,
1067+ const struct intel_crtc_state *old_crtc_state)
10711068 {
10721069 struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
10731070 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1074− struct intel_crtc *intel_crtc =
1075− to_intel_crtc(encoder->base.crtc);
1071+ struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->base.crtc);
10761072 enum dpio_channel port = vlv_dport_to_channel(dport);
1077− int pipe = intel_crtc->pipe;
1073+ enum pipe pipe = crtc->pipe;
10781074
10791075 mutex_lock(&dev_priv->sb_lock);
10801076 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW0(port), 0x00000000);
drivers/gpu/drm/i915/intel_dpll_mgr.c+42−65
@@ -813,15 +813,11 @@ hsw_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state, · 812 unmodified lines
813813 memset(&crtc_state->dpll_hw_state, 0,
814814 sizeof(crtc_state->dpll_hw_state));
815815
816− if (encoder->type == INTEL_OUTPUT_HDMI) {
816+ if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
817817 pll = hsw_ddi_hdmi_get_dpll(clock, crtc, crtc_state);
818−
819− } else if (encoder->type == INTEL_OUTPUT_DP ||
820− encoder->type == INTEL_OUTPUT_DP_MST ||
821− encoder->type == INTEL_OUTPUT_EDP) {
818+ } else if (intel_crtc_has_dp_encoder(crtc_state)) {
822819 pll = hsw_ddi_dp_get_dpll(encoder, clock);
823−
824− } else if (encoder->type == INTEL_OUTPUT_ANALOG) {
820+ } else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_ANALOG)) {
825821 if (WARN_ON(crtc_state->port_clock / 2 != 135000))
826822 return NULL;
827823
@@ -1369,15 +1365,13 @@ skl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state, · 541 unmodified lines
13691365
13701366 memset(&dpll_hw_state, 0, sizeof(dpll_hw_state));
13711367
1372− if (encoder->type == INTEL_OUTPUT_HDMI) {
1368+ if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
13731369 bret = skl_ddi_hdmi_pll_dividers(crtc, crtc_state, clock);
13741370 if (!bret) {
13751371 DRM_DEBUG_KMS("Could not get HDMI pll dividers.\n");
13761372 return NULL;
13771373 }
1378− } else if (encoder->type == INTEL_OUTPUT_DP ||
1379− encoder->type == INTEL_OUTPUT_DP_MST ||
1380− encoder->type == INTEL_OUTPUT_EDP) {
1374+ } else if (intel_crtc_has_dp_encoder(crtc_state)) {
13811375 bret = skl_ddi_dp_set_dpll_hw_state(clock, &dpll_hw_state);
13821376 if (!bret) {
13831377 DRM_DEBUG_KMS("Could not set DP dpll HW state.\n");
@@ -1388,7 +1382,7 @@ skl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state, · 4 unmodified lines
13881382 return NULL;
13891383 }
13901384
1391− if (encoder->type == INTEL_OUTPUT_EDP)
1385+ if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP))
13921386 pll = intel_find_shared_dpll(crtc, crtc_state,
13931387 DPLL_ID_SKL_DPLL0,
13941388 DPLL_ID_SKL_DPLL0);
@@ -1808,18 +1802,15 @@ bxt_get_dpll(struct intel_crtc *crtc, · 413 unmodified lines
18081802 {
18091803 struct intel_dpll_hw_state dpll_hw_state = { };
18101804 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
1811− struct intel_digital_port *intel_dig_port;
18121805 struct intel_shared_dpll *pll;
18131806 int i, clock = crtc_state->port_clock;
18141807
1815− if (encoder->type == INTEL_OUTPUT_HDMI &&
1808+ if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI) &&
18161809 !bxt_ddi_hdmi_set_dpll_hw_state(crtc, crtc_state, clock,
18171810 &dpll_hw_state))
18181811 return NULL;
18191812
1820− if ((encoder->type == INTEL_OUTPUT_DP ||
1821− encoder->type == INTEL_OUTPUT_EDP ||
1822− encoder->type == INTEL_OUTPUT_DP_MST) &&
1813+ if (intel_crtc_has_dp_encoder(crtc_state) &&
18231814 !bxt_ddi_dp_set_dpll_hw_state(clock, &dpll_hw_state))
18241815 return NULL;
18251816
@@ -1828,15 +1819,8 @@ bxt_get_dpll(struct intel_crtc *crtc, · 2 unmodified lines
18281819
18291820 crtc_state->dpll_hw_state = dpll_hw_state;
18301821
1831− if (encoder->type == INTEL_OUTPUT_DP_MST) {
1832− struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
1833−
1834− intel_dig_port = intel_mst->primary;
1835− } else
1836− intel_dig_port = enc_to_dig_port(&encoder->base);
1837−
18381822 /* 1:1 mapping between ports and PLLs */
1839− i = (enum intel_dpll_id) intel_dig_port->port;
1823+ i = (enum intel_dpll_id) encoder->port;
18401824 pll = intel_get_shared_dpll_by_id(dev_priv, i);
18411825
18421826 DRM_DEBUG_KMS("[CRTC:%d:%s] using pre-allocated %s\n",
@@ -2008,8 +1992,8 @@ static void cnl_ddi_pll_enable(struct drm_i915_private *dev_priv, · 165 unmodified lines
20081992 * requirement, follow the Display Voltage Frequency Switching
20091993 * Sequence Before Frequency Change
20101994 *
2011− * FIXME: (DVFS) is used to adjust the display voltage to match the
2012− * display clock frequencies
1995+ * Note: DVFS is actually handled via the cdclk code paths,
1996+ * hence we do nothing here.
20131997 */
20141998
20151999 /* 6. Enable DPLL in DPLL_ENABLE. */
@@ -2030,8 +2014,8 @@ static void cnl_ddi_pll_enable(struct drm_i915_private *dev_priv, · 14 unmodified lines
20302014 * requirement, follow the Display Voltage Frequency Switching
20312015 * Sequence After Frequency Change
20322016 *
2033− * FIXME: (DVFS) is used to adjust the display voltage to match the
2034− * display clock frequencies
2017+ * Note: DVFS is actually handled via the cdclk code paths,
2018+ * hence we do nothing here.
20352019 */
20362020
20372021 /*
@@ -2055,8 +2039,8 @@ static void cnl_ddi_pll_disable(struct drm_i915_private *dev_priv, · 17 unmodified lines
20552039 * requirement, follow the Display Voltage Frequency Switching
20562040 * Sequence Before Frequency Change
20572041 *
2058− * FIXME: (DVFS) is used to adjust the display voltage to match the
2059− * display clock frequencies
2042+ * Note: DVFS is actually handled via the cdclk code paths,
2043+ * hence we do nothing here.
20602044 */
20612045
20622046 /* 3. Disable DPLL through DPLL_ENABLE. */
@@ -2077,8 +2061,8 @@ static void cnl_ddi_pll_disable(struct drm_i915_private *dev_priv, · 14 unmodified lines
20772061 * requirement, follow the Display Voltage Frequency Switching
20782062 * Sequence After Frequency Change
20792063 *
2080− * FIXME: (DVFS) is used to adjust the display voltage to match the
2081− * display clock frequencies
2064+ * Note: DVFS is actually handled via the cdclk code paths,
2065+ * hence we do nothing here.
20822066 */
20832067
20842068 /* 6. Disable DPLL power in DPLL_ENABLE. */
@@ -2126,10 +2110,8 @@ out: · 41 unmodified lines
21262110 return ret;
21272111 }
21282112
2129−static void cnl_wrpll_get_multipliers(unsigned int bestdiv,
2130− unsigned int *pdiv,
2131− unsigned int *qdiv,
2132− unsigned int *kdiv)
2113+static void cnl_wrpll_get_multipliers(int bestdiv, int *pdiv,
2114+ int *qdiv, int *kdiv)
21332115 {
21342116 /* even dividers */
21352117 if (bestdiv % 2 == 0) {
@@ -2167,10 +2149,12 @@ static void cnl_wrpll_get_multipliers(unsigned int bestdiv, · 31 unmodified lines
21672149 }
21682150 }
21692151
2170−static void cnl_wrpll_params_populate(struct skl_wrpll_params *params, uint32_t dco_freq,
2171− uint32_t ref_freq, uint32_t pdiv, uint32_t qdiv,
2172− uint32_t kdiv)
2152+static void cnl_wrpll_params_populate(struct skl_wrpll_params *params,
2153+ u32 dco_freq, u32 ref_freq,
2154+ int pdiv, int qdiv, int kdiv)
21732155 {
2156+ u32 dco;
2157+
21742158 switch (kdiv) {
21752159 case 1:
21762160 params->kdiv = 1;
@@ -2202,39 +2186,35 @@ static void cnl_wrpll_params_populate(struct skl_wrpll_params *params, uint32_t · 25 unmodified lines
22022186 WARN(1, "Incorrect PDiv\n");
22032187 }
22042188
2205− if (kdiv != 2)
2206− qdiv = 1;
2189+ WARN_ON(kdiv != 2 && qdiv != 1);
22072190
22082191 params->qdiv_ratio = qdiv;
22092192 params->qdiv_mode = (qdiv == 1) ? 0 : 1;
22102193
2211− params->dco_integer = div_u64(dco_freq, ref_freq);
2212− params->dco_fraction = div_u64((div_u64((uint64_t)dco_freq<<15, (uint64_t)ref_freq) -
2213− ((uint64_t)params->dco_integer<<15)) * 0x8000, 0x8000);
2194+ dco = div_u64((u64)dco_freq << 15, ref_freq);
2195+
2196+ params->dco_integer = dco >> 15;
2197+ params->dco_fraction = dco & 0x7fff;
22142198 }
22152199
22162200 static bool
2217−cnl_ddi_calculate_wrpll(int clock /* in Hz */,
2201+cnl_ddi_calculate_wrpll(int clock,
22182202 struct drm_i915_private *dev_priv,
22192203 struct skl_wrpll_params *wrpll_params)
22202204 {
2221− uint64_t afe_clock = clock * 5 / KHz(1); /* clocks in kHz */
2222− unsigned int dco_min = 7998 * KHz(1);
2223− unsigned int dco_max = 10000 * KHz(1);
2224− unsigned int dco_mid = (dco_min + dco_max) / 2;
2225−
2205+ u32 afe_clock = clock * 5;
2206+ u32 dco_min = 7998000;
2207+ u32 dco_max = 10000000;
2208+ u32 dco_mid = (dco_min + dco_max) / 2;
22262209 static const int dividers[] = { 2, 4, 6, 8, 10, 12, 14, 16,
22272210 18, 20, 24, 28, 30, 32, 36, 40,
22282211 42, 44, 48, 50, 52, 54, 56, 60,
22292212 64, 66, 68, 70, 72, 76, 78, 80,
22302213 84, 88, 90, 92, 96, 98, 100, 102,
22312214 3, 5, 7, 9, 15, 21 };
2232− unsigned int d, dco;
2233− unsigned int dco_centrality = 0;
2234− unsigned int best_dco_centrality = 999999;
2235− unsigned int best_div = 0;
2236− unsigned int best_dco = 0;
2237− unsigned int pdiv = 0, qdiv = 0, kdiv = 0;
2215+ u32 dco, best_dco = 0, dco_centrality = 0;
2216+ u32 best_dco_centrality = U32_MAX; /* Spec meaning of 999999 MHz */
2217+ int d, best_div = 0, pdiv = 0, qdiv = 0, kdiv = 0;
22382218
22392219 for (d = 0; d < ARRAY_SIZE(dividers); d++) {
22402220 dco = afe_clock * dividers[d];
@@ -2271,7 +2251,7 @@ static bool cnl_ddi_hdmi_pll_dividers(struct intel_crtc *crtc, · 30 unmodified lines
22712251
22722252 cfgcr0 = DPLL_CFGCR0_HDMI_MODE;
22732253
2274− if (!cnl_ddi_calculate_wrpll(clock * 1000, dev_priv, &wrpll_params))
2254+ if (!cnl_ddi_calculate_wrpll(clock, dev_priv, &wrpll_params))
22752255 return false;
22762256
22772257 cfgcr0 |= DPLL_CFGCR0_DCO_FRACTION(wrpll_params.dco_fraction) |
@@ -2281,7 +2261,6 @@ static bool cnl_ddi_hdmi_pll_dividers(struct intel_crtc *crtc, · 3 unmodified lines
22812261 DPLL_CFGCR1_QDIV_MODE(wrpll_params.qdiv_mode) |
22822262 DPLL_CFGCR1_KDIV(wrpll_params.kdiv) |
22832263 DPLL_CFGCR1_PDIV(wrpll_params.pdiv) |
2284− wrpll_params.central_freq |
22852264 DPLL_CFGCR1_CENTRAL_FREQ;
22862265
22872266 memset(&crtc_state->dpll_hw_state, 0,
@@ -2345,15 +2324,13 @@ cnl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state, · 57 unmodified lines
23452324
23462325 memset(&dpll_hw_state, 0, sizeof(dpll_hw_state));
23472326
2348− if (encoder->type == INTEL_OUTPUT_HDMI) {
2327+ if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
23492328 bret = cnl_ddi_hdmi_pll_dividers(crtc, crtc_state, clock);
23502329 if (!bret) {
23512330 DRM_DEBUG_KMS("Could not get HDMI pll dividers.\n");
23522331 return NULL;
23532332 }
2354− } else if (encoder->type == INTEL_OUTPUT_DP ||
2355− encoder->type == INTEL_OUTPUT_DP_MST ||
2356− encoder->type == INTEL_OUTPUT_EDP) {
2333+ } else if (intel_crtc_has_dp_encoder(crtc_state)) {
23572334 bret = cnl_ddi_dp_set_dpll_hw_state(clock, &dpll_hw_state);
23582335 if (!bret) {
23592336 DRM_DEBUG_KMS("Could not set DP dpll HW state.\n");
@@ -2361,8 +2338,8 @@ cnl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state, · 1 unmodified line
23612338 }
23622339 crtc_state->dpll_hw_state = dpll_hw_state;
23632340 } else {
2364− DRM_DEBUG_KMS("Skip DPLL setup for encoder %d\n",
2365− encoder->type);
2341+ DRM_DEBUG_KMS("Skip DPLL setup for output_types 0x%x\n",
2342+ crtc_state->output_types);
23662343 return NULL;
23672344 }
23682345
drivers/gpu/drm/i915/intel_drv.h+33−23
@@ -47,14 +47,11 @@ · 46 unmodified lines
4747 * contexts. Note that it's important that we check the condition again after
4848 * having timed out, since the timeout could be due to preemption or similar and
4949 * we've never had a chance to check the condition before the timeout.
50− *
51− * TODO: When modesetting has fully transitioned to atomic, the below
52− * drm_can_sleep() can be removed and in_atomic()/!in_atomic() asserts
53− * added.
5450 */
5551 #define _wait_for(COND, US, W) ({ \
5652 unsigned long timeout__ = jiffies + usecs_to_jiffies(US) + 1; \
5753 int ret__; \
54+ might_sleep(); \
5855 for (;;) { \
5956 bool expired__ = time_after(jiffies, timeout__); \
6057 if (COND) { \
@@ -65,11 +62,7 @@ · 4 unmodified lines
6562 ret__ = -ETIMEDOUT; \
6663 break; \
6764 } \
68− if ((W) && drm_can_sleep()) { \
69− usleep_range((W), (W)*2); \
70− } else { \
71− cpu_relax(); \
72− } \
65+ usleep_range((W), (W) * 2); \
7366 } \
7467 ret__; \
7568 })
@@ -173,7 +166,7 @@ enum intel_output_type { · 97 unmodified lines
173166 INTEL_OUTPUT_DP = 7,
174167 INTEL_OUTPUT_EDP = 8,
175168 INTEL_OUTPUT_DSI = 9,
176− INTEL_OUTPUT_UNKNOWN = 10,
169+ INTEL_OUTPUT_DDI = 10,
177170 INTEL_OUTPUT_DP_MST = 11,
178171 };
179172
@@ -216,6 +209,9 @@ struct intel_encoder { · 36 unmodified lines
216209 enum port port;
217210 unsigned int cloneable;
218211 void (*hot_plug)(struct intel_encoder *);
212+ enum intel_output_type (*compute_output_type)(struct intel_encoder *,
213+ struct intel_crtc_state *,
214+ struct drm_connector_state *);
219215 bool (*compute_config)(struct intel_encoder *,
220216 struct intel_crtc_state *,
221217 struct drm_connector_state *);
@@ -386,6 +382,8 @@ struct intel_atomic_state { · 164 unmodified lines
386382 unsigned int active_crtcs;
387383 /* minimum acceptable cdclk for each pipe */
388384 int min_cdclk[I915_MAX_PIPES];
385+ /* minimum acceptable voltage level for each pipe */
386+ u8 min_voltage_level[I915_MAX_PIPES];
389387
390388 struct intel_shared_dpll_state shared_dpll[I915_NUM_PLLS];
391389
@@ -420,6 +418,9 @@ struct intel_plane_state { · 28 unmodified lines
420418 /* plane control register */
421419 u32 ctl;
422420
421+ /* plane color control register */
422+ u32 color_ctl;
423+
423424 /*
424425 * scaler_id
425426 * = -1 : not using a scaler
@@ -738,6 +739,9 @@ struct intel_crtc_state { · 312 unmodified lines
738739 */
739740 uint8_t lane_lat_optim_mask;
740741
742+ /* minimum acceptable voltage level */
743+ u8 min_voltage_level;
744+
741745 /* Panel fitter controls for gen2-gen4 + VLV */
742746 struct {
743747 u32 control;
@@ -1048,7 +1052,6 @@ struct intel_lspcon { · 304 unmodified lines
10481052
10491053 struct intel_digital_port {
10501054 struct intel_encoder base;
1051− enum port port;
10521055 u32 saved_port_bits;
10531056 struct intel_dp dp;
10541057 struct intel_hdmi hdmi;
@@ -1080,7 +1083,7 @@ struct intel_dp_mst_encoder { · 25 unmodified lines
10801083 static inline enum dpio_channel
10811084 vlv_dport_to_channel(struct intel_digital_port *dport)
10821085 {
1083− switch (dport->port) {
1086+ switch (dport->base.port) {
10841087 case PORT_B:
10851088 case PORT_D:
10861089 return DPIO_CH0;
@@ -1094,7 +1097,7 @@ vlv_dport_to_channel(struct intel_digital_port *dport) · 7 unmodified lines
10941097 static inline enum dpio_phy
10951098 vlv_dport_to_phy(struct intel_digital_port *dport)
10961099 {
1097− switch (dport->port) {
1100+ switch (dport->base.port) {
10981101 case PORT_B:
10991102 case PORT_C:
11001103 return DPIO_PHY0;
@@ -1147,7 +1150,7 @@ enc_to_dig_port(struct drm_encoder *encoder) · 46 unmodified lines
11471150 struct intel_encoder *intel_encoder = to_intel_encoder(encoder);
11481151
11491152 switch (intel_encoder->type) {
1150− case INTEL_OUTPUT_UNKNOWN:
1153+ case INTEL_OUTPUT_DDI:
11511154 WARN_ON(!HAS_DDI(to_i915(encoder->dev)));
11521155 case INTEL_OUTPUT_DP:
11531156 case INTEL_OUTPUT_EDP:
@@ -1271,7 +1274,6 @@ void intel_ddi_fdi_post_disable(struct intel_encoder *intel_encoder, · 117 unmodified lines
12711274 void hsw_fdi_link_train(struct intel_crtc *crtc,
12721275 const struct intel_crtc_state *crtc_state);
12731276 void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port);
1274−enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder);
12751277 bool intel_ddi_get_hw_state(struct intel_encoder *encoder, enum pipe *pipe);
12761278 void intel_ddi_enable_transcoder_func(const struct intel_crtc_state *crtc_state);
12771279 void intel_ddi_disable_transcoder_func(struct drm_i915_private *dev_priv,
@@ -1288,10 +1290,10 @@ bool intel_ddi_is_audio_enabled(struct drm_i915_private *dev_priv, · 10 unmodified lines
12881290 void intel_ddi_get_config(struct intel_encoder *encoder,
12891291 struct intel_crtc_state *pipe_config);
12901292
1291−void intel_ddi_clock_get(struct intel_encoder *encoder,
1292− struct intel_crtc_state *pipe_config);
12931293 void intel_ddi_set_vc_payload_alloc(const struct intel_crtc_state *crtc_state,
12941294 bool state);
1295+void intel_ddi_compute_min_voltage_level(struct drm_i915_private *dev_priv,
1296+ struct intel_crtc_state *crtc_state);
12951297 u32 bxt_signal_levels(struct intel_dp *intel_dp);
12961298 uint32_t ddi_signal_levels(struct intel_dp *intel_dp);
12971299 u8 intel_ddi_dp_voltage_max(struct intel_encoder *encoder);
@@ -1304,7 +1306,9 @@ void intel_init_audio_hooks(struct drm_i915_private *dev_priv); · 6 unmodified lines
13041306 void intel_audio_codec_enable(struct intel_encoder *encoder,
13051307 const struct intel_crtc_state *crtc_state,
13061308 const struct drm_connector_state *conn_state);
1307−void intel_audio_codec_disable(struct intel_encoder *encoder);
1309+void intel_audio_codec_disable(struct intel_encoder *encoder,
1310+ const struct intel_crtc_state *old_crtc_state,
1311+ const struct drm_connector_state *old_conn_state);
13081312 void i915_audio_component_init(struct drm_i915_private *dev_priv);
13091313 void i915_audio_component_cleanup(struct drm_i915_private *dev_priv);
13101314 void intel_audio_init(struct drm_i915_private *dev_priv);
@@ -1322,10 +1326,14 @@ void intel_init_cdclk_hooks(struct drm_i915_private *dev_priv); · 11 unmodified lines
13221326 void intel_update_max_cdclk(struct drm_i915_private *dev_priv);
13231327 void intel_update_cdclk(struct drm_i915_private *dev_priv);
13241328 void intel_update_rawclk(struct drm_i915_private *dev_priv);
1325−bool intel_cdclk_state_compare(const struct intel_cdclk_state *a,
1329+bool intel_cdclk_needs_modeset(const struct intel_cdclk_state *a,
13261330 const struct intel_cdclk_state *b);
1331+bool intel_cdclk_changed(const struct intel_cdclk_state *a,
1332+ const struct intel_cdclk_state *b);
13271333 void intel_set_cdclk(struct drm_i915_private *dev_priv,
13281334 const struct intel_cdclk_state *cdclk_state);
1335+void intel_dump_cdclk_state(const struct intel_cdclk_state *cdclk_state,
1336+ const char *context);
13291337
13301338 /* intel_display.c */
13311339 void i830_enable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe);
@@ -1477,8 +1485,8 @@ bool bxt_find_best_dpll(struct intel_crtc_state *crtc_state, int target_clock, · 145 unmodified lines
14771485 int chv_calc_dpll_params(int refclk, struct dpll *pll_clock);
14781486
14791487 bool intel_crtc_active(struct intel_crtc *crtc);
1480−void hsw_enable_ips(struct intel_crtc *crtc);
1481−void hsw_disable_ips(struct intel_crtc *crtc);
1488+void hsw_enable_ips(const struct intel_crtc_state *crtc_state);
1489+void hsw_disable_ips(const struct intel_crtc_state *crtc_state);
14821490 enum intel_display_power_domain intel_port_to_power_domain(enum port port);
14831491 void intel_mode_from_pipe_config(struct drm_display_mode *mode,
14841492 struct intel_crtc_state *pipe_config);
@@ -1491,6 +1499,8 @@ static inline u32 intel_plane_ggtt_offset(const struct intel_plane_state *state) · 6 unmodified lines
14911499 return i915_ggtt_offset(state->vma);
14921500 }
14931501
1502+u32 glk_plane_color_ctl(const struct intel_crtc_state *crtc_state,
1503+ const struct intel_plane_state *plane_state);
14941504 u32 skl_plane_ctl(const struct intel_crtc_state *crtc_state,
14951505 const struct intel_plane_state *plane_state);
14961506 u32 skl_plane_stride(const struct drm_framebuffer *fb, int plane,
@@ -1521,7 +1531,8 @@ void intel_dp_sink_dpms(struct intel_dp *intel_dp, int mode); · 24 unmodified lines
15211531 void intel_dp_encoder_reset(struct drm_encoder *encoder);
15221532 void intel_dp_encoder_suspend(struct intel_encoder *intel_encoder);
15231533 void intel_dp_encoder_destroy(struct drm_encoder *encoder);
1524−int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc);
1534+int intel_dp_sink_crc(struct intel_dp *intel_dp,
1535+ struct intel_crtc_state *crtc_state, u8 *crc);
15251536 bool intel_dp_compute_config(struct intel_encoder *encoder,
15261537 struct intel_crtc_state *pipe_config,
15271538 struct drm_connector_state *conn_state);
@@ -1868,7 +1879,6 @@ void intel_init_gt_powersave(struct drm_i915_private *dev_priv); · 340 unmodified lines
18681879 void intel_cleanup_gt_powersave(struct drm_i915_private *dev_priv);
18691880 void intel_sanitize_gt_powersave(struct drm_i915_private *dev_priv);
18701881 void intel_enable_gt_powersave(struct drm_i915_private *dev_priv);
1871−void intel_autoenable_gt_powersave(struct drm_i915_private *dev_priv);
18721882 void intel_disable_gt_powersave(struct drm_i915_private *dev_priv);
18731883 void intel_suspend_gt_powersave(struct drm_i915_private *dev_priv);
18741884 void gen6_rps_busy(struct drm_i915_private *dev_priv);
drivers/gpu/drm/i915/intel_dsi.c+10−9
@@ -662,11 +662,11 @@ static void vlv_dsi_clear_device_ready(struct intel_encoder *encoder) · 661 unmodified lines
662662 }
663663 }
664664
665−static void intel_dsi_port_enable(struct intel_encoder *encoder)
665+static void intel_dsi_port_enable(struct intel_encoder *encoder,
666+ const struct intel_crtc_state *crtc_state)
666667 {
667− struct drm_device *dev = encoder->base.dev;
668− struct drm_i915_private *dev_priv = to_i915(dev);
669− struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
668+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
669+ struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
670670 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
671671 enum port port;
672672
@@ -705,7 +705,7 @@ static void intel_dsi_port_enable(struct intel_encoder *encoder) · 32 unmodified lines
705705 if (IS_BROXTON(dev_priv))
706706 temp |= LANE_CONFIGURATION_DUAL_LINK_A;
707707 else
708− temp |= intel_crtc->pipe ?
708+ temp |= crtc->pipe ?
709709 LANE_CONFIGURATION_DUAL_LINK_B :
710710 LANE_CONFIGURATION_DUAL_LINK_A;
711711 }
@@ -875,7 +875,7 @@ static void intel_dsi_pre_enable(struct intel_encoder *encoder, · 163 unmodified lines
875875
876876 intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_DISPLAY_ON);
877877
878− intel_dsi_port_enable(encoder);
878+ intel_dsi_port_enable(encoder, pipe_config);
879879 }
880880
881881 intel_panel_enable_backlight(pipe_config, conn_state);
@@ -1082,7 +1082,7 @@ static void bxt_dsi_get_pipe_config(struct intel_encoder *encoder, · 200 unmodified lines
10821082 struct drm_display_mode *adjusted_mode =
10831083 &pipe_config->base.adjusted_mode;
10841084 struct drm_display_mode *adjusted_mode_sw;
1085− struct intel_crtc *intel_crtc;
1085+ struct intel_crtc *crtc = to_intel_crtc(pipe_config->base.crtc);
10861086 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
10871087 unsigned int lane_count = intel_dsi->lane_count;
10881088 unsigned int bpp, fmt;
@@ -1093,8 +1093,7 @@ static void bxt_dsi_get_pipe_config(struct intel_encoder *encoder, · 4 unmodified lines
10931093 crtc_hblank_start_sw, crtc_hblank_end_sw;
10941094
10951095 /* FIXME: hw readout should not depend on SW state */
1096− intel_crtc = to_intel_crtc(encoder->base.crtc);
1097− adjusted_mode_sw = &intel_crtc->config->base.adjusted_mode;
1096+ adjusted_mode_sw = &crtc->config->base.adjusted_mode;
10981097
10991098 /*
11001099 * Atleast one port is active as encoder->get_config called only if
@@ -1243,6 +1242,8 @@ static void intel_dsi_get_config(struct intel_encoder *encoder, · 142 unmodified lines
12431242 u32 pclk;
12441243 DRM_DEBUG_KMS("\n");
12451244
1245+ pipe_config->output_types |= BIT(INTEL_OUTPUT_DSI);
1246+
12461247 if (IS_GEN9_LP(dev_priv))
12471248 bxt_dsi_get_pipe_config(encoder, pipe_config);
12481249
drivers/gpu/drm/i915/intel_dvo.c+2−0
@@ -159,6 +159,8 @@ static void intel_dvo_get_config(struct intel_encoder *encoder, · 158 unmodified lines
159159 struct intel_dvo *intel_dvo = enc_to_dvo(encoder);
160160 u32 tmp, flags = 0;
161161
162+ pipe_config->output_types |= BIT(INTEL_OUTPUT_DVO);
163+
162164 tmp = I915_READ(intel_dvo->dev.dvo_reg);
163165 if (tmp & DVO_HSYNC_ACTIVE_HIGH)
164166 flags |= DRM_MODE_FLAG_PHSYNC;
drivers/gpu/drm/i915/intel_engine_cs.c+127−88
@@ -50,6 +50,8 @@ struct engine_class_info { · 49 unmodified lines
5050 const char *name;
5151 int (*init_legacy)(struct intel_engine_cs *engine);
5252 int (*init_execlists)(struct intel_engine_cs *engine);
53+
54+ u8 uabi_class;
5355 };
5456
5557 static const struct engine_class_info intel_engine_classes[] = {
@@ -57,21 +59,25 @@ static const struct engine_class_info intel_engine_classes[] = { · 1 unmodified line
5759 .name = "rcs",
5860 .init_execlists = logical_render_ring_init,
5961 .init_legacy = intel_init_render_ring_buffer,
62+ .uabi_class = I915_ENGINE_CLASS_RENDER,
6063 },
6164 [COPY_ENGINE_CLASS] = {
6265 .name = "bcs",
6366 .init_execlists = logical_xcs_ring_init,
6467 .init_legacy = intel_init_blt_ring_buffer,
68+ .uabi_class = I915_ENGINE_CLASS_COPY,
6569 },
6670 [VIDEO_DECODE_CLASS] = {
6771 .name = "vcs",
6872 .init_execlists = logical_xcs_ring_init,
6973 .init_legacy = intel_init_bsd_ring_buffer,
74+ .uabi_class = I915_ENGINE_CLASS_VIDEO,
7075 },
7176 [VIDEO_ENHANCEMENT_CLASS] = {
7277 .name = "vecs",
7378 .init_execlists = logical_xcs_ring_init,
7479 .init_legacy = intel_init_vebox_ring_buffer,
80+ .uabi_class = I915_ENGINE_CLASS_VIDEO_ENHANCE,
7581 },
7682 };
7783
@@ -213,13 +219,15 @@ intel_engine_setup(struct drm_i915_private *dev_priv, · 135 unmodified lines
213219 WARN_ON(snprintf(engine->name, sizeof(engine->name), "%s%u",
214220 class_info->name, info->instance) >=
215221 sizeof(engine->name));
216− engine->uabi_id = info->uabi_id;
217222 engine->hw_id = engine->guc_id = info->hw_id;
218223 engine->mmio_base = info->mmio_base;
219224 engine->irq_shift = info->irq_shift;
220225 engine->class = info->class;
221226 engine->instance = info->instance;
222227
228+ engine->uabi_id = info->uabi_id;
229+ engine->uabi_class = class_info->uabi_class;
230+
223231 engine->context_size = __intel_engine_context_size(dev_priv,
224232 engine->class);
225233 if (WARN_ON(engine->context_size > BIT(20)))
@@ -281,6 +289,8 @@ int intel_engines_init_mmio(struct drm_i915_private *dev_priv) · 55 unmodified lines
281289
282290 device_info->num_rings = hweight32(mask);
283291
292+ i915_check_and_clear_faults(dev_priv);
293+
284294 return 0;
285295
286296 cleanup:
@@ -620,7 +630,7 @@ int intel_engine_init_common(struct intel_engine_cs *engine) · 333 unmodified lines
620630 * Similarly the preempt context must always be available so that
621631 * we can interrupt the engine at any time.
622632 */
623− if (INTEL_INFO(engine->i915)->has_logical_ring_preemption) {
633+ if (HAS_LOGICAL_RING_PREEMPTION(engine->i915)) {
624634 ring = engine->context_pin(engine,
625635 engine->i915->preempt_context);
626636 if (IS_ERR(ring)) {
@@ -633,25 +643,19 @@ int intel_engine_init_common(struct intel_engine_cs *engine) · 6 unmodified lines
633643 if (ret)
634644 goto err_unpin_preempt;
635645
636− ret = i915_gem_render_state_init(engine);
637− if (ret)
638− goto err_breadcrumbs;
639−
640646 if (HWS_NEEDS_PHYSICAL(engine->i915))
641647 ret = init_phys_status_page(engine);
642648 else
643649 ret = init_status_page(engine);
644650 if (ret)
645− goto err_rs_fini;
651+ goto err_breadcrumbs;
646652
647653 return 0;
648654
649−err_rs_fini:
650− i915_gem_render_state_fini(engine);
651655 err_breadcrumbs:
652656 intel_engine_fini_breadcrumbs(engine);
653657 err_unpin_preempt:
654− if (INTEL_INFO(engine->i915)->has_logical_ring_preemption)
658+ if (HAS_LOGICAL_RING_PREEMPTION(engine->i915))
655659 engine->context_unpin(engine, engine->i915->preempt_context);
656660 err_unpin_kernel:
657661 engine->context_unpin(engine, engine->i915->kernel_context);
@@ -674,12 +678,14 @@ void intel_engine_cleanup_common(struct intel_engine_cs *engine) · 16 unmodified lines
674678 else
675679 cleanup_status_page(engine);
676680
677− i915_gem_render_state_fini(engine);
678681 intel_engine_fini_breadcrumbs(engine);
679682 intel_engine_cleanup_cmd_parser(engine);
680683 i915_gem_batch_pool_fini(&engine->batch_pool);
681684
682− if (INTEL_INFO(engine->i915)->has_logical_ring_preemption)
685+ if (engine->default_state)
686+ i915_gem_object_put(engine->default_state);
687+
688+ if (HAS_LOGICAL_RING_PREEMPTION(engine->i915))
683689 engine->context_unpin(engine, engine->i915->preempt_context);
684690 engine->context_unpin(engine, engine->i915->kernel_context);
685691 }
@@ -1014,22 +1020,6 @@ static int gen9_init_workarounds(struct intel_engine_cs *engine) · 328 unmodified lines
10141020 WA_SET_BIT_MASKED(HALF_SLICE_CHICKEN3,
10151021 GEN9_DISABLE_OCL_OOB_SUPPRESS_LOGIC);
10161022
1017− /* WaDisableDgMirrorFixInHalfSliceChicken5:bxt */
1018− if (IS_BXT_REVID(dev_priv, 0, BXT_REVID_A1))
1019− WA_CLR_BIT_MASKED(GEN9_HALF_SLICE_CHICKEN5,
1020− GEN9_DG_MIRROR_FIX_ENABLE);
1021−
1022− /* WaSetDisablePixMaskCammingAndRhwoInCommonSliceChicken:bxt */
1023− if (IS_BXT_REVID(dev_priv, 0, BXT_REVID_A1)) {
1024− WA_SET_BIT_MASKED(GEN7_COMMON_SLICE_CHICKEN1,
1025− GEN9_RHWO_OPTIMIZATION_DISABLE);
1026− /*
1027− * WA also requires GEN9_SLICE_COMMON_ECO_CHICKEN0[14:14] to be set
1028− * but we do that in per ctx batchbuffer as there is an issue
1029− * with this register not getting restored on ctx restore
1030− */
1031− }
1032−
10331023 /* WaEnableYV12BugFixInHalfSliceChicken7:skl,bxt,kbl,glk,cfl */
10341024 /* WaEnableSamplerGPGPUPreemptionSupport:skl,bxt,kbl,cfl */
10351025 WA_SET_BIT_MASKED(GEN9_HALF_SLICE_CHICKEN7,
@@ -1045,11 +1035,6 @@ static int gen9_init_workarounds(struct intel_engine_cs *engine) · 9 unmodified lines
10451035 WA_CLR_BIT_MASKED(GEN9_HALF_SLICE_CHICKEN5,
10461036 GEN9_CCS_TLB_PREFETCH_ENABLE);
10471037
1048− /* WaDisableMaskBasedCammingInRCC:bxt */
1049− if (IS_BXT_REVID(dev_priv, 0, BXT_REVID_A1))
1050− WA_SET_BIT_MASKED(SLICE_ECO_CHICKEN0,
1051− PIXEL_MASK_CAMMING_DISABLE);
1052−
10531038 /* WaForceContextSaveRestoreNonCoherent:skl,bxt,kbl,cfl */
10541039 WA_SET_BIT_MASKED(HDC_CHICKEN0,
10551040 HDC_FORCE_CONTEXT_SAVE_RESTORE_NON_COHERENT |
@@ -1079,8 +1064,7 @@ static int gen9_init_workarounds(struct intel_engine_cs *engine) · 23 unmodified lines
10791064 /* WaDisableSamplerPowerBypassForSOPingPong:skl,bxt,kbl,cfl */
10801065 if (IS_SKYLAKE(dev_priv) ||
10811066 IS_KABYLAKE(dev_priv) ||
1082− IS_COFFEELAKE(dev_priv) ||
1083− IS_BXT_REVID(dev_priv, 0, BXT_REVID_B0))
1067+ IS_COFFEELAKE(dev_priv))
10841068 WA_SET_BIT_MASKED(HALF_SLICE_CHICKEN3,
10851069 GEN8_SAMPLER_POWER_BYPASS_DIS);
10861070
@@ -1204,72 +1188,35 @@ static int skl_init_workarounds(struct intel_engine_cs *engine) · 117 unmodified lines
12041188 static int bxt_init_workarounds(struct intel_engine_cs *engine)
12051189 {
12061190 struct drm_i915_private *dev_priv = engine->i915;
1191+ u32 val;
12071192 int ret;
12081193
12091194 ret = gen9_init_workarounds(engine);
12101195 if (ret)
12111196 return ret;
12121197
1213− /* WaStoreMultiplePTEenable:bxt */
1214− /* This is a requirement according to Hardware specification */
1215− if (IS_BXT_REVID(dev_priv, 0, BXT_REVID_A1))
1216− I915_WRITE(TILECTL, I915_READ(TILECTL) | TILECTL_TLBPF);
1217−
1218− /* WaSetClckGatingDisableMedia:bxt */
1219− if (IS_BXT_REVID(dev_priv, 0, BXT_REVID_A1)) {
1220− I915_WRITE(GEN7_MISCCPCTL, (I915_READ(GEN7_MISCCPCTL) &
1221− ~GEN8_DOP_CLOCK_GATE_MEDIA_ENABLE));
1222− }
1223−
12241198 /* WaDisableThreadStallDopClockGating:bxt */
12251199 WA_SET_BIT_MASKED(GEN8_ROW_CHICKEN,
12261200 STALL_DOP_GATING_DISABLE);
12271201
12281202 /* WaDisablePooledEuLoadBalancingFix:bxt */
1229− if (IS_BXT_REVID(dev_priv, BXT_REVID_B0, REVID_FOREVER)) {
1230− I915_WRITE(FF_SLICE_CS_CHICKEN2,
1231− _MASKED_BIT_ENABLE(GEN9_POOLED_EU_LOAD_BALANCING_FIX_DISABLE));
1232− }
1233−
1234− /* WaDisableSbeCacheDispatchPortSharing:bxt */
1235− if (IS_BXT_REVID(dev_priv, 0, BXT_REVID_B0)) {
1236− WA_SET_BIT_MASKED(
1237− GEN7_HALF_SLICE_CHICKEN1,
1238− GEN7_SBE_SS_CACHE_DISPATCH_PORT_SHARING_DISABLE);
1239− }
1240−
1241− /* WaDisableObjectLevelPreemptionForTrifanOrPolygon:bxt */
1242− /* WaDisableObjectLevelPreemptionForInstancedDraw:bxt */
1243− /* WaDisableObjectLevelPreemtionForInstanceId:bxt */
1244− /* WaDisableLSQCROPERFforOCL:bxt */
1245− if (IS_BXT_REVID(dev_priv, 0, BXT_REVID_A1)) {
1246− ret = wa_ring_whitelist_reg(engine, GEN9_CS_DEBUG_MODE1);
1247− if (ret)
1248− return ret;
1249−
1250− ret = wa_ring_whitelist_reg(engine, GEN8_L3SQCREG4);
1251− if (ret)
1252− return ret;
1253− }
1203+ I915_WRITE(FF_SLICE_CS_CHICKEN2,
1204+ _MASKED_BIT_ENABLE(GEN9_POOLED_EU_LOAD_BALANCING_FIX_DISABLE));
12541205
12551206 /* WaProgramL3SqcReg1DefaultForPerf:bxt */
1256− if (IS_BXT_REVID(dev_priv, BXT_REVID_B0, REVID_FOREVER)) {
1257− u32 val = I915_READ(GEN8_L3SQCREG1);
1258− val &= ~L3_PRIO_CREDITS_MASK;
1259− val |= L3_GENERAL_PRIO_CREDITS(62) | L3_HIGH_PRIO_CREDITS(2);
1260− I915_WRITE(GEN8_L3SQCREG1, val);
1261− }
1207+ val = I915_READ(GEN8_L3SQCREG1);
1208+ val &= ~L3_PRIO_CREDITS_MASK;
1209+ val |= L3_GENERAL_PRIO_CREDITS(62) | L3_HIGH_PRIO_CREDITS(2);
1210+ I915_WRITE(GEN8_L3SQCREG1, val);
12621211
12631212 /* WaToEnableHwFixForPushConstHWBug:bxt */
1264− if (IS_BXT_REVID(dev_priv, BXT_REVID_C0, REVID_FOREVER))
1265− WA_SET_BIT_MASKED(COMMON_SLICE_CHICKEN2,
1266− GEN8_SBE_DISABLE_REPLAY_BUF_OPTIMIZATION);
1213+ WA_SET_BIT_MASKED(COMMON_SLICE_CHICKEN2,
1214+ GEN8_SBE_DISABLE_REPLAY_BUF_OPTIMIZATION);
12671215
12681216 /* WaInPlaceDecompressionHang:bxt */
1269− if (IS_BXT_REVID(dev_priv, BXT_REVID_C0, REVID_FOREVER))
1270− I915_WRITE(GEN9_GAMT_ECO_REG_RW_IA,
1271− (I915_READ(GEN9_GAMT_ECO_REG_RW_IA) |
1272− GAMT_ECO_ENABLE_IN_PLACE_DECOMPRESS));
1217+ I915_WRITE(GEN9_GAMT_ECO_REG_RW_IA,
1218+ (I915_READ(GEN9_GAMT_ECO_REG_RW_IA) |
1219+ GAMT_ECO_ENABLE_IN_PLACE_DECOMPRESS));
12731220
12741221 return 0;
12751222 }
@@ -1585,6 +1532,34 @@ bool intel_engines_are_idle(struct drm_i915_private *dev_priv) · 309 unmodified lines
15851532 return true;
15861533 }
15871534
1535+/**
1536+ * intel_engine_has_kernel_context:
1537+ * @engine: the engine
1538+ *
1539+ * Returns true if the last context to be executed on this engine, or has been
1540+ * executed if the engine is already idle, is the kernel context
1541+ * (#i915.kernel_context).
1542+ */
1543+bool intel_engine_has_kernel_context(const struct intel_engine_cs *engine)
1544+{
1545+ const struct i915_gem_context * const kernel_context =
1546+ engine->i915->kernel_context;
1547+ struct drm_i915_gem_request *rq;
1548+
1549+ lockdep_assert_held(&engine->i915->drm.struct_mutex);
1550+
1551+ /*
1552+ * Check the last context seen by the engine. If active, it will be
1553+ * the last request that remains in the timeline. When idle, it is
1554+ * the last executed context as tracked by retirement.
1555+ */
1556+ rq = __i915_gem_active_peek(&engine->timeline->last_request);
1557+ if (rq)
1558+ return rq->ctx == kernel_context;
1559+ else
1560+ return engine->last_retired_context == kernel_context;
1561+}
1562+
15881563 void intel_engines_reset_default_submission(struct drm_i915_private *i915)
15891564 {
15901565 struct intel_engine_cs *engine;
@@ -1594,19 +1569,63 @@ void intel_engines_reset_default_submission(struct drm_i915_private *i915) · 3 unmodified lines
15941569 engine->set_default_submission(engine);
15951570 }
15961571
1597−void intel_engines_mark_idle(struct drm_i915_private *i915)
1572+/**
1573+ * intel_engines_park: called when the GT is transitioning from busy->idle
1574+ * @i915: the i915 device
1575+ *
1576+ * The GT is now idle and about to go to sleep (maybe never to wake again?).
1577+ * Time for us to tidy and put away our toys (release resources back to the
1578+ * system).
1579+ */
1580+void intel_engines_park(struct drm_i915_private *i915)
15981581 {
15991582 struct intel_engine_cs *engine;
16001583 enum intel_engine_id id;
16011584
16021585 for_each_engine(engine, i915, id) {
1586+ /* Flush the residual irq tasklets first. */
16031587 intel_engine_disarm_breadcrumbs(engine);
1588+ tasklet_kill(&engine->execlists.tasklet);
1589+
1590+ /*
1591+ * We are committed now to parking the engines, make sure there
1592+ * will be no more interrupts arriving later and the engines
1593+ * are truly idle.
1594+ */
1595+ if (wait_for(intel_engine_is_idle(engine), 10)) {
1596+ struct drm_printer p = drm_debug_printer(__func__);
1597+
1598+ dev_err(i915->drm.dev,
1599+ "%s is not idle before parking\n",
1600+ engine->name);
1601+ intel_engine_dump(engine, &p);
1602+ }
1603+
1604+ if (engine->park)
1605+ engine->park(engine);
1606+
16041607 i915_gem_batch_pool_fini(&engine->batch_pool);
1605− tasklet_kill(&engine->execlists.irq_tasklet);
16061608 engine->execlists.no_priolist = false;
16071609 }
16081610 }
16091611
1612+/**
1613+ * intel_engines_unpark: called when the GT is transitioning from idle->busy
1614+ * @i915: the i915 device
1615+ *
1616+ * The GT was idle and now about to fire up with some new user requests.
1617+ */
1618+void intel_engines_unpark(struct drm_i915_private *i915)
1619+{
1620+ struct intel_engine_cs *engine;
1621+ enum intel_engine_id id;
1622+
1623+ for_each_engine(engine, i915, id) {
1624+ if (engine->unpark)
1625+ engine->unpark(engine);
1626+ }
1627+}
1628+
16101629 bool intel_engine_can_store_dword(struct intel_engine_cs *engine)
16111630 {
16121631 switch (INTEL_GEN(engine->i915)) {
@@ -1622,6 +1641,20 @@ bool intel_engine_can_store_dword(struct intel_engine_cs *engine) · 9 unmodified lines
16221641 }
16231642 }
16241643
1644+unsigned int intel_engines_has_context_isolation(struct drm_i915_private *i915)
1645+{
1646+ struct intel_engine_cs *engine;
1647+ enum intel_engine_id id;
1648+ unsigned int which;
1649+
1650+ which = 0;
1651+ for_each_engine(engine, i915, id)
1652+ if (engine->default_state)
1653+ which |= BIT(engine->uabi_class);
1654+
1655+ return which;
1656+}
1657+
16251658 static void print_request(struct drm_printer *m,
16261659 struct drm_i915_gem_request *rq,
16271660 const char *prefix)
@@ -1688,9 +1721,14 @@ void intel_engine_dump(struct intel_engine_cs *engine, struct drm_printer *m) · 60 unmodified lines
16881721 drm_printf(m, "\tRING_TAIL: 0x%08x [0x%08x]\n",
16891722 I915_READ(RING_TAIL(engine->mmio_base)) & TAIL_ADDR,
16901723 rq ? rq->ring->tail : 0);
1691− drm_printf(m, "\tRING_CTL: 0x%08x [%s]\n",
1724+ drm_printf(m, "\tRING_CTL: 0x%08x%s\n",
16921725 I915_READ(RING_CTL(engine->mmio_base)),
1693− I915_READ(RING_CTL(engine->mmio_base)) & (RING_WAIT | RING_WAIT_SEMAPHORE) ? "waiting" : "");
1726+ I915_READ(RING_CTL(engine->mmio_base)) & (RING_WAIT | RING_WAIT_SEMAPHORE) ? " [waiting]" : "");
1727+ if (INTEL_GEN(engine->i915) > 2) {
1728+ drm_printf(m, "\tRING_MODE: 0x%08x%s\n",
1729+ I915_READ(RING_MI_MODE(engine->mmio_base)),
1730+ I915_READ(RING_MI_MODE(engine->mmio_base)) & (MODE_IDLE) ? " [idle]" : "");
1731+ }
16941732
16951733 rcu_read_unlock();
16961734
@@ -1781,6 +1819,7 @@ void intel_engine_dump(struct intel_engine_cs *engine, struct drm_printer *m) · 84 unmodified lines
17811819 }
17821820 spin_unlock_irq(&b->rb_lock);
17831821
1822+ drm_printf(m, "Idle? %s\n", yesno(intel_engine_is_idle(engine)));
17841823 drm_printf(m, "\n");
17851824 }
17861825
drivers/gpu/drm/i915/intel_guc.c+26−12
@@ -23,6 +23,7 @@ · 22 unmodified lines
2323 */
2424
2525 #include "intel_guc.h"
26+#include "intel_guc_submission.h"
2627 #include "i915_drv.h"
2728
2829 static void gen8_guc_raise_irq(struct intel_guc *guc)
@@ -268,7 +269,6 @@ int intel_guc_auth_huc(struct intel_guc *guc, u32 rsa_offset) · 239 unmodified lines
268269 int intel_guc_suspend(struct drm_i915_private *dev_priv)
269270 {
270271 struct intel_guc *guc = &dev_priv->guc;
271− struct i915_gem_context *ctx;
272272 u32 data[3];
273273
274274 if (guc->fw.load_status != INTEL_UC_FIRMWARE_SUCCESS)
@@ -276,14 +276,33 @@ int intel_guc_suspend(struct drm_i915_private *dev_priv) · 1 unmodified line
276276
277277 gen9_disable_guc_interrupts(dev_priv);
278278
279− ctx = dev_priv->kernel_context;
280−
281279 data[0] = INTEL_GUC_ACTION_ENTER_S_STATE;
282280 /* any value greater than GUC_POWER_D0 */
283281 data[1] = GUC_POWER_D1;
284− /* first page is shared data with GuC */
285− data[2] = guc_ggtt_offset(ctx->engine[RCS].state) +
286− LRC_GUCSHR_PN * PAGE_SIZE;
282+ data[2] = guc_ggtt_offset(guc->shared_data);
283+
284+ return intel_guc_send(guc, data, ARRAY_SIZE(data));
285+}
286+
287+/**
288+ * intel_guc_reset_engine() - ask GuC to reset an engine
289+ * @guc: intel_guc structure
290+ * @engine: engine to be reset
291+ */
292+int intel_guc_reset_engine(struct intel_guc *guc,
293+ struct intel_engine_cs *engine)
294+{
295+ u32 data[7];
296+
297+ GEM_BUG_ON(!guc->execbuf_client);
298+
299+ data[0] = INTEL_GUC_ACTION_REQUEST_ENGINE_RESET;
300+ data[1] = engine->guc_id;
301+ data[2] = 0;
302+ data[3] = 0;
303+ data[4] = 0;
304+ data[5] = guc->execbuf_client->stage_id;
305+ data[6] = guc_ggtt_offset(guc->shared_data);
287306
288307 return intel_guc_send(guc, data, ARRAY_SIZE(data));
289308 }
@@ -295,7 +314,6 @@ int intel_guc_suspend(struct drm_i915_private *dev_priv) · 5 unmodified lines
295314 int intel_guc_resume(struct drm_i915_private *dev_priv)
296315 {
297316 struct intel_guc *guc = &dev_priv->guc;
298− struct i915_gem_context *ctx;
299317 u32 data[3];
300318
301319 if (guc->fw.load_status != INTEL_UC_FIRMWARE_SUCCESS)
@@ -304,13 +322,9 @@ int intel_guc_resume(struct drm_i915_private *dev_priv) · 2 unmodified lines
304322 if (i915_modparams.guc_log_level >= 0)
305323 gen9_enable_guc_interrupts(dev_priv);
306324
307− ctx = dev_priv->kernel_context;
308−
309325 data[0] = INTEL_GUC_ACTION_EXIT_S_STATE;
310326 data[1] = GUC_POWER_D0;
311− /* first page is shared data with GuC */
312− data[2] = guc_ggtt_offset(ctx->engine[RCS].state) +
313− LRC_GUCSHR_PN * PAGE_SIZE;
327+ data[2] = guc_ggtt_offset(guc->shared_data);
314328
315329 return intel_guc_send(guc, data, ARRAY_SIZE(data));
316330 }
drivers/gpu/drm/i915/intel_guc.h+13−2
@@ -34,9 +34,14 @@ · 33 unmodified lines
3434 #include "i915_guc_reg.h"
3535 #include "i915_vma.h"
3636
37+struct guc_preempt_work {
38+ struct work_struct work;
39+ struct intel_engine_cs *engine;
40+};
41+
3742 /*
3843 * Top level structure of GuC. It handles firmware loading and manages client
39− * pool and doorbells. intel_guc owns a i915_guc_client to replace the legacy
44+ * pool and doorbells. intel_guc owns a intel_guc_client to replace the legacy
4045 * ExecList submission.
4146 */
4247 struct intel_guc {
@@ -54,8 +59,14 @@ struct intel_guc { · 11 unmodified lines
5459 struct i915_vma *stage_desc_pool;
5560 void *stage_desc_pool_vaddr;
5661 struct ida stage_ids;
62+ struct i915_vma *shared_data;
63+ void *shared_data_vaddr;
64+
65+ struct intel_guc_client *execbuf_client;
66+ struct intel_guc_client *preempt_client;
5767
58− struct i915_guc_client *execbuf_client;
68+ struct guc_preempt_work preempt_work[I915_NUM_ENGINES];
69+ struct workqueue_struct *preempt_wq;
5970
6071 DECLARE_BITMAP(doorbell_bitmap, GUC_NUM_DOORBELLS);
6172 /* Cyclic counter mod pagesize */
drivers/gpu/drm/i915/intel_guc_ct.c+1−0
@@ -198,6 +198,7 @@ static int ctch_open(struct intel_guc *guc, · 197 unmodified lines
198198 err = ctch_init(guc, ctch);
199199 if (unlikely(err))
200200 goto err_out;
201+ GEM_BUG_ON(!ctch->vma);
201202 }
202203
203204 /* vma should be already allocated and map'ed */
drivers/gpu/drm/i915/intel_guc_fw.c+105−69
@@ -97,23 +97,50 @@ int intel_guc_fw_select(struct intel_guc *guc) · 96 unmodified lines
9797 return 0;
9898 }
9999
100−/*
101− * Read the GuC status register (GUC_STATUS) and store it in the
102− * specified location; then return a boolean indicating whether
103− * the value matches either of two values representing completion
104− * of the GuC boot process.
105− *
106− * This is used for polling the GuC status in a wait_for()
107− * loop below.
108− */
109−static inline bool guc_ucode_response(struct drm_i915_private *dev_priv,
110− u32 *status)
100+static void guc_prepare_xfer(struct intel_guc *guc)
111101 {
112− u32 val = I915_READ(GUC_STATUS);
113− u32 uk_val = val & GS_UKERNEL_MASK;
114− *status = val;
115− return (uk_val == GS_UKERNEL_READY ||
116− ((val & GS_MIA_CORE_STATE) && uk_val == GS_UKERNEL_LAPIC_DONE));
102+ struct drm_i915_private *dev_priv = guc_to_i915(guc);
103+
104+ /* Must program this register before loading the ucode with DMA */
105+ I915_WRITE(GUC_SHIM_CONTROL, GUC_DISABLE_SRAM_INIT_TO_ZEROES |
106+ GUC_ENABLE_READ_CACHE_LOGIC |
107+ GUC_ENABLE_MIA_CACHING |
108+ GUC_ENABLE_READ_CACHE_FOR_SRAM_DATA |
109+ GUC_ENABLE_READ_CACHE_FOR_WOPCM_DATA |
110+ GUC_ENABLE_MIA_CLOCK_GATING);
111+
112+ if (IS_GEN9_LP(dev_priv))
113+ I915_WRITE(GEN9LP_GT_PM_CONFIG, GT_DOORBELL_ENABLE);
114+ else
115+ I915_WRITE(GEN9_GT_PM_CONFIG, GT_DOORBELL_ENABLE);
116+
117+ if (IS_GEN9(dev_priv)) {
118+ /* DOP Clock Gating Enable for GuC clocks */
119+ I915_WRITE(GEN7_MISCCPCTL, (GEN8_DOP_CLOCK_GATE_GUC_ENABLE |
120+ I915_READ(GEN7_MISCCPCTL)));
121+
122+ /* allows for 5us (in 10ns units) before GT can go to RC6 */
123+ I915_WRITE(GUC_ARAT_C6DIS, 0x1FF);
124+ }
125+}
126+
127+/* Copy RSA signature from the fw image to HW for verification */
128+static int guc_xfer_rsa(struct intel_guc *guc, struct i915_vma *vma)
129+{
130+ struct drm_i915_private *dev_priv = guc_to_i915(guc);
131+ struct intel_uc_fw *guc_fw = &guc->fw;
132+ struct sg_table *sg = vma->pages;
133+ u32 rsa[UOS_RSA_SCRATCH_MAX_COUNT];
134+ int i;
135+
136+ if (sg_pcopy_to_buffer(sg->sgl, sg->nents, rsa, sizeof(rsa),
137+ guc_fw->rsa_offset) != sizeof(rsa))
138+ return -EINVAL;
139+
140+ for (i = 0; i < UOS_RSA_SCRATCH_MAX_COUNT; i++)
141+ I915_WRITE(UOS_RSA_SCRATCH(i), rsa[i]);
142+
143+ return 0;
117144 }
118145
119146 /*
@@ -122,29 +149,19 @@ static inline bool guc_ucode_response(struct drm_i915_private *dev_priv, · 2 unmodified lines
122149 * Architecturally, the DMA engine is bidirectional, and can potentially even
123150 * transfer between GTT locations. This functionality is left out of the API
124151 * for now as there is no need for it.
125− *
126− * Note that GuC needs the CSS header plus uKernel code to be copied by the
127− * DMA engine in one operation, whereas the RSA signature is loaded via MMIO.
128152 */
129−static int guc_ucode_xfer_dma(struct drm_i915_private *dev_priv,
130− struct i915_vma *vma)
153+static int guc_xfer_ucode(struct intel_guc *guc, struct i915_vma *vma)
131154 {
132− struct intel_uc_fw *guc_fw = &dev_priv->guc.fw;
155+ struct drm_i915_private *dev_priv = guc_to_i915(guc);
156+ struct intel_uc_fw *guc_fw = &guc->fw;
133157 unsigned long offset;
134− struct sg_table *sg = vma->pages;
135− u32 status, rsa[UOS_RSA_SCRATCH_MAX_COUNT];
136− int i, ret = 0;
137−
138− /* where RSA signature starts */
139− offset = guc_fw->rsa_offset;
140−
141− /* Copy RSA signature from the fw image to HW for verification */
142− sg_pcopy_to_buffer(sg->sgl, sg->nents, rsa, sizeof(rsa), offset);
143− for (i = 0; i < UOS_RSA_SCRATCH_MAX_COUNT; i++)
144− I915_WRITE(UOS_RSA_SCRATCH(i), rsa[i]);
158+ u32 status;
159+ int ret;
145160
146− /* The header plus uCode will be copied to WOPCM via DMA, excluding any
147− * other components */
161+ /*
162+ * The header plus uCode will be copied to WOPCM via DMA, excluding any
163+ * other components
164+ */
148165 I915_WRITE(DMA_COPY_SIZE, guc_fw->header_size + guc_fw->ucode_size);
149166
150167 /* Set the source address for the new blob */
@@ -162,33 +179,62 @@ static int guc_ucode_xfer_dma(struct drm_i915_private *dev_priv, · 11 unmodified lines
162179 /* Finally start the DMA */
163180 I915_WRITE(DMA_CTRL, _MASKED_BIT_ENABLE(UOS_MOVE | START_DMA));
164181
182+ /* Wait for DMA to finish */
183+ ret = __intel_wait_for_register_fw(dev_priv, DMA_CTRL, START_DMA, 0,
184+ 2, 100, &status);
185+ DRM_DEBUG_DRIVER("GuC DMA status %#x\n", status);
186+
187+ return ret;
188+}
189+
190+/*
191+ * Read the GuC status register (GUC_STATUS) and store it in the
192+ * specified location; then return a boolean indicating whether
193+ * the value matches either of two values representing completion
194+ * of the GuC boot process.
195+ *
196+ * This is used for polling the GuC status in a wait_for()
197+ * loop below.
198+ */
199+static inline bool guc_ready(struct intel_guc *guc, u32 *status)
200+{
201+ struct drm_i915_private *dev_priv = guc_to_i915(guc);
202+ u32 val = I915_READ(GUC_STATUS);
203+ u32 uk_val = val & GS_UKERNEL_MASK;
204+
205+ *status = val;
206+ return (uk_val == GS_UKERNEL_READY) ||
207+ ((val & GS_MIA_CORE_STATE) && (uk_val == GS_UKERNEL_LAPIC_DONE));
208+}
209+
210+static int guc_wait_ucode(struct intel_guc *guc)
211+{
212+ u32 status;
213+ int ret;
214+
165215 /*
166− * Wait for the DMA to complete & the GuC to start up.
216+ * Wait for the GuC to start up.
167217 * NB: Docs recommend not using the interrupt for completion.
168218 * Measurements indicate this should take no more than 20ms, so a
169219 * timeout here indicates that the GuC has failed and is unusable.
170220 * (Higher levels of the driver will attempt to fall back to
171221 * execlist mode if this happens.)
172222 */
173− ret = wait_for(guc_ucode_response(dev_priv, &status), 100);
174−
175− DRM_DEBUG_DRIVER("DMA status 0x%x, GuC status 0x%x\n",
176− I915_READ(DMA_CTRL), status);
223+ ret = wait_for(guc_ready(guc, &status), 100);
224+ DRM_DEBUG_DRIVER("GuC status %#x\n", status);
177225
178226 if ((status & GS_BOOTROM_MASK) == GS_BOOTROM_RSA_FAILED) {
179227 DRM_ERROR("GuC firmware signature verification failed\n");
180228 ret = -ENOEXEC;
181229 }
182230
183− DRM_DEBUG_DRIVER("returning %d\n", ret);
184−
185231 return ret;
186232 }
187233
188234 /*
189235 * Load the GuC firmware blob into the MinuteIA.
190236 */
191−static int guc_ucode_xfer(struct intel_uc_fw *guc_fw, struct i915_vma *vma)
237+static int guc_fw_xfer(struct intel_uc_fw *guc_fw, struct i915_vma *vma)
192238 {
193239 struct intel_guc *guc = container_of(guc_fw, struct intel_guc, fw);
194240 struct drm_i915_private *dev_priv = guc_to_i915(guc);
@@ -198,34 +244,24 @@ static int guc_ucode_xfer(struct intel_uc_fw *guc_fw, struct i915_vma *vma) · 3 unmodified lines
198244
199245 intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
200246
201− /* Enable MIA caching. GuC clock gating is disabled. */
202− I915_WRITE(GUC_SHIM_CONTROL, GUC_SHIM_CONTROL_VALUE);
247+ guc_prepare_xfer(guc);
203248
204− /* WaDisableMinuteIaClockGating:bxt */
205− if (IS_BXT_REVID(dev_priv, 0, BXT_REVID_A1)) {
206− I915_WRITE(GUC_SHIM_CONTROL, (I915_READ(GUC_SHIM_CONTROL) &
207− ~GUC_ENABLE_MIA_CLOCK_GATING));
208− }
209−
210− /* WaC6DisallowByGfxPause:bxt */
211− if (IS_BXT_REVID(dev_priv, 0, BXT_REVID_B0))
212− I915_WRITE(GEN6_GFXPAUSE, 0x30FFF);
213−
214− if (IS_GEN9_LP(dev_priv))
215− I915_WRITE(GEN9LP_GT_PM_CONFIG, GT_DOORBELL_ENABLE);
216− else
217− I915_WRITE(GEN9_GT_PM_CONFIG, GT_DOORBELL_ENABLE);
218−
219− if (IS_GEN9(dev_priv)) {
220− /* DOP Clock Gating Enable for GuC clocks */
221− I915_WRITE(GEN7_MISCCPCTL, (GEN8_DOP_CLOCK_GATE_GUC_ENABLE |
222− I915_READ(GEN7_MISCCPCTL)));
249+ /*
250+ * Note that GuC needs the CSS header plus uKernel code to be copied
251+ * by the DMA engine in one operation, whereas the RSA signature is
252+ * loaded via MMIO.
253+ */
254+ ret = guc_xfer_rsa(guc, vma);
255+ if (ret)
256+ DRM_WARN("GuC firmware signature xfer error %d\n", ret);
223257
224− /* allows for 5us (in 10ns units) before GT can go to RC6 */
225− I915_WRITE(GUC_ARAT_C6DIS, 0x1FF);
226− }
258+ ret = guc_xfer_ucode(guc, vma);
259+ if (ret)
260+ DRM_WARN("GuC firmware code xfer error %d\n", ret);
227261
228− ret = guc_ucode_xfer_dma(dev_priv, vma);
262+ ret = guc_wait_ucode(guc);
263+ if (ret)
264+ DRM_ERROR("GuC firmware xfer error %d\n", ret);
229265
230266 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
231267
@@ -247,5 +283,5 @@ static int guc_ucode_xfer(struct intel_uc_fw *guc_fw, struct i915_vma *vma) · 15 unmodified lines
247283 */
248284 int intel_guc_fw_upload(struct intel_guc *guc)
249285 {
250− return intel_uc_fw_upload(&guc->fw, guc_ucode_xfer);
286+ return intel_uc_fw_upload(&guc->fw, guc_fw_xfer);
251287 }
drivers/gpu/drm/i915/intel_guc_fwif.h+40−0
@@ -544,9 +544,37 @@ union guc_log_control { · 543 unmodified lines
544544 u32 value;
545545 } __packed;
546546
547+struct guc_ctx_report {
548+ u32 report_return_status;
549+ u32 reserved1[64];
550+ u32 affected_count;
551+ u32 reserved2[2];
552+} __packed;
553+
554+/* GuC Shared Context Data Struct */
555+struct guc_shared_ctx_data {
556+ u32 addr_of_last_preempted_data_low;
557+ u32 addr_of_last_preempted_data_high;
558+ u32 addr_of_last_preempted_data_high_tmp;
559+ u32 padding;
560+ u32 is_mapped_to_proxy;
561+ u32 proxy_ctx_id;
562+ u32 engine_reset_ctx_id;
563+ u32 media_reset_count;
564+ u32 reserved1[8];
565+ u32 uk_last_ctx_switch_reason;
566+ u32 was_reset;
567+ u32 lrca_gpu_addr;
568+ u64 execlist_ctx;
569+ u32 reserved2[66];
570+ struct guc_ctx_report preempt_ctx_report[GUC_MAX_ENGINES_NUM];
571+} __packed;
572+
547573 /* This Action will be programmed in C180 - SOFT_SCRATCH_O_REG */
548574 enum intel_guc_action {
549575 INTEL_GUC_ACTION_DEFAULT = 0x0,
576+ INTEL_GUC_ACTION_REQUEST_PREEMPTION = 0x2,
577+ INTEL_GUC_ACTION_REQUEST_ENGINE_RESET = 0x3,
550578 INTEL_GUC_ACTION_SAMPLE_FORCEWAKE = 0x6,
551579 INTEL_GUC_ACTION_ALLOCATE_DOORBELL = 0x10,
552580 INTEL_GUC_ACTION_DEALLOCATE_DOORBELL = 0x20,
@@ -562,6 +590,18 @@ enum intel_guc_action { · 9 unmodified lines
562590 INTEL_GUC_ACTION_LIMIT
563591 };
564592
593+enum intel_guc_preempt_options {
594+ INTEL_GUC_PREEMPT_OPTION_DROP_WORK_Q = 0x4,
595+ INTEL_GUC_PREEMPT_OPTION_DROP_SUBMIT_Q = 0x8,
596+};
597+
598+enum intel_guc_report_status {
599+ INTEL_GUC_REPORT_STATUS_UNKNOWN = 0x0,
600+ INTEL_GUC_REPORT_STATUS_ACKED = 0x1,
601+ INTEL_GUC_REPORT_STATUS_ERROR = 0x2,
602+ INTEL_GUC_REPORT_STATUS_COMPLETE = 0x4,
603+};
604+
565605 /*
566606 * The GuC sends its response to a command by overwriting the
567607 * command in SS0. The response is distinguishable from a command
drivers/gpu/drm/i915/intel_guc_submission.crenamed from drivers/gpu/drm/i915/i915_guc_submission.c+501−198
@@ -25,23 +25,24 @@ · 24 unmodified lines
2525 #include <linux/circ_buf.h>
2626 #include <trace/events/dma_fence.h>
2727
28−#include "i915_guc_submission.h"
28+#include "intel_guc_submission.h"
2929 #include "i915_drv.h"
3030
3131 /**
3232 * DOC: GuC-based command submission
3333 *
3434 * GuC client:
35− * A i915_guc_client refers to a submission path through GuC. Currently, there
36− * is only one of these (the execbuf_client) and this one is charged with all
37− * submissions to the GuC. This struct is the owner of a doorbell, a process
38− * descriptor and a workqueue (all of them inside a single gem object that
39− * contains all required pages for these elements).
35+ * A intel_guc_client refers to a submission path through GuC. Currently, there
36+ * are two clients. One of them (the execbuf_client) is charged with all
37+ * submissions to the GuC, the other one (preempt_client) is responsible for
38+ * preempting the execbuf_client. This struct is the owner of a doorbell, a
39+ * process descriptor and a workqueue (all of them inside a single gem object
40+ * that contains all required pages for these elements).
4041 *
4142 * GuC stage descriptor:
4243 * During initialization, the driver allocates a static pool of 1024 such
4344 * descriptors, and shares them with the GuC.
44− * Currently, there exists a 1:1 mapping between a i915_guc_client and a
45+ * Currently, there exists a 1:1 mapping between a intel_guc_client and a
4546 * guc_stage_desc (via the client's stage_id), so effectively only one
4647 * gets used. This stage descriptor lets the GuC know about the doorbell,
4748 * workqueue and process descriptor. Theoretically, it also lets the GuC
@@ -70,7 +71,7 @@ · 22 unmodified lines
7071 * WQ_TYPE_INORDER is needed to support legacy submission via GuC, which
7172 * represents in-order queue. The kernel driver packs ring tail pointer and an
7273 * ELSP context descriptor dword into Work Item.
73− * See guc_wq_item_append()
74+ * See guc_add_request()
7475 *
7576 * ADS:
7677 * The Additional Data Struct (ADS) has pointers for different buffers used by
@@ -81,12 +82,13 @@ · 4 unmodified lines
8182 *
8283 */
8384
84−static inline bool is_high_priority(struct i915_guc_client* client)
85+static inline bool is_high_priority(struct intel_guc_client *client)
8586 {
86− return client->priority <= GUC_CLIENT_PRIORITY_HIGH;
87+ return (client->priority == GUC_CLIENT_PRIORITY_KMD_HIGH ||
88+ client->priority == GUC_CLIENT_PRIORITY_HIGH);
8789 }
8890
89−static int __reserve_doorbell(struct i915_guc_client *client)
91+static int __reserve_doorbell(struct intel_guc_client *client)
9092 {
9193 unsigned long offset;
9294 unsigned long end;
@@ -100,7 +102,7 @@ static int __reserve_doorbell(struct i915_guc_client *client) · 7 unmodified lines
100102 * priority contexts, the second half for high-priority ones.
101103 */
102104 offset = 0;
103− end = GUC_NUM_DOORBELLS/2;
105+ end = GUC_NUM_DOORBELLS / 2;
104106 if (is_high_priority(client)) {
105107 offset = end;
106108 end += offset;
@@ -118,7 +120,7 @@ static int __reserve_doorbell(struct i915_guc_client *client) · 11 unmodified lines
118120 return 0;
119121 }
120122
121−static void __unreserve_doorbell(struct i915_guc_client *client)
123+static void __unreserve_doorbell(struct intel_guc_client *client)
122124 {
123125 GEM_BUG_ON(client->doorbell_id == GUC_DOORBELL_INVALID);
124126
@@ -150,7 +152,7 @@ static int __guc_deallocate_doorbell(struct intel_guc *guc, u32 stage_id) · 25 unmodified lines
150152 return intel_guc_send(guc, action, ARRAY_SIZE(action));
151153 }
152154
153−static struct guc_stage_desc *__get_stage_desc(struct i915_guc_client *client)
155+static struct guc_stage_desc *__get_stage_desc(struct intel_guc_client *client)
154156 {
155157 struct guc_stage_desc *base = client->guc->stage_desc_pool_vaddr;
156158
@@ -164,7 +166,7 @@ static struct guc_stage_desc *__get_stage_desc(struct i915_guc_client *client) · 7 unmodified lines
164166 * client object which contains the page being used for the doorbell
165167 */
166168
167−static void __update_doorbell_desc(struct i915_guc_client *client, u16 new_id)
169+static void __update_doorbell_desc(struct intel_guc_client *client, u16 new_id)
168170 {
169171 struct guc_stage_desc *desc;
170172
@@ -173,12 +175,12 @@ static void __update_doorbell_desc(struct i915_guc_client *client, u16 new_id) · 2 unmodified lines
173175 desc->db_id = new_id;
174176 }
175177
176−static struct guc_doorbell_info *__get_doorbell(struct i915_guc_client *client)
178+static struct guc_doorbell_info *__get_doorbell(struct intel_guc_client *client)
177179 {
178180 return client->vaddr + client->doorbell_offset;
179181 }
180182
181−static bool has_doorbell(struct i915_guc_client *client)
183+static bool has_doorbell(struct intel_guc_client *client)
182184 {
183185 if (client->doorbell_id == GUC_DOORBELL_INVALID)
184186 return false;
@@ -186,7 +188,7 @@ static bool has_doorbell(struct i915_guc_client *client) · 1 unmodified line
186188 return test_bit(client->doorbell_id, client->guc->doorbell_bitmap);
187189 }
188190
189−static int __create_doorbell(struct i915_guc_client *client)
191+static int __create_doorbell(struct intel_guc_client *client)
190192 {
191193 struct guc_doorbell_info *doorbell;
192194 int err;
@@ -196,13 +198,16 @@ static int __create_doorbell(struct i915_guc_client *client) · 3 unmodified lines
196198 doorbell->cookie = 0;
197199
198200 err = __guc_allocate_doorbell(client->guc, client->stage_id);
199− if (err)
201+ if (err) {
200202 doorbell->db_status = GUC_DOORBELL_DISABLED;
203+ DRM_ERROR("Couldn't create client %u doorbell: %d\n",
204+ client->stage_id, err);
205+ }
201206
202207 return err;
203208 }
204209
205−static int __destroy_doorbell(struct i915_guc_client *client)
210+static int __destroy_doorbell(struct intel_guc_client *client)
206211 {
207212 struct drm_i915_private *dev_priv = guc_to_i915(client->guc);
208213 struct guc_doorbell_info *doorbell;
@@ -216,14 +221,15 @@ static int __destroy_doorbell(struct i915_guc_client *client) · 7 unmodified lines
216221
217222 /* Doorbell release flow requires that we wait for GEN8_DRB_VALID bit
218223 * to go to zero after updating db_status before we call the GuC to
219− * release the doorbell */
224+ * release the doorbell
225+ */
220226 if (wait_for_us(!(I915_READ(GEN8_DRBREGL(db_id)) & GEN8_DRB_VALID), 10))
221227 WARN_ONCE(true, "Doorbell never became invalid after disable\n");
222228
223229 return __guc_deallocate_doorbell(client->guc, client->stage_id);
224230 }
225231
226−static int create_doorbell(struct i915_guc_client *client)
232+static int create_doorbell(struct intel_guc_client *client)
227233 {
228234 int ret;
229235
@@ -245,7 +251,7 @@ err: · 15 unmodified lines
245251 return ret;
246252 }
247253
248−static int destroy_doorbell(struct i915_guc_client *client)
254+static int destroy_doorbell(struct intel_guc_client *client)
249255 {
250256 int err;
251257
@@ -265,7 +271,7 @@ static int destroy_doorbell(struct i915_guc_client *client) · 13 unmodified lines
265271 return 0;
266272 }
267273
268−static unsigned long __select_cacheline(struct intel_guc* guc)
274+static unsigned long __select_cacheline(struct intel_guc *guc)
269275 {
270276 unsigned long offset;
271277
@@ -276,12 +282,12 @@ static unsigned long __select_cacheline(struct intel_guc* guc) · 4 unmodified lines
276282 guc->db_cacheline += cache_line_size();
277283
278284 DRM_DEBUG_DRIVER("reserved cacheline 0x%lx, next 0x%x, linesize %u\n",
279− offset, guc->db_cacheline, cache_line_size());
285+ offset, guc->db_cacheline, cache_line_size());
280286 return offset;
281287 }
282288
283289 static inline struct guc_process_desc *
284−__get_process_desc(struct i915_guc_client *client)
290+__get_process_desc(struct intel_guc_client *client)
285291 {
286292 return client->vaddr + client->proc_desc_offset;
287293 }
@@ -290,7 +296,7 @@ __get_process_desc(struct i915_guc_client *client) · 2 unmodified lines
290296 * Initialise the process descriptor shared with the GuC firmware.
291297 */
292298 static void guc_proc_desc_init(struct intel_guc *guc,
293− struct i915_guc_client *client)
299+ struct intel_guc_client *client)
294300 {
295301 struct guc_process_desc *desc;
296302
@@ -311,6 +317,37 @@ static void guc_proc_desc_init(struct intel_guc *guc, · 14 unmodified lines
311317 desc->priority = client->priority;
312318 }
313319
320+static int guc_stage_desc_pool_create(struct intel_guc *guc)
321+{
322+ struct i915_vma *vma;
323+ void *vaddr;
324+
325+ vma = intel_guc_allocate_vma(guc,
326+ PAGE_ALIGN(sizeof(struct guc_stage_desc) *
327+ GUC_MAX_STAGE_DESCRIPTORS));
328+ if (IS_ERR(vma))
329+ return PTR_ERR(vma);
330+
331+ vaddr = i915_gem_object_pin_map(vma->obj, I915_MAP_WB);
332+ if (IS_ERR(vaddr)) {
333+ i915_vma_unpin_and_release(&vma);
334+ return PTR_ERR(vaddr);
335+ }
336+
337+ guc->stage_desc_pool = vma;
338+ guc->stage_desc_pool_vaddr = vaddr;
339+ ida_init(&guc->stage_ids);
340+
341+ return 0;
342+}
343+
344+static void guc_stage_desc_pool_destroy(struct intel_guc *guc)
345+{
346+ ida_destroy(&guc->stage_ids);
347+ i915_gem_object_unpin_map(guc->stage_desc_pool->obj);
348+ i915_vma_unpin_and_release(&guc->stage_desc_pool);
349+}
350+
314351 /*
315352 * Initialise/clear the stage descriptor shared with the GuC firmware.
316353 *
@@ -319,7 +356,7 @@ static void guc_proc_desc_init(struct intel_guc *guc, · 2 unmodified lines
319356 * write queue, etc).
320357 */
321358 static void guc_stage_desc_init(struct intel_guc *guc,
322− struct i915_guc_client *client)
359+ struct intel_guc_client *client)
323360 {
324361 struct drm_i915_private *dev_priv = guc_to_i915(guc);
325362 struct intel_engine_cs *engine;
@@ -331,7 +368,10 @@ static void guc_stage_desc_init(struct intel_guc *guc, · 5 unmodified lines
331368 desc = __get_stage_desc(client);
332369 memset(desc, 0, sizeof(*desc));
333370
334− desc->attribute = GUC_STAGE_DESC_ATTR_ACTIVE | GUC_STAGE_DESC_ATTR_KERNEL;
371+ desc->attribute = GUC_STAGE_DESC_ATTR_ACTIVE |
372+ GUC_STAGE_DESC_ATTR_KERNEL;
373+ if (is_high_priority(client))
374+ desc->attribute |= GUC_STAGE_DESC_ATTR_PREEMPT;
335375 desc->stage_id = client->stage_id;
336376 desc->priority = client->priority;
337377 desc->db_id = client->doorbell_id;
@@ -356,7 +396,7 @@ static void guc_stage_desc_init(struct intel_guc *guc, · 18 unmodified lines
356396 * submission or, in other words, not using a direct submission
357397 * model) the KMD's LRCA is not used for any work submission.
358398 * Instead, the GuC uses the LRCA of the user mode context (see
359− * guc_wq_item_append below).
399+ * guc_add_request below).
360400 */
361401 lrc->context_desc = lower_32_bits(ce->lrc_desc);
362402
@@ -365,7 +405,8 @@ static void guc_stage_desc_init(struct intel_guc *guc, · 2 unmodified lines
365405 guc_ggtt_offset(ce->state) + LRC_STATE_PN * PAGE_SIZE;
366406
367407 /* XXX: In direct submission, the GuC wants the HW context id
368− * here. In proxy submission, it wants the stage id */
408+ * here. In proxy submission, it wants the stage id
409+ */
369410 lrc->context_id = (client->stage_id << GUC_ELC_CTXID_OFFSET) |
370411 (guc_engine_id << GUC_ELC_ENGINE_OFFSET);
371412
@@ -378,7 +419,7 @@ static void guc_stage_desc_init(struct intel_guc *guc, · 6 unmodified lines
378419 }
379420
380421 DRM_DEBUG_DRIVER("Host engines 0x%x => GuC engines used 0x%x\n",
381− client->engines, desc->engines_used);
422+ client->engines, desc->engines_used);
382423 WARN_ON(desc->engines_used == 0);
383424
384425 /*
@@ -398,7 +439,7 @@ static void guc_stage_desc_init(struct intel_guc *guc, · 13 unmodified lines
398439 }
399440
400441 static void guc_stage_desc_fini(struct intel_guc *guc,
401− struct i915_guc_client *client)
442+ struct intel_guc_client *client)
402443 {
403444 struct guc_stage_desc *desc;
404445
@@ -406,24 +447,47 @@ static void guc_stage_desc_fini(struct intel_guc *guc, · 1 unmodified line
406447 memset(desc, 0, sizeof(*desc));
407448 }
408449
450+static int guc_shared_data_create(struct intel_guc *guc)
451+{
452+ struct i915_vma *vma;
453+ void *vaddr;
454+
455+ vma = intel_guc_allocate_vma(guc, PAGE_SIZE);
456+ if (IS_ERR(vma))
457+ return PTR_ERR(vma);
458+
459+ vaddr = i915_gem_object_pin_map(vma->obj, I915_MAP_WB);
460+ if (IS_ERR(vaddr)) {
461+ i915_vma_unpin_and_release(&vma);
462+ return PTR_ERR(vaddr);
463+ }
464+
465+ guc->shared_data = vma;
466+ guc->shared_data_vaddr = vaddr;
467+
468+ return 0;
469+}
470+
471+static void guc_shared_data_destroy(struct intel_guc *guc)
472+{
473+ i915_gem_object_unpin_map(guc->shared_data->obj);
474+ i915_vma_unpin_and_release(&guc->shared_data);
475+}
476+
409477 /* Construct a Work Item and append it to the GuC's Work Queue */
410−static void guc_wq_item_append(struct i915_guc_client *client,
411− struct drm_i915_gem_request *rq)
478+static void guc_wq_item_append(struct intel_guc_client *client,
479+ u32 target_engine, u32 context_desc,
480+ u32 ring_tail, u32 fence_id)
412481 {
413482 /* wqi_len is in DWords, and does not include the one-word header */
414483 const size_t wqi_size = sizeof(struct guc_wq_item);
415484 const u32 wqi_len = wqi_size / sizeof(u32) - 1;
416− struct intel_engine_cs *engine = rq->engine;
417− struct i915_gem_context *ctx = rq->ctx;
418485 struct guc_process_desc *desc = __get_process_desc(client);
419486 struct guc_wq_item *wqi;
420− u32 ring_tail, wq_off;
487+ u32 wq_off;
421488
422489 lockdep_assert_held(&client->wq_lock);
423490
424− ring_tail = intel_ring_set_tail(rq->ring, rq->tail) / sizeof(u64);
425− GEM_BUG_ON(ring_tail > WQ_RING_TAIL_MAX);
426−
427491 /* For now workqueue item is 4 DWs; workqueue buffer is 2 pages. So we
428492 * should not have the case where structure wqi is across page, neither
429493 * wrapped to the beginning. This simplifies the implementation below.
@@ -445,19 +509,18 @@ static void guc_wq_item_append(struct i915_guc_client *client, · 15 unmodified lines
445509 /* Now fill in the 4-word work queue item */
446510 wqi->header = WQ_TYPE_INORDER |
447511 (wqi_len << WQ_LEN_SHIFT) |
448− (engine->guc_id << WQ_TARGET_SHIFT) |
512+ (target_engine << WQ_TARGET_SHIFT) |
449513 WQ_NO_WCFLUSH_WAIT;
450−
451− wqi->context_desc = lower_32_bits(intel_lr_context_descriptor(ctx, engine));
452−
514+ wqi->context_desc = context_desc;
453515 wqi->submit_element_info = ring_tail << WQ_RING_TAIL_SHIFT;
454− wqi->fence_id = rq->global_seqno;
516+ GEM_BUG_ON(ring_tail > WQ_RING_TAIL_MAX);
517+ wqi->fence_id = fence_id;
455518
456− /* Postincrement WQ tail for next time. */
519+ /* Make the update visible to GuC */
457520 WRITE_ONCE(desc->tail, (wq_off + wqi_size) & (GUC_WQ_SIZE - 1));
458521 }
459522
460−static void guc_reset_wq(struct i915_guc_client *client)
523+static void guc_reset_wq(struct intel_guc_client *client)
461524 {
462525 struct guc_process_desc *desc = __get_process_desc(client);
463526
@@ -465,7 +528,7 @@ static void guc_reset_wq(struct i915_guc_client *client) · 1 unmodified line
465528 desc->tail = 0;
466529 }
467530
468−static void guc_ring_doorbell(struct i915_guc_client *client)
531+static void guc_ring_doorbell(struct intel_guc_client *client)
469532 {
470533 struct guc_doorbell_info *db;
471534 u32 cookie;
@@ -475,29 +538,166 @@ static void guc_ring_doorbell(struct i915_guc_client *client) · 3 unmodified lines
475538 /* pointer of current doorbell cacheline */
476539 db = __get_doorbell(client);
477540
478− /* we're not expecting the doorbell cookie to change behind our back */
541+ /*
542+ * We're not expecting the doorbell cookie to change behind our back,
543+ * we also need to treat 0 as a reserved value.
544+ */
479545 cookie = READ_ONCE(db->cookie);
480− WARN_ON_ONCE(xchg(&db->cookie, cookie + 1) != cookie);
546+ WARN_ON_ONCE(xchg(&db->cookie, cookie + 1 ?: cookie + 2) != cookie);
481547
482548 /* XXX: doorbell was lost and need to acquire it again */
483549 GEM_BUG_ON(db->db_status != GUC_DOORBELL_ENABLED);
484550 }
485551
552+static void guc_add_request(struct intel_guc *guc,
553+ struct drm_i915_gem_request *rq)
554+{
555+ struct intel_guc_client *client = guc->execbuf_client;
556+ struct intel_engine_cs *engine = rq->engine;
557+ u32 ctx_desc = lower_32_bits(intel_lr_context_descriptor(rq->ctx,
558+ engine));
559+ u32 ring_tail = intel_ring_set_tail(rq->ring, rq->tail) / sizeof(u64);
560+
561+ spin_lock(&client->wq_lock);
562+
563+ guc_wq_item_append(client, engine->guc_id, ctx_desc,
564+ ring_tail, rq->global_seqno);
565+ guc_ring_doorbell(client);
566+
567+ client->submissions[engine->id] += 1;
568+
569+ spin_unlock(&client->wq_lock);
570+}
571+
572+/*
573+ * When we're doing submissions using regular execlists backend, writing to
574+ * ELSP from CPU side is enough to make sure that writes to ringbuffer pages
575+ * pinned in mappable aperture portion of GGTT are visible to command streamer.
576+ * Writes done by GuC on our behalf are not guaranteeing such ordering,
577+ * therefore, to ensure the flush, we're issuing a POSTING READ.
578+ */
579+static void flush_ggtt_writes(struct i915_vma *vma)
580+{
581+ struct drm_i915_private *dev_priv = to_i915(vma->obj->base.dev);
582+
583+ if (i915_vma_is_map_and_fenceable(vma))
584+ POSTING_READ_FW(GUC_STATUS);
585+}
586+
587+#define GUC_PREEMPT_FINISHED 0x1
588+#define GUC_PREEMPT_BREADCRUMB_DWORDS 0x8
589+static void inject_preempt_context(struct work_struct *work)
590+{
591+ struct guc_preempt_work *preempt_work =
592+ container_of(work, typeof(*preempt_work), work);
593+ struct intel_engine_cs *engine = preempt_work->engine;
594+ struct intel_guc *guc = container_of(preempt_work, typeof(*guc),
595+ preempt_work[engine->id]);
596+ struct intel_guc_client *client = guc->preempt_client;
597+ struct guc_stage_desc *stage_desc = __get_stage_desc(client);
598+ struct intel_ring *ring = client->owner->engine[engine->id].ring;
599+ u32 ctx_desc = lower_32_bits(intel_lr_context_descriptor(client->owner,
600+ engine));
601+ u32 *cs = ring->vaddr + ring->tail;
602+ u32 data[7];
603+
604+ if (engine->id == RCS) {
605+ cs = gen8_emit_ggtt_write_rcs(cs, GUC_PREEMPT_FINISHED,
606+ intel_hws_preempt_done_address(engine));
607+ } else {
608+ cs = gen8_emit_ggtt_write(cs, GUC_PREEMPT_FINISHED,
609+ intel_hws_preempt_done_address(engine));
610+ *cs++ = MI_NOOP;
611+ *cs++ = MI_NOOP;
612+ }
613+ *cs++ = MI_USER_INTERRUPT;
614+ *cs++ = MI_NOOP;
615+
616+ GEM_BUG_ON(!IS_ALIGNED(ring->size,
617+ GUC_PREEMPT_BREADCRUMB_DWORDS * sizeof(u32)));
618+ GEM_BUG_ON((void *)cs - (ring->vaddr + ring->tail) !=
619+ GUC_PREEMPT_BREADCRUMB_DWORDS * sizeof(u32));
620+
621+ ring->tail += GUC_PREEMPT_BREADCRUMB_DWORDS * sizeof(u32);
622+ ring->tail &= (ring->size - 1);
623+
624+ flush_ggtt_writes(ring->vma);
625+
626+ spin_lock_irq(&client->wq_lock);
627+ guc_wq_item_append(client, engine->guc_id, ctx_desc,
628+ ring->tail / sizeof(u64), 0);
629+ spin_unlock_irq(&client->wq_lock);
630+
631+ /*
632+ * If GuC firmware performs an engine reset while that engine had
633+ * a preemption pending, it will set the terminated attribute bit
634+ * on our preemption stage descriptor. GuC firmware retains all
635+ * pending work items for a high-priority GuC client, unlike the
636+ * normal-priority GuC client where work items are dropped. It
637+ * wants to make sure the preempt-to-idle work doesn't run when
638+ * scheduling resumes, and uses this bit to inform its scheduler
639+ * and presumably us as well. Our job is to clear it for the next
640+ * preemption after reset, otherwise that and future preemptions
641+ * will never complete. We'll just clear it every time.
642+ */
643+ stage_desc->attribute &= ~GUC_STAGE_DESC_ATTR_TERMINATED;
644+
645+ data[0] = INTEL_GUC_ACTION_REQUEST_PREEMPTION;
646+ data[1] = client->stage_id;
647+ data[2] = INTEL_GUC_PREEMPT_OPTION_DROP_WORK_Q |
648+ INTEL_GUC_PREEMPT_OPTION_DROP_SUBMIT_Q;
649+ data[3] = engine->guc_id;
650+ data[4] = guc->execbuf_client->priority;
651+ data[5] = guc->execbuf_client->stage_id;
652+ data[6] = guc_ggtt_offset(guc->shared_data);
653+
654+ if (WARN_ON(intel_guc_send(guc, data, ARRAY_SIZE(data)))) {
655+ execlists_clear_active(&engine->execlists,
656+ EXECLISTS_ACTIVE_PREEMPT);
657+ tasklet_schedule(&engine->execlists.tasklet);
658+ }
659+}
660+
661+/*
662+ * We're using user interrupt and HWSP value to mark that preemption has
663+ * finished and GPU is idle. Normally, we could unwind and continue similar to
664+ * execlists submission path. Unfortunately, with GuC we also need to wait for
665+ * it to finish its own postprocessing, before attempting to submit. Otherwise
666+ * GuC may silently ignore our submissions, and thus we risk losing request at
667+ * best, executing out-of-order and causing kernel panic at worst.
668+ */
669+#define GUC_PREEMPT_POSTPROCESS_DELAY_MS 10
670+static void wait_for_guc_preempt_report(struct intel_engine_cs *engine)
671+{
672+ struct intel_guc *guc = &engine->i915->guc;
673+ struct guc_shared_ctx_data *data = guc->shared_data_vaddr;
674+ struct guc_ctx_report *report =
675+ &data->preempt_ctx_report[engine->guc_id];
676+
677+ WARN_ON(wait_for_atomic(report->report_return_status ==
678+ INTEL_GUC_REPORT_STATUS_COMPLETE,
679+ GUC_PREEMPT_POSTPROCESS_DELAY_MS));
680+ /*
681+ * GuC is expecting that we're also going to clear the affected context
682+ * counter, let's also reset the return status to not depend on GuC
683+ * resetting it after recieving another preempt action
684+ */
685+ report->affected_count = 0;
686+ report->report_return_status = INTEL_GUC_REPORT_STATUS_UNKNOWN;
687+}
688+
486689 /**
487− * i915_guc_submit() - Submit commands through GuC
690+ * guc_submit() - Submit commands through GuC
488691 * @engine: engine associated with the commands
489692 *
490693 * The only error here arises if the doorbell hardware isn't functioning
491694 * as expected, which really shouln't happen.
492695 */
493−static void i915_guc_submit(struct intel_engine_cs *engine)
696+static void guc_submit(struct intel_engine_cs *engine)
494697 {
495− struct drm_i915_private *dev_priv = engine->i915;
496− struct intel_guc *guc = &dev_priv->guc;
497− struct i915_guc_client *client = guc->execbuf_client;
698+ struct intel_guc *guc = &engine->i915->guc;
498699 struct intel_engine_execlists * const execlists = &engine->execlists;
499700 struct execlist_port *port = execlists->port;
500− const unsigned int engine_id = engine->id;
501701 unsigned int n;
502702
503703 for (n = 0; n < execlists_num_ports(execlists); n++) {
@@ -508,44 +708,13 @@ static void i915_guc_submit(struct intel_engine_cs *engine) · 4 unmodified lines
508708 if (rq && count == 0) {
509709 port_set(&port[n], port_pack(rq, ++count));
510710
511− if (i915_vma_is_map_and_fenceable(rq->ring->vma))
512− POSTING_READ_FW(GUC_STATUS);
513−
514− spin_lock(&client->wq_lock);
515−
516− guc_wq_item_append(client, rq);
517− guc_ring_doorbell(client);
711+ flush_ggtt_writes(rq->ring->vma);
518712
519− client->submissions[engine_id] += 1;
520−
521− spin_unlock(&client->wq_lock);
713+ guc_add_request(guc, rq);
522714 }
523715 }
524716 }
525717
526−static void nested_enable_signaling(struct drm_i915_gem_request *rq)
527−{
528− /* If we use dma_fence_enable_sw_signaling() directly, lockdep
529− * detects an ordering issue between the fence lockclass and the
530− * global_timeline. This circular dependency can only occur via 2
531− * different fences (but same fence lockclass), so we use the nesting
532− * annotation here to prevent the warn, equivalent to the nesting
533− * inside i915_gem_request_submit() for when we also enable the
534− * signaler.
535− */
536−
537− if (test_and_set_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT,
538− &rq->fence.flags))
539− return;
540−
541− GEM_BUG_ON(test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &rq->fence.flags));
542− trace_dma_fence_enable_signal(&rq->fence);
543−
544− spin_lock_nested(&rq->lock, SINGLE_DEPTH_NESTING);
545− intel_engine_enable_signaling(rq, true);
546− spin_unlock(&rq->lock);
547−}
548−
549718 static void port_assign(struct execlist_port *port,
550719 struct drm_i915_gem_request *rq)
551720 {
@@ -555,10 +724,9 @@ static void port_assign(struct execlist_port *port, · 3 unmodified lines
555724 i915_gem_request_put(port_request(port));
556725
557726 port_set(port, port_pack(i915_gem_request_get(rq), port_count(port)));
558− nested_enable_signaling(rq);
559727 }
560728
561−static void i915_guc_dequeue(struct intel_engine_cs *engine)
729+static void guc_dequeue(struct intel_engine_cs *engine)
562730 {
563731 struct intel_engine_execlists * const execlists = &engine->execlists;
564732 struct execlist_port *port = execlists->port;
@@ -568,13 +736,32 @@ static void i915_guc_dequeue(struct intel_engine_cs *engine) · 3 unmodified lines
568736 bool submit = false;
569737 struct rb_node *rb;
570738
571− if (port_isset(port))
572− port++;
573−
574739 spin_lock_irq(&engine->timeline->lock);
575740 rb = execlists->first;
576741 GEM_BUG_ON(rb_first(&execlists->queue) != rb);
577− while (rb) {
742+
743+ if (!rb)
744+ goto unlock;
745+
746+ if (HAS_LOGICAL_RING_PREEMPTION(engine->i915) && port_isset(port)) {
747+ struct guc_preempt_work *preempt_work =
748+ &engine->i915->guc.preempt_work[engine->id];
749+
750+ if (rb_entry(rb, struct i915_priolist, node)->priority >
751+ max(port_request(port)->priotree.priority, 0)) {
752+ execlists_set_active(execlists,
753+ EXECLISTS_ACTIVE_PREEMPT);
754+ queue_work(engine->i915->guc.preempt_wq,
755+ &preempt_work->work);
756+ goto unlock;
757+ } else if (port_isset(last_port)) {
758+ goto unlock;
759+ }
760+
761+ port++;
762+ }
763+
764+ do {
578765 struct i915_priolist *p = rb_entry(rb, typeof(*p), node);
579766 struct drm_i915_gem_request *rq, *rn;
580767
@@ -592,10 +779,10 @@ static void i915_guc_dequeue(struct intel_engine_cs *engine) · 11 unmodified lines
592779 }
593780
594781 INIT_LIST_HEAD(&rq->priotree.link);
595− rq->priotree.priority = INT_MAX;
596782
597783 __i915_gem_request_submit(rq);
598− trace_i915_gem_request_in(rq, port_index(port, execlists));
784+ trace_i915_gem_request_in(rq,
785+ port_index(port, execlists));
599786 last = rq;
600787 submit = true;
601788 }
@@ -605,24 +792,23 @@ static void i915_guc_dequeue(struct intel_engine_cs *engine) · 3 unmodified lines
605792 INIT_LIST_HEAD(&p->requests);
606793 if (p->priority != I915_PRIORITY_NORMAL)
607794 kmem_cache_free(engine->i915->priorities, p);
608− }
795+ } while (rb);
609796 done:
610797 execlists->first = rb;
611798 if (submit) {
612799 port_assign(port, last);
613800 execlists_set_active(execlists, EXECLISTS_ACTIVE_USER);
614− i915_guc_submit(engine);
801+ guc_submit(engine);
615802 }
803+unlock:
616804 spin_unlock_irq(&engine->timeline->lock);
617805 }
618806
619−static void i915_guc_irq_handler(unsigned long data)
807+static void guc_submission_tasklet(unsigned long data)
620808 {
621809 struct intel_engine_cs * const engine = (struct intel_engine_cs *)data;
622810 struct intel_engine_execlists * const execlists = &engine->execlists;
623811 struct execlist_port *port = execlists->port;
624− const struct execlist_port * const last_port =
625− &execlists->port[execlists->port_mask];
626812 struct drm_i915_gem_request *rq;
627813
628814 rq = port_request(&port[0]);
@@ -637,14 +823,26 @@ static void i915_guc_irq_handler(unsigned long data) · 8 unmodified lines
637823 if (!rq)
638824 execlists_clear_active(execlists, EXECLISTS_ACTIVE_USER);
639825
640− if (!port_isset(last_port))
641− i915_guc_dequeue(engine);
826+ if (execlists_is_active(execlists, EXECLISTS_ACTIVE_PREEMPT) &&
827+ intel_read_status_page(engine, I915_GEM_HWS_PREEMPT_INDEX) ==
828+ GUC_PREEMPT_FINISHED) {
829+ execlists_cancel_port_requests(&engine->execlists);
830+ execlists_unwind_incomplete_requests(execlists);
831+
832+ wait_for_guc_preempt_report(engine);
833+
834+ execlists_clear_active(execlists, EXECLISTS_ACTIVE_PREEMPT);
835+ intel_write_status_page(engine, I915_GEM_HWS_PREEMPT_INDEX, 0);
836+ }
837+
838+ if (!execlists_is_active(execlists, EXECLISTS_ACTIVE_PREEMPT))
839+ guc_dequeue(engine);
642840 }
643841
644842 /*
645843 * Everything below here is concerned with setup & teardown, and is
646844 * therefore not part of the somewhat time-critical batch-submission
647− * path of i915_guc_submit() above.
845+ * path of guc_submit() above.
648846 */
649847
650848 /* Check that a doorbell register is in the expected state */
@@ -673,7 +871,7 @@ static bool doorbell_ok(struct intel_guc *guc, u16 db_id) · 22 unmodified lines
673871 * reloaded the GuC FW) we can use this function to tell the GuC to reassign the
674872 * doorbell to the rightful owner.
675873 */
676−static int __reset_doorbell(struct i915_guc_client* client, u16 db_id)
874+static int __reset_doorbell(struct intel_guc_client *client, u16 db_id)
677875 {
678876 int err;
679877
@@ -694,7 +892,7 @@ static int __reset_doorbell(struct i915_guc_client* client, u16 db_id) · 14 unmodified lines
694892 */
695893 static int guc_init_doorbell_hw(struct intel_guc *guc)
696894 {
697− struct i915_guc_client *client = guc->execbuf_client;
895+ struct intel_guc_client *client = guc->execbuf_client;
698896 bool recreate_first_client = false;
699897 u16 db_id;
700898 int ret;
@@ -717,7 +915,8 @@ static int guc_init_doorbell_hw(struct intel_guc *guc) · 16 unmodified lines
717915 if (recreate_first_client) {
718916 ret = __reserve_doorbell(client);
719917 if (unlikely(ret)) {
720− DRM_ERROR("Couldn't re-reserve first client db: %d\n", ret);
918+ DRM_ERROR("Couldn't re-reserve first client db: %d\n",
919+ ret);
721920 return ret;
722921 }
723922
@@ -725,15 +924,16 @@ static int guc_init_doorbell_hw(struct intel_guc *guc) · 1 unmodified line
725924 }
726925
727926 /* Now for every client (and not only execbuf_client) make sure their
728− * doorbells are known by the GuC */
729− //for (client = client_list; client != NULL; client = client->next)
730− {
731− ret = __create_doorbell(client);
732− if (ret) {
733− DRM_ERROR("Couldn't recreate client %u doorbell: %d\n",
734− client->stage_id, ret);
735− return ret;
736− }
927+ * doorbells are known by the GuC
928+ */
929+ ret = __create_doorbell(guc->execbuf_client);
930+ if (ret)
931+ return ret;
932+
933+ ret = __create_doorbell(guc->preempt_client);
934+ if (ret) {
935+ __destroy_doorbell(guc->execbuf_client);
936+ return ret;
737937 }
738938
739939 /* Read back & verify all (used & unused) doorbell registers */
@@ -744,25 +944,25 @@ static int guc_init_doorbell_hw(struct intel_guc *guc) · 4 unmodified lines
744944 }
745945
746946 /**
747− * guc_client_alloc() - Allocate an i915_guc_client
947+ * guc_client_alloc() - Allocate an intel_guc_client
748948 * @dev_priv: driver private data structure
749949 * @engines: The set of engines to enable for this client
750950 * @priority: four levels priority _CRITICAL, _HIGH, _NORMAL and _LOW
751− * The kernel client to replace ExecList submission is created with
752− * NORMAL priority. Priority of a client for scheduler can be HIGH,
753− * while a preemption context can use CRITICAL.
951+ * The kernel client to replace ExecList submission is created with
952+ * NORMAL priority. Priority of a client for scheduler can be HIGH,
953+ * while a preemption context can use CRITICAL.
754954 * @ctx: the context that owns the client (we use the default render
755− * context)
955+ * context)
756956 *
757− * Return: An i915_guc_client object if success, else NULL.
957+ * Return: An intel_guc_client object if success, else NULL.
758958 */
759−static struct i915_guc_client *
959+static struct intel_guc_client *
760960 guc_client_alloc(struct drm_i915_private *dev_priv,
761961 u32 engines,
762962 u32 priority,
763963 struct i915_gem_context *ctx)
764964 {
765− struct i915_guc_client *client;
965+ struct intel_guc_client *client;
766966 struct intel_guc *guc = &dev_priv->guc;
767967 struct i915_vma *vma;
768968 void *vaddr;
@@ -780,7 +980,7 @@ guc_client_alloc(struct drm_i915_private *dev_priv, · 11 unmodified lines
780980 spin_lock_init(&client->wq_lock);
781981
782982 ret = ida_simple_get(&guc->stage_ids, 0, GUC_MAX_STAGE_DESCRIPTORS,
783− GFP_KERNEL);
983+ GFP_KERNEL);
784984 if (ret < 0)
785985 goto err_client;
786986
@@ -840,7 +1040,7 @@ err_client: · 53 unmodified lines
8401040 return ERR_PTR(ret);
8411041 }
8421042
843−static void guc_client_free(struct i915_guc_client *client)
1043+static void guc_client_free(struct intel_guc_client *client)
8441044 {
8451045 /*
8461046 * XXX: wait for any outstanding submissions before freeing memory.
@@ -849,7 +1049,8 @@ static void guc_client_free(struct i915_guc_client *client) · 2 unmodified lines
8491049
8501050 /* FIXME: in many cases, by the time we get here the GuC has been
8511051 * reset, so we cannot destroy the doorbell properly. Ignore the
852− * error message for now */
1052+ * error message for now
1053+ */
8531054 destroy_doorbell(client);
8541055 guc_stage_desc_fini(client->guc, client);
8551056 i915_gem_object_unpin_map(client->vma->obj);
@@ -858,6 +1059,50 @@ static void guc_client_free(struct i915_guc_client *client) · 2 unmodified lines
8581059 kfree(client);
8591060 }
8601061
1062+static int guc_clients_create(struct intel_guc *guc)
1063+{
1064+ struct drm_i915_private *dev_priv = guc_to_i915(guc);
1065+ struct intel_guc_client *client;
1066+
1067+ GEM_BUG_ON(guc->execbuf_client);
1068+ GEM_BUG_ON(guc->preempt_client);
1069+
1070+ client = guc_client_alloc(dev_priv,
1071+ INTEL_INFO(dev_priv)->ring_mask,
1072+ GUC_CLIENT_PRIORITY_KMD_NORMAL,
1073+ dev_priv->kernel_context);
1074+ if (IS_ERR(client)) {
1075+ DRM_ERROR("Failed to create GuC client for submission!\n");
1076+ return PTR_ERR(client);
1077+ }
1078+ guc->execbuf_client = client;
1079+
1080+ client = guc_client_alloc(dev_priv,
1081+ INTEL_INFO(dev_priv)->ring_mask,
1082+ GUC_CLIENT_PRIORITY_KMD_HIGH,
1083+ dev_priv->preempt_context);
1084+ if (IS_ERR(client)) {
1085+ DRM_ERROR("Failed to create GuC client for preemption!\n");
1086+ guc_client_free(guc->execbuf_client);
1087+ guc->execbuf_client = NULL;
1088+ return PTR_ERR(client);
1089+ }
1090+ guc->preempt_client = client;
1091+
1092+ return 0;
1093+}
1094+
1095+static void guc_clients_destroy(struct intel_guc *guc)
1096+{
1097+ struct intel_guc_client *client;
1098+
1099+ client = fetch_and_zero(&guc->execbuf_client);
1100+ guc_client_free(client);
1101+
1102+ client = fetch_and_zero(&guc->preempt_client);
1103+ guc_client_free(client);
1104+}
1105+
8611106 static void guc_policy_init(struct guc_policy *policy)
8621107 {
8631108 policy->execution_quantum = POLICY_DEFAULT_EXECUTION_QUANTUM_US;
@@ -941,7 +1186,8 @@ static int guc_ads_create(struct intel_guc *guc) · 77 unmodified lines
9411186 * because our GuC shared data is there.
9421187 */
9431188 blob->ads.golden_context_lrca =
944− guc_ggtt_offset(dev_priv->kernel_context->engine[RCS].state) + skipped_offset;
1189+ guc_ggtt_offset(dev_priv->kernel_context->engine[RCS].state) +
1190+ skipped_offset;
9451191
9461192 /*
9471193 * The GuC expects us to exclude the portion of the context image that
@@ -950,7 +1196,8 @@ static int guc_ads_create(struct intel_guc *guc) · 2 unmodified lines
9501196 * dwords). Weird guc is weird.
9511197 */
9521198 for_each_engine(engine, dev_priv, id)
953− blob->ads.eng_state_size[engine->guc_id] = engine->context_size - skipped_size;
1199+ blob->ads.eng_state_size[engine->guc_id] =
1200+ engine->context_size - skipped_size;
9541201
9551202 base = guc_ggtt_offset(vma);
9561203 blob->ads.scheduler_policies = base + ptr_offset(blob, policies);
@@ -967,66 +1214,110 @@ static void guc_ads_destroy(struct intel_guc *guc) · 10 unmodified lines
9671214 i915_vma_unpin_and_release(&guc->ads_vma);
9681215 }
9691216
1217+static int guc_preempt_work_create(struct intel_guc *guc)
1218+{
1219+ struct drm_i915_private *dev_priv = guc_to_i915(guc);
1220+ struct intel_engine_cs *engine;
1221+ enum intel_engine_id id;
1222+
1223+ /*
1224+ * Even though both sending GuC action, and adding a new workitem to
1225+ * GuC workqueue are serialized (each with its own locking), since
1226+ * we're using mutliple engines, it's possible that we're going to
1227+ * issue a preempt request with two (or more - each for different
1228+ * engine) workitems in GuC queue. In this situation, GuC may submit
1229+ * all of them, which will make us very confused.
1230+ * Our preemption contexts may even already be complete - before we
1231+ * even had the chance to sent the preempt action to GuC!. Rather
1232+ * than introducing yet another lock, we can just use ordered workqueue
1233+ * to make sure we're always sending a single preemption request with a
1234+ * single workitem.
1235+ */
1236+ guc->preempt_wq = alloc_ordered_workqueue("i915-guc_preempt",
1237+ WQ_HIGHPRI);
1238+ if (!guc->preempt_wq)
1239+ return -ENOMEM;
1240+
1241+ for_each_engine(engine, dev_priv, id) {
1242+ guc->preempt_work[id].engine = engine;
1243+ INIT_WORK(&guc->preempt_work[id].work, inject_preempt_context);
1244+ }
1245+
1246+ return 0;
1247+}
1248+
1249+static void guc_preempt_work_destroy(struct intel_guc *guc)
1250+{
1251+ struct drm_i915_private *dev_priv = guc_to_i915(guc);
1252+ struct intel_engine_cs *engine;
1253+ enum intel_engine_id id;
1254+
1255+ for_each_engine(engine, dev_priv, id)
1256+ cancel_work_sync(&guc->preempt_work[id].work);
1257+
1258+ destroy_workqueue(guc->preempt_wq);
1259+ guc->preempt_wq = NULL;
1260+}
1261+
9701262 /*
9711263 * Set up the memory resources to be shared with the GuC (via the GGTT)
9721264 * at firmware loading time.
9731265 */
974−int i915_guc_submission_init(struct drm_i915_private *dev_priv)
1266+int intel_guc_submission_init(struct intel_guc *guc)
9751267 {
976− struct intel_guc *guc = &dev_priv->guc;
977− struct i915_vma *vma;
978− void *vaddr;
9791268 int ret;
9801269
9811270 if (guc->stage_desc_pool)
9821271 return 0;
9831272
984− vma = intel_guc_allocate_vma(guc,
985− PAGE_ALIGN(sizeof(struct guc_stage_desc) *
986− GUC_MAX_STAGE_DESCRIPTORS));
987− if (IS_ERR(vma))
988− return PTR_ERR(vma);
989−
990− guc->stage_desc_pool = vma;
991−
992− vaddr = i915_gem_object_pin_map(guc->stage_desc_pool->obj, I915_MAP_WB);
993− if (IS_ERR(vaddr)) {
994− ret = PTR_ERR(vaddr);
995− goto err_vma;
996− }
1273+ ret = guc_stage_desc_pool_create(guc);
1274+ if (ret)
1275+ return ret;
1276+ /*
1277+ * Keep static analysers happy, let them know that we allocated the
1278+ * vma after testing that it didn't exist earlier.
1279+ */
1280+ GEM_BUG_ON(!guc->stage_desc_pool);
9971281
998− guc->stage_desc_pool_vaddr = vaddr;
1282+ ret = guc_shared_data_create(guc);
1283+ if (ret)
1284+ goto err_stage_desc_pool;
1285+ GEM_BUG_ON(!guc->shared_data);
9991286
10001287 ret = intel_guc_log_create(guc);
10011288 if (ret < 0)
1002− goto err_vaddr;
1289+ goto err_shared_data;
10031290
1004− ret = guc_ads_create(guc);
1005− if (ret < 0)
1291+ ret = guc_preempt_work_create(guc);
1292+ if (ret)
10061293 goto err_log;
1294+ GEM_BUG_ON(!guc->preempt_wq);
10071295
1008− ida_init(&guc->stage_ids);
1296+ ret = guc_ads_create(guc);
1297+ if (ret < 0)
1298+ goto err_wq;
1299+ GEM_BUG_ON(!guc->ads_vma);
10091300
10101301 return 0;
10111302
1303+err_wq:
1304+ guc_preempt_work_destroy(guc);
10121305 err_log:
10131306 intel_guc_log_destroy(guc);
1014−err_vaddr:
1015− i915_gem_object_unpin_map(guc->stage_desc_pool->obj);
1016−err_vma:
1017− i915_vma_unpin_and_release(&guc->stage_desc_pool);
1307+err_shared_data:
1308+ guc_shared_data_destroy(guc);
1309+err_stage_desc_pool:
1310+ guc_stage_desc_pool_destroy(guc);
10181311 return ret;
10191312 }
10201313
1021−void i915_guc_submission_fini(struct drm_i915_private *dev_priv)
1314+void intel_guc_submission_fini(struct intel_guc *guc)
10221315 {
1023− struct intel_guc *guc = &dev_priv->guc;
1024−
1025− ida_destroy(&guc->stage_ids);
10261316 guc_ads_destroy(guc);
1317+ guc_preempt_work_destroy(guc);
10271318 intel_guc_log_destroy(guc);
1028− i915_gem_object_unpin_map(guc->stage_desc_pool->obj);
1029− i915_vma_unpin_and_release(&guc->stage_desc_pool);
1319+ guc_shared_data_destroy(guc);
1320+ guc_stage_desc_pool_destroy(guc);
10301321 }
10311322
10321323 static void guc_interrupts_capture(struct drm_i915_private *dev_priv)
@@ -1036,7 +1327,9 @@ static void guc_interrupts_capture(struct drm_i915_private *dev_priv) · 3 unmodified lines
10361327 enum intel_engine_id id;
10371328 int irqs;
10381329
1039− /* tell all command streamers to forward interrupts (but not vblank) to GuC */
1330+ /* tell all command streamers to forward interrupts (but not vblank)
1331+ * to GuC
1332+ */
10401333 irqs = _MASKED_BIT_ENABLE(GFX_INTERRUPT_STEERING);
10411334 for_each_engine(engine, dev_priv, id)
10421335 I915_WRITE(RING_MODE_GEN7(engine), irqs);
@@ -1097,10 +1390,19 @@ static void guc_interrupts_release(struct drm_i915_private *dev_priv) · 54 unmodified lines
10971390 rps->pm_intrmsk_mbz &= ~ARAT_EXPIRED_INTRMSK;
10981391 }
10991392
1100−int i915_guc_submission_enable(struct drm_i915_private *dev_priv)
1393+static void guc_submission_park(struct intel_engine_cs *engine)
11011394 {
1102− struct intel_guc *guc = &dev_priv->guc;
1103− struct i915_guc_client *client = guc->execbuf_client;
1395+ intel_engine_unpin_breadcrumbs_irq(engine);
1396+}
1397+
1398+static void guc_submission_unpark(struct intel_engine_cs *engine)
1399+{
1400+ intel_engine_pin_breadcrumbs_irq(engine);
1401+}
1402+
1403+int intel_guc_submission_enable(struct intel_guc *guc)
1404+{
1405+ struct drm_i915_private *dev_priv = guc_to_i915(guc);
11041406 struct intel_engine_cs *engine;
11051407 enum intel_engine_id id;
11061408 int err;
@@ -1118,61 +1420,62 @@ int i915_guc_submission_enable(struct drm_i915_private *dev_priv) · 11 unmodified lines
11181420 sizeof(struct guc_wq_item) *
11191421 I915_NUM_ENGINES > GUC_WQ_SIZE);
11201422
1121− if (!client) {
1122− client = guc_client_alloc(dev_priv,
1123− INTEL_INFO(dev_priv)->ring_mask,
1124− GUC_CLIENT_PRIORITY_KMD_NORMAL,
1125− dev_priv->kernel_context);
1126− if (IS_ERR(client)) {
1127− DRM_ERROR("Failed to create GuC client for execbuf!\n");
1128− return PTR_ERR(client);
1129− }
1130−
1131− guc->execbuf_client = client;
1423+ /*
1424+ * We're being called on both module initialization and on reset,
1425+ * until this flow is changed, we're using regular client presence to
1426+ * determine which case are we in, and whether we should allocate new
1427+ * clients or just reset their workqueues.
1428+ */
1429+ if (!guc->execbuf_client) {
1430+ err = guc_clients_create(guc);
1431+ if (err)
1432+ return err;
1433+ } else {
1434+ guc_reset_wq(guc->execbuf_client);
1435+ guc_reset_wq(guc->preempt_client);
11321436 }
11331437
11341438 err = intel_guc_sample_forcewake(guc);
11351439 if (err)
1136− goto err_execbuf_client;
1137−
1138− guc_reset_wq(client);
1440+ goto err_free_clients;
11391441
11401442 err = guc_init_doorbell_hw(guc);
11411443 if (err)
1142− goto err_execbuf_client;
1444+ goto err_free_clients;
11431445
11441446 /* Take over from manual control of ELSP (execlists) */
11451447 guc_interrupts_capture(dev_priv);
11461448
11471449 for_each_engine(engine, dev_priv, id) {
1148− struct intel_engine_execlists * const execlists = &engine->execlists;
1149− /* The tasklet was initialised by execlists, and may be in
1150− * a state of flux (across a reset) and so we just want to
1151− * take over the callback without changing any other state
1152− * in the tasklet.
1153− */
1154− execlists->irq_tasklet.func = i915_guc_irq_handler;
1155− clear_bit(ENGINE_IRQ_EXECLIST, &engine->irq_posted);
1156− tasklet_schedule(&execlists->irq_tasklet);
1450+ struct intel_engine_execlists * const execlists =
1451+ &engine->execlists;
1452+
1453+ execlists->tasklet.func = guc_submission_tasklet;
1454+ engine->park = guc_submission_park;
1455+ engine->unpark = guc_submission_unpark;
11571456 }
11581457
11591458 return 0;
11601459
1161−err_execbuf_client:
1162− guc_client_free(guc->execbuf_client);
1163− guc->execbuf_client = NULL;
1460+err_free_clients:
1461+ guc_clients_destroy(guc);
11641462 return err;
11651463 }
11661464
1167−void i915_guc_submission_disable(struct drm_i915_private *dev_priv)
1465+void intel_guc_submission_disable(struct intel_guc *guc)
11681466 {
1169− struct intel_guc *guc = &dev_priv->guc;
1467+ struct drm_i915_private *dev_priv = guc_to_i915(guc);
1468+
1469+ GEM_BUG_ON(dev_priv->gt.awake); /* GT should be parked first */
11701470
11711471 guc_interrupts_release(dev_priv);
11721472
11731473 /* Revert back to manual ELSP submission */
11741474 intel_engines_reset_default_submission(dev_priv);
11751475
1176− guc_client_free(guc->execbuf_client);
1177− guc->execbuf_client = NULL;
1476+ guc_clients_destroy(guc);
11781477 }
1478+
1479+#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
1480+#include "selftests/intel_guc.c"
1481+#endif
drivers/gpu/drm/i915/intel_guc_submission.hrenamed from drivers/gpu/drm/i915/i915_guc_submission.h+6−5
@@ -52,7 +52,7 @@ struct drm_i915_private; · 51 unmodified lines
5252 * queue (a circular array of work items), again described in the process
5353 * descriptor. Work queue pages are mapped momentarily as required.
5454 */
55−struct i915_guc_client {
55+struct intel_guc_client {
5656 struct i915_vma *vma;
5757 void *vaddr;
5858 struct i915_gem_context *owner;
@@ -67,14 +67,15 @@ struct i915_guc_client { · 8 unmodified lines
6767 u16 doorbell_id;
6868 unsigned long doorbell_offset;
6969
70+ /* Protects GuC client's WQ access */
7071 spinlock_t wq_lock;
7172 /* Per-engine counts of GuC submissions */
7273 u64 submissions[I915_NUM_ENGINES];
7374 };
7475
75−int i915_guc_submission_init(struct drm_i915_private *dev_priv);
76−int i915_guc_submission_enable(struct drm_i915_private *dev_priv);
77−void i915_guc_submission_disable(struct drm_i915_private *dev_priv);
78−void i915_guc_submission_fini(struct drm_i915_private *dev_priv);
76+int intel_guc_submission_init(struct intel_guc *guc);
77+int intel_guc_submission_enable(struct intel_guc *guc);
78+void intel_guc_submission_disable(struct intel_guc *guc);
79+void intel_guc_submission_fini(struct intel_guc *guc);
7980
8081 #endif
drivers/gpu/drm/i915/intel_hdmi.c+55−43
@@ -186,7 +186,7 @@ static bool g4x_infoframe_enabled(struct drm_encoder *encoder, · 185 unmodified lines
186186 if ((val & VIDEO_DIP_ENABLE) == 0)
187187 return false;
188188
189− if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(intel_dig_port->port))
189+ if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(intel_dig_port->base.port))
190190 return false;
191191
192192 return val & (VIDEO_DIP_ENABLE_AVI |
@@ -245,7 +245,7 @@ static bool ibx_infoframe_enabled(struct drm_encoder *encoder, · 52 unmodified lines
245245 if ((val & VIDEO_DIP_ENABLE) == 0)
246246 return false;
247247
248− if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(intel_dig_port->port))
248+ if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(intel_dig_port->base.port))
249249 return false;
250250
251251 return val & (VIDEO_DIP_ENABLE_AVI |
@@ -362,7 +362,7 @@ static bool vlv_infoframe_enabled(struct drm_encoder *encoder, · 110 unmodified lines
362362 if ((val & VIDEO_DIP_ENABLE) == 0)
363363 return false;
364364
365− if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(intel_dig_port->port))
365+ if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(intel_dig_port->base.port))
366366 return false;
367367
368368 return val & (VIDEO_DIP_ENABLE_AVI |
@@ -538,7 +538,7 @@ static void g4x_set_infoframes(struct drm_encoder *encoder, · 169 unmodified lines
538538 struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
539539 i915_reg_t reg = VIDEO_DIP_CTL;
540540 u32 val = I915_READ(reg);
541− u32 port = VIDEO_DIP_PORT(intel_dig_port->port);
541+ u32 port = VIDEO_DIP_PORT(intel_dig_port->base.port);
542542
543543 assert_hdmi_port_disabled(intel_hdmi);
544544
@@ -689,7 +689,7 @@ static void ibx_set_infoframes(struct drm_encoder *encoder, · 144 unmodified lines
689689 struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
690690 i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
691691 u32 val = I915_READ(reg);
692− u32 port = VIDEO_DIP_PORT(intel_dig_port->port);
692+ u32 port = VIDEO_DIP_PORT(intel_dig_port->base.port);
693693
694694 assert_hdmi_port_disabled(intel_hdmi);
695695
@@ -785,7 +785,7 @@ static void vlv_set_infoframes(struct drm_encoder *encoder, · 89 unmodified lines
785785 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
786786 i915_reg_t reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
787787 u32 val = I915_READ(reg);
788− u32 port = VIDEO_DIP_PORT(intel_dig_port->port);
788+ u32 port = VIDEO_DIP_PORT(intel_dig_port->base.port);
789789
790790 assert_hdmi_port_disabled(intel_hdmi);
791791
@@ -960,6 +960,8 @@ static void intel_hdmi_get_config(struct intel_encoder *encoder, · 168 unmodified lines
960960 u32 tmp, flags = 0;
961961 int dotclock;
962962
963+ pipe_config->output_types |= BIT(INTEL_OUTPUT_HDMI);
964+
963965 tmp = I915_READ(intel_hdmi->hdmi_reg);
964966
965967 if (tmp & SDVO_HSYNC_ACTIVE_HIGH)
@@ -1207,7 +1209,8 @@ static void g4x_disable_hdmi(struct intel_encoder *encoder, · 241 unmodified lines
12071209 const struct drm_connector_state *old_conn_state)
12081210 {
12091211 if (old_crtc_state->has_audio)
1210− intel_audio_codec_disable(encoder);
1212+ intel_audio_codec_disable(encoder,
1213+ old_crtc_state, old_conn_state);
12111214
12121215 intel_disable_hdmi(encoder, old_crtc_state, old_conn_state);
12131216 }
@@ -1217,7 +1220,8 @@ static void pch_disable_hdmi(struct intel_encoder *encoder, · 3 unmodified lines
12171220 const struct drm_connector_state *old_conn_state)
12181221 {
12191222 if (old_crtc_state->has_audio)
1220− intel_audio_codec_disable(encoder);
1223+ intel_audio_codec_disable(encoder,
1224+ old_crtc_state, old_conn_state);
12211225 }
12221226
12231227 static void pch_post_disable_hdmi(struct intel_encoder *encoder,
@@ -1227,24 +1231,34 @@ static void pch_post_disable_hdmi(struct intel_encoder *encoder, · 3 unmodified lines
12271231 intel_disable_hdmi(encoder, old_crtc_state, old_conn_state);
12281232 }
12291233
1230−static int intel_hdmi_source_max_tmds_clock(struct drm_i915_private *dev_priv)
1234+static int intel_hdmi_source_max_tmds_clock(struct intel_encoder *encoder)
12311235 {
1232− if (IS_G4X(dev_priv))
1233− return 165000;
1234− else if (IS_GEMINILAKE(dev_priv))
1235− return 594000;
1236− else if (IS_HASWELL(dev_priv) || INTEL_INFO(dev_priv)->gen >= 8)
1237− return 300000;
1236+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1237+ const struct ddi_vbt_port_info *info =
1238+ &dev_priv->vbt.ddi_port_info[encoder->port];
1239+ int max_tmds_clock;
1240+
1241+ if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
1242+ max_tmds_clock = 594000;
1243+ else if (INTEL_GEN(dev_priv) >= 8 || IS_HASWELL(dev_priv))
1244+ max_tmds_clock = 300000;
1245+ else if (INTEL_GEN(dev_priv) >= 5)
1246+ max_tmds_clock = 225000;
12381247 else
1239− return 225000;
1248+ max_tmds_clock = 165000;
1249+
1250+ if (info->max_tmds_clock)
1251+ max_tmds_clock = min(max_tmds_clock, info->max_tmds_clock);
1252+
1253+ return max_tmds_clock;
12401254 }
12411255
12421256 static int hdmi_port_clock_limit(struct intel_hdmi *hdmi,
12431257 bool respect_downstream_limits,
12441258 bool force_dvi)
12451259 {
1246− struct drm_device *dev = intel_hdmi_to_dev(hdmi);
1247− int max_tmds_clock = intel_hdmi_source_max_tmds_clock(to_i915(dev));
1260+ struct intel_encoder *encoder = &hdmi_to_dig_port(hdmi)->base;
1261+ int max_tmds_clock = intel_hdmi_source_max_tmds_clock(encoder);
12481262
12491263 if (respect_downstream_limits) {
12501264 struct intel_connector *connector = hdmi->attached_connector;
@@ -1339,6 +1353,12 @@ static bool hdmi_12bpc_possible(const struct intel_crtc_state *crtc_state) · 88 unmodified lines
13391353 if (HAS_GMCH_DISPLAY(dev_priv))
13401354 return false;
13411355
1356+ if (crtc_state->pipe_bpp <= 8*3)
1357+ return false;
1358+
1359+ if (!crtc_state->has_hdmi_sink)
1360+ return false;
1361+
13421362 /*
13431363 * HDMI 12bpc affects the clocks, so it's only possible
13441364 * when not cloning with other encoder types.
@@ -1464,9 +1484,8 @@ bool intel_hdmi_compute_config(struct intel_encoder *encoder, · 119 unmodified lines
14641484 * outputs. We also need to check that the higher clock still fits
14651485 * within limits.
14661486 */
1467− if (pipe_config->pipe_bpp > 8*3 && pipe_config->has_hdmi_sink && !force_dvi &&
1468− hdmi_port_clock_valid(intel_hdmi, clock_12bpc, true, force_dvi) == MODE_OK &&
1469− hdmi_12bpc_possible(pipe_config)) {
1487+ if (hdmi_12bpc_possible(pipe_config) &&
1488+ hdmi_port_clock_valid(intel_hdmi, clock_12bpc, true, force_dvi) == MODE_OK) {
14701489 DRM_DEBUG_KMS("picking bpc to 12 for HDMI output\n");
14711490 desired_bpp = 12*3;
14721491
@@ -1495,7 +1514,8 @@ bool intel_hdmi_compute_config(struct intel_encoder *encoder, · 22 unmodified lines
14951514
14961515 pipe_config->lane_count = 4;
14971516
1498− if (scdc->scrambling.supported && IS_GEMINILAKE(dev_priv)) {
1517+ if (scdc->scrambling.supported && (INTEL_GEN(dev_priv) >= 10 ||
1518+ IS_GEMINILAKE(dev_priv))) {
14991519 if (scdc->scrambling.low_rates)
15001520 pipe_config->hdmi_scrambling = true;
15011521
@@ -1529,7 +1549,7 @@ intel_hdmi_dp_dual_mode_detect(struct drm_connector *connector, bool has_edid) · 27 unmodified lines
15291549 {
15301550 struct drm_i915_private *dev_priv = to_i915(connector->dev);
15311551 struct intel_hdmi *hdmi = intel_attached_hdmi(connector);
1532− enum port port = hdmi_to_dig_port(hdmi)->port;
1552+ enum port port = hdmi_to_dig_port(hdmi)->base.port;
15331553 struct i2c_adapter *adapter =
15341554 intel_gmbus_get_adapter(dev_priv, hdmi->ddc_bus);
15351555 enum drm_dp_dual_mode_type type = drm_dp_dual_mode_detect(adapter);
@@ -1613,12 +1633,9 @@ intel_hdmi_detect(struct drm_connector *connector, bool force) · 77 unmodified lines
16131633
16141634 intel_hdmi_unset_edid(connector);
16151635
1616− if (intel_hdmi_set_edid(connector)) {
1617− struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1618−
1619− hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI;
1636+ if (intel_hdmi_set_edid(connector))
16201637 status = connector_status_connected;
1621− } else
1638+ else
16221639 status = connector_status_disconnected;
16231640
16241641 intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS);
@@ -1629,8 +1646,6 @@ intel_hdmi_detect(struct drm_connector *connector, bool force) · 4 unmodified lines
16291646 static void
16301647 intel_hdmi_force(struct drm_connector *connector)
16311648 {
1632− struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1633−
16341649 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
16351650 connector->base.id, connector->name);
16361651
@@ -1640,7 +1655,6 @@ intel_hdmi_force(struct drm_connector *connector) · 3 unmodified lines
16401655 return;
16411656
16421657 intel_hdmi_set_edid(connector);
1643− hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI;
16441658 }
16451659
16461660 static int intel_hdmi_get_modes(struct drm_connector *connector)
@@ -1673,10 +1687,9 @@ static void vlv_hdmi_pre_enable(struct intel_encoder *encoder, · 26 unmodified lines
16731687 const struct drm_connector_state *conn_state)
16741688 {
16751689 struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
1676− struct drm_device *dev = encoder->base.dev;
1677− struct drm_i915_private *dev_priv = to_i915(dev);
1690+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
16781691
1679− vlv_phy_pre_encoder_enable(encoder);
1692+ vlv_phy_pre_encoder_enable(encoder, pipe_config);
16801693
16811694 /* HDMI 1.0V-2dB */
16821695 vlv_set_phy_signal_level(encoder, 0x2b245f5f, 0x00002000, 0x5578b83a,
@@ -1697,7 +1710,7 @@ static void vlv_hdmi_pre_pll_enable(struct intel_encoder *encoder, · 14 unmodified lines
16971710 {
16981711 intel_hdmi_prepare(encoder, pipe_config);
16991712
1700− vlv_phy_pre_pll_enable(encoder);
1713+ vlv_phy_pre_pll_enable(encoder, pipe_config);
17011714 }
17021715
17031716 static void chv_hdmi_pre_pll_enable(struct intel_encoder *encoder,
@@ -1706,14 +1719,14 @@ static void chv_hdmi_pre_pll_enable(struct intel_encoder *encoder, · 2 unmodified lines
17061719 {
17071720 intel_hdmi_prepare(encoder, pipe_config);
17081721
1709− chv_phy_pre_pll_enable(encoder);
1722+ chv_phy_pre_pll_enable(encoder, pipe_config);
17101723 }
17111724
17121725 static void chv_hdmi_post_pll_disable(struct intel_encoder *encoder,
17131726 const struct intel_crtc_state *old_crtc_state,
17141727 const struct drm_connector_state *old_conn_state)
17151728 {
1716− chv_phy_post_pll_disable(encoder);
1729+ chv_phy_post_pll_disable(encoder, old_crtc_state);
17171730 }
17181731
17191732 static void vlv_hdmi_post_disable(struct intel_encoder *encoder,
@@ -1721,7 +1734,7 @@ static void vlv_hdmi_post_disable(struct intel_encoder *encoder, · 1 unmodified line
17211734 const struct drm_connector_state *old_conn_state)
17221735 {
17231736 /* Reset lanes to avoid HDMI flicker (VLV w/a) */
1724− vlv_phy_reset_lanes(encoder);
1737+ vlv_phy_reset_lanes(encoder, old_crtc_state);
17251738 }
17261739
17271740 static void chv_hdmi_post_disable(struct intel_encoder *encoder,
@@ -1734,7 +1747,7 @@ static void chv_hdmi_post_disable(struct intel_encoder *encoder, · 6 unmodified lines
17341747 mutex_lock(&dev_priv->sb_lock);
17351748
17361749 /* Assert data lane reset */
1737− chv_data_lane_soft_reset(encoder, true);
1750+ chv_data_lane_soft_reset(encoder, old_crtc_state, true);
17381751
17391752 mutex_unlock(&dev_priv->sb_lock);
17401753 }
@@ -1747,7 +1760,7 @@ static void chv_hdmi_pre_enable(struct intel_encoder *encoder, · 6 unmodified lines
17471760 struct drm_device *dev = encoder->base.dev;
17481761 struct drm_i915_private *dev_priv = to_i915(dev);
17491762
1750− chv_phy_pre_encoder_enable(encoder);
1763+ chv_phy_pre_encoder_enable(encoder, pipe_config);
17511764
17521765 /* FIXME: Program the support xxx V-dB */
17531766 /* Use 800mV-0dB */
@@ -2006,7 +2019,7 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port, · 252 unmodified lines
20062019 struct intel_encoder *intel_encoder = &intel_dig_port->base;
20072020 struct drm_device *dev = intel_encoder->base.dev;
20082021 struct drm_i915_private *dev_priv = to_i915(dev);
2009− enum port port = intel_dig_port->port;
2022+ enum port port = intel_encoder->port;
20102023
20112024 DRM_DEBUG_KMS("Adding HDMI connector on port %c\n",
20122025 port_name(port));
@@ -2024,7 +2037,7 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port, · 11 unmodified lines
20242037 connector->doublescan_allowed = 0;
20252038 connector->stereo_allowed = 1;
20262039
2027− if (IS_GEMINILAKE(dev_priv))
2040+ if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
20282041 connector->ycbcr_420_allowed = true;
20292042
20302043 intel_hdmi->ddc_bus = intel_hdmi_ddc_pin(dev_priv, port);
@@ -2126,7 +2139,6 @@ void intel_hdmi_init(struct drm_i915_private *dev_priv, · 95 unmodified lines
21262139 if (IS_G4X(dev_priv))
21272140 intel_encoder->cloneable |= 1 << INTEL_OUTPUT_HDMI;
21282141
2129− intel_dig_port->port = port;
21302142 intel_dig_port->hdmi.hdmi_reg = hdmi_reg;
21312143 intel_dig_port->dp.output_reg = INVALID_MMIO_REG;
21322144 intel_dig_port->max_lanes = 4;
drivers/gpu/drm/i915/intel_huc.c+1−1
@@ -151,7 +151,7 @@ static int huc_ucode_xfer(struct intel_uc_fw *huc_fw, struct i915_vma *vma) · 150 unmodified lines
151151 I915_WRITE(DMA_CTRL, _MASKED_BIT_ENABLE(HUC_UKERNEL | START_DMA));
152152
153153 /* Wait for DMA to finish */
154− ret = wait_for((I915_READ(DMA_CTRL) & START_DMA) == 0, 100);
154+ ret = intel_wait_for_register_fw(dev_priv, DMA_CTRL, START_DMA, 0, 100);
155155
156156 DRM_DEBUG_DRIVER("HuC DMA transfer wait over with ret %d\n", ret);
157157
drivers/gpu/drm/i915/intel_lrc.c+110−71
@@ -136,6 +136,7 @@ · 135 unmodified lines
136136 #include <drm/drmP.h>
137137 #include <drm/i915_drm.h>
138138 #include "i915_drv.h"
139+#include "i915_gem_render_state.h"
139140 #include "intel_mocs.h"
140141
141142 #define RING_EXECLIST_QFULL (1 << 0x2)
@@ -354,7 +355,7 @@ static void unwind_wa_tail(struct drm_i915_gem_request *rq) · 212 unmodified lines
354355 assert_ring_tail_valid(rq->ring, rq->tail);
355356 }
356357
357−static void unwind_incomplete_requests(struct intel_engine_cs *engine)
358+static void __unwind_incomplete_requests(struct intel_engine_cs *engine)
358359 {
359360 struct drm_i915_gem_request *rq, *rn;
360361 struct i915_priolist *uninitialized_var(p);
@@ -385,6 +386,17 @@ static void unwind_incomplete_requests(struct intel_engine_cs *engine) · 24 unmodified lines
385386 }
386387 }
387388
389+void
390+execlists_unwind_incomplete_requests(struct intel_engine_execlists *execlists)
391+{
392+ struct intel_engine_cs *engine =
393+ container_of(execlists, typeof(*engine), execlists);
394+
395+ spin_lock_irq(&engine->timeline->lock);
396+ __unwind_incomplete_requests(engine);
397+ spin_unlock_irq(&engine->timeline->lock);
398+}
399+
388400 static inline void
389401 execlists_context_status_change(struct drm_i915_gem_request *rq,
390402 unsigned long status)
@@ -455,6 +467,11 @@ static void execlists_submit_ports(struct intel_engine_cs *engine) · 64 unmodified lines
455467 port_set(&port[n], port_pack(rq, count));
456468 desc = execlists_update_context(rq);
457469 GEM_DEBUG_EXEC(port[n].context_id = upper_32_bits(desc));
470+
471+ GEM_TRACE("%s in[%d]: ctx=%d.%d, seqno=%x\n",
472+ engine->name, n,
473+ rq->ctx->hw_id, count,
474+ rq->global_seqno);
458475 } else {
459476 GEM_BUG_ON(!n);
460477 desc = 0;
@@ -509,17 +526,13 @@ static void inject_preempt_context(struct intel_engine_cs *engine) · 48 unmodified lines
509526 ce->ring->tail &= (ce->ring->size - 1);
510527 ce->lrc_reg_state[CTX_RING_TAIL+1] = ce->ring->tail;
511528
529+ GEM_TRACE("\n");
512530 for (n = execlists_num_ports(&engine->execlists); --n; )
513531 elsp_write(0, elsp);
514532
515533 elsp_write(ce->lrc_desc, elsp);
516534 }
517535
518−static bool can_preempt(struct intel_engine_cs *engine)
519−{
520− return INTEL_INFO(engine->i915)->has_logical_ring_preemption;
521−}
522−
523536 static void execlists_dequeue(struct intel_engine_cs *engine)
524537 {
525538 struct intel_engine_execlists * const execlists = &engine->execlists;
@@ -567,7 +580,7 @@ static void execlists_dequeue(struct intel_engine_cs *engine) · 41 unmodified lines
567580 if (port_count(&port[0]) > 1)
568581 goto unlock;
569582
570− if (can_preempt(engine) &&
583+ if (HAS_LOGICAL_RING_PREEMPTION(engine->i915) &&
571584 rb_entry(rb, struct i915_priolist, node)->priority >
572585 max(last->priotree.priority, 0)) {
573586 /*
@@ -690,8 +703,8 @@ unlock: · 116 unmodified lines
690703 }
691704 }
692705
693−static void
694−execlist_cancel_port_requests(struct intel_engine_execlists *execlists)
706+void
707+execlists_cancel_port_requests(struct intel_engine_execlists * const execlists)
695708 {
696709 struct execlist_port *port = execlists->port;
697710 unsigned int num_ports = execlists_num_ports(execlists);
@@ -718,7 +731,7 @@ static void execlists_cancel_requests(struct intel_engine_cs *engine) · 20 unmodified lines
718731 spin_lock_irqsave(&engine->timeline->lock, flags);
719732
720733 /* Cancel the requests on the HW and clear the ELSP tracker. */
721− execlist_cancel_port_requests(execlists);
734+ execlists_cancel_port_requests(execlists);
722735
723736 /* Mark all executing requests as skipped. */
724737 list_for_each_entry(rq, &engine->timeline->requests, link) {
@@ -768,7 +781,7 @@ static void execlists_cancel_requests(struct intel_engine_cs *engine) · 43 unmodified lines
768781 * Check the unread Context Status Buffers and manage the submission of new
769782 * contexts to the ELSP accordingly.
770783 */
771−static void intel_lrc_irq_handler(unsigned long data)
784+static void execlists_submission_tasklet(unsigned long data)
772785 {
773786 struct intel_engine_cs * const engine = (struct intel_engine_cs *)data;
774787 struct intel_engine_execlists * const execlists = &engine->execlists;
@@ -826,6 +839,10 @@ static void intel_lrc_irq_handler(unsigned long data) · 51 unmodified lines
826839 head = execlists->csb_head;
827840 tail = READ_ONCE(buf[write_idx]);
828841 }
842+ GEM_TRACE("%s cs-irq head=%d [%d], tail=%d [%d]\n",
843+ engine->name,
844+ head, GEN8_CSB_READ_PTR(readl(dev_priv->regs + i915_mmio_reg_offset(RING_CONTEXT_STATUS_PTR(engine)))),
845+ tail, GEN8_CSB_WRITE_PTR(readl(dev_priv->regs + i915_mmio_reg_offset(RING_CONTEXT_STATUS_PTR(engine)))));
829846
830847 while (head != tail) {
831848 struct drm_i915_gem_request *rq;
@@ -853,16 +870,16 @@ static void intel_lrc_irq_handler(unsigned long data) · 21 unmodified lines
853870 */
854871
855872 status = READ_ONCE(buf[2 * head]); /* maybe mmio! */
873+ GEM_TRACE("%s csb[%dd]: status=0x%08x:0x%08x\n",
874+ engine->name, head,
875+ status, buf[2*head + 1]);
856876 if (!(status & GEN8_CTX_STATUS_COMPLETED_MASK))
857877 continue;
858878
859879 if (status & GEN8_CTX_STATUS_ACTIVE_IDLE &&
860880 buf[2*head + 1] == PREEMPT_ID) {
861− execlist_cancel_port_requests(execlists);
862−
863− spin_lock_irq(&engine->timeline->lock);
864− unwind_incomplete_requests(engine);
865− spin_unlock_irq(&engine->timeline->lock);
881+ execlists_cancel_port_requests(execlists);
882+ execlists_unwind_incomplete_requests(execlists);
866883
867884 GEM_BUG_ON(!execlists_is_active(execlists,
868885 EXECLISTS_ACTIVE_PREEMPT));
@@ -883,6 +900,10 @@ static void intel_lrc_irq_handler(unsigned long data) · 14 unmodified lines
883900 GEM_DEBUG_BUG_ON(buf[2 * head + 1] != port->context_id);
884901
885902 rq = port_unpack(port, &count);
903+ GEM_TRACE("%s out[0]: ctx=%d.%d, seqno=%x\n",
904+ engine->name,
905+ rq->ctx->hw_id, count,
906+ rq->global_seqno);
886907 GEM_BUG_ON(count == 0);
887908 if (--count == 0) {
888909 GEM_BUG_ON(status & GEN8_CTX_STATUS_PREEMPTED);
@@ -926,7 +947,7 @@ static void insert_request(struct intel_engine_cs *engine, · 37 unmodified lines
926947
927948 list_add_tail(&pt->link, &ptr_mask_bits(p, 1)->requests);
928949 if (ptr_unmask_bits(p, 1))
929− tasklet_hi_schedule(&engine->execlists.irq_tasklet);
950+ tasklet_hi_schedule(&engine->execlists.tasklet);
930951 }
931952
932953 static void execlists_submit_request(struct drm_i915_gem_request *request)
@@ -1057,12 +1078,34 @@ static void execlists_schedule(struct drm_i915_gem_request *request, int prio) · 124 unmodified lines
10571078 spin_unlock_irq(&engine->timeline->lock);
10581079 }
10591080
1081+static int __context_pin(struct i915_gem_context *ctx, struct i915_vma *vma)
1082+{
1083+ unsigned int flags;
1084+ int err;
1085+
1086+ /*
1087+ * Clear this page out of any CPU caches for coherent swap-in/out.
1088+ * We only want to do this on the first bind so that we do not stall
1089+ * on an active context (which by nature is already on the GPU).
1090+ */
1091+ if (!(vma->flags & I915_VMA_GLOBAL_BIND)) {
1092+ err = i915_gem_object_set_to_gtt_domain(vma->obj, true);
1093+ if (err)
1094+ return err;
1095+ }
1096+
1097+ flags = PIN_GLOBAL | PIN_HIGH;
1098+ if (ctx->ggtt_offset_bias)
1099+ flags |= PIN_OFFSET_BIAS | ctx->ggtt_offset_bias;
1100+
1101+ return i915_vma_pin(vma, 0, GEN8_LR_CONTEXT_ALIGN, flags);
1102+}
1103+
10601104 static struct intel_ring *
10611105 execlists_context_pin(struct intel_engine_cs *engine,
10621106 struct i915_gem_context *ctx)
10631107 {
10641108 struct intel_context *ce = &ctx->engine[engine->id];
1065− unsigned int flags;
10661109 void *vaddr;
10671110 int ret;
10681111
@@ -1079,11 +1122,7 @@ execlists_context_pin(struct intel_engine_cs *engine, · 10 unmodified lines
10791122 }
10801123 GEM_BUG_ON(!ce->state);
10811124
1082− flags = PIN_GLOBAL | PIN_HIGH;
1083− if (ctx->ggtt_offset_bias)
1084− flags |= PIN_OFFSET_BIAS | ctx->ggtt_offset_bias;
1085−
1086− ret = i915_vma_pin(ce->state, 0, GEN8_LR_CONTEXT_ALIGN, flags);
1125+ ret = __context_pin(ctx, ce->state);
10871126 if (ret)
10881127 goto err;
10891128
@@ -1103,9 +1142,7 @@ execlists_context_pin(struct intel_engine_cs *engine, · 13 unmodified lines
11031142 ce->lrc_reg_state[CTX_RING_BUFFER_START+1] =
11041143 i915_ggtt_offset(ce->ring->vma);
11051144
1106− ce->state->obj->mm.dirty = true;
11071145 ce->state->obj->pin_global++;
1108−
11091146 i915_gem_context_get(ctx);
11101147 out:
11111148 return ce->ring;
@@ -1143,7 +1180,6 @@ static int execlists_request_alloc(struct drm_i915_gem_request *request) · 31 unmodified lines
11431180 {
11441181 struct intel_engine_cs *engine = request->engine;
11451182 struct intel_context *ce = &request->ctx->engine[engine->id];
1146− u32 *cs;
11471183 int ret;
11481184
11491185 GEM_BUG_ON(!ce->pin_count);
@@ -1154,17 +1190,9 @@ static int execlists_request_alloc(struct drm_i915_gem_request *request) · 4 unmodified lines
11541190 */
11551191 request->reserved_space += EXECLISTS_REQUEST_SIZE;
11561192
1157− cs = intel_ring_begin(request, 0);
1158− if (IS_ERR(cs))
1159− return PTR_ERR(cs);
1160−
1161− if (!ce->initialised) {
1162− ret = engine->init_context(request);
1163− if (ret)
1164− return ret;
1165−
1166− ce->initialised = true;
1167− }
1193+ ret = intel_ring_wait_for_space(request->ring, request->reserved_space);
1194+ if (ret)
1195+ return ret;
11681196
11691197 /* Note that after this point, we have committed to using
11701198 * this request as it is being used to both track the
@@ -1474,8 +1502,8 @@ static int gen8_init_common_ring(struct intel_engine_cs *engine) · 303 unmodified lines
14741502 execlists->active = 0;
14751503
14761504 /* After a GPU reset, we may have requests to replay */
1477− if (!i915_modparams.enable_guc_submission && execlists->first)
1478− tasklet_schedule(&execlists->irq_tasklet);
1505+ if (execlists->first)
1506+ tasklet_schedule(&execlists->tasklet);
14791507
14801508 return 0;
14811509 }
@@ -1531,10 +1559,10 @@ static void reset_common_ring(struct intel_engine_cs *engine, · 49 unmodified lines
15311559 * guessing the missed context-switch events by looking at what
15321560 * requests were completed.
15331561 */
1534− execlist_cancel_port_requests(execlists);
1562+ execlists_cancel_port_requests(execlists);
15351563
15361564 /* Push back any incomplete requests for replay after the reset. */
1537− unwind_incomplete_requests(engine);
1565+ __unwind_incomplete_requests(engine);
15381566
15391567 spin_unlock_irqrestore(&engine->timeline->lock, flags);
15401568
@@ -1794,10 +1822,8 @@ static void gen8_emit_breadcrumb(struct drm_i915_gem_request *request, u32 *cs) · 253 unmodified lines
17941822 /* w/a: bit 5 needs to be zero for MI_FLUSH_DW address. */
17951823 BUILD_BUG_ON(I915_GEM_HWS_INDEX_ADDR & (1 << 5));
17961824
1797− *cs++ = (MI_FLUSH_DW + 1) | MI_FLUSH_DW_OP_STOREDW;
1798− *cs++ = intel_hws_seqno_address(request->engine) | MI_FLUSH_DW_USE_GTT;
1799− *cs++ = 0;
1800− *cs++ = request->global_seqno;
1825+ cs = gen8_emit_ggtt_write(cs, request->global_seqno,
1826+ intel_hws_seqno_address(request->engine));
18011827 *cs++ = MI_USER_INTERRUPT;
18021828 *cs++ = MI_NOOP;
18031829 request->tail = intel_ring_offset(request, cs);
@@ -1807,24 +1833,14 @@ static void gen8_emit_breadcrumb(struct drm_i915_gem_request *request, u32 *cs) · 3 unmodified lines
18071833 }
18081834 static const int gen8_emit_breadcrumb_sz = 6 + WA_TAIL_DWORDS;
18091835
1810−static void gen8_emit_breadcrumb_render(struct drm_i915_gem_request *request,
1836+static void gen8_emit_breadcrumb_rcs(struct drm_i915_gem_request *request,
18111837 u32 *cs)
18121838 {
18131839 /* We're using qword write, seqno should be aligned to 8 bytes. */
18141840 BUILD_BUG_ON(I915_GEM_HWS_INDEX & 1);
18151841
1816− /* w/a for post sync ops following a GPGPU operation we
1817− * need a prior CS_STALL, which is emitted by the flush
1818− * following the batch.
1819− */
1820− *cs++ = GFX_OP_PIPE_CONTROL(6);
1821− *cs++ = PIPE_CONTROL_GLOBAL_GTT_IVB | PIPE_CONTROL_CS_STALL |
1822− PIPE_CONTROL_QW_WRITE;
1823− *cs++ = intel_hws_seqno_address(request->engine);
1824− *cs++ = 0;
1825− *cs++ = request->global_seqno;
1826− /* We're thrashing one dword of HWS. */
1827− *cs++ = 0;
1842+ cs = gen8_emit_ggtt_write_rcs(cs, request->global_seqno,
1843+ intel_hws_seqno_address(request->engine));
18281844 *cs++ = MI_USER_INTERRUPT;
18291845 *cs++ = MI_NOOP;
18301846 request->tail = intel_ring_offset(request, cs);
@@ -1832,7 +1848,7 @@ static void gen8_emit_breadcrumb_render(struct drm_i915_gem_request *request, · 1 unmodified line
18321848
18331849 gen8_emit_wa_tail(request, cs);
18341850 }
1835−static const int gen8_emit_breadcrumb_render_sz = 8 + WA_TAIL_DWORDS;
1851+static const int gen8_emit_breadcrumb_rcs_sz = 8 + WA_TAIL_DWORDS;
18361852
18371853 static int gen8_init_rcs_context(struct drm_i915_gem_request *req)
18381854 {
@@ -1865,8 +1881,9 @@ void intel_logical_ring_cleanup(struct intel_engine_cs *engine) · 26 unmodified lines
18651881 * Tasklet cannot be active at this point due intel_mark_active/idle
18661882 * so this is just for documentation.
18671883 */
1868− if (WARN_ON(test_bit(TASKLET_STATE_SCHED, &engine->execlists.irq_tasklet.state)))
1869− tasklet_kill(&engine->execlists.irq_tasklet);
1884+ if (WARN_ON(test_bit(TASKLET_STATE_SCHED,
1885+ &engine->execlists.tasklet.state)))
1886+ tasklet_kill(&engine->execlists.tasklet);
18701887
18711888 dev_priv = engine->i915;
18721889
@@ -1890,7 +1907,10 @@ static void execlists_set_default_submission(struct intel_engine_cs *engine) · 17 unmodified lines
18901907 engine->submit_request = execlists_submit_request;
18911908 engine->cancel_requests = execlists_cancel_requests;
18921909 engine->schedule = execlists_schedule;
1893− engine->execlists.irq_tasklet.func = intel_lrc_irq_handler;
1910+ engine->execlists.tasklet.func = execlists_submission_tasklet;
1911+
1912+ engine->park = NULL;
1913+ engine->unpark = NULL;
18941914 }
18951915
18961916 static void
@@ -1949,8 +1969,8 @@ logical_ring_setup(struct intel_engine_cs *engine) · 52 unmodified lines
19491969
19501970 engine->execlists.fw_domains = fw_domains;
19511971
1952− tasklet_init(&engine->execlists.irq_tasklet,
1953− intel_lrc_irq_handler, (unsigned long)engine);
1972+ tasklet_init(&engine->execlists.tasklet,
1973+ execlists_submission_tasklet, (unsigned long)engine);
19541974
19551975 logical_ring_default_vfuncs(engine);
19561976 logical_ring_default_irqs(engine);
@@ -1988,8 +2008,8 @@ int logical_render_ring_init(struct intel_engine_cs *engine) · 31 unmodified lines
19882008 engine->init_hw = gen8_init_render_ring;
19892009 engine->init_context = gen8_init_rcs_context;
19902010 engine->emit_flush = gen8_emit_flush_render;
1991− engine->emit_breadcrumb = gen8_emit_breadcrumb_render;
1992− engine->emit_breadcrumb_sz = gen8_emit_breadcrumb_render_sz;
2011+ engine->emit_breadcrumb = gen8_emit_breadcrumb_rcs;
2012+ engine->emit_breadcrumb_sz = gen8_emit_breadcrumb_rcs_sz;
19932013
19942014 ret = intel_engine_create_scratch(engine, PAGE_SIZE);
19952015 if (ret)
@@ -2106,7 +2126,6 @@ static void execlists_init_reg_state(u32 *regs, · 110 unmodified lines
21062126
21072127 CTX_REG(regs, CTX_CONTEXT_CONTROL, RING_CONTEXT_CONTROL(engine),
21082128 _MASKED_BIT_ENABLE(CTX_CTRL_INHIBIT_SYN_CTX_SWITCH |
2109− CTX_CTRL_ENGINE_CTX_RESTORE_INHIBIT |
21102129 (HAS_RESOURCE_STREAMER(dev_priv) ?
21112130 CTX_CTRL_RS_CTX_ENABLE : 0)));
21122131 CTX_REG(regs, CTX_RING_HEAD, RING_HEAD(base), 0);
@@ -2183,6 +2202,7 @@ populate_lr_context(struct i915_gem_context *ctx, · 70 unmodified lines
21832202 struct intel_ring *ring)
21842203 {
21852204 void *vaddr;
2205+ u32 *regs;
21862206 int ret;
21872207
21882208 ret = i915_gem_object_set_to_cpu_domain(ctx_obj, true);
@@ -2199,11 +2219,31 @@ populate_lr_context(struct i915_gem_context *ctx, · 10 unmodified lines
21992219 }
22002220 ctx_obj->mm.dirty = true;
22012221
2222+ if (engine->default_state) {
2223+ /*
2224+ * We only want to copy over the template context state;
2225+ * skipping over the headers reserved for GuC communication,
2226+ * leaving those as zero.
2227+ */
2228+ const unsigned long start = LRC_HEADER_PAGES * PAGE_SIZE;
2229+ void *defaults;
2230+
2231+ defaults = i915_gem_object_pin_map(engine->default_state,
2232+ I915_MAP_WB);
2233+ if (IS_ERR(defaults))
2234+ return PTR_ERR(defaults);
2235+
2236+ memcpy(vaddr + start, defaults + start, engine->context_size);
2237+ i915_gem_object_unpin_map(engine->default_state);
2238+ }
2239+
22022240 /* The second page of the context object contains some fields which must
22032241 * be set up prior to the first execution. */
2204−
2205− execlists_init_reg_state(vaddr + LRC_STATE_PN * PAGE_SIZE,
2206− ctx, engine, ring);
2242+ regs = vaddr + LRC_STATE_PN * PAGE_SIZE;
2243+ execlists_init_reg_state(regs, ctx, engine, ring);
2244+ if (!engine->default_state)
2245+ regs[CTX_CONTEXT_CONTROL + 1] |=
2246+ _MASKED_BIT_ENABLE(CTX_CTRL_ENGINE_CTX_RESTORE_INHIBIT);
22072247
22082248 i915_gem_object_unpin_map(ctx_obj);
22092249
@@ -2256,7 +2296,6 @@ static int execlists_context_deferred_alloc(struct i915_gem_context *ctx, · 46 unmodified lines
22562296
22572297 ce->ring = ring;
22582298 ce->state = vma;
2259− ce->initialised |= engine->init_context == NULL;
22602299
22612300 return 0;
22622301
drivers/gpu/drm/i915/intel_lrc.h+0−1
@@ -107,7 +107,6 @@ intel_lr_context_descriptor(struct i915_gem_context *ctx, · 106 unmodified lines
107107 return ctx->engine[engine->id].lrc_desc;
108108 }
109109
110−
111110 /* Execlists */
112111 int intel_sanitize_enable_execlists(struct drm_i915_private *dev_priv,
113112 int enable_execlists);
drivers/gpu/drm/i915/intel_lvds.c+2−0
@@ -125,6 +125,8 @@ static void intel_lvds_get_config(struct intel_encoder *encoder, · 124 unmodified lines
125125 struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base);
126126 u32 tmp, flags = 0;
127127
128+ pipe_config->output_types |= BIT(INTEL_OUTPUT_LVDS);
129+
128130 tmp = I915_READ(lvds_encoder->reg);
129131 if (tmp & LVDS_HSYNC_POLARITY)
130132 flags |= DRM_MODE_FLAG_NHSYNC;
drivers/gpu/drm/i915/intel_opregion.c+2−2
@@ -367,7 +367,7 @@ int intel_opregion_notify_encoder(struct intel_encoder *intel_encoder, · 366 unmodified lines
367367 if (intel_encoder->type == INTEL_OUTPUT_DSI)
368368 port = 0;
369369 else
370− port = intel_ddi_get_encoder_port(intel_encoder);
370+ port = intel_encoder->port;
371371
372372 if (port == PORT_E) {
373373 port = 0;
@@ -383,7 +383,7 @@ int intel_opregion_notify_encoder(struct intel_encoder *intel_encoder, · 9 unmodified lines
383383 case INTEL_OUTPUT_ANALOG:
384384 type = DISPLAY_TYPE_CRT;
385385 break;
386− case INTEL_OUTPUT_UNKNOWN:
386+ case INTEL_OUTPUT_DDI:
387387 case INTEL_OUTPUT_DP:
388388 case INTEL_OUTPUT_HDMI:
389389 case INTEL_OUTPUT_DP_MST:
drivers/gpu/drm/i915/intel_pipe_crc.c+2−2
@@ -269,7 +269,7 @@ static int i9xx_pipe_crc_auto_source(struct drm_i915_private *dev_priv, · 268 unmodified lines
269269 case INTEL_OUTPUT_DP:
270270 case INTEL_OUTPUT_EDP:
271271 dig_port = enc_to_dig_port(&encoder->base);
272− switch (dig_port->port) {
272+ switch (dig_port->base.port) {
273273 case PORT_B:
274274 *source = INTEL_PIPE_CRC_SOURCE_DP_B;
275275 break;
@@ -281,7 +281,7 @@ static int i9xx_pipe_crc_auto_source(struct drm_i915_private *dev_priv, · 5 unmodified lines
281281 break;
282282 default:
283283 WARN(1, "nonexisting DP port %c\n",
284− port_name(dig_port->port));
284+ port_name(dig_port->base.port));
285285 break;
286286 }
287287 break;
drivers/gpu/drm/i915/intel_pm.c+63−111
@@ -75,9 +75,6 @@ static void gen9_init_clock_gating(struct drm_i915_private *dev_priv) · 74 unmodified lines
7575 I915_WRITE(CHICKEN_PAR1_1,
7676 I915_READ(CHICKEN_PAR1_1) | SKL_EDP_PSR_FIX_RDWRAP);
7777
78− I915_WRITE(GEN8_CONFIG0,
79− I915_READ(GEN8_CONFIG0) | GEN9_DEFAULT_FIXES);
80−
8178 /* WaEnableChickenDCPR:skl,bxt,kbl,glk,cfl */
8279 I915_WRITE(GEN8_CHICKEN_DCPR_1,
8380 I915_READ(GEN8_CHICKEN_DCPR_1) | MASK_WAKEMEM);
@@ -124,7 +121,6 @@ static void bxt_init_clock_gating(struct drm_i915_private *dev_priv) · 40 unmodified lines
124121
125122 static void glk_init_clock_gating(struct drm_i915_private *dev_priv)
126123 {
127− u32 val;
128124 gen9_init_clock_gating(dev_priv);
129125
130126 /*
@@ -144,11 +140,6 @@ static void glk_init_clock_gating(struct drm_i915_private *dev_priv) · 13 unmodified lines
144140 I915_WRITE(CHICKEN_MISC_2, val);
145141 }
146142
147− /* Display WA #1133: WaFbcSkipSegments:glk */
148− val = I915_READ(ILK_DPFC_CHICKEN);
149− val &= ~GLK_SKIP_SEG_COUNT_MASK;
150− val |= GLK_SKIP_SEG_EN | GLK_SKIP_SEG_COUNT(1);
151− I915_WRITE(ILK_DPFC_CHICKEN, val);
152143 }
153144
154145 static void i915_pineview_get_mem_freq(struct drm_i915_private *dev_priv)
@@ -928,7 +919,7 @@ static void pineview_update_wm(struct intel_crtc *unused_crtc) · 773 unmodified lines
928919 * and the size of 8 whole lines. This adjustment is always performed
929920 * in the actual pixel depth regardless of whether FBC is enabled or not."
930921 */
931−static int g4x_tlb_miss_wa(int fifo_size, int width, int cpp)
922+static unsigned int g4x_tlb_miss_wa(int fifo_size, int width, int cpp)
932923 {
933924 int tlb_miss = fifo_size * 64 - width * cpp * 8;
934925
@@ -1105,8 +1096,8 @@ static uint16_t g4x_compute_wm(const struct intel_crtc_state *crtc_state, · 170 unmodified lines
11051096 struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
11061097 const struct drm_display_mode *adjusted_mode =
11071098 &crtc_state->base.adjusted_mode;
1108− int clock, htotal, cpp, width, wm;
1109− int latency = dev_priv->wm.pri_latency[level] * 10;
1099+ unsigned int latency = dev_priv->wm.pri_latency[level] * 10;
1100+ unsigned int clock, htotal, cpp, width, wm;
11101101
11111102 if (latency == 0)
11121103 return USHRT_MAX;
@@ -1145,7 +1136,7 @@ static uint16_t g4x_compute_wm(const struct intel_crtc_state *crtc_state, · 32 unmodified lines
11451136 level == G4X_WM_LEVEL_NORMAL) {
11461137 wm = intel_wm_method1(clock, cpp, latency);
11471138 } else {
1148− int small, large;
1139+ unsigned int small, large;
11491140
11501141 small = intel_wm_method1(clock, cpp, latency);
11511142 large = intel_wm_method2(clock, htotal, width, cpp, latency);
@@ -1158,7 +1149,7 @@ static uint16_t g4x_compute_wm(const struct intel_crtc_state *crtc_state, · 6 unmodified lines
11581149
11591150 wm = DIV_ROUND_UP(wm, 64) + 2;
11601151
1161− return min_t(int, wm, USHRT_MAX);
1152+ return min_t(unsigned int, wm, USHRT_MAX);
11621153 }
11631154
11641155 static bool g4x_raw_plane_wm_set(struct intel_crtc_state *crtc_state,
@@ -1409,17 +1400,29 @@ static int g4x_compute_pipe_wm(struct intel_crtc_state *crtc_state) · 244 unmodified lines
14091400
14101401 static int g4x_compute_intermediate_wm(struct drm_device *dev,
14111402 struct intel_crtc *crtc,
1412− struct intel_crtc_state *crtc_state)
1403+ struct intel_crtc_state *new_crtc_state)
14131404 {
1414− struct g4x_wm_state *intermediate = &crtc_state->wm.g4x.intermediate;
1415− const struct g4x_wm_state *optimal = &crtc_state->wm.g4x.optimal;
1416− const struct g4x_wm_state *active = &crtc->wm.active.g4x;
1405+ struct g4x_wm_state *intermediate = &new_crtc_state->wm.g4x.intermediate;
1406+ const struct g4x_wm_state *optimal = &new_crtc_state->wm.g4x.optimal;
1407+ struct intel_atomic_state *intel_state =
1408+ to_intel_atomic_state(new_crtc_state->base.state);
1409+ const struct intel_crtc_state *old_crtc_state =
1410+ intel_atomic_get_old_crtc_state(intel_state, crtc);
1411+ const struct g4x_wm_state *active = &old_crtc_state->wm.g4x.optimal;
14171412 enum plane_id plane_id;
14181413
1414+ if (!new_crtc_state->base.active || drm_atomic_crtc_needs_modeset(&new_crtc_state->base)) {
1415+ *intermediate = *optimal;
1416+
1417+ intermediate->cxsr = false;
1418+ intermediate->hpll_en = false;
1419+ goto out;
1420+ }
1421+
14191422 intermediate->cxsr = optimal->cxsr && active->cxsr &&
1420− !crtc_state->disable_cxsr;
1423+ !new_crtc_state->disable_cxsr;
14211424 intermediate->hpll_en = optimal->hpll_en && active->hpll_en &&
1422− !crtc_state->disable_cxsr;
1425+ !new_crtc_state->disable_cxsr;
14231426 intermediate->fbc_en = optimal->fbc_en && active->fbc_en;
14241427
14251428 for_each_plane_id_on_crtc(crtc, plane_id) {
@@ -1461,12 +1464,13 @@ static int g4x_compute_intermediate_wm(struct drm_device *dev, · 35 unmodified lines
14611464 WARN_ON(intermediate->hpll.fbc > g4x_fbc_fifo_size(2) &&
14621465 intermediate->fbc_en && intermediate->hpll_en);
14631466
1467+out:
14641468 /*
14651469 * If our intermediate WM are identical to the final WM, then we can
14661470 * omit the post-vblank programming; only update if it's different.
14671471 */
14681472 if (memcmp(intermediate, optimal, sizeof(*intermediate)) != 0)
1469− crtc_state->wm.need_postvbl_update = true;
1473+ new_crtc_state->wm.need_postvbl_update = true;
14701474
14711475 return 0;
14721476 }
@@ -1602,7 +1606,7 @@ static uint16_t vlv_compute_wm_level(const struct intel_crtc_state *crtc_state, · 129 unmodified lines
16021606 struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
16031607 const struct drm_display_mode *adjusted_mode =
16041608 &crtc_state->base.adjusted_mode;
1605− int clock, htotal, cpp, width, wm;
1609+ unsigned int clock, htotal, cpp, width, wm;
16061610
16071611 if (dev_priv->wm.pri_latency[level] == 0)
16081612 return USHRT_MAX;
@@ -1628,7 +1632,7 @@ static uint16_t vlv_compute_wm_level(const struct intel_crtc_state *crtc_state, · 19 unmodified lines
16281632 dev_priv->wm.pri_latency[level] * 10);
16291633 }
16301634
1631− return min_t(int, wm, USHRT_MAX);
1635+ return min_t(unsigned int, wm, USHRT_MAX);
16321636 }
16331637
16341638 static bool vlv_need_sprite0_fifo_workaround(unsigned int active_planes)
@@ -2029,16 +2033,27 @@ static void vlv_atomic_update_fifo(struct intel_atomic_state *state, · 394 unmodified lines
20292033
20302034 static int vlv_compute_intermediate_wm(struct drm_device *dev,
20312035 struct intel_crtc *crtc,
2032− struct intel_crtc_state *crtc_state)
2036+ struct intel_crtc_state *new_crtc_state)
20332037 {
2034− struct vlv_wm_state *intermediate = &crtc_state->wm.vlv.intermediate;
2035− const struct vlv_wm_state *optimal = &crtc_state->wm.vlv.optimal;
2036− const struct vlv_wm_state *active = &crtc->wm.active.vlv;
2038+ struct vlv_wm_state *intermediate = &new_crtc_state->wm.vlv.intermediate;
2039+ const struct vlv_wm_state *optimal = &new_crtc_state->wm.vlv.optimal;
2040+ struct intel_atomic_state *intel_state =
2041+ to_intel_atomic_state(new_crtc_state->base.state);
2042+ const struct intel_crtc_state *old_crtc_state =
2043+ intel_atomic_get_old_crtc_state(intel_state, crtc);
2044+ const struct vlv_wm_state *active = &old_crtc_state->wm.vlv.optimal;
20372045 int level;
20382046
2047+ if (!new_crtc_state->base.active || drm_atomic_crtc_needs_modeset(&new_crtc_state->base)) {
2048+ *intermediate = *optimal;
2049+
2050+ intermediate->cxsr = false;
2051+ goto out;
2052+ }
2053+
20392054 intermediate->num_levels = min(optimal->num_levels, active->num_levels);
20402055 intermediate->cxsr = optimal->cxsr && active->cxsr &&
2041− !crtc_state->disable_cxsr;
2056+ !new_crtc_state->disable_cxsr;
20422057
20432058 for (level = 0; level < intermediate->num_levels; level++) {
20442059 enum plane_id plane_id;
@@ -2057,12 +2072,13 @@ static int vlv_compute_intermediate_wm(struct drm_device *dev, · 12 unmodified lines
20572072
20582073 vlv_invalidate_wms(crtc, intermediate, level);
20592074
2075+out:
20602076 /*
20612077 * If our intermediate WM are identical to the final WM, then we can
20622078 * omit the post-vblank programming; only update if it's different.
20632079 */
20642080 if (memcmp(intermediate, optimal, sizeof(*intermediate)) != 0)
2065− crtc_state->wm.need_postvbl_update = true;
2081+ new_crtc_state->wm.need_postvbl_update = true;
20662082
20672083 return 0;
20682084 }
@@ -3930,6 +3946,7 @@ skl_pipe_downscale_amount(const struct intel_crtc_state *crtc_state) · 1861 unmodified lines
39303946 int skl_check_pipe_max_pixel_rate(struct intel_crtc *intel_crtc,
39313947 struct intel_crtc_state *cstate)
39323948 {
3949+ struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev);
39333950 struct drm_crtc_state *crtc_state = &cstate->base;
39343951 struct drm_atomic_state *state = crtc_state->state;
39353952 struct drm_plane *plane;
@@ -3972,7 +3989,7 @@ int skl_check_pipe_max_pixel_rate(struct intel_crtc *intel_crtc, · 36 unmodified lines
39723989 crtc_clock = crtc_state->adjusted_mode.crtc_clock;
39733990 dotclk = to_intel_atomic_state(state)->cdclk.logical.cdclk;
39743991
3975− if (IS_GEMINILAKE(to_i915(intel_crtc->base.dev)))
3992+ if (IS_GEMINILAKE(dev_priv) || INTEL_GEN(dev_priv) >= 10)
39763993 dotclk *= 2;
39773994
39783995 pipe_max_pixel_rate = div_round_up_u32_fixed16(dotclk, pipe_downscale);
@@ -6620,12 +6637,19 @@ static void gen9_enable_rc6(struct drm_i915_private *dev_priv) · 2641 unmodified lines
66206637 I915_WRITE(GEN6_RC_CONTROL, 0);
66216638
66226639 /* 2b: Program RC6 thresholds.*/
6623−
6624− /* WaRsDoubleRc6WrlWithCoarsePowerGating: Doubling WRL only when CPG is enabled */
6625− if (IS_SKYLAKE(dev_priv))
6640+ if (INTEL_GEN(dev_priv) >= 10) {
6641+ I915_WRITE(GEN6_RC6_WAKE_RATE_LIMIT, 54 << 16 | 85);
6642+ I915_WRITE(GEN10_MEDIA_WAKE_RATE_LIMIT, 150);
6643+ } else if (IS_SKYLAKE(dev_priv)) {
6644+ /*
6645+ * WaRsDoubleRc6WrlWithCoarsePowerGating:skl Doubling WRL only
6646+ * when CPG is enabled
6647+ */
66266648 I915_WRITE(GEN6_RC6_WAKE_RATE_LIMIT, 108 << 16);
6627− else
6649+ } else {
66286650 I915_WRITE(GEN6_RC6_WAKE_RATE_LIMIT, 54 << 16);
6651+ }
6652+
66296653 I915_WRITE(GEN6_RC_EVALUATION_INTERVAL, 125000); /* 12500 * 1280ns */
66306654 I915_WRITE(GEN6_RC_IDLE_HYSTERSIS, 25); /* 25 * 1280ns */
66316655 for_each_engine(engine, dev_priv, id)
@@ -7910,7 +7934,6 @@ void intel_init_gt_powersave(struct drm_i915_private *dev_priv) · 1278 unmodified lines
79107934 intel_runtime_pm_get(dev_priv);
79117935 }
79127936
7913− mutex_lock(&dev_priv->drm.struct_mutex);
79147937 mutex_lock(&dev_priv->pcu_lock);
79157938
79167939 /* Initialize RPS limits (for userspace) */
@@ -7952,9 +7975,6 @@ void intel_init_gt_powersave(struct drm_i915_private *dev_priv) · 35 unmodified lines
79527975 rps->boost_freq = rps->max_freq;
79537976
79547977 mutex_unlock(&dev_priv->pcu_lock);
7955− mutex_unlock(&dev_priv->drm.struct_mutex);
7956−
7957− intel_autoenable_gt_powersave(dev_priv);
79587978 }
79597979
79607980 void intel_cleanup_gt_powersave(struct drm_i915_private *dev_priv)
@@ -7979,9 +7999,6 @@ void intel_suspend_gt_powersave(struct drm_i915_private *dev_priv) · 18 unmodified lines
79797999 if (INTEL_GEN(dev_priv) < 6)
79808000 return;
79818001
7982− if (cancel_delayed_work_sync(&dev_priv->gt_pm.autoenable_work))
7983− intel_runtime_pm_put(dev_priv);
7984−
79858002 /* gen6_rps_idle() will be called later to disable interrupts */
79868003 }
79878004
@@ -8140,65 +8157,6 @@ void intel_enable_gt_powersave(struct drm_i915_private *dev_priv) · 152 unmodified lines
81408157 mutex_unlock(&dev_priv->pcu_lock);
81418158 }
81428159
8143−static void __intel_autoenable_gt_powersave(struct work_struct *work)
8144−{
8145− struct drm_i915_private *dev_priv =
8146− container_of(work,
8147− typeof(*dev_priv),
8148− gt_pm.autoenable_work.work);
8149− struct intel_engine_cs *rcs;
8150− struct drm_i915_gem_request *req;
8151−
8152− rcs = dev_priv->engine[RCS];
8153− if (rcs->last_retired_context)
8154− goto out;
8155−
8156− if (!rcs->init_context)
8157− goto out;
8158−
8159− mutex_lock(&dev_priv->drm.struct_mutex);
8160−
8161− req = i915_gem_request_alloc(rcs, dev_priv->kernel_context);
8162− if (IS_ERR(req))
8163− goto unlock;
8164−
8165− if (!i915_modparams.enable_execlists && i915_switch_context(req) == 0)
8166− rcs->init_context(req);
8167−
8168− /* Mark the device busy, calling intel_enable_gt_powersave() */
8169− i915_add_request(req);
8170−
8171−unlock:
8172− mutex_unlock(&dev_priv->drm.struct_mutex);
8173−out:
8174− intel_runtime_pm_put(dev_priv);
8175−}
8176−
8177−void intel_autoenable_gt_powersave(struct drm_i915_private *dev_priv)
8178−{
8179− if (IS_IRONLAKE_M(dev_priv)) {
8180− ironlake_enable_drps(dev_priv);
8181− intel_init_emon(dev_priv);
8182− } else if (INTEL_INFO(dev_priv)->gen >= 6) {
8183− /*
8184− * PCU communication is slow and this doesn't need to be
8185− * done at any specific time, so do this out of our fast path
8186− * to make resume and init faster.
8187− *
8188− * We depend on the HW RC6 power context save/restore
8189− * mechanism when entering D3 through runtime PM suspend. So
8190− * disable RPM until RPS/RC6 is properly setup. We can only
8191− * get here via the driver load/system resume/runtime resume
8192− * paths, so the _noresume version is enough (and in case of
8193− * runtime resume it's necessary).
8194− */
8195− if (queue_delayed_work(dev_priv->wq,
8196− &dev_priv->gt_pm.autoenable_work,
8197− round_jiffies_up_relative(HZ)))
8198− intel_runtime_pm_get_noresume(dev_priv);
8199− }
8200−}
8201−
82028160 static void ibx_init_clock_gating(struct drm_i915_private *dev_priv)
82038161 {
82048162 /*
@@ -8532,17 +8490,13 @@ static void cnl_init_clock_gating(struct drm_i915_private *dev_priv) · 327 unmodified lines
85328490 I915_WRITE(DISP_ARB_CTL, I915_READ(DISP_ARB_CTL) |
85338491 DISP_FBC_MEMORY_WAKE);
85348492
8493+ val = I915_READ(SLICE_UNIT_LEVEL_CLKGATE);
8494+ /* ReadHitWriteOnlyDisable:cnl */
8495+ val |= RCCUNIT_CLKGATE_DIS;
85358496 /* WaSarbUnitClockGatingDisable:cnl (pre-prod) */
85368497 if (IS_CNL_REVID(dev_priv, CNL_REVID_A0, CNL_REVID_B0))
8537− I915_WRITE(SLICE_UNIT_LEVEL_CLKGATE,
8538− I915_READ(SLICE_UNIT_LEVEL_CLKGATE) |
8539− SARBUNIT_CLKGATE_DIS);
8540−
8541− /* Display WA #1133: WaFbcSkipSegments:cnl */
8542− val = I915_READ(ILK_DPFC_CHICKEN);
8543− val &= ~GLK_SKIP_SEG_COUNT_MASK;
8544− val |= GLK_SKIP_SEG_EN | GLK_SKIP_SEG_COUNT(1);
8545− I915_WRITE(ILK_DPFC_CHICKEN, val);
8498+ val |= SARBUNIT_CLKGATE_DIS;
8499+ I915_WRITE(SLICE_UNIT_LEVEL_CLKGATE, val);
85468500 }
85478501
85488502 static void cfl_init_clock_gating(struct drm_i915_private *dev_priv)
@@ -9429,8 +9383,6 @@ void intel_pm_setup(struct drm_i915_private *dev_priv) · 880 unmodified lines
94299383 {
94309384 mutex_init(&dev_priv->pcu_lock);
94319385
9432− INIT_DELAYED_WORK(&dev_priv->gt_pm.autoenable_work,
9433− __intel_autoenable_gt_powersave);
94349386 atomic_set(&dev_priv->gt_pm.rps.num_waiters, 0);
94359387
94369388 dev_priv->runtime_pm.suspended = false;
drivers/gpu/drm/i915/intel_psr.c+2−2
@@ -163,7 +163,7 @@ static void hsw_psr_enable_sink(struct intel_dp *intel_dp) · 162 unmodified lines
163163 [3] = 1 - 1,
164164 [4] = DP_SET_POWER_D0,
165165 };
166− enum port port = dig_port->port;
166+ enum port port = dig_port->base.port;
167167 u32 aux_ctl;
168168 int i;
169169
@@ -376,7 +376,7 @@ void intel_psr_compute_config(struct intel_dp *intel_dp, · 206 unmodified lines
376376 * ones. Since by Display design transcoder EDP is tied to port A
377377 * we can safely escape based on the port A.
378378 */
379− if (HAS_DDI(dev_priv) && dig_port->port != PORT_A) {
379+ if (HAS_DDI(dev_priv) && dig_port->base.port != PORT_A) {
380380 DRM_DEBUG_KMS("PSR condition failed: Port not supported\n");
381381 return;
382382 }
drivers/gpu/drm/i915/intel_ringbuffer.c+85−38
@@ -28,9 +28,12 @@ · 27 unmodified lines
2828 */
2929
3030 #include <linux/log2.h>
31+
3132 #include <drm/drmP.h>
32−#include "i915_drv.h"
3333 #include <drm/i915_drm.h>
34+
35+#include "i915_drv.h"
36+#include "i915_gem_render_state.h"
3437 #include "i915_trace.h"
3538 #include "intel_drv.h"
3639
@@ -480,10 +483,14 @@ static bool stop_ring(struct intel_engine_cs *engine) · 443 unmodified lines
480483 }
481484 }
482485
483− I915_WRITE_CTL(engine, 0);
486+ I915_WRITE_HEAD(engine, I915_READ_TAIL(engine));
487+
484488 I915_WRITE_HEAD(engine, 0);
485489 I915_WRITE_TAIL(engine, 0);
486490
491+ /* The ring must be empty before it is disabled */
492+ I915_WRITE_CTL(engine, 0);
493+
487494 return (I915_READ_HEAD(engine) & HEAD_ADDR) == 0;
488495 }
489496
@@ -1359,12 +1366,13 @@ static int context_pin(struct i915_gem_context *ctx) · 869 unmodified lines
13591366 struct i915_vma *vma = ctx->engine[RCS].state;
13601367 int ret;
13611368
1362− /* Clear this page out of any CPU caches for coherent swap-in/out.
1369+ /*
1370+ * Clear this page out of any CPU caches for coherent swap-in/out.
13631371 * We only want to do this on the first bind so that we do not stall
13641372 * on an active context (which by nature is already on the GPU).
13651373 */
13661374 if (!(vma->flags & I915_VMA_GLOBAL_BIND)) {
1367− ret = i915_gem_object_set_to_gtt_domain(vma->obj, false);
1375+ ret = i915_gem_object_set_to_gtt_domain(vma->obj, true);
13681376 if (ret)
13691377 return ret;
13701378 }
@@ -1379,11 +1387,34 @@ alloc_context_vma(struct intel_engine_cs *engine) · 8 unmodified lines
13791387 struct drm_i915_private *i915 = engine->i915;
13801388 struct drm_i915_gem_object *obj;
13811389 struct i915_vma *vma;
1390+ int err;
13821391
13831392 obj = i915_gem_object_create(i915, engine->context_size);
13841393 if (IS_ERR(obj))
13851394 return ERR_CAST(obj);
13861395
1396+ if (engine->default_state) {
1397+ void *defaults, *vaddr;
1398+
1399+ vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
1400+ if (IS_ERR(vaddr)) {
1401+ err = PTR_ERR(vaddr);
1402+ goto err_obj;
1403+ }
1404+
1405+ defaults = i915_gem_object_pin_map(engine->default_state,
1406+ I915_MAP_WB);
1407+ if (IS_ERR(defaults)) {
1408+ err = PTR_ERR(defaults);
1409+ goto err_map;
1410+ }
1411+
1412+ memcpy(vaddr, defaults, engine->context_size);
1413+
1414+ i915_gem_object_unpin_map(engine->default_state);
1415+ i915_gem_object_unpin_map(obj);
1416+ }
1417+
13871418 /*
13881419 * Try to make the context utilize L3 as well as LLC.
13891420 *
@@ -1405,10 +1436,18 @@ alloc_context_vma(struct intel_engine_cs *engine) · 15 unmodified lines
14051436 }
14061437
14071438 vma = i915_vma_instance(obj, &i915->ggtt.base, NULL);
1408− if (IS_ERR(vma))
1409− i915_gem_object_put(obj);
1439+ if (IS_ERR(vma)) {
1440+ err = PTR_ERR(vma);
1441+ goto err_obj;
1442+ }
14101443
14111444 return vma;
1445+
1446+err_map:
1447+ i915_gem_object_unpin_map(obj);
1448+err_obj:
1449+ i915_gem_object_put(obj);
1450+ return ERR_PTR(err);
14121451 }
14131452
14141453 static struct intel_ring *
@@ -1441,20 +1480,9 @@ intel_ring_context_pin(struct intel_engine_cs *engine, · 26 unmodified lines
14411480 if (ret)
14421481 goto err;
14431482
1444− ce->state->obj->mm.dirty = true;
14451483 ce->state->obj->pin_global++;
14461484 }
14471485
1448− /* The kernel context is only used as a placeholder for flushing the
1449− * active context. It is never used for submitting user rendering and
1450− * as such never requires the golden render context, and so we can skip
1451− * emitting it when we switch to the kernel context. This is required
1452− * as during eviction we cannot allocate and pin the renderstate in
1453− * order to initialise the context.
1454− */
1455− if (i915_gem_context_is_kernel(ctx))
1456− ce->initialised = true;
1457−
14581486 i915_gem_context_get(ctx);
14591487
14601488 out:
@@ -1550,7 +1578,7 @@ void intel_legacy_submission_resume(struct drm_i915_private *dev_priv) · 89 unmodified lines
15501578
15511579 static int ring_request_alloc(struct drm_i915_gem_request *request)
15521580 {
1553− u32 *cs;
1581+ int ret;
15541582
15551583 GEM_BUG_ON(!request->ctx->engine[request->engine->id].pin_count);
15561584
@@ -1560,37 +1588,24 @@ static int ring_request_alloc(struct drm_i915_gem_request *request) · 3 unmodified lines
15601588 */
15611589 request->reserved_space += LEGACY_REQUEST_SIZE;
15621590
1563− cs = intel_ring_begin(request, 0);
1564− if (IS_ERR(cs))
1565− return PTR_ERR(cs);
1591+ ret = intel_ring_wait_for_space(request->ring, request->reserved_space);
1592+ if (ret)
1593+ return ret;
15661594
15671595 request->reserved_space -= LEGACY_REQUEST_SIZE;
15681596 return 0;
15691597 }
15701598
1571−static noinline int wait_for_space(struct drm_i915_gem_request *req,
1572− unsigned int bytes)
1599+static noinline int wait_for_space(struct intel_ring *ring, unsigned int bytes)
15731600 {
1574− struct intel_ring *ring = req->ring;
15751601 struct drm_i915_gem_request *target;
15761602 long timeout;
15771603
1578− lockdep_assert_held(&req->i915->drm.struct_mutex);
1604+ lockdep_assert_held(&ring->vma->vm->i915->drm.struct_mutex);
15791605
15801606 if (intel_ring_update_space(ring) >= bytes)
15811607 return 0;
15821608
1583− /*
1584− * Space is reserved in the ringbuffer for finalising the request,
1585− * as that cannot be allowed to fail. During request finalisation,
1586− * reserved_space is set to 0 to stop the overallocation and the
1587− * assumption is that then we never need to wait (which has the
1588− * risk of failing with EINTR).
1589− *
1590− * See also i915_gem_request_alloc() and i915_add_request().
1591− */
1592− GEM_BUG_ON(!req->reserved_space);
1593−
15941609 list_for_each_entry(target, &ring->request_list, ring_link) {
15951610 /* Would completion of this request free enough space? */
15961611 if (bytes <= __intel_ring_space(target->postfix,
@@ -1614,6 +1629,22 @@ static noinline int wait_for_space(struct drm_i915_gem_request *req, · 17 unmodified lines
16141629 return 0;
16151630 }
16161631
1632+int intel_ring_wait_for_space(struct intel_ring *ring, unsigned int bytes)
1633+{
1634+ GEM_BUG_ON(bytes > ring->effective_size);
1635+ if (unlikely(bytes > ring->effective_size - ring->emit))
1636+ bytes += ring->size - ring->emit;
1637+
1638+ if (unlikely(bytes > ring->space)) {
1639+ int ret = wait_for_space(ring, bytes);
1640+ if (unlikely(ret))
1641+ return ret;
1642+ }
1643+
1644+ GEM_BUG_ON(ring->space < bytes);
1645+ return 0;
1646+}
1647+
16171648 u32 *intel_ring_begin(struct drm_i915_gem_request *req,
16181649 unsigned int num_dwords)
16191650 {
@@ -1653,7 +1684,20 @@ u32 *intel_ring_begin(struct drm_i915_gem_request *req, · 33 unmodified lines
16531684 }
16541685
16551686 if (unlikely(total_bytes > ring->space)) {
1656− int ret = wait_for_space(req, total_bytes);
1687+ int ret;
1688+
1689+ /*
1690+ * Space is reserved in the ringbuffer for finalising the
1691+ * request, as that cannot be allowed to fail. During request
1692+ * finalisation, reserved_space is set to 0 to stop the
1693+ * overallocation and the assumption is that then we never need
1694+ * to wait (which has the risk of failing with EINTR).
1695+ *
1696+ * See also i915_gem_request_alloc() and i915_add_request().
1697+ */
1698+ GEM_BUG_ON(!req->reserved_space);
1699+
1700+ ret = wait_for_space(ring, total_bytes);
16571701 if (unlikely(ret))
16581702 return ERR_PTR(ret);
16591703 }
@@ -2028,12 +2072,15 @@ static void i9xx_set_default_submission(struct intel_engine_cs *engine) · 368 unmodified lines
20282072 {
20292073 engine->submit_request = i9xx_submit_request;
20302074 engine->cancel_requests = cancel_requests;
2075+
2076+ engine->park = NULL;
2077+ engine->unpark = NULL;
20312078 }
20322079
20332080 static void gen6_bsd_set_default_submission(struct intel_engine_cs *engine)
20342081 {
2082+ i9xx_set_default_submission(engine);
20352083 engine->submit_request = gen6_bsd_submit_request;
2036− engine->cancel_requests = cancel_requests;
20372084 }
20382085
20392086 static void intel_ring_default_vfuncs(struct drm_i915_private *dev_priv,
drivers/gpu/drm/i915/intel_ringbuffer.h+72−7
@@ -166,7 +166,6 @@ struct i915_ctx_workarounds { · 165 unmodified lines
166166 };
167167
168168 struct drm_i915_gem_request;
169−struct intel_render_state;
170169
171170 /*
172171 * Engine IDs definitions.
@@ -195,9 +194,9 @@ struct i915_priolist { · 22 unmodified lines
195194 */
196195 struct intel_engine_execlists {
197196 /**
198− * @irq_tasklet: softirq tasklet for bottom handler
197+ * @tasklet: softirq tasklet for bottom handler
199198 */
200− struct tasklet_struct irq_tasklet;
199+ struct tasklet_struct tasklet;
201200
202201 /**
203202 * @default_priolist: priority list for I915_PRIORITY_NORMAL
@@ -290,11 +289,14 @@ struct intel_engine_execlists { · 86 unmodified lines
290289 struct intel_engine_cs {
291290 struct drm_i915_private *i915;
292291 char name[INTEL_ENGINE_CS_MAX_NAME];
292+
293293 enum intel_engine_id id;
294− unsigned int uabi_id;
295294 unsigned int hw_id;
296295 unsigned int guc_id;
297296
297+ u8 uabi_id;
298+ u8 uabi_class;
299+
298300 u8 class;
299301 u8 instance;
300302 u32 context_size;
@@ -304,7 +306,7 @@ struct intel_engine_cs { · 3 unmodified lines
304306 struct intel_ring *buffer;
305307 struct intel_timeline *timeline;
306308
307− struct intel_render_state *render_state;
309+ struct drm_i915_gem_object *default_state;
308310
309311 atomic_t irq_count;
310312 unsigned long irq_posted;
@@ -340,9 +342,9 @@ struct intel_engine_cs { · 29 unmodified lines
340342 struct timer_list hangcheck; /* detect missed interrupts */
341343
342344 unsigned int hangcheck_interrupts;
345+ unsigned int irq_enabled;
343346
344347 bool irq_armed : 1;
345− bool irq_enabled : 1;
346348 I915_SELFTEST_DECLARE(bool mock : 1);
347349 } breadcrumbs;
348350
@@ -366,6 +368,9 @@ struct intel_engine_cs { · 17 unmodified lines
366368 void (*reset_hw)(struct intel_engine_cs *engine,
367369 struct drm_i915_gem_request *req);
368370
371+ void (*park)(struct intel_engine_cs *engine);
372+ void (*unpark)(struct intel_engine_cs *engine);
373+
369374 void (*set_default_submission)(struct intel_engine_cs *engine);
370375
371376 struct intel_ring *(*context_pin)(struct intel_engine_cs *engine,
@@ -555,6 +560,12 @@ execlists_is_active(const struct intel_engine_execlists *execlists, · 183 unmodified lines
555560 return test_bit(bit, (unsigned long *)&execlists->active);
556561 }
557562
563+void
564+execlists_cancel_port_requests(struct intel_engine_execlists * const execlists);
565+
566+void
567+execlists_unwind_incomplete_requests(struct intel_engine_execlists *execlists);
568+
558569 static inline unsigned int
559570 execlists_num_ports(const struct intel_engine_execlists * const execlists)
560571 {
@@ -624,6 +635,8 @@ intel_write_status_page(struct intel_engine_cs *engine, int reg, u32 value) · 63 unmodified lines
624635 */
625636 #define I915_GEM_HWS_INDEX 0x30
626637 #define I915_GEM_HWS_INDEX_ADDR (I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT)
638+#define I915_GEM_HWS_PREEMPT_INDEX 0x32
639+#define I915_GEM_HWS_PREEMPT_ADDR (I915_GEM_HWS_PREEMPT_INDEX << MI_STORE_DWORD_INDEX_SHIFT)
627640 #define I915_GEM_HWS_SCRATCH_INDEX 0x40
628641 #define I915_GEM_HWS_SCRATCH_ADDR (I915_GEM_HWS_SCRATCH_INDEX << MI_STORE_DWORD_INDEX_SHIFT)
629642
@@ -648,6 +661,7 @@ void intel_legacy_submission_resume(struct drm_i915_private *dev_priv); · 18 unmodified lines
648661
649662 int __must_check intel_ring_cacheline_align(struct drm_i915_gem_request *req);
650663
664+int intel_ring_wait_for_space(struct intel_ring *ring, unsigned int bytes);
651665 u32 __must_check *intel_ring_begin(struct drm_i915_gem_request *req,
652666 unsigned int n);
653667
@@ -776,6 +790,11 @@ static inline u32 intel_hws_seqno_address(struct intel_engine_cs *engine) · 122 unmodified lines
776790 return engine->status_page.ggtt_offset + I915_GEM_HWS_INDEX_ADDR;
777791 }
778792
793+static inline u32 intel_hws_preempt_done_address(struct intel_engine_cs *engine)
794+{
795+ return engine->status_page.ggtt_offset + I915_GEM_HWS_PREEMPT_ADDR;
796+}
797+
779798 /* intel_breadcrumbs.c -- user interrupt bottom-half for waiters */
780799 int intel_engine_init_breadcrumbs(struct intel_engine_cs *engine);
781800
@@ -846,6 +865,9 @@ unsigned int intel_engine_wakeup(struct intel_engine_cs *engine); · 64 unmodified lines
846865 #define ENGINE_WAKEUP_WAITER BIT(0)
847866 #define ENGINE_WAKEUP_ASLEEP BIT(1)
848867
868+void intel_engine_pin_breadcrumbs_irq(struct intel_engine_cs *engine);
869+void intel_engine_unpin_breadcrumbs_irq(struct intel_engine_cs *engine);
870+
849871 void __intel_engine_disarm_breadcrumbs(struct intel_engine_cs *engine);
850872 void intel_engine_disarm_breadcrumbs(struct intel_engine_cs *engine);
851873
@@ -864,11 +886,54 @@ static inline u32 *gen8_emit_pipe_control(u32 *batch, u32 flags, u32 offset) · 12 unmodified lines
864886 return batch + 6;
865887 }
866888
889+static inline u32 *
890+gen8_emit_ggtt_write_rcs(u32 *cs, u32 value, u32 gtt_offset)
891+{
892+ /* We're using qword write, offset should be aligned to 8 bytes. */
893+ GEM_BUG_ON(!IS_ALIGNED(gtt_offset, 8));
894+
895+ /* w/a for post sync ops following a GPGPU operation we
896+ * need a prior CS_STALL, which is emitted by the flush
897+ * following the batch.
898+ */
899+ *cs++ = GFX_OP_PIPE_CONTROL(6);
900+ *cs++ = PIPE_CONTROL_GLOBAL_GTT_IVB | PIPE_CONTROL_CS_STALL |
901+ PIPE_CONTROL_QW_WRITE;
902+ *cs++ = gtt_offset;
903+ *cs++ = 0;
904+ *cs++ = value;
905+ /* We're thrashing one dword of HWS. */
906+ *cs++ = 0;
907+
908+ return cs;
909+}
910+
911+static inline u32 *
912+gen8_emit_ggtt_write(u32 *cs, u32 value, u32 gtt_offset)
913+{
914+ /* w/a: bit 5 needs to be zero for MI_FLUSH_DW address. */
915+ GEM_BUG_ON(gtt_offset & (1 << 5));
916+ /* Offset should be aligned to 8 bytes for both (QW/DW) write types */
917+ GEM_BUG_ON(!IS_ALIGNED(gtt_offset, 8));
918+
919+ *cs++ = (MI_FLUSH_DW + 1) | MI_FLUSH_DW_OP_STOREDW;
920+ *cs++ = gtt_offset | MI_FLUSH_DW_USE_GTT;
921+ *cs++ = 0;
922+ *cs++ = value;
923+
924+ return cs;
925+}
926+
867927 bool intel_engine_is_idle(struct intel_engine_cs *engine);
868928 bool intel_engines_are_idle(struct drm_i915_private *dev_priv);
869929
870−void intel_engines_mark_idle(struct drm_i915_private *i915);
930+bool intel_engine_has_kernel_context(const struct intel_engine_cs *engine);
931+
932+void intel_engines_park(struct drm_i915_private *i915);
933+void intel_engines_unpark(struct drm_i915_private *i915);
934+
871935 void intel_engines_reset_default_submission(struct drm_i915_private *i915);
936+unsigned int intel_engines_has_context_isolation(struct drm_i915_private *i915);
872937
873938 bool intel_engine_can_store_dword(struct intel_engine_cs *engine);
874939
drivers/gpu/drm/i915/intel_runtime_pm.c+2−1
@@ -705,7 +705,8 @@ static void gen9_dc_off_power_well_enable(struct drm_i915_private *dev_priv, · 704 unmodified lines
705705 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
706706
707707 dev_priv->display.get_cdclk(dev_priv, &cdclk_state);
708− WARN_ON(!intel_cdclk_state_compare(&dev_priv->cdclk.hw, &cdclk_state));
708+ /* Can't read out voltage_level so can't use intel_cdclk_changed() */
709+ WARN_ON(intel_cdclk_needs_modeset(&dev_priv->cdclk.hw, &cdclk_state));
709710
710711 gen9_assert_dbuf_enabled(dev_priv);
711712
drivers/gpu/drm/i915/intel_sdvo.c+4−2
@@ -1429,6 +1429,8 @@ static void intel_sdvo_get_config(struct intel_encoder *encoder, · 1428 unmodified lines
14291429 u8 val;
14301430 bool ret;
14311431
1432+ pipe_config->output_types |= BIT(INTEL_OUTPUT_SDVO);
1433+
14321434 sdvox = I915_READ(intel_sdvo->sdvo_reg);
14331435
14341436 ret = intel_sdvo_get_input_timing(intel_sdvo, &dtd);
@@ -1510,7 +1512,7 @@ static void intel_disable_sdvo(struct intel_encoder *encoder, · 75 unmodified lines
15101512 {
15111513 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
15121514 struct intel_sdvo *intel_sdvo = to_sdvo(encoder);
1513− struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
1515+ struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->base.crtc);
15141516 u32 temp;
15151517
15161518 intel_sdvo_set_active_outputs(intel_sdvo, 0);
@@ -1569,7 +1571,7 @@ static void intel_enable_sdvo(struct intel_encoder *encoder, · 52 unmodified lines
15691571 struct drm_device *dev = encoder->base.dev;
15701572 struct drm_i915_private *dev_priv = to_i915(dev);
15711573 struct intel_sdvo *intel_sdvo = to_sdvo(encoder);
1572− struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
1574+ struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->base.crtc);
15731575 u32 temp;
15741576 bool input1, input2;
15751577 int i;
drivers/gpu/drm/i915/intel_sprite.c+5−6
@@ -263,13 +263,9 @@ skl_update_plane(struct intel_plane *plane, · 262 unmodified lines
263263
264264 spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
265265
266− if (IS_GEMINILAKE(dev_priv) || IS_CANNONLAKE(dev_priv)) {
266+ if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
267267 I915_WRITE_FW(PLANE_COLOR_CTL(pipe, plane_id),
268− PLANE_COLOR_PIPE_GAMMA_ENABLE |
269− PLANE_COLOR_PIPE_CSC_ENABLE |
270− PLANE_COLOR_PLANE_GAMMA_DISABLE);
271− }
272−
268+ plane_state->color_ctl);
273269 if (key->flags) {
274270 I915_WRITE_FW(PLANE_KEYVAL(pipe, plane_id), key->min_value);
275271 I915_WRITE_FW(PLANE_KEYMAX(pipe, plane_id), key->max_value);
@@ -978,6 +974,9 @@ intel_check_sprite_plane(struct intel_plane *plane, · 702 unmodified lines
978974 state->ctl = g4x_sprite_ctl(crtc_state, state);
979975 }
980976
977+ if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
978+ state->color_ctl = glk_plane_color_ctl(crtc_state, state);
979+
981980 return 0;
982981 }
983982
drivers/gpu/drm/i915/intel_tv.c+4−2
@@ -822,7 +822,7 @@ intel_enable_tv(struct intel_encoder *encoder, · 821 unmodified lines
822822
823823 /* Prevents vblank waits from timing out in intel_tv_detect_type() */
824824 intel_wait_for_vblank(dev_priv,
825− to_intel_crtc(encoder->base.crtc)->pipe);
825+ to_intel_crtc(pipe_config->base.crtc)->pipe);
826826
827827 I915_WRITE(TV_CTL, I915_READ(TV_CTL) | TV_ENC_ENABLE);
828828 }
@@ -868,6 +868,8 @@ static void · 39 unmodified lines
868868 intel_tv_get_config(struct intel_encoder *encoder,
869869 struct intel_crtc_state *pipe_config)
870870 {
871+ pipe_config->output_types |= BIT(INTEL_OUTPUT_TVOUT);
872+
871873 pipe_config->base.adjusted_mode.crtc_clock = pipe_config->port_clock;
872874 }
873875
@@ -980,7 +982,7 @@ static void intel_tv_pre_enable(struct intel_encoder *encoder, · 106 unmodified lines
980982 const struct drm_connector_state *conn_state)
981983 {
982984 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
983− struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
985+ struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->base.crtc);
984986 struct intel_tv *intel_tv = enc_to_tv(encoder);
985987 const struct tv_mode *tv_mode = intel_tv_mode_find(conn_state);
986988 u32 tv_ctl;
drivers/gpu/drm/i915/intel_uc.c+12−10
@@ -23,8 +23,8 @@ · 22 unmodified lines
2323 */
2424
2525 #include "intel_uc.h"
26+#include "intel_guc_submission.h"
2627 #include "i915_drv.h"
27−#include "i915_guc_submission.h"
2828
2929 /* Reset GuC providing us with fresh state for both GuC and HuC.
3030 */
@@ -33,9 +33,9 @@ static int __intel_uc_reset_hw(struct drm_i915_private *dev_priv) · 2 unmodified lines
3333 int ret;
3434 u32 guc_status;
3535
36− ret = intel_guc_reset(dev_priv);
36+ ret = intel_reset_guc(dev_priv);
3737 if (ret) {
38− DRM_ERROR("GuC reset failed, ret = %d\n", ret);
38+ DRM_ERROR("Failed to reset GuC, ret = %d\n", ret);
3939 return ret;
4040 }
4141
@@ -168,7 +168,7 @@ int intel_uc_init_hw(struct drm_i915_private *dev_priv) · 126 unmodified lines
168168 * This is stuff we need to have available at fw load time
169169 * if we are planning to enable submission later
170170 */
171− ret = i915_guc_submission_init(dev_priv);
171+ ret = intel_guc_submission_init(guc);
172172 if (ret)
173173 goto err_guc;
174174 }
@@ -217,7 +217,7 @@ int intel_uc_init_hw(struct drm_i915_private *dev_priv) · 42 unmodified lines
217217 if (i915_modparams.guc_log_level >= 0)
218218 gen9_enable_guc_interrupts(dev_priv);
219219
220− ret = i915_guc_submission_enable(dev_priv);
220+ ret = intel_guc_submission_enable(guc);
221221 if (ret)
222222 goto err_interrupts;
223223 }
@@ -246,7 +246,7 @@ err_log_capture: · 22 unmodified lines
246246 guc_capture_load_err_log(guc);
247247 err_submission:
248248 if (i915_modparams.enable_guc_submission)
249− i915_guc_submission_fini(dev_priv);
249+ intel_guc_submission_fini(guc);
250250 err_guc:
251251 i915_ggtt_disable_guc(dev_priv);
252252
@@ -271,19 +271,21 @@ err_guc: · 18 unmodified lines
271271
272272 void intel_uc_fini_hw(struct drm_i915_private *dev_priv)
273273 {
274− guc_free_load_err_log(&dev_priv->guc);
274+ struct intel_guc *guc = &dev_priv->guc;
275+
276+ guc_free_load_err_log(guc);
275277
276278 if (!i915_modparams.enable_guc_loading)
277279 return;
278280
279281 if (i915_modparams.enable_guc_submission)
280− i915_guc_submission_disable(dev_priv);
282+ intel_guc_submission_disable(guc);
281283
282− guc_disable_communication(&dev_priv->guc);
284+ guc_disable_communication(guc);
283285
284286 if (i915_modparams.enable_guc_submission) {
285287 gen9_disable_guc_interrupts(dev_priv);
286− i915_guc_submission_fini(dev_priv);
288+ intel_guc_submission_fini(guc);
287289 }
288290
289291 i915_ggtt_disable_guc(dev_priv);
drivers/gpu/drm/i915/intel_uc_fw.c+1−1
@@ -299,7 +299,7 @@ void intel_uc_fw_fini(struct intel_uc_fw *uc_fw) · 298 unmodified lines
299299 *
300300 * Pretty printer for uC firmware.
301301 */
302−void intel_uc_fw_dump(struct intel_uc_fw *uc_fw, struct drm_printer *p)
302+void intel_uc_fw_dump(const struct intel_uc_fw *uc_fw, struct drm_printer *p)
303303 {
304304 drm_printf(p, "%s firmware: %s\n",
305305 intel_uc_fw_type_repr(uc_fw->type), uc_fw->path);
drivers/gpu/drm/i915/intel_uc_fw.h+1−1
@@ -116,6 +116,6 @@ int intel_uc_fw_upload(struct intel_uc_fw *uc_fw, · 115 unmodified lines
116116 int (*xfer)(struct intel_uc_fw *uc_fw,
117117 struct i915_vma *vma));
118118 void intel_uc_fw_fini(struct intel_uc_fw *uc_fw);
119−void intel_uc_fw_dump(struct intel_uc_fw *uc_fw, struct drm_printer *p);
119+void intel_uc_fw_dump(const struct intel_uc_fw *uc_fw, struct drm_printer *p);
120120
121121 #endif
drivers/gpu/drm/i915/intel_uncore.c+146−23
@@ -69,17 +69,104 @@ fw_domain_arm_timer(struct intel_uncore_forcewake_domain *d) · 68 unmodified lines
6969 HRTIMER_MODE_REL);
7070 }
7171
72+static inline int
73+__wait_for_ack(const struct drm_i915_private *i915,
74+ const struct intel_uncore_forcewake_domain *d,
75+ const u32 ack,
76+ const u32 value)
77+{
78+ return wait_for_atomic((__raw_i915_read32(i915, d->reg_ack) & ack) == value,
79+ FORCEWAKE_ACK_TIMEOUT_MS);
80+}
81+
82+static inline int
83+wait_ack_clear(const struct drm_i915_private *i915,
84+ const struct intel_uncore_forcewake_domain *d,
85+ const u32 ack)
86+{
87+ return __wait_for_ack(i915, d, ack, 0);
88+}
89+
90+static inline int
91+wait_ack_set(const struct drm_i915_private *i915,
92+ const struct intel_uncore_forcewake_domain *d,
93+ const u32 ack)
94+{
95+ return __wait_for_ack(i915, d, ack, ack);
96+}
97+
7298 static inline void
7399 fw_domain_wait_ack_clear(const struct drm_i915_private *i915,
74100 const struct intel_uncore_forcewake_domain *d)
75101 {
76− if (wait_for_atomic((__raw_i915_read32(i915, d->reg_ack) &
77− FORCEWAKE_KERNEL) == 0,
78− FORCEWAKE_ACK_TIMEOUT_MS))
102+ if (wait_ack_clear(i915, d, FORCEWAKE_KERNEL))
79103 DRM_ERROR("%s: timed out waiting for forcewake ack to clear.\n",
80104 intel_uncore_forcewake_domain_to_str(d->id));
81105 }
82106
107+enum ack_type {
108+ ACK_CLEAR = 0,
109+ ACK_SET
110+};
111+
112+static int
113+fw_domain_wait_ack_with_fallback(const struct drm_i915_private *i915,
114+ const struct intel_uncore_forcewake_domain *d,
115+ const enum ack_type type)
116+{
117+ const u32 ack_bit = FORCEWAKE_KERNEL;
118+ const u32 value = type == ACK_SET ? ack_bit : 0;
119+ unsigned int pass;
120+ bool ack_detected;
121+
122+ /*
123+ * There is a possibility of driver's wake request colliding
124+ * with hardware's own wake requests and that can cause
125+ * hardware to not deliver the driver's ack message.
126+ *
127+ * Use a fallback bit toggle to kick the gpu state machine
128+ * in the hope that the original ack will be delivered along with
129+ * the fallback ack.
130+ *
131+ * This workaround is described in HSDES #1604254524
132+ */
133+
134+ pass = 1;
135+ do {
136+ wait_ack_clear(i915, d, FORCEWAKE_KERNEL_FALLBACK);
137+
138+ __raw_i915_write32(i915, d->reg_set,
139+ _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL_FALLBACK));
140+ /* Give gt some time to relax before the polling frenzy */
141+ udelay(10 * pass);
142+ wait_ack_set(i915, d, FORCEWAKE_KERNEL_FALLBACK);
143+
144+ ack_detected = (__raw_i915_read32(i915, d->reg_ack) & ack_bit) == value;
145+
146+ __raw_i915_write32(i915, d->reg_set,
147+ _MASKED_BIT_DISABLE(FORCEWAKE_KERNEL_FALLBACK));
148+ } while (!ack_detected && pass++ < 10);
149+
150+ DRM_DEBUG_DRIVER("%s had to use fallback to %s ack, 0x%x (passes %u)\n",
151+ intel_uncore_forcewake_domain_to_str(d->id),
152+ type == ACK_SET ? "set" : "clear",
153+ __raw_i915_read32(i915, d->reg_ack),
154+ pass);
155+
156+ return ack_detected ? 0 : -ETIMEDOUT;
157+}
158+
159+static inline void
160+fw_domain_wait_ack_clear_fallback(const struct drm_i915_private *i915,
161+ const struct intel_uncore_forcewake_domain *d)
162+{
163+ if (likely(!wait_ack_clear(i915, d, FORCEWAKE_KERNEL)))
164+ return;
165+
166+ if (fw_domain_wait_ack_with_fallback(i915, d, ACK_CLEAR))
167+ fw_domain_wait_ack_clear(i915, d);
168+}
169+
83170 static inline void
84171 fw_domain_get(struct drm_i915_private *i915,
85172 const struct intel_uncore_forcewake_domain *d)
@@ -88,16 +175,25 @@ fw_domain_get(struct drm_i915_private *i915, · 2 unmodified lines
88175 }
89176
90177 static inline void
91−fw_domain_wait_ack(const struct drm_i915_private *i915,
92− const struct intel_uncore_forcewake_domain *d)
178+fw_domain_wait_ack_set(const struct drm_i915_private *i915,
179+ const struct intel_uncore_forcewake_domain *d)
93180 {
94− if (wait_for_atomic((__raw_i915_read32(i915, d->reg_ack) &
95− FORCEWAKE_KERNEL),
96− FORCEWAKE_ACK_TIMEOUT_MS))
181+ if (wait_ack_set(i915, d, FORCEWAKE_KERNEL))
97182 DRM_ERROR("%s: timed out waiting for forcewake ack request.\n",
98183 intel_uncore_forcewake_domain_to_str(d->id));
99184 }
100185
186+static inline void
187+fw_domain_wait_ack_set_fallback(const struct drm_i915_private *i915,
188+ const struct intel_uncore_forcewake_domain *d)
189+{
190+ if (likely(!wait_ack_set(i915, d, FORCEWAKE_KERNEL)))
191+ return;
192+
193+ if (fw_domain_wait_ack_with_fallback(i915, d, ACK_SET))
194+ fw_domain_wait_ack_set(i915, d);
195+}
196+
101197 static inline void
102198 fw_domain_put(const struct drm_i915_private *i915,
103199 const struct intel_uncore_forcewake_domain *d)
@@ -119,7 +215,27 @@ fw_domains_get(struct drm_i915_private *i915, enum forcewake_domains fw_domains) · 15 unmodified lines
119215 }
120216
121217 for_each_fw_domain_masked(d, fw_domains, i915, tmp)
122− fw_domain_wait_ack(i915, d);
218+ fw_domain_wait_ack_set(i915, d);
219+
220+ i915->uncore.fw_domains_active |= fw_domains;
221+}
222+
223+static void
224+fw_domains_get_with_fallback(struct drm_i915_private *i915,
225+ enum forcewake_domains fw_domains)
226+{
227+ struct intel_uncore_forcewake_domain *d;
228+ unsigned int tmp;
229+
230+ GEM_BUG_ON(fw_domains & ~i915->uncore.fw_domains);
231+
232+ for_each_fw_domain_masked(d, fw_domains, i915, tmp) {
233+ fw_domain_wait_ack_clear_fallback(i915, d);
234+ fw_domain_get(i915, d);
235+ }
236+
237+ for_each_fw_domain_masked(d, fw_domains, i915, tmp)
238+ fw_domain_wait_ack_set_fallback(i915, d);
123239
124240 i915->uncore.fw_domains_active |= fw_domains;
125241 }
@@ -229,6 +345,7 @@ intel_uncore_fw_release_timer(struct hrtimer *timer) · 103 unmodified lines
229345 return HRTIMER_NORESTART;
230346 }
231347
348+/* Note callers must have acquired the PUNIT->PMIC bus, before calling this. */
232349 static void intel_uncore_forcewake_reset(struct drm_i915_private *dev_priv,
233350 bool restore)
234351 {
@@ -237,6 +354,8 @@ static void intel_uncore_forcewake_reset(struct drm_i915_private *dev_priv, · 2 unmodified lines
237354 int retry_count = 100;
238355 enum forcewake_domains fw, active_domains;
239356
357+ iosf_mbi_assert_punit_acquired();
358+
240359 /* Hold uncore.lock across reset to prevent any register access
241360 * with forcewake not set correctly. Wait until all pending
242361 * timers are run before holding.
@@ -416,14 +535,18 @@ static void __intel_uncore_early_sanitize(struct drm_i915_private *dev_priv, · 173 unmodified lines
416535 GT_FIFO_CTL_RC6_POLICY_STALL);
417536 }
418537
538+ iosf_mbi_punit_acquire();
419539 intel_uncore_forcewake_reset(dev_priv, restore_forcewake);
540+ iosf_mbi_punit_release();
420541 }
421542
422543 void intel_uncore_suspend(struct drm_i915_private *dev_priv)
423544 {
424− iosf_mbi_unregister_pmic_bus_access_notifier(
545+ iosf_mbi_punit_acquire();
546+ iosf_mbi_unregister_pmic_bus_access_notifier_unlocked(
425547 &dev_priv->uncore.pmic_bus_access_nb);
426548 intel_uncore_forcewake_reset(dev_priv, false);
549+ iosf_mbi_punit_release();
427550 }
428551
429552 void intel_uncore_resume_early(struct drm_i915_private *dev_priv)
@@ -1148,7 +1271,8 @@ static void intel_uncore_fw_domains_init(struct drm_i915_private *dev_priv) · 718 unmodified lines
11481271 }
11491272
11501273 if (INTEL_GEN(dev_priv) >= 9) {
1151− dev_priv->uncore.funcs.force_wake_get = fw_domains_get;
1274+ dev_priv->uncore.funcs.force_wake_get =
1275+ fw_domains_get_with_fallback;
11521276 dev_priv->uncore.funcs.force_wake_put = fw_domains_put;
11531277 fw_domain_init(dev_priv, FW_DOMAIN_ID_RENDER,
11541278 FORCEWAKE_RENDER_GEN9,
@@ -1309,18 +1433,18 @@ void intel_uncore_init(struct drm_i915_private *dev_priv) · 154 unmodified lines
13091433
13101434 iosf_mbi_register_pmic_bus_access_notifier(
13111435 &dev_priv->uncore.pmic_bus_access_nb);
1312−
1313− i915_check_and_clear_faults(dev_priv);
13141436 }
13151437
13161438 void intel_uncore_fini(struct drm_i915_private *dev_priv)
13171439 {
1318− iosf_mbi_unregister_pmic_bus_access_notifier(
1319− &dev_priv->uncore.pmic_bus_access_nb);
1320−
13211440 /* Paranoia: make sure we have disabled everything before we exit. */
13221441 intel_uncore_sanitize(dev_priv);
1442+
1443+ iosf_mbi_punit_acquire();
1444+ iosf_mbi_unregister_pmic_bus_access_notifier_unlocked(
1445+ &dev_priv->uncore.pmic_bus_access_nb);
13231446 intel_uncore_forcewake_reset(dev_priv, false);
1447+ iosf_mbi_punit_release();
13241448 }
13251449
13261450 static const struct reg_whitelist {
@@ -1400,10 +1524,14 @@ static void gen3_stop_engine(struct intel_engine_cs *engine) · 73 unmodified lines
14001524 DRM_DEBUG_DRIVER("%s: timed out on STOP_RING\n",
14011525 engine->name);
14021526
1403− I915_WRITE_FW(RING_CTL(base), 0);
1527+ I915_WRITE_FW(RING_HEAD(base), I915_READ_FW(RING_TAIL(base)));
1528+
14041529 I915_WRITE_FW(RING_HEAD(base), 0);
14051530 I915_WRITE_FW(RING_TAIL(base), 0);
14061531
1532+ /* The ring must be empty before it is disabled */
1533+ I915_WRITE_FW(RING_CTL(base), 0);
1534+
14071535 /* Check acts as a post */
14081536 if (I915_READ_FW(RING_HEAD(base)) != 0)
14091537 DRM_DEBUG_DRIVER("%s: ring head not parked\n",
@@ -1801,18 +1929,13 @@ bool intel_has_gpu_reset(struct drm_i915_private *dev_priv) · 391 unmodified lines
18011929 return intel_get_gpu_reset(dev_priv) != NULL;
18021930 }
18031931
1804−/*
1805− * When GuC submission is enabled, GuC manages ELSP and can initiate the
1806− * engine reset too. For now, fall back to full GPU reset if it is enabled.
1807− */
18081932 bool intel_has_reset_engine(struct drm_i915_private *dev_priv)
18091933 {
18101934 return (dev_priv->info.has_reset_engine &&
1811− !dev_priv->guc.execbuf_client &&
18121935 i915_modparams.reset >= 2);
18131936 }
18141937
1815−int intel_guc_reset(struct drm_i915_private *dev_priv)
1938+int intel_reset_guc(struct drm_i915_private *dev_priv)
18161939 {
18171940 int ret;
18181941
drivers/gpu/drm/i915/intel_vbt_defs.h+6−2
@@ -304,6 +304,10 @@ struct bdb_general_features { · 303 unmodified lines
304304 #define DVO_PORT_MIPIC 23 /* 171 */
305305 #define DVO_PORT_MIPID 24 /* 171 */
306306
307+#define HDMI_MAX_DATA_RATE_PLATFORM 0 /* 204 */
308+#define HDMI_MAX_DATA_RATE_297 1 /* 204 */
309+#define HDMI_MAX_DATA_RATE_165 2 /* 204 */
310+
307311 #define LEGACY_CHILD_DEVICE_CONFIG_SIZE 33
308312
309313 /* DDC Bus DDI Type 155+ */
@@ -342,8 +346,8 @@ struct child_device_config { · 32 unmodified lines
342346 u8 i2c_speed;
343347 u8 dp_onboard_redriver; /* 158 */
344348 u8 dp_ondock_redriver; /* 158 */
345− u8 hdmi_level_shifter_value:4; /* 169 */
346− u8 hdmi_max_data_rate:4; /* 204 */
349+ u8 hdmi_level_shifter_value:5; /* 169 */
350+ u8 hdmi_max_data_rate:3; /* 204 */
347351 u16 dtd_buf_ptr; /* 161 */
348352 u8 edidless_efp:1; /* 161 */
349353 u8 compression_enable:1; /* 198 */
drivers/gpu/drm/i915/selftests/huge_pages.c+3−0
@@ -1159,6 +1159,9 @@ static int igt_ppgtt_exhaust_huge(void *arg) · 1158 unmodified lines
11591159 int n, i;
11601160 int err = -ENODEV;
11611161
1162+ if (supported == I915_GTT_PAGE_SIZE_4K)
1163+ return 0;
1164+
11621165 /*
11631166 * Sanity check creating objects with a varying mix of page sizes --
11641167 * ensuring that our writes lands in the right place.
drivers/gpu/drm/i915/selftests/i915_gem_coherency.c+8−8
@@ -33,7 +33,7 @@ static int cpu_set(struct drm_i915_gem_object *obj, · 32 unmodified lines
3333 {
3434 unsigned int needs_clflush;
3535 struct page *page;
36− typeof(v) *map;
36+ u32 *map;
3737 int err;
3838
3939 err = i915_gem_obj_prepare_shmem_write(obj, &needs_clflush);
@@ -59,7 +59,7 @@ static int cpu_get(struct drm_i915_gem_object *obj, · 19 unmodified lines
5959 {
6060 unsigned int needs_clflush;
6161 struct page *page;
62− typeof(v) map;
62+ u32 *map;
6363 int err;
6464
6565 err = i915_gem_obj_prepare_shmem_read(obj, &needs_clflush);
@@ -82,7 +82,7 @@ static int gtt_set(struct drm_i915_gem_object *obj, · 16 unmodified lines
8282 u32 v)
8383 {
8484 struct i915_vma *vma;
85− typeof(v) *map;
85+ u32 __iomem *map;
8686 int err;
8787
8888 err = i915_gem_object_set_to_gtt_domain(obj, true);
@@ -98,7 +98,7 @@ static int gtt_set(struct drm_i915_gem_object *obj, · 9 unmodified lines
9898 if (IS_ERR(map))
9999 return PTR_ERR(map);
100100
101− map[offset / sizeof(*map)] = v;
101+ iowrite32(v, &map[offset / sizeof(*map)]);
102102 i915_vma_unpin_iomap(vma);
103103
104104 return 0;
@@ -109,7 +109,7 @@ static int gtt_get(struct drm_i915_gem_object *obj, · 4 unmodified lines
109109 u32 *v)
110110 {
111111 struct i915_vma *vma;
112− typeof(v) map;
112+ u32 __iomem *map;
113113 int err;
114114
115115 err = i915_gem_object_set_to_gtt_domain(obj, false);
@@ -125,7 +125,7 @@ static int gtt_get(struct drm_i915_gem_object *obj, · 9 unmodified lines
125125 if (IS_ERR(map))
126126 return PTR_ERR(map);
127127
128− *v = map[offset / sizeof(*map)];
128+ *v = ioread32(&map[offset / sizeof(*map)]);
129129 i915_vma_unpin_iomap(vma);
130130
131131 return 0;
@@ -135,7 +135,7 @@ static int wc_set(struct drm_i915_gem_object *obj, · 3 unmodified lines
135135 unsigned long offset,
136136 u32 v)
137137 {
138− typeof(v) *map;
138+ u32 *map;
139139 int err;
140140
141141 err = i915_gem_object_set_to_wc_domain(obj, true);
@@ -156,7 +156,7 @@ static int wc_get(struct drm_i915_gem_object *obj, · 14 unmodified lines
156156 unsigned long offset,
157157 u32 *v)
158158 {
159− typeof(v) map;
159+ u32 *map;
160160 int err;
161161
162162 err = i915_gem_object_set_to_wc_domain(obj, false);
drivers/gpu/drm/i915/selftests/i915_gem_context.c+1−1
@@ -325,7 +325,7 @@ static int igt_ctx_exec(void *arg) · 324 unmodified lines
325325 LIST_HEAD(objects);
326326 unsigned long ncontexts, ndwords, dw;
327327 bool first_shared_gtt = true;
328− int err;
328+ int err = -ENODEV;
329329
330330 /* Create a few different contexts (with different mm) and write
331331 * through each ctx/mm using the GPU making sure those writes end
drivers/gpu/drm/i915/selftests/i915_gem_gtt.c+34−14
@@ -216,13 +216,21 @@ static int lowlevel_hole(struct drm_i915_private *i915, · 215 unmodified lines
216216 hole_size = (hole_end - hole_start) >> size;
217217 if (hole_size > KMALLOC_MAX_SIZE / sizeof(u32))
218218 hole_size = KMALLOC_MAX_SIZE / sizeof(u32);
219− count = hole_size;
219+ count = hole_size >> 1;
220+ if (!count) {
221+ pr_debug("%s: hole is too small [%llx - %llx] >> %d: %lld\n",
222+ __func__, hole_start, hole_end, size, hole_size);
223+ break;
224+ }
225+
220226 do {
221− count >>= 1;
222227 order = i915_random_order(count, &prng);
223− } while (!order && count);
224− if (!order)
225− break;
228+ if (order)
229+ break;
230+ } while (count >>= 1);
231+ if (!count)
232+ return -ENOMEM;
233+ GEM_BUG_ON(!order);
226234
227235 GEM_BUG_ON(count * BIT_ULL(size) > vm->total);
228236 GEM_BUG_ON(hole_start + count * BIT_ULL(size) > hole_end);
@@ -267,7 +275,9 @@ static int lowlevel_hole(struct drm_i915_private *i915, · 38 unmodified lines
267275 mock_vma.node.size = BIT_ULL(size);
268276 mock_vma.node.start = addr;
269277
278+ intel_runtime_pm_get(i915);
270279 vm->insert_entries(vm, &mock_vma, I915_CACHE_NONE, 0);
280+ intel_runtime_pm_put(i915);
271281 }
272282 count = n;
273283
@@ -697,18 +707,26 @@ static int drunk_hole(struct drm_i915_private *i915, · 423 unmodified lines
697707 unsigned int *order, count, n;
698708 struct i915_vma *vma;
699709 u64 hole_size;
700− int err;
710+ int err = -ENODEV;
701711
702712 hole_size = (hole_end - hole_start) >> size;
703713 if (hole_size > KMALLOC_MAX_SIZE / sizeof(u32))
704714 hole_size = KMALLOC_MAX_SIZE / sizeof(u32);
705− count = hole_size;
715+ count = hole_size >> 1;
716+ if (!count) {
717+ pr_debug("%s: hole is too small [%llx - %llx] >> %d: %lld\n",
718+ __func__, hole_start, hole_end, size, hole_size);
719+ break;
720+ }
721+
706722 do {
707− count >>= 1;
708723 order = i915_random_order(count, &prng);
709− } while (!order && count);
710− if (!order)
711− break;
724+ if (order)
725+ break;
726+ } while (count >>= 1);
727+ if (!count)
728+ return -ENOMEM;
729+ GEM_BUG_ON(!order);
712730
713731 /* Ignore allocation failures (i.e. don't report them as
714732 * a test failure) as we are purposefully allocating very
@@ -956,7 +974,7 @@ static int exercise_ggtt(struct drm_i915_private *i915, · 241 unmodified lines
956974 u64 hole_start, hole_end, last = 0;
957975 struct drm_mm_node *node;
958976 IGT_TIMEOUT(end_time);
959− int err;
977+ int err = 0;
960978
961979 mutex_lock(&i915->drm.struct_mutex);
962980 restart:
@@ -1047,6 +1065,7 @@ static int igt_ggtt_page(void *arg) · 84 unmodified lines
10471065 goto out_remove;
10481066 }
10491067
1068+ intel_runtime_pm_get(i915);
10501069 for (n = 0; n < count; n++) {
10511070 u64 offset = tmp.start + order[n] * PAGE_SIZE;
10521071 u32 __iomem *vaddr;
@@ -1086,6 +1105,7 @@ static int igt_ggtt_page(void *arg) · 33 unmodified lines
10861105 break;
10871106 }
10881107 }
1108+ intel_runtime_pm_put(i915);
10891109
10901110 kfree(order);
10911111 out_remove:
@@ -1160,7 +1180,7 @@ static int igt_gtt_reserve(void *arg) · 68 unmodified lines
11601180 struct drm_i915_gem_object *obj, *on;
11611181 LIST_HEAD(objects);
11621182 u64 total;
1163− int err;
1183+ int err = -ENODEV;
11641184
11651185 /* i915_gem_gtt_reserve() tries to reserve the precise range
11661186 * for the node, and evicts if it has to. So our test checks that
@@ -1351,7 +1371,7 @@ static int igt_gtt_insert(void *arg) · 184 unmodified lines
13511371 }, *ii;
13521372 LIST_HEAD(objects);
13531373 u64 total;
1354− int err;
1374+ int err = -ENODEV;
13551375
13561376 /* i915_gem_gtt_insert() tries to allocate some free space in the GTT
13571377 * to the node, evicting if required.
drivers/gpu/drm/i915/selftests/i915_gem_object.c+2−0
@@ -317,6 +317,7 @@ static int igt_partial_tiling(void *arg) · 316 unmodified lines
317317 }
318318
319319 mutex_lock(&i915->drm.struct_mutex);
320+ intel_runtime_pm_get(i915);
320321
321322 if (1) {
322323 IGT_TIMEOUT(end);
@@ -418,6 +419,7 @@ next_tiling: ; · 95 unmodified lines
418419 }
419420
420421 out_unlock:
422+ intel_runtime_pm_put(i915);
421423 mutex_unlock(&i915->drm.struct_mutex);
422424 i915_gem_object_unpin_pages(obj);
423425 out:
drivers/gpu/drm/i915/selftests/i915_gem_request.c+1−1
@@ -332,7 +332,7 @@ static int live_nop_request(void *arg) · 331 unmodified lines
332332 struct intel_engine_cs *engine;
333333 struct live_test t;
334334 unsigned int id;
335− int err;
335+ int err = -ENODEV;
336336
337337 /* Submit various sized batches of empty requests, to each engine
338338 * (individually), and wait for the batch to complete. We can check
drivers/gpu/drm/i915/selftests/i915_gem_timeline.c+1−1
@@ -79,7 +79,7 @@ static int igt_sync(void *arg) · 78 unmodified lines
7979 }, *p;
8080 struct intel_timeline *tl;
8181 int order, offset;
82− int ret;
82+ int ret = -ENODEV;
8383
8484 tl = mock_timeline(0);
8585 if (!tl)
drivers/gpu/drm/i915/selftests/i915_live_selftests.h+1−0
@@ -20,3 +20,4 @@ selftest(evict, i915_gem_evict_live_selftests) · 19 unmodified lines
2020 selftest(hugepages, i915_gem_huge_page_live_selftests)
2121 selftest(contexts, i915_gem_context_live_selftests)
2222 selftest(hangcheck, intel_hangcheck_live_selftests)
23+selftest(guc, intel_guc_live_selftest)
drivers/gpu/drm/i915/selftests/i915_syncmap.c+3−3
@@ -333,7 +333,7 @@ static int igt_syncmap_join_below(void *arg) · 332 unmodified lines
333333 {
334334 struct i915_syncmap *sync;
335335 unsigned int step, order, idx;
336− int err;
336+ int err = -ENODEV;
337337
338338 i915_syncmap_init(&sync);
339339
@@ -402,7 +402,7 @@ static int igt_syncmap_neighbours(void *arg) · 62 unmodified lines
402402 I915_RND_STATE(prng);
403403 IGT_TIMEOUT(end_time);
404404 struct i915_syncmap *sync;
405− int err;
405+ int err = -ENODEV;
406406
407407 /*
408408 * Each leaf holds KSYNCMAP seqno. Check that when we create KSYNCMAP
@@ -447,7 +447,7 @@ static int igt_syncmap_compact(void *arg) · 38 unmodified lines
447447 {
448448 struct i915_syncmap *sync;
449449 unsigned int idx, order;
450− int err;
450+ int err = -ENODEV;
451451
452452 i915_syncmap_init(&sync);
453453
drivers/gpu/drm/i915/selftests/i915_vma.c+1−1
@@ -150,7 +150,7 @@ static int igt_vma_create(void *arg) · 149 unmodified lines
150150 IGT_TIMEOUT(end_time);
151151 LIST_HEAD(contexts);
152152 LIST_HEAD(objects);
153− int err;
153+ int err = -ENOMEM;
154154
155155 /* Exercise creating many vma amonst many objections, checking the
156156 * vma creation and lookup routines.
drivers/gpu/drm/i915/selftests/intel_guc.c+367−0
@@ -0,0 +1,367 @@
1+/*
2+ * Copyright © 2017 Intel Corporation
3+ *
4+ * Permission is hereby granted, free of charge, to any person obtaining a
5+ * copy of this software and associated documentation files (the "Software"),
6+ * to deal in the Software without restriction, including without limitation
7+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8+ * and/or sell copies of the Software, and to permit persons to whom the
9+ * Software is furnished to do so, subject to the following conditions:
10+ *
11+ * The above copyright notice and this permission notice (including the next
12+ * paragraph) shall be included in all copies or substantial portions of the
13+ * Software.
14+ *
15+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21+ * IN THE SOFTWARE.
22+ *
23+ */
24+
25+#include "../i915_selftest.h"
26+
27+/* max doorbell number + negative test for each client type */
28+#define ATTEMPTS (GUC_NUM_DOORBELLS + GUC_CLIENT_PRIORITY_NUM)
29+
30+struct intel_guc_client *clients[ATTEMPTS];
31+
32+static bool available_dbs(struct intel_guc *guc, u32 priority)
33+{
34+ unsigned long offset;
35+ unsigned long end;
36+ u16 id;
37+
38+ /* first half is used for normal priority, second half for high */
39+ offset = 0;
40+ end = GUC_NUM_DOORBELLS / 2;
41+ if (priority <= GUC_CLIENT_PRIORITY_HIGH) {
42+ offset = end;
43+ end += offset;
44+ }
45+
46+ id = find_next_zero_bit(guc->doorbell_bitmap, end, offset);
47+ if (id < end)
48+ return true;
49+
50+ return false;
51+}
52+
53+static int check_all_doorbells(struct intel_guc *guc)
54+{
55+ u16 db_id;
56+
57+ pr_info_once("Max number of doorbells: %d", GUC_NUM_DOORBELLS);
58+ for (db_id = 0; db_id < GUC_NUM_DOORBELLS; ++db_id) {
59+ if (!doorbell_ok(guc, db_id)) {
60+ pr_err("doorbell %d, not ok\n", db_id);
61+ return -EIO;
62+ }
63+ }
64+
65+ return 0;
66+}
67+
68+/*
69+ * Basic client sanity check, handy to validate create_clients.
70+ */
71+static int validate_client(struct intel_guc_client *client,
72+ int client_priority,
73+ bool is_preempt_client)
74+{
75+ struct drm_i915_private *dev_priv = guc_to_i915(client->guc);
76+ struct i915_gem_context *ctx_owner = is_preempt_client ?
77+ dev_priv->preempt_context : dev_priv->kernel_context;
78+
79+ if (client->owner != ctx_owner ||
80+ client->engines != INTEL_INFO(dev_priv)->ring_mask ||
81+ client->priority != client_priority ||
82+ client->doorbell_id == GUC_DOORBELL_INVALID)
83+ return -EINVAL;
84+ else
85+ return 0;
86+}
87+
88+/*
89+ * Check that guc_init_doorbell_hw is doing what it should.
90+ *
91+ * During GuC submission enable, we create GuC clients and their doorbells,
92+ * but after resetting the microcontroller (resume & gpu reset), these
93+ * GuC clients are still around, but the status of their doorbells may be
94+ * incorrect. This is the reason behind validating that the doorbells status
95+ * expected by the driver matches what the GuC/HW have.
96+ */
97+static int igt_guc_init_doorbell_hw(void *args)
98+{
99+ struct drm_i915_private *dev_priv = args;
100+ struct intel_guc *guc;
101+ DECLARE_BITMAP(db_bitmap_bk, GUC_NUM_DOORBELLS);
102+ int i, err = 0;
103+
104+ GEM_BUG_ON(!HAS_GUC(dev_priv));
105+ mutex_lock(&dev_priv->drm.struct_mutex);
106+
107+ guc = &dev_priv->guc;
108+ if (!guc) {
109+ pr_err("No guc object!\n");
110+ err = -EINVAL;
111+ goto unlock;
112+ }
113+
114+ err = check_all_doorbells(guc);
115+ if (err)
116+ goto unlock;
117+
118+ /*
119+ * Get rid of clients created during driver load because the test will
120+ * recreate them.
121+ */
122+ guc_clients_destroy(guc);
123+ if (guc->execbuf_client || guc->preempt_client) {
124+ pr_err("guc_clients_destroy lied!\n");
125+ err = -EINVAL;
126+ goto unlock;
127+ }
128+
129+ err = guc_clients_create(guc);
130+ if (err) {
131+ pr_err("Failed to create clients\n");
132+ goto unlock;
133+ }
134+
135+ err = validate_client(guc->execbuf_client,
136+ GUC_CLIENT_PRIORITY_KMD_NORMAL, false);
137+ if (err) {
138+ pr_err("execbug client validation failed\n");
139+ goto out;
140+ }
141+
142+ err = validate_client(guc->preempt_client,
143+ GUC_CLIENT_PRIORITY_KMD_HIGH, true);
144+ if (err) {
145+ pr_err("preempt client validation failed\n");
146+ goto out;
147+ }
148+
149+ /* each client should have received a doorbell during alloc */
150+ if (!has_doorbell(guc->execbuf_client) ||
151+ !has_doorbell(guc->preempt_client)) {
152+ pr_err("guc_clients_create didn't create doorbells\n");
153+ err = -EINVAL;
154+ goto out;
155+ }
156+
157+ /*
158+ * Basic test - an attempt to reallocate a valid doorbell to the
159+ * client it is currently assigned should not cause a failure.
160+ */
161+ err = guc_init_doorbell_hw(guc);
162+ if (err)
163+ goto out;
164+
165+ /*
166+ * Negative test - a client with no doorbell (invalid db id).
167+ * Each client gets a doorbell when it is created, after destroying
168+ * the doorbell, the db id is changed to GUC_DOORBELL_INVALID and the
169+ * firmware will reject any attempt to allocate a doorbell with an
170+ * invalid id (db has to be reserved before allocation).
171+ */
172+ destroy_doorbell(guc->execbuf_client);
173+ if (has_doorbell(guc->execbuf_client)) {
174+ pr_err("destroy db did not work\n");
175+ err = -EINVAL;
176+ goto out;
177+ }
178+
179+ err = guc_init_doorbell_hw(guc);
180+ if (err != -EIO) {
181+ pr_err("unexpected (err = %d)", err);
182+ goto out;
183+ }
184+
185+ if (!available_dbs(guc, guc->execbuf_client->priority)) {
186+ pr_err("doorbell not available when it should\n");
187+ err = -EIO;
188+ goto out;
189+ }
190+
191+ /* clean after test */
192+ err = create_doorbell(guc->execbuf_client);
193+ if (err) {
194+ pr_err("recreate doorbell failed\n");
195+ goto out;
196+ }
197+
198+ /*
199+ * Negative test - doorbell_bitmap out of sync, will trigger a few of
200+ * WARN_ON(!doorbell_ok(guc, db_id)) but that's ok as long as the
201+ * doorbells from our clients don't fail.
202+ */
203+ bitmap_copy(db_bitmap_bk, guc->doorbell_bitmap, GUC_NUM_DOORBELLS);
204+ for (i = 0; i < GUC_NUM_DOORBELLS; i++)
205+ if (i % 2)
206+ test_and_change_bit(i, guc->doorbell_bitmap);
207+
208+ err = guc_init_doorbell_hw(guc);
209+ if (err) {
210+ pr_err("out of sync doorbell caused an error\n");
211+ goto out;
212+ }
213+
214+ /* restore 'correct' db bitmap */
215+ bitmap_copy(guc->doorbell_bitmap, db_bitmap_bk, GUC_NUM_DOORBELLS);
216+ err = guc_init_doorbell_hw(guc);
217+ if (err) {
218+ pr_err("restored doorbell caused an error\n");
219+ goto out;
220+ }
221+
222+out:
223+ /*
224+ * Leave clean state for other test, plus the driver always destroy the
225+ * clients during unload.
226+ */
227+ guc_clients_destroy(guc);
228+ guc_clients_create(guc);
229+unlock:
230+ mutex_unlock(&dev_priv->drm.struct_mutex);
231+ return err;
232+}
233+
234+/*
235+ * Create as many clients as number of doorbells. Note that there's already
236+ * client(s)/doorbell(s) created during driver load, but this test creates
237+ * its own and do not interact with the existing ones.
238+ */
239+static int igt_guc_doorbells(void *arg)
240+{
241+ struct drm_i915_private *dev_priv = arg;
242+ struct intel_guc *guc;
243+ int i, err = 0;
244+ u16 db_id;
245+
246+ GEM_BUG_ON(!HAS_GUC(dev_priv));
247+ mutex_lock(&dev_priv->drm.struct_mutex);
248+
249+ guc = &dev_priv->guc;
250+ if (!guc) {
251+ pr_err("No guc object!\n");
252+ err = -EINVAL;
253+ goto unlock;
254+ }
255+
256+ err = check_all_doorbells(guc);
257+ if (err)
258+ goto unlock;
259+
260+ for (i = 0; i < ATTEMPTS; i++) {
261+ clients[i] = guc_client_alloc(dev_priv,
262+ INTEL_INFO(dev_priv)->ring_mask,
263+ i % GUC_CLIENT_PRIORITY_NUM,
264+ dev_priv->kernel_context);
265+
266+ if (!clients[i]) {
267+ pr_err("[%d] No guc client\n", i);
268+ err = -EINVAL;
269+ goto out;
270+ }
271+
272+ if (IS_ERR(clients[i])) {
273+ if (PTR_ERR(clients[i]) != -ENOSPC) {
274+ pr_err("[%d] unexpected error\n", i);
275+ err = PTR_ERR(clients[i]);
276+ goto out;
277+ }
278+
279+ if (available_dbs(guc, i % GUC_CLIENT_PRIORITY_NUM)) {
280+ pr_err("[%d] non-db related alloc fail\n", i);
281+ err = -EINVAL;
282+ goto out;
283+ }
284+
285+ /* expected, ran out of dbs for this client type */
286+ continue;
287+ }
288+
289+ /*
290+ * The check below is only valid because we keep a doorbell
291+ * assigned during the whole life of the client.
292+ */
293+ if (clients[i]->stage_id >= GUC_NUM_DOORBELLS) {
294+ pr_err("[%d] more clients than doorbells (%d >= %d)\n",
295+ i, clients[i]->stage_id, GUC_NUM_DOORBELLS);
296+ err = -EINVAL;
297+ goto out;
298+ }
299+
300+ err = validate_client(clients[i],
301+ i % GUC_CLIENT_PRIORITY_NUM, false);
302+ if (err) {
303+ pr_err("[%d] client_alloc sanity check failed!\n", i);
304+ err = -EINVAL;
305+ goto out;
306+ }
307+
308+ db_id = clients[i]->doorbell_id;
309+
310+ /*
311+ * Client alloc gives us a doorbell, but we want to exercise
312+ * this ourselves (this resembles guc_init_doorbell_hw)
313+ */
314+ destroy_doorbell(clients[i]);
315+ if (clients[i]->doorbell_id != GUC_DOORBELL_INVALID) {
316+ pr_err("[%d] destroy db did not work!\n", i);
317+ err = -EINVAL;
318+ goto out;
319+ }
320+
321+ err = __reserve_doorbell(clients[i]);
322+ if (err) {
323+ pr_err("[%d] Failed to reserve a doorbell\n", i);
324+ goto out;
325+ }
326+
327+ __update_doorbell_desc(clients[i], clients[i]->doorbell_id);
328+ err = __create_doorbell(clients[i]);
329+ if (err) {
330+ pr_err("[%d] Failed to create a doorbell\n", i);
331+ goto out;
332+ }
333+
334+ /* doorbell id shouldn't change, we are holding the mutex */
335+ if (db_id != clients[i]->doorbell_id) {
336+ pr_err("[%d] doorbell id changed (%d != %d)\n",
337+ i, db_id, clients[i]->doorbell_id);
338+ err = -EINVAL;
339+ goto out;
340+ }
341+
342+ err = check_all_doorbells(guc);
343+ if (err)
344+ goto out;
345+ }
346+
347+out:
348+ for (i = 0; i < ATTEMPTS; i++)
349+ if (!IS_ERR_OR_NULL(clients[i]))
350+ guc_client_free(clients[i]);
351+unlock:
352+ mutex_unlock(&dev_priv->drm.struct_mutex);
353+ return err;
354+}
355+
356+int intel_guc_live_selftest(struct drm_i915_private *dev_priv)
357+{
358+ static const struct i915_subtest tests[] = {
359+ SUBTEST(igt_guc_init_doorbell_hw),
360+ SUBTEST(igt_guc_doorbells),
361+ };
362+
363+ if (!i915_modparams.enable_guc_submission)
364+ return 0;
365+
366+ return i915_subtests(tests, dev_priv);
367+}
drivers/gpu/drm/i915/selftests/intel_uncore.c+7−4
@@ -120,10 +120,10 @@ static int intel_uncore_check_forcewake_domains(struct drm_i915_private *dev_pri · 119 unmodified lines
120120 !IS_CHERRYVIEW(dev_priv))
121121 return 0;
122122
123− if (IS_VALLEYVIEW(dev_priv)) /* XXX system lockup! */
124− return 0;
125−
126− if (IS_BROADWELL(dev_priv)) /* XXX random GPU hang afterwards! */
123+ /*
124+ * This test may lockup the machine or cause GPU hangs afterwards.
125+ */
126+ if (!IS_ENABLED(CONFIG_DRM_I915_SELFTEST_BROKEN))
127127 return 0;
128128
129129 valid = kzalloc(BITS_TO_LONGS(FW_RANGE) * sizeof(*valid),
@@ -148,7 +148,10 @@ static int intel_uncore_check_forcewake_domains(struct drm_i915_private *dev_pri · 18 unmodified lines
148148 for_each_set_bit(offset, valid, FW_RANGE) {
149149 i915_reg_t reg = { offset };
150150
151+ iosf_mbi_punit_acquire();
151152 intel_uncore_forcewake_reset(dev_priv, false);
153+ iosf_mbi_punit_release();
154+
152155 check_for_unclaimed_mmio(dev_priv);
153156
154157 (void)I915_READ(reg);
drivers/gpu/drm/i915/selftests/mock_engine.c+31−10
@@ -32,6 +32,13 @@ static struct mock_request *first_request(struct mock_engine *engine) · 31 unmodified lines
3232 link);
3333 }
3434
35+static void advance(struct mock_engine *engine,
36+ struct mock_request *request)
37+{
38+ list_del_init(&request->link);
39+ mock_seqno_advance(&engine->base, request->base.global_seqno);
40+}
41+
3542 static void hw_delay_complete(struct timer_list *t)
3643 {
3744 struct mock_engine *engine = from_timer(engine, t, hw_delay);
@@ -39,15 +46,23 @@ static void hw_delay_complete(struct timer_list *t) · 1 unmodified line
3946
4047 spin_lock(&engine->hw_lock);
4148
42− request = first_request(engine);
43− if (request) {
44− list_del_init(&request->link);
45− mock_seqno_advance(&engine->base, request->base.global_seqno);
46− }
47−
49+ /* Timer fired, first request is complete */
4850 request = first_request(engine);
4951 if (request)
50− mod_timer(&engine->hw_delay, jiffies + request->delay);
52+ advance(engine, request);
53+
54+ /*
55+ * Also immediately signal any subsequent 0-delay requests, but
56+ * requeue the timer for the next delayed request.
57+ */
58+ while ((request = first_request(engine))) {
59+ if (request->delay) {
60+ mod_timer(&engine->hw_delay, jiffies + request->delay);
61+ break;
62+ }
63+
64+ advance(engine, request);
65+ }
5166
5267 spin_unlock(&engine->hw_lock);
5368 }
@@ -98,16 +113,22 @@ static void mock_submit_request(struct drm_i915_gem_request *request) · 44 unmodified lines
98113
99114 spin_lock_irq(&engine->hw_lock);
100115 list_add_tail(&mock->link, &engine->hw_queue);
101− if (mock->link.prev == &engine->hw_queue)
102− mod_timer(&engine->hw_delay, jiffies + mock->delay);
116+ if (mock->link.prev == &engine->hw_queue) {
117+ if (mock->delay)
118+ mod_timer(&engine->hw_delay, jiffies + mock->delay);
119+ else
120+ advance(engine, mock);
121+ }
103122 spin_unlock_irq(&engine->hw_lock);
104123 }
105124
106125 static struct intel_ring *mock_ring(struct intel_engine_cs *engine)
107126 {
108− const unsigned long sz = roundup_pow_of_two(sizeof(struct intel_ring));
127+ const unsigned long sz = PAGE_SIZE / 2;
109128 struct intel_ring *ring;
110129
130+ BUILD_BUG_ON(MIN_SPACE_FOR_ADD_REQUEST > sz);
131+
111132 ring = kzalloc(sizeof(*ring) + sz, GFP_KERNEL);
112133 if (!ring)
113134 return NULL;
drivers/gpu/drm/i915/selftests/mock_gem_device.c+1−6
@@ -179,8 +179,8 @@ struct drm_i915_private *mock_gem_device(void) · 178 unmodified lines
179179 I915_GTT_PAGE_SIZE_64K |
180180 I915_GTT_PAGE_SIZE_2M;
181181
182− spin_lock_init(&i915->mm.object_stat_lock);
183182 mock_uncore_init(i915);
183+ i915_gem_init__mm(i915);
184184
185185 init_waitqueue_head(&i915->gpu_error.wait_queue);
186186 init_waitqueue_head(&i915->gpu_error.reset_queue);
@@ -189,11 +189,6 @@ struct drm_i915_private *mock_gem_device(void) · 2 unmodified lines
189189 if (!i915->wq)
190190 goto put_device;
191191
192− INIT_WORK(&i915->mm.free_work, __i915_gem_free_work);
193− init_llist_head(&i915->mm.free_list);
194− INIT_LIST_HEAD(&i915->mm.unbound_list);
195− INIT_LIST_HEAD(&i915->mm.bound_list);
196−
197192 mock_init_contexts(i915);
198193
199194 INIT_DELAYED_WORK(&i915->gt.retire_work, mock_retire_work_handler);
include/uapi/drm/i915_drm.h+37−0
@@ -86,6 +86,22 @@ enum i915_mocs_table_index { · 85 unmodified lines
8686 I915_MOCS_CACHED,
8787 };
8888
89+/*
90+ * Different engines serve different roles, and there may be more than one
91+ * engine serving each role. enum drm_i915_gem_engine_class provides a
92+ * classification of the role of the engine, which may be used when requesting
93+ * operations to be performed on a certain subset of engines, or for providing
94+ * information about that group.
95+ */
96+enum drm_i915_gem_engine_class {
97+ I915_ENGINE_CLASS_RENDER = 0,
98+ I915_ENGINE_CLASS_COPY = 1,
99+ I915_ENGINE_CLASS_VIDEO = 2,
100+ I915_ENGINE_CLASS_VIDEO_ENHANCE = 3,
101+
102+ I915_ENGINE_CLASS_INVALID = -1
103+};
104+
89105 /* Each region is a minimum of 16k, and there are at most 255 of them.
90106 */
91107 #define I915_NR_TEX_REGIONS 255 /* table size 2k - maximum due to use
@@ -450,6 +466,27 @@ typedef struct drm_i915_irq_wait { · 358 unmodified lines
450466 */
451467 #define I915_PARAM_HAS_EXEC_FENCE_ARRAY 49
452468
469+/*
470+ * Query whether every context (both per-file default and user created) is
471+ * isolated (insofar as HW supports). If this parameter is not true, then
472+ * freshly created contexts may inherit values from an existing context,
473+ * rather than default HW values. If true, it also ensures (insofar as HW
474+ * supports) that all state set by this context will not leak to any other
475+ * context.
476+ *
477+ * As not every engine across every gen support contexts, the returned
478+ * value reports the support of context isolation for individual engines by
479+ * returning a bitmask of each engine class set to true if that class supports
480+ * isolation.
481+ */
482+#define I915_PARAM_HAS_CONTEXT_ISOLATION 50
483+
484+/* Frequency of the command streamer timestamps given by the *_TIMESTAMP
485+ * registers. This used to be fixed per platform but from CNL onwards, this
486+ * might vary depending on the parts.
487+ */
488+#define I915_PARAM_CS_TIMESTAMP_FREQUENCY 51
489+
453490 typedef struct drm_i915_getparam {
454491 __s32 param;
455492 /*