History

Merge drm/drm-next into drm-xe-next

Need to sync some header include that propagated through drm-intel-next. v2: After some changes in drm/drm-next

Rodrigo Vivi committed 2 years ago

Commit 8664e762 parents 33991ae 541b1b0616 files · +27860 −18095Browse files

Unified · Split

616 files
  1. Documentation/devicetree/bindings/display/panel/boe,tv101wum-nl6.yaml +0 −2
  2. Documentation/devicetree/bindings/display/panel/himax,hx83102.yaml +77 −0
  3. Documentation/devicetree/bindings/display/panel/panel-edp-legacy.yaml +117 −0
  4. Documentation/devicetree/bindings/display/panel/panel-mipi-dbi-spi.yaml +30 −0
  5. Documentation/devicetree/bindings/display/panel/panel-simple-lvds-dual-ports.yaml +6 −0
  6. Documentation/devicetree/bindings/display/panel/panel-simple.yaml +2 −56
  7. Documentation/devicetree/bindings/display/panel/samsung,atna33xc20.yaml +95 −0
  8. Documentation/devicetree/bindings/display/panel/sharp,ld-d5116z01b.yaml +0 −30
  9. Documentation/devicetree/bindings/display/panel/wl-355608-a8.yaml +60 −0
  10. Documentation/devicetree/bindings/display/rockchip/rockchip,dw-mipi-dsi.yaml +2 −0
  11. Documentation/devicetree/bindings/gpu/arm,mali-bifrost.yaml +4 −1
  12. Documentation/devicetree/bindings/vendor-prefixes.yaml +6 −0
  13. Documentation/gpu/drm-internals.rst +2 −8
  14. Documentation/gpu/drm-kms-helpers.rst +9 −3
  15. Documentation/gpu/i915.rst +1 −4
  16. Documentation/gpu/kms-properties.csv +0 −2
  17. Documentation/gpu/todo.rst +40 −30
  18. MAINTAINERS +6 −5
  19. arch/x86/kernel/early-quirks.c +42 −43
  20. drivers/accel/ivpu/Makefile +7 −4
  21. drivers/accel/ivpu/ivpu_debugfs.c +87 −2
  22. drivers/accel/ivpu/ivpu_drv.c +99 −14
  23. drivers/accel/ivpu/ivpu_drv.h +53 −9
  24. drivers/accel/ivpu/ivpu_fw.c +50 −11
  25. drivers/accel/ivpu/ivpu_fw.h +4 −0
  26. drivers/accel/ivpu/ivpu_gem.h +7 −4
  27. drivers/accel/ivpu/ivpu_hw.c +331 −0
  28. drivers/accel/ivpu/ivpu_hw.h +77 −122
  29. drivers/accel/ivpu/ivpu_hw_37xx.c +0 −1065
  30. drivers/accel/ivpu/ivpu_hw_37xx_reg.h +0 −72
  31. drivers/accel/ivpu/ivpu_hw_40xx.c +0 −1250
  32. drivers/accel/ivpu/ivpu_hw_40xx_reg.h +9 −85
  33. drivers/accel/ivpu/ivpu_hw_btrs.c +905 −0
  34. drivers/accel/ivpu/ivpu_hw_btrs.h +50 −0
  35. drivers/accel/ivpu/ivpu_hw_btrs_lnl_reg.h +108 −0
  36. drivers/accel/ivpu/ivpu_hw_btrs_mtl_reg.h +83 −0
  37. drivers/accel/ivpu/ivpu_hw_ip.c +1174 −0
  38. drivers/accel/ivpu/ivpu_hw_ip.h +36 −0
  39. drivers/accel/ivpu/ivpu_ipc.c +9 −11
  40. drivers/accel/ivpu/ivpu_ipc.h +5 −3
  41. drivers/accel/ivpu/ivpu_job.c +263 −61
  42. drivers/accel/ivpu/ivpu_job.h +5 −1
  43. drivers/accel/ivpu/ivpu_jsm_msg.c +294 −17
  44. drivers/accel/ivpu/ivpu_jsm_msg.h +21 −1
  45. drivers/accel/ivpu/ivpu_mmu.c +15 −7
  46. drivers/accel/ivpu/ivpu_mmu_context.c +86 −0
  47. drivers/accel/ivpu/ivpu_mmu_context.h +2 −0
  48. drivers/accel/ivpu/ivpu_ms.c +309 −0
  49. drivers/accel/ivpu/ivpu_ms.h +36 −0
  50. drivers/accel/ivpu/ivpu_pm.c +82 −29
  51. drivers/accel/ivpu/ivpu_pm.h +7 −3
  52. drivers/accel/ivpu/ivpu_sysfs.c +58 −0
  53. drivers/accel/ivpu/ivpu_sysfs.h +13 −0
  54. drivers/accel/ivpu/vpu_boot_api.h +14 −2
  55. drivers/accel/ivpu/vpu_jsm_api.h +11 −3
  56. drivers/char/agp/amd64-agp.c +1 −0
  57. drivers/char/agp/intel-agp.c +2 −1
  58. drivers/char/agp/intel-gtt.c +2 −1
  59. drivers/char/agp/sis-agp.c +1 −0
  60. drivers/char/agp/via-agp.c +1 −0
  61. drivers/dma-buf/dma-fence-array.c +4 −6
  62. drivers/dma-buf/dma-heap.c +2 −2
  63. drivers/dma-buf/dma-resv.c +7 −0
  64. drivers/dma-buf/heaps/cma_heap.c +2 −2
  65. drivers/dma-buf/heaps/system_heap.c +2 −2
  66. drivers/gpu/drm/Kconfig +15 −1
  67. drivers/gpu/drm/Makefile +3 −3
  68. drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c +0 −16
  69. drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.h +0 −1
  70. drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +3 −3
  71. drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c +2 −6
  72. drivers/gpu/drm/amd/amdgpu/dce_v10_0.c +2 −2
  73. drivers/gpu/drm/amd/amdgpu/dce_v11_0.c +2 −2
  74. drivers/gpu/drm/amd/amdgpu/dce_v6_0.c +2 −2
  75. drivers/gpu/drm/amd/amdgpu/dce_v8_0.c +2 −2
  76. drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +1 −1
  77. drivers/gpu/drm/arm/display/komeda/komeda_crtc.c +35 −14
  78. drivers/gpu/drm/arm/display/komeda/komeda_drv.c +6 −2
  79. drivers/gpu/drm/arm/display/komeda/komeda_kms.h +1 −0
  80. drivers/gpu/drm/arm/display/komeda/komeda_pipeline.c +2 −2
  81. drivers/gpu/drm/ast/ast_drv.c +2 −2
  82. drivers/gpu/drm/atmel-hlcdc/Kconfig +1 −1
  83. drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c +141 −31
  84. drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c +105 −0
  85. drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h +108 −24
  86. drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c +309 −60
  87. drivers/gpu/drm/bridge/adv7511/adv7511_drv.c +0 −5
  88. drivers/gpu/drm/bridge/analogix/analogix-anx6345.c +7 −13
  89. drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c +12 −16
  90. drivers/gpu/drm/bridge/analogix/analogix_dp_core.c +44 −128
  91. drivers/gpu/drm/bridge/analogix/analogix_dp_core.h +2 −20
  92. drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c +15 −104
  93. drivers/gpu/drm/bridge/analogix/anx7625.c +17 −19
  94. drivers/gpu/drm/bridge/analogix/anx7625.h +2 −8
  95. drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c +0 −5
  96. drivers/gpu/drm/bridge/imx/imx-ldb-helper.c +0 −5
  97. drivers/gpu/drm/bridge/imx/imx8qxp-pixel-combiner.c +0 −5
  98. drivers/gpu/drm/bridge/imx/imx8qxp-pixel-link.c +0 −5
  99. drivers/gpu/drm/bridge/imx/imx8qxp-pxl2dpi.c +0 −5
  100. drivers/gpu/drm/bridge/ite-it6505.c +50 −30
  101. drivers/gpu/drm/bridge/lontium-lt9611.c +1 −0
  102. drivers/gpu/drm/bridge/lontium-lt9611uxc.c +1 −5
  103. drivers/gpu/drm/bridge/megachips-stdpxxxx-ge-b850v3-fw.c +0 −5
  104. drivers/gpu/drm/bridge/nxp-ptn3460.c +0 −5
  105. drivers/gpu/drm/bridge/panel.c +0 −5
  106. drivers/gpu/drm/bridge/samsung-dsim.c +23 −2
  107. drivers/gpu/drm/bridge/sii902x.c +33 −13
  108. drivers/gpu/drm/bridge/sii9234.c +1 −0
  109. drivers/gpu/drm/bridge/sil-sii8620.c +1 −0
  110. drivers/gpu/drm/bridge/simple-bridge.c +1 −17
  111. drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c +0 −5
  112. drivers/gpu/drm/bridge/tc358767.c +22 −5
  113. drivers/gpu/drm/bridge/ti-tfp410.c +0 −5
  114. drivers/gpu/drm/ci/build-igt.sh +40 −1
  115. drivers/gpu/drm/ci/build.sh +7 −3
  116. drivers/gpu/drm/ci/build.yml +1 −0
  117. drivers/gpu/drm/ci/container.yml +4 −8
  118. drivers/gpu/drm/ci/gitlab-ci.yml +32 −15
  119. drivers/gpu/drm/ci/igt_runner.sh +8 −7
  120. drivers/gpu/drm/ci/image-tags.yml +2 −2
  121. drivers/gpu/drm/ci/lava-submit.sh +2 −2
  122. drivers/gpu/drm/ci/test.yml +33 −8
  123. drivers/gpu/drm/ci/testlist.txt +0 −2761
  124. drivers/gpu/drm/ci/x86_64.config +1 −0
  125. drivers/gpu/drm/ci/xfails/amdgpu-stoney-fails.txt +27 −14
  126. drivers/gpu/drm/ci/xfails/amdgpu-stoney-flakes.txt +7 −0
  127. drivers/gpu/drm/ci/xfails/amdgpu-stoney-skips.txt +32 −1
  128. drivers/gpu/drm/ci/xfails/i915-amly-fails.txt +31 −0
  129. drivers/gpu/drm/ci/xfails/i915-amly-flakes.txt +9 −0
  130. drivers/gpu/drm/ci/xfails/i915-amly-skips.txt +21 −1
  131. drivers/gpu/drm/ci/xfails/i915-apl-fails.txt +26 −20
  132. drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt +6 −0
  133. drivers/gpu/drm/ci/xfails/i915-apl-skips.txt +25 −1
  134. drivers/gpu/drm/ci/xfails/i915-cml-fails.txt +38 −0
  135. drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt +6 −0
  136. drivers/gpu/drm/ci/xfails/i915-cml-skips.txt +23 −0
  137. drivers/gpu/drm/ci/xfails/i915-glk-fails.txt +34 −7
  138. drivers/gpu/drm/ci/xfails/i915-glk-flakes.txt +7 −0
  139. drivers/gpu/drm/ci/xfails/i915-glk-skips.txt +25 −1
  140. drivers/gpu/drm/ci/xfails/i915-kbl-fails.txt +19 −23
  141. drivers/gpu/drm/ci/xfails/i915-kbl-flakes.txt +6 −1
  142. drivers/gpu/drm/ci/xfails/i915-kbl-skips.txt +35 −1
  143. drivers/gpu/drm/ci/xfails/i915-tgl-fails.txt +42 −35
  144. drivers/gpu/drm/ci/xfails/i915-tgl-skips.txt +27 −1
  145. drivers/gpu/drm/ci/xfails/i915-whl-fails.txt +40 −23
  146. drivers/gpu/drm/ci/xfails/i915-whl-flakes.txt +6 −0
  147. drivers/gpu/drm/ci/xfails/i915-whl-skips.txt +21 −1
  148. drivers/gpu/drm/ci/xfails/mediatek-mt8173-fails.txt +12 −18
  149. drivers/gpu/drm/ci/xfails/mediatek-mt8173-flakes.txt +11 −0
  150. drivers/gpu/drm/ci/xfails/mediatek-mt8173-skips.txt +16 −0
  151. drivers/gpu/drm/ci/xfails/mediatek-mt8183-fails.txt +8 −13
  152. drivers/gpu/drm/ci/xfails/mediatek-mt8183-skips.txt +18 −0
  153. drivers/gpu/drm/ci/xfails/meson-g12b-fails.txt +8 −16
  154. drivers/gpu/drm/ci/xfails/meson-g12b-skips.txt +18 −0
  155. drivers/gpu/drm/ci/xfails/msm-apq8016-fails.txt +11 −15
  156. drivers/gpu/drm/ci/xfails/msm-apq8016-skips.txt +15 −0
  157. drivers/gpu/drm/ci/xfails/msm-apq8096-fails.txt +7 −1
  158. drivers/gpu/drm/ci/xfails/msm-apq8096-flakes.txt +6 −0
  159. drivers/gpu/drm/ci/xfails/msm-apq8096-skips.txt +25 −1
  160. drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-fails.txt +174 −1
  161. drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-flakes.txt +8 −0
  162. drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-skips.txt +19 −0
  163. drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-lazor-limozeen-fails.txt +174 −1
  164. drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-lazor-limozeen-flakes.txt +6 −0
  165. drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-lazor-limozeen-skips.txt +16 −0
  166. drivers/gpu/drm/ci/xfails/msm-sdm845-fails.txt +7 −31
  167. drivers/gpu/drm/ci/xfails/msm-sdm845-flakes.txt +11 −14
  168. drivers/gpu/drm/ci/xfails/msm-sdm845-skips.txt +19 −0
  169. drivers/gpu/drm/ci/xfails/rockchip-rk3288-fails.txt +8 −54
  170. drivers/gpu/drm/ci/xfails/rockchip-rk3288-skips.txt +20 −1
  171. drivers/gpu/drm/ci/xfails/rockchip-rk3399-fails.txt +8 −75
  172. drivers/gpu/drm/ci/xfails/rockchip-rk3399-flakes.txt +6 −7
  173. drivers/gpu/drm/ci/xfails/rockchip-rk3399-skips.txt +19 −0
  174. drivers/gpu/drm/ci/xfails/update-xfails.py +2 −2
  175. drivers/gpu/drm/ci/xfails/virtio_gpu-none-fails.txt +68 −26
  176. drivers/gpu/drm/ci/xfails/virtio_gpu-none-skips.txt +19 −1
  177. drivers/gpu/drm/ci/xfails/vkms-none-fails.txt +57 −0
  178. drivers/gpu/drm/ci/xfails/vkms-none-flakes.txt +69 −0
  179. drivers/gpu/drm/ci/xfails/vkms-none-skips.txt +119 −0
  180. drivers/gpu/drm/display/Kconfig +7 −0
  181. drivers/gpu/drm/display/Makefile +2 −0
  182. drivers/gpu/drm/display/drm_hdmi_helper.c +61 −0
  183. drivers/gpu/drm/display/drm_hdmi_state_helper.c +752 −0
  184. drivers/gpu/drm/drm_atomic.c +11 −0
  185. drivers/gpu/drm/drm_atomic_uapi.c +4 −0
  186. drivers/gpu/drm/drm_bridge.c +0 −42
  187. drivers/gpu/drm/drm_bridge_connector.c +91 −16
  188. drivers/gpu/drm/drm_connector.c +201 −0
  189. drivers/gpu/drm/drm_crtc_internal.h +2 −0
  190. drivers/gpu/drm/drm_debugfs.c +156 −2
  191. drivers/gpu/drm/drm_drv.c +3 −3
  192. drivers/gpu/drm/drm_edid.c +33 −28
  193. drivers/gpu/drm/drm_fb_helper.c +2 −9
  194. drivers/gpu/drm/drm_fbdev_dma.c +52 −14
  195. drivers/gpu/drm/drm_fbdev_shmem.c +317 −0
  196. drivers/gpu/drm/drm_fbdev_ttm.c +40 −40
  197. drivers/gpu/drm/drm_ioctl.c +3 −2
  198. drivers/gpu/drm/drm_mipi_dbi.c +54 −23
  199. drivers/gpu/drm/drm_mipi_dsi.c +322 −0
  200. drivers/gpu/drm/drm_mm.c +0 −35
  201. drivers/gpu/drm/drm_mode_object.c +1 −0
  202. drivers/gpu/drm/drm_modes.c +4 −1
  203. drivers/gpu/drm/drm_panel_orientation_quirks.c +1 −0
  204. drivers/gpu/drm/drm_panic.c +200 −84
  205. drivers/gpu/drm/drm_print.c +30 −42
  206. drivers/gpu/drm/drm_probe_helper.c +7 −6
  207. drivers/gpu/drm/drm_simple_kms_helper.c +1 −0
  208. drivers/gpu/drm/drm_sysfs.c +2 −22
  209. drivers/gpu/drm/gma500/cdv_intel_dp.c +1 −1
  210. drivers/gpu/drm/gud/gud_drv.c +3 −2
  211. drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c +2 −2
  212. drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c +10 −7
  213. drivers/gpu/drm/hisilicon/kirin/Kconfig +1 −1
  214. drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c +5 −6
  215. drivers/gpu/drm/hisilicon/kirin/dw_dsi_reg.h +2 −0
  216. drivers/gpu/drm/hisilicon/kirin/kirin_ade_reg.h +1 −1
  217. drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c +2 −2
  218. drivers/gpu/drm/hyperv/hyperv_drm_drv.c +2 −2
  219. drivers/gpu/drm/i2c/tda998x_drv.c +10 −9
  220. drivers/gpu/drm/i915/Kconfig +0 −1
  221. drivers/gpu/drm/i915/Makefile +3 −24
  222. drivers/gpu/drm/i915/display/dvo_ns2501.c +0 −1
  223. drivers/gpu/drm/i915/display/g4x_dp.c +16 −21
  224. drivers/gpu/drm/i915/display/i9xx_plane.c +58 −46
  225. drivers/gpu/drm/i915/display/i9xx_plane_regs.h +112 −0
  226. drivers/gpu/drm/i915/display/i9xx_wm.c +57 −57
  227. drivers/gpu/drm/i915/display/icl_dsi.c +29 −17
  228. drivers/gpu/drm/i915/display/intel_alpm.c +414 −0
  229. drivers/gpu/drm/i915/display/intel_alpm.h +27 −0
  230. drivers/gpu/drm/i915/display/intel_atomic.c +0 −1
  231. drivers/gpu/drm/i915/display/intel_atomic_plane.c +44 −18
  232. drivers/gpu/drm/i915/display/intel_atomic_plane.h +1 −0
  233. drivers/gpu/drm/i915/display/intel_audio.c +16 −1
  234. drivers/gpu/drm/i915/display/intel_audio_regs.h +3 −0
  235. drivers/gpu/drm/i915/display/intel_bios.c +129 −114
  236. drivers/gpu/drm/i915/display/intel_bw.c +63 −2
  237. drivers/gpu/drm/i915/display/intel_cdclk.c +51 −79
  238. drivers/gpu/drm/i915/display/intel_color.c +88 −55
  239. drivers/gpu/drm/i915/display/intel_color.h +3 −1
  240. drivers/gpu/drm/i915/display/intel_color_regs.h +5 −0
  241. drivers/gpu/drm/i915/display/intel_crt.c +31 −19
  242. drivers/gpu/drm/i915/display/intel_crtc.c +6 −9
  243. drivers/gpu/drm/i915/display/intel_crtc_state_dump.c +8 −7
  244. drivers/gpu/drm/i915/display/intel_cursor.c +80 −22
  245. drivers/gpu/drm/i915/display/intel_cursor_regs.h +112 −0
  246. drivers/gpu/drm/i915/display/intel_cx0_phy.c +323 −45
  247. drivers/gpu/drm/i915/display/intel_cx0_phy.h +4 −4
  248. drivers/gpu/drm/i915/display/intel_cx0_phy_regs.h +40 −8
  249. drivers/gpu/drm/i915/display/intel_ddi.c +65 −64
  250. drivers/gpu/drm/i915/display/intel_display.c +466 −357
  251. drivers/gpu/drm/i915/display/intel_display.h +8 −5
  252. drivers/gpu/drm/i915/display/intel_display_debugfs.c +8 −4
  253. drivers/gpu/drm/i915/display/intel_display_device.c +654 −283
  254. drivers/gpu/drm/i915/display/intel_display_device.h +88 −1
  255. drivers/gpu/drm/i915/display/intel_display_irq.c +29 −17
  256. drivers/gpu/drm/i915/display/intel_display_limits.h +14 −7
  257. drivers/gpu/drm/i915/display/intel_display_params.c +1 −1
  258. drivers/gpu/drm/i915/display/intel_display_power.c +12 −8
  259. drivers/gpu/drm/i915/display/intel_display_power_well.c +7 −7
  260. drivers/gpu/drm/i915/display/intel_display_types.h +62 −25
  261. drivers/gpu/drm/i915/display/intel_dkl_phy.c +0 −1
  262. drivers/gpu/drm/i915/display/intel_dmc.c +14 −7
  263. drivers/gpu/drm/i915/display/intel_dmc.h +3 −3
  264. drivers/gpu/drm/i915/display/intel_dp.c +248 −166
  265. drivers/gpu/drm/i915/display/intel_dp.h +15 −9
  266. drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c +130 −19
  267. drivers/gpu/drm/i915/display/intel_dp_aux_regs.h +14 −4
  268. drivers/gpu/drm/i915/display/intel_dp_hdcp.c +3 −2
  269. drivers/gpu/drm/i915/display/intel_dp_link_training.c +527 −11
  270. drivers/gpu/drm/i915/display/intel_dp_link_training.h +7 −1
  271. drivers/gpu/drm/i915/display/intel_dp_mst.c +48 −36
  272. drivers/gpu/drm/i915/display/intel_dpll.c +34 −29
  273. drivers/gpu/drm/i915/display/intel_dpll_mgr.h +1 −0
  274. drivers/gpu/drm/i915/display/intel_dpt.c +5 −4
  275. drivers/gpu/drm/i915/display/intel_dpt.h +3 −2
  276. drivers/gpu/drm/i915/display/intel_dpt_common.c +1 −0
  277. drivers/gpu/drm/i915/display/intel_drrs.c +4 −4
  278. drivers/gpu/drm/i915/display/intel_dsb.c +10 −21
  279. drivers/gpu/drm/i915/display/intel_dsb.h +9 −0
  280. drivers/gpu/drm/i915/display/intel_dsi_vbt.c +3 −3
  281. drivers/gpu/drm/i915/display/intel_dvo.c +3 −2
  282. drivers/gpu/drm/i915/display/intel_encoder.c +39 −0
  283. drivers/gpu/drm/i915/display/intel_encoder.h +16 −0
  284. drivers/gpu/drm/i915/display/intel_fb.c +30 −15
  285. drivers/gpu/drm/i915/display/intel_fb_pin.c +35 −40
  286. drivers/gpu/drm/i915/display/intel_fb_pin.h +6 −6
  287. drivers/gpu/drm/i915/display/intel_fbc.c +16 −22
  288. drivers/gpu/drm/i915/display/intel_fbdev.c +21 −19
  289. drivers/gpu/drm/i915/display/intel_fbdev_fb.c +3 −3
  290. drivers/gpu/drm/i915/display/intel_fbdev_fb.h +2 −2
  291. drivers/gpu/drm/i915/display/intel_fdi.c +8 −7
  292. drivers/gpu/drm/i915/display/intel_fifo_underrun.c +8 −5
  293. drivers/gpu/drm/i915/display/intel_frontbuffer.c +2 −0
  294. drivers/gpu/drm/i915/display/intel_hdcp.c +26 −1
  295. drivers/gpu/drm/i915/display/intel_hdcp_gsc.c +1 −1
  296. drivers/gpu/drm/i915/display/intel_hdcp_gsc_message.c +1 −1
  297. drivers/gpu/drm/i915/display/intel_hdmi.c +23 −18
  298. drivers/gpu/drm/i915/display/intel_hotplug_irq.c +8 −4
  299. drivers/gpu/drm/i915/display/intel_lpe_audio.c +1 −1
  300. drivers/gpu/drm/i915/display/intel_lspcon.c +1 −1
  301. drivers/gpu/drm/i915/display/intel_lvds.c +16 −15
  302. drivers/gpu/drm/i915/display/intel_modeset_setup.c +30 −30
  303. drivers/gpu/drm/i915/display/intel_modeset_verify.c +4 −4
  304. drivers/gpu/drm/i915/display/intel_overlay.c +11 −10
  305. drivers/gpu/drm/i915/display/intel_overlay.h +3 −3
  306. drivers/gpu/drm/i915/display/intel_panel.c +1 −1
  307. drivers/gpu/drm/i915/display/intel_pch_display.c +11 −10
  308. drivers/gpu/drm/i915/display/intel_pipe_crc.c +11 −10
  309. drivers/gpu/drm/i915/display/intel_pipe_crc_regs.h +152 −0
  310. drivers/gpu/drm/i915/display/intel_pps.c +16 −16
  311. drivers/gpu/drm/i915/display/intel_pps_regs.h +8 −8
  312. drivers/gpu/drm/i915/display/intel_psr.c +448 −521
  313. drivers/gpu/drm/i915/display/intel_psr_regs.h +27 −66
  314. drivers/gpu/drm/i915/display/intel_sprite.c +0 −1
  315. drivers/gpu/drm/i915/display/intel_sprite_regs.h +141 −101
  316. drivers/gpu/drm/i915/display/intel_sprite_uapi.c +1 −1
  317. drivers/gpu/drm/i915/display/intel_tdf.h +25 −0
  318. drivers/gpu/drm/i915/display/intel_vblank.c +82 −87
  319. drivers/gpu/drm/i915/display/intel_vblank.h +5 −0
  320. drivers/gpu/drm/i915/display/intel_vbt_defs.h +642 −87
  321. drivers/gpu/drm/i915/display/intel_vdsc.c +9 −10
  322. drivers/gpu/drm/i915/display/intel_vdsc_regs.h +3 −3
  323. drivers/gpu/drm/i915/display/intel_vrr.c +148 −34
  324. drivers/gpu/drm/i915/display/intel_vrr_regs.h +127 −0
  325. drivers/gpu/drm/i915/display/skl_universal_plane.c +141 −65
  326. drivers/gpu/drm/i915/display/skl_universal_plane.h +2 −0
  327. drivers/gpu/drm/i915/display/skl_universal_plane_regs.h +442 −0
  328. drivers/gpu/drm/i915/display/skl_watermark.c +26 −108
  329. drivers/gpu/drm/i915/display/skl_watermark.h +8 −5
  330. drivers/gpu/drm/i915/display/skl_watermark_regs.h +0 −83
  331. drivers/gpu/drm/i915/display/vlv_dsi.c +2 −1
  332. drivers/gpu/drm/i915/gem/i915_gem_stolen.c +1 −1
  333. drivers/gpu/drm/i915/gt/intel_ggtt.c +2 −2
  334. drivers/gpu/drm/i915/gt/intel_ggtt_gmch.c +1 −1
  335. drivers/gpu/drm/i915/gt/intel_gt.c +1 −1
  336. drivers/gpu/drm/i915/gt/intel_gt_clock_utils.c +2 −1
  337. drivers/gpu/drm/i915/gt/intel_gt_pm_debugfs.c +0 −1
  338. drivers/gpu/drm/i915/gt/intel_reset.c +1 −1
  339. drivers/gpu/drm/i915/gt/intel_rps.c +7 −6
  340. drivers/gpu/drm/i915/gt/selftest_context.c +1 −1
  341. drivers/gpu/drm/i915/gt/uc/intel_gsc_proxy.c +2 −2
  342. drivers/gpu/drm/i915/gvt/cmd_parser.c +8 −7
  343. drivers/gpu/drm/i915/gvt/display.c +39 −34
  344. drivers/gpu/drm/i915/gvt/dmabuf.c +2 −1
  345. drivers/gpu/drm/i915/gvt/fb_decoder.c +13 −10
  346. drivers/gpu/drm/i915/gvt/handlers.c +84 −79
  347. drivers/gpu/drm/i915/gvt/kvmgt.c +1 −0
  348. drivers/gpu/drm/i915/gvt/reg.h +0 −3
  349. drivers/gpu/drm/i915/i915_drv.h +10 −1
  350. drivers/gpu/drm/i915/i915_gpu_error.c +3 −2
  351. drivers/gpu/drm/i915/i915_irq.c +3 −2
  352. drivers/gpu/drm/i915/i915_pci.c +76 −75
  353. drivers/gpu/drm/i915/i915_reg.h +72 −855
  354. drivers/gpu/drm/i915/i915_suspend.c +32 −16
  355. drivers/gpu/drm/i915/intel_clock_gating.c +7 −7
  356. drivers/gpu/drm/i915/intel_device_info.c +46 −46
  357. drivers/gpu/drm/i915/intel_gvt_mmio_table.c +178 −175
  358. drivers/gpu/drm/i915/intel_pci_config.h +1 −1
  359. drivers/gpu/drm/i915/pxp/intel_pxp_tee.c +2 −2
  360. drivers/gpu/drm/i915/soc/intel_dram.c +132 −84
  361. drivers/gpu/drm/i915/soc/intel_dram.h +1 −0
  362. drivers/gpu/drm/i915/soc/intel_gmch.c +1 −1
  363. drivers/gpu/drm/i915/soc/intel_pch.c +2 −2
  364. drivers/gpu/drm/imx/ipuv3/imx-ldb.c +12 −12
  365. drivers/gpu/drm/imx/ipuv3/imx-tve.c +6 −8
  366. drivers/gpu/drm/imx/lcdc/imx-lcdc.c +2 −2
  367. drivers/gpu/drm/ingenic/ingenic-drm-drv.c +2 −2
  368. drivers/gpu/drm/loongson/Kconfig +1 −0
  369. drivers/gpu/drm/loongson/lsdc_drv.c +2 −2
  370. drivers/gpu/drm/loongson/lsdc_output_7a1000.c +7 −8
  371. drivers/gpu/drm/loongson/lsdc_output_7a2000.c +7 −8
  372. drivers/gpu/drm/mediatek/mtk_drm_drv.c +2 −2
  373. drivers/gpu/drm/mediatek/mtk_hdmi.c +0 −11
  374. drivers/gpu/drm/meson/meson_plane.c +11 −6
  375. drivers/gpu/drm/mgag200/Kconfig +8 −10
  376. drivers/gpu/drm/mgag200/Makefile +3 −2
  377. drivers/gpu/drm/mgag200/mgag200_bmc.c +107 −0
  378. drivers/gpu/drm/mgag200/mgag200_ddc.c +179 −0
  379. drivers/gpu/drm/mgag200/mgag200_ddc.h +11 −0
  380. drivers/gpu/drm/mgag200/mgag200_drv.c +8 −19
  381. drivers/gpu/drm/mgag200/mgag200_drv.h +17 −29
  382. drivers/gpu/drm/mgag200/mgag200_g200.c +3 −43
  383. drivers/gpu/drm/mgag200/mgag200_g200eh.c +5 −41
  384. drivers/gpu/drm/mgag200/mgag200_g200eh3.c +5 −41
  385. drivers/gpu/drm/mgag200/mgag200_g200er.c +5 −41
  386. drivers/gpu/drm/mgag200/mgag200_g200ev.c +5 −41
  387. drivers/gpu/drm/mgag200/mgag200_g200ew3.c +5 −41
  388. drivers/gpu/drm/mgag200/mgag200_g200se.c +5 −41
  389. drivers/gpu/drm/mgag200/mgag200_g200wb.c +5 −41
  390. drivers/gpu/drm/mgag200/mgag200_i2c.c +0 −129
  391. drivers/gpu/drm/mgag200/mgag200_mode.c +1 −34
  392. drivers/gpu/drm/mgag200/mgag200_vga.c +72 −0
  393. drivers/gpu/drm/nouveau/dispnv50/disp.c +4 −4
  394. drivers/gpu/drm/nouveau/dispnv50/head.c +1 −7
  395. drivers/gpu/drm/nouveau/include/nvkm/subdev/gsp.h +6 −0
  396. drivers/gpu/drm/nouveau/nouveau_bo.c +1 −1
  397. drivers/gpu/drm/nouveau/nouveau_chan.c +1 −1
  398. drivers/gpu/drm/nouveau/nouveau_connector.c +1 −1
  399. drivers/gpu/drm/nouveau/nouveau_dmem.c +1 −1
  400. drivers/gpu/drm/nouveau/nouveau_drm.c +3 −3
  401. drivers/gpu/drm/nouveau/nouveau_exec.c +1 −1
  402. drivers/gpu/drm/nouveau/nouveau_fence.c +1 −29
  403. drivers/gpu/drm/nouveau/nouveau_fence.h +1 −1
  404. drivers/gpu/drm/nouveau/nouveau_gem.c +1 −1
  405. drivers/gpu/drm/nouveau/nouveau_sched.h +2 −2
  406. drivers/gpu/drm/nouveau/nouveau_uvmm.c +1 −1
  407. drivers/gpu/drm/nouveau/nvkm/subdev/gsp/r535.c +338 −24
  408. drivers/gpu/drm/omapdrm/Kconfig +1 −1
  409. drivers/gpu/drm/omapdrm/omap_gem.c +2 −2
  410. drivers/gpu/drm/panel/Kconfig +9 −0
  411. drivers/gpu/drm/panel/Makefile +1 −0
  412. drivers/gpu/drm/panel/panel-abt-y030xx067a.c +1 −0
  413. drivers/gpu/drm/panel/panel-auo-a030jtn01.c +1 −0
  414. drivers/gpu/drm/panel/panel-boe-himax8279d.c +0 −40
  415. drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c +1327 −1430
  416. drivers/gpu/drm/panel/panel-edp.c +56 −204
  417. drivers/gpu/drm/panel/panel-himax-hx83102.c +706 −0
  418. drivers/gpu/drm/panel/panel-himax-hx8394.c +1 −2
  419. drivers/gpu/drm/panel/panel-ilitek-ili9341.c +4 −3
  420. drivers/gpu/drm/panel/panel-ilitek-ili9882t.c +375 −455
  421. drivers/gpu/drm/panel/panel-innolux-ej030na.c +1 −0
  422. drivers/gpu/drm/panel/panel-innolux-p079zca.c +133 −199
  423. drivers/gpu/drm/panel/panel-jdi-lt070me05000.c +0 −35
  424. drivers/gpu/drm/panel/panel-khadas-ts050.c +0 −39
  425. drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c +0 −48
  426. drivers/gpu/drm/panel/panel-leadtek-ltk050h3146w.c +0 −28
  427. drivers/gpu/drm/panel/panel-leadtek-ltk500hd1829.c +0 −28
  428. drivers/gpu/drm/panel/panel-lg-sw43408.c +37 −37
  429. drivers/gpu/drm/panel/panel-newvision-nv3052c.c +226 −0
  430. drivers/gpu/drm/panel/panel-novatek-nt36672a.c +0 −29
  431. drivers/gpu/drm/panel/panel-novatek-nt36672e.c +310 −337
  432. drivers/gpu/drm/panel/panel-novatek-nt39016.c +1 −0
  433. drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c +0 −44
  434. drivers/gpu/drm/panel/panel-orisetech-ota5601a.c +1 −0
  435. drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c +1 −40
  436. drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c +1 −46
  437. drivers/gpu/drm/panel/panel-raydium-rm67191.c +0 −26
  438. drivers/gpu/drm/panel/panel-raydium-rm692e5.c +0 −10
  439. drivers/gpu/drm/panel/panel-samsung-atna33xc20.c +0 −36
  440. drivers/gpu/drm/panel/panel-seiko-43wvf1g.c +0 −49
  441. drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c +2 −61
  442. drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c +0 −24
  443. drivers/gpu/drm/panel/panel-simple.c +148 −37
  444. drivers/gpu/drm/panel/panel-sitronix-st7703.c +7 −28
  445. drivers/gpu/drm/panel/panel-sony-acx565akm.c +0 −6
  446. drivers/gpu/drm/panel/panel-tdo-tl070wsh30.c +0 −23
  447. drivers/gpu/drm/panel/panel-xinpeng-xpp055c272.c +0 −28
  448. drivers/gpu/drm/panfrost/panfrost_drv.c +10 −0
  449. drivers/gpu/drm/qxl/qxl_drv.c +2 −2
  450. drivers/gpu/drm/radeon/atombios_encoders.c +5 −5
  451. drivers/gpu/drm/radeon/evergreen_hdmi.c +2 −3
  452. drivers/gpu/drm/radeon/radeon_audio.c +7 −6
  453. drivers/gpu/drm/radeon/radeon_connectors.c +6 −21
  454. drivers/gpu/drm/radeon/radeon_display.c +1 −1
  455. drivers/gpu/drm/radeon/radeon_encoders.c +2 −2
  456. drivers/gpu/drm/radeon/radeon_mode.h +0 −2
  457. drivers/gpu/drm/renesas/rcar-du/Kconfig +1 −1
  458. drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c +2 −2
  459. drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c +2 −2
  460. drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c +2 −2
  461. drivers/gpu/drm/rockchip/Kconfig +3 −0
  462. drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c +20 −0
  463. drivers/gpu/drm/rockchip/inno_hdmi.c +53 −99
  464. drivers/gpu/drm/rockchip/rockchip_drm_drv.c +2 −2
  465. drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +1 −1
  466. drivers/gpu/drm/solomon/ssd130x.c +2 −2
  467. drivers/gpu/drm/sti/Kconfig +1 −1
  468. drivers/gpu/drm/sti/sti_dvo.c +1 −0
  469. drivers/gpu/drm/stm/Kconfig +1 −1
  470. drivers/gpu/drm/sun4i/Kconfig +3 −0
  471. drivers/gpu/drm/sun4i/sun4i_backend.c +3 −1
  472. drivers/gpu/drm/sun4i/sun4i_crtc.c +1 −1
  473. drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c +53 −30
  474. drivers/gpu/drm/sun4i/sun8i_mixer.c +67 −3
  475. drivers/gpu/drm/sun4i/sun8i_mixer.h +20 −0
  476. drivers/gpu/drm/sun4i/sun8i_ui_layer.c +8 −77
  477. drivers/gpu/drm/sun4i/sun8i_ui_layer.h +4 −16
  478. drivers/gpu/drm/sun4i/sun8i_vi_layer.c +8 −78
  479. drivers/gpu/drm/sun4i/sun8i_vi_layer.h +4 −16
  480. drivers/gpu/drm/sun4i/sunxi_engine.h +10 −3
  481. drivers/gpu/drm/tests/Makefile +1 −0
  482. drivers/gpu/drm/tests/drm_buddy_test.c +1 −0
  483. drivers/gpu/drm/tests/drm_cmdline_parser_test.c +1 −0
  484. drivers/gpu/drm/tests/drm_connector_test.c +1051 −1
  485. drivers/gpu/drm/tests/drm_damage_helper_test.c +1 −0
  486. drivers/gpu/drm/tests/drm_dp_mst_helper_test.c +1 −0
  487. drivers/gpu/drm/tests/drm_exec_test.c +1 −0
  488. drivers/gpu/drm/tests/drm_format_test.c +1 −0
  489. drivers/gpu/drm/tests/drm_framebuffer_test.c +1 −0
  490. drivers/gpu/drm/tests/drm_gem_shmem_test.c +1 −0
  491. drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c +1743 −0
  492. drivers/gpu/drm/tests/drm_kunit_edid.h +484 −0
  493. drivers/gpu/drm/tests/drm_kunit_helpers.c +1 −0
  494. drivers/gpu/drm/tests/drm_managed_test.c +1 −0
  495. drivers/gpu/drm/tests/drm_mm_test.c +1 −0
  496. drivers/gpu/drm/tests/drm_modes_test.c +1 −0
  497. drivers/gpu/drm/tests/drm_plane_helper_test.c +1 −0
  498. drivers/gpu/drm/tests/drm_probe_helper_test.c +1 −0
  499. drivers/gpu/drm/tests/drm_rect_test.c +1 −0
  500. drivers/gpu/drm/tidss/tidss_plane.c +13 −1
  501. drivers/gpu/drm/tiny/bochs.c +13 −15
  502. drivers/gpu/drm/tiny/cirrus.c +3 −2
  503. drivers/gpu/drm/tiny/gm12u320.c +3 −2
  504. drivers/gpu/drm/tiny/hx8357d.c +2 −2
  505. drivers/gpu/drm/tiny/ili9163.c +2 −2
  506. drivers/gpu/drm/tiny/ili9225.c +2 −3
  507. drivers/gpu/drm/tiny/ili9341.c +2 −2
  508. drivers/gpu/drm/tiny/ili9486.c +2 −2
  509. drivers/gpu/drm/tiny/mi0283qt.c +2 −3
  510. drivers/gpu/drm/tiny/ofdrm.c +2 −2
  511. drivers/gpu/drm/tiny/panel-mipi-dbi.c +56 −4
  512. drivers/gpu/drm/tiny/repaper.c +2 −2
  513. drivers/gpu/drm/tiny/simpledrm.c +2 −2
  514. drivers/gpu/drm/tiny/st7586.c +2 −3
  515. drivers/gpu/drm/tiny/st7735r.c +2 −2
  516. drivers/gpu/drm/udl/Makefile +7 −1
  517. drivers/gpu/drm/udl/udl_drv.c +3 −2
  518. drivers/gpu/drm/udl/udl_drv.h +1 −11
  519. drivers/gpu/drm/udl/udl_edid.c +80 −0
  520. drivers/gpu/drm/udl/udl_edid.h +15 −0
  521. drivers/gpu/drm/udl/udl_modeset.c +29 −109
  522. drivers/gpu/drm/v3d/v3d_drv.c +11 −0
  523. drivers/gpu/drm/v3d/v3d_drv.h +10 −1
  524. drivers/gpu/drm/v3d/v3d_perfmon.c +227 −1
  525. drivers/gpu/drm/v3d/v3d_performance_counters.h +29 −0
  526. drivers/gpu/drm/v3d/v3d_sched.c +1 −1
  527. drivers/gpu/drm/vboxvideo/vbox_drv.c +2 −2
  528. drivers/gpu/drm/vc4/Kconfig +1 −0
  529. drivers/gpu/drm/vc4/tests/vc4_mock.c +2 −4
  530. drivers/gpu/drm/vc4/tests/vc4_mock.h +2 −7
  531. drivers/gpu/drm/vc4/tests/vc4_mock_plane.c +11 −33
  532. drivers/gpu/drm/vc4/vc4_hdmi.c +79 −565
  533. drivers/gpu/drm/vc4/vc4_hdmi.h +9 −35
  534. drivers/gpu/drm/vc4/vc4_hdmi_phy.c +3 −3
  535. drivers/gpu/drm/virtio/virtgpu_display.c +4 −6
  536. drivers/gpu/drm/virtio/virtgpu_drv.c +2 −2
  537. drivers/gpu/drm/virtio/virtgpu_drv.h +1 −1
  538. drivers/gpu/drm/virtio/virtgpu_vq.c +6 −6
  539. drivers/gpu/drm/vkms/vkms_drv.c +2 −2
  540. drivers/gpu/drm/vmwgfx/vmwgfx_drv.c +2 −2
  541. drivers/gpu/drm/vmwgfx/vmwgfx_vkms.c +0 −1
  542. drivers/gpu/drm/xe/Makefile +4 −1
  543. drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_object_types.h +11 −0
  544. drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_stolen.h +0 −0
  545. drivers/gpu/drm/xe/compat-i915-headers/gt/intel_gt_types.h +0 −0
  546. drivers/gpu/drm/xe/compat-i915-headers/i915_drv.h +1 −66
  547. drivers/gpu/drm/xe/compat-i915-headers/intel_runtime_pm.h +51 −0
  548. drivers/gpu/drm/xe/compat-i915-headers/intel_uncore.h +5 −0
  549. drivers/gpu/drm/xe/display/ext/i915_irq.c +0 −1
  550. drivers/gpu/drm/xe/display/intel_fb_bo.c +4 −3
  551. drivers/gpu/drm/xe/display/intel_fbdev_fb.c +18 −19
  552. drivers/gpu/drm/xe/display/intel_fbdev_fb.h +0 −21
  553. drivers/gpu/drm/xe/display/xe_display.c +0 −3
  554. drivers/gpu/drm/xe/display/xe_dsb_buffer.c +4 −5
  555. drivers/gpu/drm/xe/display/xe_fb_pin.c +12 −12
  556. drivers/gpu/drm/xe/display/xe_hdcp_gsc.c +1 −1
  557. drivers/gpu/drm/xe/display/xe_plane_initial.c +11 −12
  558. drivers/gpu/drm/xe/display/xe_tdf.c +13 −0
  559. drivers/gpu/drm/xe/regs/xe_gt_regs.h +3 −0
  560. drivers/gpu/drm/xe/xe_device.c +49 −0
  561. drivers/gpu/drm/xe/xe_device.h +2 −0
  562. drivers/gpu/drm/xe/xe_device_types.h +1 −5
  563. drivers/gpu/drm/xe/xe_ggtt.c +1 −1
  564. drivers/gpu/drm/xe/xe_gsc_proxy.c +2 −2
  565. drivers/gpu/drm/xe/xe_gt_printk.h +3 −0
  566. drivers/gpu/drm/xe/xe_pci.c +2 −1
  567. drivers/gpu/drm/xlnx/zynqmp_disp.c +19 −25
  568. drivers/gpu/drm/xlnx/zynqmp_dp.c +27 −35
  569. drivers/gpu/drm/xlnx/zynqmp_dpsub.c +1 −0
  570. drivers/gpu/drm/xlnx/zynqmp_dpsub.h +1 −0
  571. drivers/gpu/drm/xlnx/zynqmp_kms.c +16 −6
  572. drivers/gpu/drm/xlnx/zynqmp_kms.h +2 −2
  573. drivers/misc/mei/gsc_proxy/mei_gsc_proxy.c +2 −2
  574. drivers/misc/mei/hdcp/mei_hdcp.c +2 −2
  575. drivers/misc/mei/pxp/mei_pxp.c +2 −2
  576. drivers/platform/x86/intel_ips.c +1 −1
  577. drivers/video/fbdev/core/fb_defio.c +55 −27
  578. include/drm/display/drm_dp.h +24 −4
  579. include/drm/display/drm_dp_helper.h +2 −1
  580. include/drm/display/drm_hdmi_helper.h +4 −0
  581. include/drm/display/drm_hdmi_state_helper.h +23 −0
  582. include/drm/drm_bridge.h +81 −3
  583. include/drm/drm_connector.h +251 −1
  584. include/drm/drm_drv.h +1 −1
  585. include/drm/drm_edid.h +0 −4
  586. include/drm/drm_fbdev_generic.h +0 −15
  587. include/drm/drm_fbdev_shmem.h +15 −0
  588. include/drm/drm_fbdev_ttm.h +15 −0
  589. include/drm/drm_mipi_dbi.h +10 −0
  590. include/drm/drm_mipi_dsi.h +104 −18
  591. include/drm/drm_mm.h +0 −1
  592. include/drm/drm_mode_config.h +2 −2
  593. include/drm/drm_panic.h +9 −0
  594. include/drm/drm_print.h +7 −7
  595. include/drm/i915_pciids.h +0 −767
  596. include/drm/intel/i915_component.h +0 −0
  597. include/drm/intel/i915_drm.h +0 −0
  598. include/drm/intel/i915_gsc_proxy_mei_interface.h +0 −0
  599. include/drm/intel/i915_hdcp_interface.h +0 −0
  600. include/drm/intel/i915_pciids.h +800 −0
  601. include/drm/intel/i915_pxp_tee_interface.h +0 −0
  602. include/drm/intel/intel-gtt.h +0 −0
  603. include/drm/intel/intel_lpe_audio.h +0 −0
  604. include/drm/intel/xe_pciids.h +0 −0
  605. include/linux/dma-fence-array.h +3 −0
  606. include/linux/dma-heap.h +2 −2
  607. include/linux/fb.h +1 −0
  608. include/linux/mfd/atmel-hlcdc.h +10 −0
  609. include/sound/hdaudio.h +1 −1
  610. include/uapi/drm/amdgpu_drm.h +9 −0
  611. include/uapi/drm/drm_mode.h +0 −8
  612. include/uapi/drm/ivpu_accel.h +68 −1
  613. include/uapi/drm/v3d_drm.h +48 −0
  614. include/uapi/linux/dma-heap.h +1 −1
  615. lib/fonts/Kconfig +10 −10
  616. sound/x86/intel_hdmi_audio.c +1 −1
Documentation/devicetree/bindings/display/panel/boe,tv101wum-nl6.yaml+0−2
@@ -32,8 +32,6 @@ properties: · 31 unmodified lines
3232 - innolux,hj110iz-01a
3333 # STARRY 2081101QFH032011-53G 10.1" WUXGA TFT LCD panel
3434 - starry,2081101qfh032011-53g
35− # STARRY himax83102-j02 10.51" WUXGA TFT LCD panel
36− - starry,himax83102-j02
3735 # STARRY ili9882t 10.51" WUXGA TFT LCD panel
3836 - starry,ili9882t
3937
Documentation/devicetree/bindings/display/panel/himax,hx83102.yaml+77−0
@@ -0,0 +1,77 @@
1+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2+%YAML 1.2
3+---
4+$id: http://devicetree.org/schemas/display/panel/himax,hx83102.yaml#
5+$schema: http://devicetree.org/meta-schemas/core.yaml#
6+
7+title: Himax HX83102 MIPI-DSI LCD panel controller
8+
9+maintainers:
10+ - Cong Yang <yangcong5@huaqin.corp-partner.google.com>
11+
12+allOf:
13+ - $ref: panel-common.yaml#
14+
15+properties:
16+ compatible:
17+ items:
18+ - enum:
19+ # Boe nv110wum-l60 11.0" WUXGA TFT LCD panel
20+ - boe,nv110wum-l60
21+ # IVO t109nw41 11.0" WUXGA TFT LCD panel
22+ - ivo,t109nw41
23+ # STARRY himax83102-j02 10.51" WUXGA TFT LCD panel
24+ - starry,himax83102-j02
25+ - const: himax,hx83102
26+
27+ reg:
28+ description: the virtual channel number of a DSI peripheral
29+
30+ enable-gpios:
31+ description: a GPIO spec for the enable pin
32+
33+ pp1800-supply:
34+ description: core voltage supply
35+
36+ avdd-supply:
37+ description: phandle of the regulator that provides positive voltage
38+
39+ avee-supply:
40+ description: phandle of the regulator that provides negative voltage
41+
42+ backlight: true
43+ port: true
44+ rotation: true
45+
46+required:
47+ - compatible
48+ - reg
49+ - enable-gpios
50+ - pp1800-supply
51+ - avdd-supply
52+ - avee-supply
53+
54+additionalProperties: false
55+
56+examples:
57+ - |
58+ dsi {
59+ #address-cells = <1>;
60+ #size-cells = <0>;
61+ panel@0 {
62+ compatible = "starry,himax83102-j02", "himax,hx83102";
63+ reg = <0>;
64+ enable-gpios = <&pio 45 0>;
65+ avdd-supply = <&ppvarn_lcd>;
66+ avee-supply = <&ppvarp_lcd>;
67+ pp1800-supply = <&pp1800_lcd>;
68+ backlight = <&backlight_lcd0>;
69+ port {
70+ panel_in: endpoint {
71+ remote-endpoint = <&dsi_out>;
72+ };
73+ };
74+ };
75+ };
76+
77+...
Documentation/devicetree/bindings/display/panel/panel-edp-legacy.yaml+117−0
@@ -0,0 +1,117 @@
1+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2+%YAML 1.2
3+---
4+$id: http://devicetree.org/schemas/display/panel/panel-edp-legacy.yaml#
5+$schema: http://devicetree.org/meta-schemas/core.yaml#
6+
7+title: Legacy eDP panels from before the "edp-panel" compatible
8+
9+maintainers:
10+ - Douglas Anderson <dianders@chromium.org>
11+
12+description: |
13+ This binding file is a collection of eDP panels from before the generic
14+ "edp-panel" compatible was introduced. It is kept around to support old
15+ dts files. The only reason one might add a new panel here instead of using
16+ the generic "edp-panel" is if it needed to be used on an eDP controller
17+ that doesn't support the generic "edp-panel" compatible, but it should be
18+ a strong preference to add the generic "edp-panel" compatible instead.
19+
20+allOf:
21+ - $ref: panel-common.yaml#
22+
23+properties:
24+ compatible:
25+ enum:
26+ # compatible must be listed in alphabetical order, ordered by compatible.
27+ # The description in the comment is mandatory for each compatible.
28+
29+ # AU Optronics Corporation 10.1" WSVGA TFT LCD panel
30+ - auo,b101ean01
31+ # AUO B116XAK01 eDP TFT LCD panel
32+ - auo,b116xa01
33+ # AU Optronics Corporation 13.3" FHD (1920x1080) color TFT-LCD panel
34+ - auo,b133htn01
35+ # AU Optronics Corporation 13.3" WXGA (1366x768) TFT LCD panel
36+ - auo,b133xtn01
37+ # BOE OPTOELECTRONICS TECHNOLOGY 10.1" WXGA TFT LCD panel
38+ - boe,nv101wxmn51
39+ # BOE NV133FHM-N61 13.3" FHD (1920x1080) TFT LCD Panel
40+ - boe,nv110wtm-n61
41+ # BOE NV110WTM-N61 11.0" 2160x1440 TFT LCD Panel
42+ - boe,nv133fhm-n61
43+ # BOE NV133FHM-N62 13.3" FHD (1920x1080) TFT LCD Panel
44+ - boe,nv133fhm-n62
45+ # BOE NV140FHM-N49 14.0" FHD a-Si FT panel
46+ - boe,nv140fhmn49
47+ # Innolux Corporation 11.6" WXGA (1366x768) TFT LCD panel
48+ - innolux,n116bca-ea1
49+ # Innolux Corporation 11.6" WXGA (1366x768) TFT LCD panel
50+ - innolux,n116bge
51+ # InnoLux 13.3" FHD (1920x1080) eDP TFT LCD panel
52+ - innolux,n125hce-gn1
53+ # Innolux P120ZDG-BF1 12.02 inch eDP 2K display panel
54+ - innolux,p120zdg-bf1
55+ # King & Display KD116N21-30NV-A010 eDP TFT LCD panel
56+ - kingdisplay,kd116n21-30nv-a010
57+ # LG LP079QX1-SP0V 7.9" (1536x2048 pixels) TFT LCD panel
58+ - lg,lp079qx1-sp0v
59+ # LG 9.7" (2048x1536 pixels) TFT LCD panel
60+ - lg,lp097qx1-spa1
61+ # LG 12.0" (1920x1280 pixels) TFT LCD panel
62+ - lg,lp120up1
63+ # LG 12.9" (2560x1700 pixels) TFT LCD panel
64+ - lg,lp129qe
65+ # NewEast Optoelectronics CO., LTD WJFH116008A eDP TFT LCD panel
66+ - neweast,wjfh116008a
67+ # Samsung 12.2" (2560x1600 pixels) TFT LCD panel
68+ - samsung,lsn122dl01-c01
69+ # Samsung Electronics 14" WXGA (1366x768) TFT LCD panel
70+ - samsung,ltn140at29-301
71+ # Sharp LD-D5116Z01B 12.3" WUXGA+ eDP panel
72+ - sharp,ld-d5116z01b
73+ # Sharp 12.3" (2400x1600 pixels) TFT LCD panel
74+ - sharp,lq123p1jx31
75+
76+ backlight: true
77+ ddc-i2c-bus: true
78+ enable-gpios: true
79+ panel-timing: true
80+ port: true
81+ power-supply: true
82+ no-hpd: true
83+ hpd-gpios: true
84+
85+additionalProperties: false
86+
87+required:
88+ - compatible
89+ - power-supply
90+
91+examples:
92+ - |
93+ panel: panel {
94+ compatible = "innolux,n116bge";
95+ power-supply = <&panel_regulator>;
96+ backlight = <&backlight>;
97+
98+ panel-timing {
99+ clock-frequency = <74250000>;
100+ hactive = <1366>;
101+ hfront-porch = <136>;
102+ hback-porch = <60>;
103+ hsync-len = <30>;
104+ hsync-active = <0>;
105+ vactive = <768>;
106+ vfront-porch = <8>;
107+ vback-porch = <12>;
108+ vsync-len = <12>;
109+ vsync-active = <0>;
110+ };
111+
112+ port {
113+ panel_in_edp: endpoint {
114+ remote-endpoint = <&edp_out_panel>;
115+ };
116+ };
117+ };
Documentation/devicetree/bindings/display/panel/panel-mipi-dbi-spi.yaml+30−0
@@ -50,6 +50,12 @@ description: | · 49 unmodified lines
5050 | Command or data |
5151 |<D7><D6><D5><D4><D3><D2><D1><D0>|
5252
53+ The standard defines one pixel format for type C: RGB111. The industry
54+ however has decided to provide the type A/B interface pixel formats also on
55+ the Type C interface and most common among these are RGB565 and RGB666.
56+ The MIPI DCS command set_address_mode (36h) has one bit that controls RGB/BGR
57+ order. This gives each supported RGB format a BGR variant.
58+
5359 The panel resolution is specified using the panel-timing node properties
5460 hactive (width) and vactive (height). The other mandatory panel-timing
5561 properties should be set to zero except clock-frequency which can be
@@ -93,6 +99,28 @@ properties: · 37 unmodified lines
9399
94100 spi-3wire: true
95101
102+ format:
103+ description: >
104+ Pixel format in bit order as going on the wire:
105+ * `x2r1g1b1r1g1b1` - RGB111, 2 pixels per byte
106+ * `x2b1g1r1b1g1r1` - BGR111, 2 pixels per byte
107+ * `x1r1g1b1x1r1g1b1` - RGB111, 2 pixels per byte
108+ * `x1b1g1r1x1b1g1r1` - BGR111, 2 pixels per byte
109+ * `r5g6b5` - RGB565, 2 bytes
110+ * `b5g6r5` - BGR565, 2 bytes
111+ * `r6x2g6x2b6x2` - RGB666, 3 bytes
112+ * `b6x2g6x2r6x2` - BGR666, 3 bytes
113+ enum:
114+ - x2r1g1b1r1g1b1
115+ - x2b1g1r1b1g1r1
116+ - x1r1g1b1x1r1g1b1
117+ - x1b1g1r1x1b1g1r1
118+ - r5g6b5
119+ - b5g6r5
120+ - r6x2g6x2b6x2
121+ - b6x2g6x2r6x2
122+ default: r5g6b5
123+
96124 required:
97125 - compatible
98126 - reg
@@ -119,6 +147,8 @@ examples: · 20 unmodified lines
119147 reset-gpios = <&gpio 25 GPIO_ACTIVE_HIGH>;
120148 write-only;
121149
150+ format = "r5g6b5";
151+
122152 backlight = <&backlight>;
123153
124154 width-mm = <35>;
Documentation/devicetree/bindings/display/panel/panel-simple-lvds-dual-ports.yaml+6−0
@@ -41,6 +41,12 @@ properties: · 40 unmodified lines
4141 - auo,g190ean01
4242 # Kaohsiung Opto-Electronics Inc. 10.1" WUXGA (1920 x 1200) LVDS TFT LCD panel
4343 - koe,tx26d202vm0bwa
44+ # Lincoln Technology Solutions, LCD185-101CT 10.1" TFT 1920x1200
45+ - lincolntech,lcd185-101ct
46+ # Microtips Technology MF-101HIEBCAF0 10.1" WUXGA (1920x1200) TFT LCD panel
47+ - microtips,mf-101hiebcaf0
48+ # Microtips Technology MF-103HIEB0GA0 10.25" 1920x720 TFT LCD panel
49+ - microtips,mf-103hieb0ga0
4450 # NLT Technologies, Ltd. 15.6" FHD (1920x1080) LVDS TFT LCD panel
4551 - nlt,nl192108ac18-02d
4652
Documentation/devicetree/bindings/display/panel/panel-simple.yaml+2−56
@@ -41,22 +41,10 @@ properties: · 40 unmodified lines
4141 - ampire,am800600p5tmqw-tb8h
4242 # AU Optronics Corporation 10.1" WSVGA TFT LCD panel
4343 - auo,b101aw03
44− # AU Optronics Corporation 10.1" WSVGA TFT LCD panel
45− - auo,b101ean01
4644 # AU Optronics Corporation 10.1" WXGA TFT LCD panel
4745 - auo,b101xtn01
48− # AUO B116XAK01 eDP TFT LCD panel
49− - auo,b116xa01
5046 # AU Optronics Corporation 11.6" HD (1366x768) color TFT-LCD panel
5147 - auo,b116xw03
52− # AU Optronics Corporation 13.3" FHD (1920x1080) color TFT-LCD panel
53− - auo,b133han05
54− # AU Optronics Corporation 13.3" FHD (1920x1080) color TFT-LCD panel
55− - auo,b133htn01
56− # AU Optronics Corporation 13.3" WXGA (1366x768) TFT LCD panel
57− - auo,b133xtn01
58− # AU Optronics Corporation 14.0" FHD (1920x1080) color TFT-LCD panel
59− - auo,b140han06
6048 # AU Optronics Corporation 7.0" FHD (800 x 480) TFT LCD panel
6149 - auo,g070vvn01
6250 # AU Optronics Corporation 10.1" (1280x800) color TFT LCD panel
@@ -81,16 +69,6 @@ properties: · 18 unmodified lines
8169 - boe,ev121wxm-n10-1850
8270 # BOE HV070WSA-100 7.01" WSVGA TFT LCD panel
8371 - boe,hv070wsa-100
84− # BOE OPTOELECTRONICS TECHNOLOGY 10.1" WXGA TFT LCD panel
85− - boe,nv101wxmn51
86− # BOE NV133FHM-N61 13.3" FHD (1920x1080) TFT LCD Panel
87− - boe,nv110wtm-n61
88− # BOE NV110WTM-N61 11.0" 2160x1440 TFT LCD Panel
89− - boe,nv133fhm-n61
90− # BOE NV133FHM-N62 13.3" FHD (1920x1080) TFT LCD Panel
91− - boe,nv133fhm-n62
92− # BOE NV140FHM-N49 14.0" FHD a-Si FT panel
93− - boe,nv140fhmn49
9472 # Crystal Clear Technology CMT430B19N00 4.3" 480x272 TFT-LCD panel
9573 - cct,cmt430b19n00
9674 # CDTech(H.K.) Electronics Limited 4.3" 480x272 color TFT-LCD panel
@@ -172,8 +150,6 @@ properties: · 75 unmodified lines
172150 - hannstar,hsd100pxn1
173151 # Hitachi Ltd. Corporation 9" WVGA (800x480) TFT LCD panel
174152 - hit,tx23d38vm0caa
175− # InfoVision Optoelectronics M133NWF4 R0 13.3" FHD (1920x1080) TFT LCD panel
176− - ivo,m133nwf4-r0
177153 # Innolux AT043TN24 4.3" WQVGA TFT LCD panel
178154 - innolux,at043tn24
179155 # Innolux AT070TN92 7.0" WQVGA TFT LCD panel
@@ -192,22 +168,12 @@ properties: · 12 unmodified lines
192168 - innolux,g121x1-l03
193169 # Innolux Corporation 12.1" G121XCE-L01 XGA (1024x768) TFT LCD panel
194170 - innolux,g121xce-l01
195− # Innolux Corporation 11.6" WXGA (1366x768) TFT LCD panel
196− - innolux,n116bca-ea1
197− # Innolux Corporation 11.6" WXGA (1366x768) TFT LCD panel
198− - innolux,n116bge
199− # InnoLux 13.3" FHD (1920x1080) eDP TFT LCD panel
200− - innolux,n125hce-gn1
201171 # InnoLux 15.6" FHD (1920x1080) TFT LCD panel
202172 - innolux,g156hce-l01
203173 # InnoLux 15.6" WXGA TFT LCD panel
204174 - innolux,n156bge-l21
205− # Innolux P120ZDG-BF1 12.02 inch eDP 2K display panel
206− - innolux,p120zdg-bf1
207175 # Innolux Corporation 7.0" WSVGA (1024x600) TFT LCD panel
208176 - innolux,zj070na-01p
209− # King & Display KD116N21-30NV-A010 eDP TFT LCD panel
210− - kingdisplay,kd116n21-30nv-a010
211177 # Kaohsiung Opto-Electronics Inc. 5.7" QVGA (320 x 240) TFT LCD panel
212178 - koe,tx14d24vm1bpa
213179 # Kaohsiung Opto-Electronics. TX31D200VM0BAA 12.3" HSXGA LVDS panel
@@ -220,14 +186,6 @@ properties: · 6 unmodified lines
220186 - lemaker,bl035-rgb-002
221187 # LG 7" (800x480 pixels) TFT LCD panel
222188 - lg,lb070wv8
223− # LG LP079QX1-SP0V 7.9" (1536x2048 pixels) TFT LCD panel
224− - lg,lp079qx1-sp0v
225− # LG 9.7" (2048x1536 pixels) TFT LCD panel
226− - lg,lp097qx1-spa1
227− # LG 12.0" (1920x1280 pixels) TFT LCD panel
228− - lg,lp120up1
229− # LG 12.9" (2560x1700 pixels) TFT LCD panel
230− - lg,lp129qe
231189 # Logic Technologies LT161010-2NHC 7" WVGA TFT Cap Touch Module
232190 - logictechno,lt161010-2nhc
233191 # Logic Technologies LT161010-2NHR 7" WVGA TFT Resistive Touch Module
@@ -254,8 +212,6 @@ properties: · 20 unmodified lines
254212 - nec,nl4827hc19-05b
255213 # Netron-DY E231732 7.0" WSVGA TFT LCD panel
256214 - netron-dy,e231732
257− # NewEast Optoelectronics CO., LTD WJFH116008A eDP TFT LCD panel
258− - neweast,wjfh116008a
259215 # Newhaven Display International 480 x 272 TFT LCD panel
260216 - newhaven,nhd-4.3-480272ef-atxl
261217 # New Vision Display 7.0" 800 RGB x 480 TFT LCD panel
@@ -280,6 +236,8 @@ properties: · 18 unmodified lines
280236 - powertip,ph128800t006-zhc01
281237 # POWERTIP PH800480T013-IDF2 7.0" WVGA TFT LCD panel
282238 - powertip,ph800480t013-idf02
239+ # PrimeView PM070WL4 7.0" 800x480 TFT LCD panel
240+ - primeview,pm070wl4
283241 # QiaoDian XianShi Corporation 4"3 TFT LCD panel
284242 - qiaodian,qd43003c0-40
285243 # Shenzhen QiShenglong Industrialist Co., Ltd. Gopher 2b 4.3" 480(RGB)x272 TFT LCD panel
@@ -290,16 +248,10 @@ properties: · 4 unmodified lines
290248 - rocktech,rk070er9427
291249 # Rocktech Display Ltd. RK043FN48H 4.3" 480x272 LCD-TFT panel
292250 - rocktech,rk043fn48h
293− # Samsung 13.3" FHD (1920x1080 pixels) eDP AMOLED panel
294− - samsung,atna33xc20
295− # Samsung 12.2" (2560x1600 pixels) TFT LCD panel
296− - samsung,lsn122dl01-c01
297251 # Samsung Electronics 10.1" WXGA (1280x800) TFT LCD panel
298252 - samsung,ltl101al01
299253 # Samsung Electronics 10.1" WSVGA TFT LCD panel
300254 - samsung,ltn101nt05
301− # Samsung Electronics 14" WXGA (1366x768) TFT LCD panel
302− - samsung,ltn140at29-301
303255 # Satoz SAT050AT40H12R2 5.0" WVGA TFT LCD panel
304256 - satoz,sat050at40h12r2
305257 # Sharp LQ035Q7DB03 3.5" QVGA TFT LCD panel
@@ -308,18 +260,12 @@ properties: · 2 unmodified lines
308260 - sharp,lq070y3dg3b
309261 # Sharp Display Corp. LQ101K1LY04 10.07" WXGA TFT LCD panel
310262 - sharp,lq101k1ly04
311− # Sharp 12.3" (2400x1600 pixels) TFT LCD panel
312− - sharp,lq123p1jx31
313− # Sharp 14" (1920x1080 pixels) TFT LCD panel
314− - sharp,lq140m1jw46
315263 # Sharp LS020B1DD01D 2.0" HQVGA TFT LCD panel
316264 - sharp,ls020b1dd01d
317265 # Shelly SCA07010-BFN-LNN 7.0" WVGA TFT LCD panel
318266 - shelly,sca07010-bfn-lnn
319267 # Starry KR070PE2T 7" WVGA TFT LCD panel
320268 - starry,kr070pe2t
321− # Starry 12.2" (1920x1200 pixels) TFT LCD panel
322− - starry,kr122ea0sra
323269 # Startek KD070WVFPA043-C069A 7" TFT LCD panel
324270 - startek,kd070wvfpa
325271 # Team Source Display Technology TST043015CMHX 4.3" WQVGA TFT LCD panel
Documentation/devicetree/bindings/display/panel/samsung,atna33xc20.yaml+95−0
@@ -0,0 +1,95 @@
1+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2+%YAML 1.2
3+---
4+$id: http://devicetree.org/schemas/display/panel/samsung,atna33xc20.yaml#
5+$schema: http://devicetree.org/meta-schemas/core.yaml#
6+
7+title: Samsung 13.3" FHD (1920x1080 pixels) eDP AMOLED panel
8+
9+maintainers:
10+ - Douglas Anderson <dianders@chromium.org>
11+
12+allOf:
13+ - $ref: panel-common.yaml#
14+
15+properties:
16+ compatible:
17+ const: samsung,atna33xc20
18+
19+ enable-gpios: true
20+ port: true
21+ power-supply: true
22+ no-hpd: true
23+ hpd-gpios: true
24+
25+additionalProperties: false
26+
27+required:
28+ - compatible
29+ - enable-gpios
30+ - power-supply
31+
32+examples:
33+ - |
34+ #include <dt-bindings/clock/qcom,rpmh.h>
35+ #include <dt-bindings/gpio/gpio.h>
36+ #include <dt-bindings/interrupt-controller/irq.h>
37+
38+ i2c {
39+ #address-cells = <1>;
40+ #size-cells = <0>;
41+
42+ bridge@2d {
43+ compatible = "ti,sn65dsi86";
44+ reg = <0x2d>;
45+
46+ interrupt-parent = <&tlmm>;
47+ interrupts = <10 IRQ_TYPE_LEVEL_HIGH>;
48+
49+ enable-gpios = <&tlmm 102 GPIO_ACTIVE_HIGH>;
50+
51+ vpll-supply = <&src_pp1800_s4a>;
52+ vccio-supply = <&src_pp1800_s4a>;
53+ vcca-supply = <&src_pp1200_l2a>;
54+ vcc-supply = <&src_pp1200_l2a>;
55+
56+ clocks = <&rpmhcc RPMH_LN_BB_CLK2>;
57+ clock-names = "refclk";
58+
59+ no-hpd;
60+
61+ ports {
62+ #address-cells = <1>;
63+ #size-cells = <0>;
64+
65+ port@0 {
66+ reg = <0>;
67+ endpoint {
68+ remote-endpoint = <&dsi0_out>;
69+ };
70+ };
71+
72+ port@1 {
73+ reg = <1>;
74+ sn65dsi86_out: endpoint {
75+ remote-endpoint = <&panel_in_edp>;
76+ };
77+ };
78+ };
79+
80+ aux-bus {
81+ panel {
82+ compatible = "samsung,atna33xc20";
83+ enable-gpios = <&tlmm 12 GPIO_ACTIVE_HIGH>;
84+ power-supply = <&pp3300_dx_edp>;
85+ hpd-gpios = <&sn65dsi86_bridge 2 GPIO_ACTIVE_HIGH>;
86+
87+ port {
88+ panel_in_edp: endpoint {
89+ remote-endpoint = <&sn65dsi86_out>;
90+ };
91+ };
92+ };
93+ };
94+ };
95+ };
Documentation/devicetree/bindings/display/panel/sharp,ld-d5116z01b.yaml+0−30
@@ -1,30 +0,0 @@
1−# SPDX-License-Identifier: GPL-2.0
2−%YAML 1.2
3−---
4−$id: http://devicetree.org/schemas/display/panel/sharp,ld-d5116z01b.yaml#
5−$schema: http://devicetree.org/meta-schemas/core.yaml#
6−
7−title: Sharp LD-D5116Z01B 12.3" WUXGA+ eDP panel
8−
9−maintainers:
10− - Jeffrey Hugo <jeffrey.l.hugo@gmail.com>
11−
12−allOf:
13− - $ref: panel-common.yaml#
14−
15−properties:
16− compatible:
17− const: sharp,ld-d5116z01b
18−
19− power-supply: true
20− backlight: true
21− port: true
22− no-hpd: true
23−
24−additionalProperties: false
25−
26−required:
27− - compatible
28− - power-supply
29−
30−...
Documentation/devicetree/bindings/display/panel/wl-355608-a8.yaml+60−0
@@ -0,0 +1,60 @@
1+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2+%YAML 1.2
3+---
4+$id: http://devicetree.org/schemas/display/panel/wl-355608-a8.yaml#
5+$schema: http://devicetree.org/meta-schemas/core.yaml#
6+
7+title: WL-355608-A8 3.5" (640x480 pixels) 24-bit IPS LCD panel
8+
9+maintainers:
10+ - Ryan Walklin <ryan@testtoast.com>
11+
12+allOf:
13+ - $ref: panel-common.yaml#
14+ - $ref: /schemas/spi/spi-peripheral-props.yaml#
15+
16+properties:
17+ compatible:
18+ const: wl-355608-a8
19+
20+ reg:
21+ maxItems: 1
22+
23+ spi-3wire: true
24+
25+required:
26+ - compatible
27+ - reg
28+ - port
29+ - power-supply
30+ - reset-gpios
31+
32+unevaluatedProperties: false
33+
34+examples:
35+ - |
36+ #include <dt-bindings/gpio/gpio.h>
37+
38+ spi {
39+ #address-cells = <1>;
40+ #size-cells = <0>;
41+
42+ panel@0 {
43+ compatible = "wl-355608-a8";
44+ reg = <0>;
45+
46+ spi-3wire;
47+ spi-max-frequency = <3125000>;
48+
49+ reset-gpios = <&pio 8 14 GPIO_ACTIVE_LOW>; // PI14
50+
51+ backlight = <&backlight>;
52+ power-supply = <&reg_lcd>;
53+
54+ port {
55+ endpoint {
56+ remote-endpoint = <&tcon_lcd0_out_lcd>;
57+ };
58+ };
59+ };
60+ };
Documentation/devicetree/bindings/display/rockchip/rockchip,dw-mipi-dsi.yaml+2−0
@@ -15,6 +15,7 @@ properties: · 14 unmodified lines
1515 items:
1616 - enum:
1717 - rockchip,px30-mipi-dsi
18+ - rockchip,rk3128-mipi-dsi
1819 - rockchip,rk3288-mipi-dsi
1920 - rockchip,rk3399-mipi-dsi
2021 - rockchip,rk3568-mipi-dsi
@@ -77,6 +78,7 @@ allOf: · 56 unmodified lines
7778 contains:
7879 enum:
7980 - rockchip,px30-mipi-dsi
81+ - rockchip,rk3128-mipi-dsi
8082 - rockchip,rk3568-mipi-dsi
8183 - rockchip,rv1126-mipi-dsi
8284
Documentation/devicetree/bindings/gpu/arm,mali-bifrost.yaml+4−1
@@ -34,6 +34,7 @@ properties: · 33 unmodified lines
3434 - const: arm,mali-valhall-jm # Mali Valhall GPU model/revision is fully discoverable
3535 - items:
3636 - enum:
37+ - mediatek,mt8188-mali
3738 - mediatek,mt8192-mali
3839 - const: arm,mali-valhall-jm # Mali Valhall GPU model/revision is fully discoverable
3940
@@ -195,7 +196,9 @@ allOf: · 155 unmodified lines
195196 properties:
196197 compatible:
197198 contains:
198− const: mediatek,mt8183b-mali
199+ enum:
200+ - mediatek,mt8183b-mali
201+ - mediatek,mt8188-mali
199202 then:
200203 properties:
201204 power-domains:
Documentation/devicetree/bindings/vendor-prefixes.yaml+6−0
@@ -820,6 +820,8 @@ patternProperties: · 819 unmodified lines
820820 description: Lichee Pi
821821 "^linaro,.*":
822822 description: Linaro Limited
823+ "^lincolntech,.*":
824+ description: Lincoln Technology Solutions
823825 "^lineartechnology,.*":
824826 description: Linear Technology
825827 "^linksprite,.*":
@@ -924,6 +926,8 @@ patternProperties: · 98 unmodified lines
924926 description: Microsoft Corporation
925927 "^microsys,.*":
926928 description: MicroSys Electronics GmbH
929+ "^microtips,.*":
930+ description: Microtips Technology USA
927931 "^mikroe,.*":
928932 description: MikroElektronika d.o.o.
929933 "^mikrotik,.*":
@@ -1160,6 +1164,8 @@ patternProperties: · 230 unmodified lines
11601164 description: PowerVR (deprecated, use img)
11611165 "^powkiddy,.*":
11621166 description: Powkiddy
1167+ "^primeview,.*":
1168+ description: Prime View International (PVI)
11631169 "^primux,.*":
11641170 description: Primux Trading, S.L.
11651171 "^probox2,.*":
Documentation/gpu/drm-internals.rst+2−8
@@ -57,8 +57,8 @@ is larger than the driver minor, the DRM_IOCTL_SET_VERSION call will · 56 unmodified lines
5757 return an error. Otherwise the driver's set_version() method will be
5858 called with the requested version.
5959
60−Name, Description and Date
61−~~~~~~~~~~~~~~~~~~~~~~~~~~
60+Name and Description
61+~~~~~~~~~~~~~~~~~~~~
6262
6363 char \*name; char \*desc; char \*date;
6464 The driver name is printed to the kernel log at initialization time,
@@ -69,12 +69,6 @@ The driver description is a purely informative string passed to · 4 unmodified lines
6969 userspace through the DRM_IOCTL_VERSION ioctl and otherwise unused by
7070 the kernel.
7171
72−The driver date, formatted as YYYYMMDD, is meant to identify the date of
73−the latest modification to the driver. However, as most drivers fail to
74−update it, its value is mostly useless. The DRM core prints it to the
75−kernel log at initialization time and passes it to userspace through the
76−DRM_IOCTL_VERSION ioctl.
77−
7872 Module Initialization
7973 ---------------------
8074
Documentation/gpu/drm-kms-helpers.rst+9−3
@@ -110,15 +110,21 @@ fbdev Helper Functions Reference · 109 unmodified lines
110110 .. kernel-doc:: drivers/gpu/drm/drm_fb_helper.c
111111 :doc: fbdev helpers
112112
113+.. kernel-doc:: drivers/gpu/drm/drm_fbdev_dma.c
114+ :export:
115+
116+.. kernel-doc:: drivers/gpu/drm/drm_fbdev_shmem.c
117+ :export:
118+
119+.. kernel-doc:: drivers/gpu/drm/drm_fbdev_ttm.c
120+ :export:
121+
113122 .. kernel-doc:: include/drm/drm_fb_helper.h
114123 :internal:
115124
116125 .. kernel-doc:: drivers/gpu/drm/drm_fb_helper.c
117126 :export:
118127
119−.. kernel-doc:: drivers/gpu/drm/drm_fbdev_generic.c
120− :export:
121−
122128 format Helper Functions Reference
123129 =================================
124130
Documentation/gpu/i915.rst+1−4
@@ -150,7 +150,7 @@ High Definition Audio · 149 unmodified lines
150150 .. kernel-doc:: drivers/gpu/drm/i915/display/intel_audio.c
151151 :internal:
152152
153−.. kernel-doc:: include/drm/i915_component.h
153+.. kernel-doc:: include/drm/intel/i915_component.h
154154 :internal:
155155
156156 Intel HDMI LPE Audio Support
@@ -210,9 +210,6 @@ DMC wakelock support · 53 unmodified lines
210210 .. kernel-doc:: drivers/gpu/drm/i915/display/intel_dmc_wl.c
211211 :doc: DMC wakelock support
212212
213−.. kernel-doc:: drivers/gpu/drm/i915/display/intel_dmc_wl.c
214− :internal:
215−
216213 Video BIOS Table (VBT)
217214 ----------------------
218215
Documentation/gpu/kms-properties.csv+0−2
@@ -17,7 +17,6 @@ Owner Module/Drivers,Group,Property Name,Type,Property Values,Object attached,De · 16 unmodified lines
1717 ,Virtual GPU,“suggested X”,RANGE,"Min=0, Max=0xffffffff",Connector,property to suggest an X offset for a connector
1818 ,,“suggested Y”,RANGE,"Min=0, Max=0xffffffff",Connector,property to suggest an Y offset for a connector
1919 ,Optional,"""aspect ratio""",ENUM,"{ ""None"", ""4:3"", ""16:9"" }",Connector,TDB
20−i915,Generic,"""Broadcast RGB""",ENUM,"{ ""Automatic"", ""Full"", ""Limited 16:235"" }",Connector,"When this property is set to Limited 16:235 and CTM is set, the hardware will be programmed with the result of the multiplication of CTM by the limited range matrix to ensure the pixels normally in the range 0..1.0 are remapped to the range 16/255..235/255."
2120 ,,“audio”,ENUM,"{ ""force-dvi"", ""off"", ""auto"", ""on"" }",Connector,TBD
2221 ,SDVO-TV,“mode”,ENUM,"{ ""NTSC_M"", ""NTSC_J"", ""NTSC_443"", ""PAL_B"" } etc.",Connector,TBD
2322 ,,"""left_margin""",RANGE,"Min=0, Max= SDVO dependent",Connector,TBD
@@ -38,7 +37,6 @@ i915,Generic,"""Broadcast RGB""",ENUM,"{ ""Automatic"", ""Full"", ""Limited 16:2 · 14 unmodified lines
3837 ,,“dot_crawl”,RANGE,"Min=0, Max=1",Connector,TBD
3938 ,SDVO-TV/LVDS,“brightness”,RANGE,"Min=0, Max= SDVO dependent",Connector,TBD
4039 CDV gma-500,Generic,"""Broadcast RGB""",ENUM,"{ “Full”, “Limited 16:235” }",Connector,TBD
41−,,"""Broadcast RGB""",ENUM,"{ “off”, “auto”, “on” }",Connector,TBD
4240 Poulsbo,Generic,“backlight”,RANGE,"Min=0, Max=100",Connector,TBD
4341 ,SDVO-TV,“mode”,ENUM,"{ ""NTSC_M"", ""NTSC_J"", ""NTSC_443"", ""PAL_B"" } etc.",Connector,TBD
4442 ,,"""left_margin""",RANGE,"Min=0, Max= SDVO dependent",Connector,TBD
Documentation/gpu/todo.rst+40−30
@@ -243,19 +243,6 @@ Contact: Maintainer of the driver you plan to convert · 242 unmodified lines
243243
244244 Level: Intermediate
245245
246−Convert drivers to use drm_fbdev_generic_setup()
247−------------------------------------------------
248−
249−Most drivers can use drm_fbdev_generic_setup(). Driver have to implement
250−atomic modesetting and GEM vmap support. Historically, generic fbdev emulation
251−expected the framebuffer in system memory or system-like memory. By employing
252−struct iosys_map, drivers with frambuffers in I/O memory can be supported
253−as well.
254−
255−Contact: Maintainer of the driver you plan to convert
256−
257−Level: Intermediate
258−
259246 Reimplement functions in drm_fbdev_fb_ops without fbdev
260247 -------------------------------------------------------
261248
@@ -482,30 +469,53 @@ Contact: Thomas Zimmermann <tzimmermann@suse.de> · 220 unmodified lines
482469
483470 Level: Starter
484471
485−Clean up checks for already prepared/enabled in panels
486−------------------------------------------------------
472+Remove disable/unprepare in remove/shutdown in panel-simple and panel-edp
473+-------------------------------------------------------------------------
474+
475+As of commit d2aacaf07395 ("drm/panel: Check for already prepared/enabled in
476+drm_panel"), we have a check in the drm_panel core to make sure nobody
477+double-calls prepare/enable/disable/unprepare. Eventually that should probably
478+be turned into a WARN_ON() or somehow made louder, but right now we actually
479+expect it to trigger and so we don't want it to be too loud.
480+
481+Specifically, that warning will trigger for panel-edp and panel-simple at
482+shutdown time because those panels hardcode a call to drm_panel_disable()
483+and drm_panel_unprepare() at shutdown and remove time that they call regardless
484+of panel state. On systems with a properly coded DRM modeset driver that
485+calls drm_atomic_helper_shutdown() this is pretty much guaranteed to cause
486+the warning to fire.
487+
488+Unfortunately we can't safely remove the calls in panel-edp and panel-simple
489+until we're sure that all DRM modeset drivers that are used with those panels
490+properly call drm_atomic_helper_shutdown(). This TODO item is to validate
491+that all DRM modeset drivers used with panel-edp and panel-simple properly
492+call drm_atomic_helper_shutdown() and then remove the calls to
493+disable/unprepare from those panels. Alternatively, this TODO item could be
494+removed by convincing stakeholders that those calls are fine and downgrading
495+the error message in drm_panel_disable() / drm_panel_unprepare() to a
496+debug-level message.
487497
488−In a whole pile of panel drivers, we have code to make the
489−prepare/unprepare/enable/disable callbacks behave as no-ops if they've already
490−been called. To get some idea of the duplicated code, try::
498+Contact: Douglas Anderson <dianders@chromium.org>
491499
492− git grep 'if.*>prepared' -- drivers/gpu/drm/panel
493− git grep 'if.*>enabled' -- drivers/gpu/drm/panel
500+Level: Intermediate
494501
495−In the patch ("drm/panel: Check for already prepared/enabled in drm_panel")
496−we've moved this check to the core. Now we can most definitely remove the
497−check from the individual panels and save a pile of code.
502+Transition away from using mipi_dsi_*_write_seq()
503+-------------------------------------------------
498504
499−In adition to removing the check from the individual panels, it is believed
500−that even the core shouldn't need this check and that should be considered
501−an error if other code ever relies on this check. The check in the core
502−currently prints a warning whenever something is relying on this check with
503−dev_warn(). After a little while, we likely want to promote this to a
504−WARN(1) to help encourage folks not to rely on this behavior.
505+The macros mipi_dsi_generic_write_seq() and mipi_dsi_dcs_write_seq() are
506+non-intuitive because, if there are errors, they return out of the *caller's*
507+function. We should move all callers to use mipi_dsi_generic_write_seq_multi()
508+and mipi_dsi_dcs_write_seq_multi() macros instead.
509+
510+Once all callers are transitioned, the macros and the functions that they call,
511+mipi_dsi_generic_write_chatty() and mipi_dsi_dcs_write_buffer_chatty(), can
512+probably be removed. Alternatively, if people feel like the _multi() variants
513+are overkill for some use cases, we could keep the mipi_dsi_*_write_seq()
514+variants but change them not to return out of the caller.
505515
506516 Contact: Douglas Anderson <dianders@chromium.org>
507517
508−Level: Starter/Intermediate
518+Level: Starter
509519
510520
511521 Core refactorings
MAINTAINERS+6−5
@@ -6909,7 +6909,7 @@ DRM DRIVER FOR LG SW43408 PANELS · 6908 unmodified lines
69096909 M: Sumit Semwal <sumit.semwal@linaro.org>
69106910 M: Caleb Connolly <caleb.connolly@linaro.org>
69116911 S: Maintained
6912−T: git git://anongit.freedesktop.org/drm/drm-misc
6912+T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
69136913 F: Documentation/devicetree/bindings/display/panel/lg,sw43408.yaml
69146914 F: drivers/gpu/drm/panel/panel-lg-sw43408.c
69156915
@@ -7196,6 +7196,7 @@ L: dri-devel@lists.freedesktop.org · 280 unmodified lines
71967196 S: Maintained
71977197 T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
71987198 F: Documentation/gpu/vkms.rst
7199+F: drivers/gpu/drm/ci/xfails/vkms*
71997200 F: drivers/gpu/drm/vkms/
72007201
72017202 DRM DRIVER FOR VIRTUALBOX VIRTUAL GPU
@@ -7566,7 +7567,6 @@ F: include/drm/gpu_scheduler.h · 364 unmodified lines
75667567 DRM PANEL DRIVERS
75677568 M: Neil Armstrong <neil.armstrong@linaro.org>
75687569 R: Jessica Zhang <quic_jesszhan@quicinc.com>
7569−R: Sam Ravnborg <sam@ravnborg.org>
75707570 L: dri-devel@lists.freedesktop.org
75717571 S: Maintained
75727572 T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
@@ -11012,6 +11012,7 @@ S: Supported · 3439 unmodified lines
1101211012 F: drivers/gpu/drm/i915/display/
1101311013 F: drivers/gpu/drm/xe/display/
1101411014 F: drivers/gpu/drm/xe/compat-i915-headers
11015+F: include/drm/intel/
1101511016
1101611017 INTEL DRM I915 DRIVER (Meteor Lake, DG2 and older excluding Poulsbo, Moorestown and derivative)
1101711018 M: Jani Nikula <jani.nikula@linux.intel.com>
@@ -11024,12 +11025,12 @@ W: https://drm.pages.freedesktop.org/intel-docs/ · 6 unmodified lines
1102411025 Q: http://patchwork.freedesktop.org/project/intel-gfx/
1102511026 B: https://drm.pages.freedesktop.org/intel-docs/how-to-file-i915-bugs.html
1102611027 C: irc://irc.oftc.net/intel-gfx
11027−T: git git://anongit.freedesktop.org/drm-intel
11028+T: git https://gitlab.freedesktop.org/drm/i915/kernel.git
1102811029 F: Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon
1102911030 F: Documentation/gpu/i915.rst
1103011031 F: drivers/gpu/drm/ci/xfails/i915*
1103111032 F: drivers/gpu/drm/i915/
11032−F: include/drm/i915*
11033+F: include/drm/intel/
1103311034 F: include/uapi/drm/i915_drm.h
1103411035
1103511036 INTEL DRM XE DRIVER (Lunar Lake and newer)
@@ -11045,7 +11046,7 @@ T: git https://gitlab.freedesktop.org/drm/xe/kernel.git · 9 unmodified lines
1104511046 F: Documentation/ABI/testing/sysfs-driver-intel-xe-hwmon
1104611047 F: Documentation/gpu/xe/
1104711048 F: drivers/gpu/drm/xe/
11048−F: include/drm/xe*
11049+F: include/drm/intel/
1104911050 F: include/uapi/drm/xe_drm.h
1105011051
1105111052 INTEL ETHERNET DRIVERS
arch/x86/kernel/early-quirks.c+42−43
@@ -17,8 +17,8 @@ · 16 unmodified lines
1717 #include <linux/bcma/bcma.h>
1818 #include <linux/bcma/bcma_regs.h>
1919 #include <linux/platform_data/x86/apple.h>
20−#include <drm/i915_drm.h>
21−#include <drm/i915_pciids.h>
20+#include <drm/intel/i915_drm.h>
21+#include <drm/intel/i915_pciids.h>
2222 #include <asm/pci-direct.h>
2323 #include <asm/dma.h>
2424 #include <asm/io_apic.h>
@@ -518,47 +518,46 @@ static const struct intel_early_ops gen11_early_ops __initconst = { · 493 unmodified lines
518518
519519 /* Intel integrated GPUs for which we need to reserve "stolen memory" */
520520 static const struct pci_device_id intel_early_ids[] __initconst = {
521− INTEL_I830_IDS(&i830_early_ops),
522− INTEL_I845G_IDS(&i845_early_ops),
523− INTEL_I85X_IDS(&i85x_early_ops),
524− INTEL_I865G_IDS(&i865_early_ops),
525− INTEL_I915G_IDS(&gen3_early_ops),
526− INTEL_I915GM_IDS(&gen3_early_ops),
527− INTEL_I945G_IDS(&gen3_early_ops),
528− INTEL_I945GM_IDS(&gen3_early_ops),
529− INTEL_VLV_IDS(&gen6_early_ops),
530− INTEL_PINEVIEW_G_IDS(&gen3_early_ops),
531− INTEL_PINEVIEW_M_IDS(&gen3_early_ops),
532− INTEL_I965G_IDS(&gen3_early_ops),
533− INTEL_G33_IDS(&gen3_early_ops),
534− INTEL_I965GM_IDS(&gen3_early_ops),
535− INTEL_GM45_IDS(&gen3_early_ops),
536− INTEL_G45_IDS(&gen3_early_ops),
537− INTEL_IRONLAKE_D_IDS(&gen3_early_ops),
538− INTEL_IRONLAKE_M_IDS(&gen3_early_ops),
539− INTEL_SNB_D_IDS(&gen6_early_ops),
540− INTEL_SNB_M_IDS(&gen6_early_ops),
541− INTEL_IVB_M_IDS(&gen6_early_ops),
542− INTEL_IVB_D_IDS(&gen6_early_ops),
543− INTEL_HSW_IDS(&gen6_early_ops),
544− INTEL_BDW_IDS(&gen8_early_ops),
545− INTEL_CHV_IDS(&chv_early_ops),
546− INTEL_SKL_IDS(&gen9_early_ops),
547− INTEL_BXT_IDS(&gen9_early_ops),
548− INTEL_KBL_IDS(&gen9_early_ops),
549− INTEL_CFL_IDS(&gen9_early_ops),
550− INTEL_GLK_IDS(&gen9_early_ops),
551− INTEL_CNL_IDS(&gen9_early_ops),
552− INTEL_ICL_11_IDS(&gen11_early_ops),
553− INTEL_EHL_IDS(&gen11_early_ops),
554− INTEL_JSL_IDS(&gen11_early_ops),
555− INTEL_TGL_12_IDS(&gen11_early_ops),
556− INTEL_RKL_IDS(&gen11_early_ops),
557− INTEL_ADLS_IDS(&gen11_early_ops),
558− INTEL_ADLP_IDS(&gen11_early_ops),
559− INTEL_ADLN_IDS(&gen11_early_ops),
560− INTEL_RPLS_IDS(&gen11_early_ops),
561− INTEL_RPLP_IDS(&gen11_early_ops),
521+ INTEL_I830_IDS(INTEL_VGA_DEVICE, &i830_early_ops),
522+ INTEL_I845G_IDS(INTEL_VGA_DEVICE, &i845_early_ops),
523+ INTEL_I85X_IDS(INTEL_VGA_DEVICE, &i85x_early_ops),
524+ INTEL_I865G_IDS(INTEL_VGA_DEVICE, &i865_early_ops),
525+ INTEL_I915G_IDS(INTEL_VGA_DEVICE, &gen3_early_ops),
526+ INTEL_I915GM_IDS(INTEL_VGA_DEVICE, &gen3_early_ops),
527+ INTEL_I945G_IDS(INTEL_VGA_DEVICE, &gen3_early_ops),
528+ INTEL_I945GM_IDS(INTEL_VGA_DEVICE, &gen3_early_ops),
529+ INTEL_VLV_IDS(INTEL_VGA_DEVICE, &gen6_early_ops),
530+ INTEL_PNV_IDS(INTEL_VGA_DEVICE, &gen3_early_ops),
531+ INTEL_I965G_IDS(INTEL_VGA_DEVICE, &gen3_early_ops),
532+ INTEL_G33_IDS(INTEL_VGA_DEVICE, &gen3_early_ops),
533+ INTEL_I965GM_IDS(INTEL_VGA_DEVICE, &gen3_early_ops),
534+ INTEL_GM45_IDS(INTEL_VGA_DEVICE, &gen3_early_ops),
535+ INTEL_G45_IDS(INTEL_VGA_DEVICE, &gen3_early_ops),
536+ INTEL_ILK_IDS(INTEL_VGA_DEVICE, &gen3_early_ops),
537+ INTEL_SNB_IDS(INTEL_VGA_DEVICE, &gen6_early_ops),
538+ INTEL_IVB_IDS(INTEL_VGA_DEVICE, &gen6_early_ops),
539+ INTEL_HSW_IDS(INTEL_VGA_DEVICE, &gen6_early_ops),
540+ INTEL_BDW_IDS(INTEL_VGA_DEVICE, &gen8_early_ops),
541+ INTEL_CHV_IDS(INTEL_VGA_DEVICE, &chv_early_ops),
542+ INTEL_SKL_IDS(INTEL_VGA_DEVICE, &gen9_early_ops),
543+ INTEL_BXT_IDS(INTEL_VGA_DEVICE, &gen9_early_ops),
544+ INTEL_KBL_IDS(INTEL_VGA_DEVICE, &gen9_early_ops),
545+ INTEL_CFL_IDS(INTEL_VGA_DEVICE, &gen9_early_ops),
546+ INTEL_WHL_IDS(INTEL_VGA_DEVICE, &gen9_early_ops),
547+ INTEL_CML_IDS(INTEL_VGA_DEVICE, &gen9_early_ops),
548+ INTEL_GLK_IDS(INTEL_VGA_DEVICE, &gen9_early_ops),
549+ INTEL_CNL_IDS(INTEL_VGA_DEVICE, &gen9_early_ops),
550+ INTEL_ICL_IDS(INTEL_VGA_DEVICE, &gen11_early_ops),
551+ INTEL_EHL_IDS(INTEL_VGA_DEVICE, &gen11_early_ops),
552+ INTEL_JSL_IDS(INTEL_VGA_DEVICE, &gen11_early_ops),
553+ INTEL_TGL_IDS(INTEL_VGA_DEVICE, &gen11_early_ops),
554+ INTEL_RKL_IDS(INTEL_VGA_DEVICE, &gen11_early_ops),
555+ INTEL_ADLS_IDS(INTEL_VGA_DEVICE, &gen11_early_ops),
556+ INTEL_ADLP_IDS(INTEL_VGA_DEVICE, &gen11_early_ops),
557+ INTEL_ADLN_IDS(INTEL_VGA_DEVICE, &gen11_early_ops),
558+ INTEL_RPLS_IDS(INTEL_VGA_DEVICE, &gen11_early_ops),
559+ INTEL_RPLU_IDS(INTEL_VGA_DEVICE, &gen11_early_ops),
560+ INTEL_RPLP_IDS(INTEL_VGA_DEVICE, &gen11_early_ops),
562561 };
563562
564563 struct resource intel_graphics_stolen_res __ro_after_init = DEFINE_RES_MEM(0, 0);
drivers/accel/ivpu/Makefile+7−4
@@ -1,19 +1,22 @@
11 # SPDX-License-Identifier: GPL-2.0-only
2−# Copyright (C) 2023 Intel Corporation
2+# Copyright (C) 2023-2024 Intel Corporation
33
44 intel_vpu-y := \
55 ivpu_drv.o \
66 ivpu_fw.o \
77 ivpu_fw_log.o \
88 ivpu_gem.o \
9− ivpu_hw_37xx.o \
10− ivpu_hw_40xx.o \
9+ ivpu_hw.o \
10+ ivpu_hw_btrs.o \
11+ ivpu_hw_ip.o \
1112 ivpu_ipc.o \
1213 ivpu_job.o \
1314 ivpu_jsm_msg.o \
1415 ivpu_mmu.o \
1516 ivpu_mmu_context.o \
16− ivpu_pm.o
17+ ivpu_ms.o \
18+ ivpu_pm.o \
19+ ivpu_sysfs.o
1720
1821 intel_vpu-$(CONFIG_DEBUG_FS) += ivpu_debugfs.o
1922
drivers/accel/ivpu/ivpu_debugfs.c+87−2
@@ -1,6 +1,6 @@
11 // SPDX-License-Identifier: GPL-2.0-only
22 /*
3− * Copyright (C) 2020-2023 Intel Corporation
3+ * Copyright (C) 2020-2024 Intel Corporation
44 */
55
66 #include <linux/debugfs.h>
@@ -145,6 +145,30 @@ static const struct file_operations dvfs_mode_fops = { · 138 unmodified lines
145145 .write = dvfs_mode_fops_write,
146146 };
147147
148+static ssize_t
149+fw_dyndbg_fops_write(struct file *file, const char __user *user_buf, size_t size, loff_t *pos)
150+{
151+ struct ivpu_device *vdev = file->private_data;
152+ char buffer[VPU_DYNDBG_CMD_MAX_LEN] = {};
153+ int ret;
154+
155+ if (size >= VPU_DYNDBG_CMD_MAX_LEN)
156+ return -EINVAL;
157+
158+ ret = strncpy_from_user(buffer, user_buf, size);
159+ if (ret < 0)
160+ return ret;
161+
162+ ivpu_jsm_dyndbg_control(vdev, buffer, size);
163+ return size;
164+}
165+
166+static const struct file_operations fw_dyndbg_fops = {
167+ .owner = THIS_MODULE,
168+ .open = simple_open,
169+ .write = fw_dyndbg_fops_write,
170+};
171+
148172 static int fw_log_show(struct seq_file *s, void *v)
149173 {
150174 struct ivpu_device *vdev = s->private;
@@ -335,6 +359,61 @@ static const struct file_operations ivpu_reset_engine_fops = { · 184 unmodified lines
335359 .write = ivpu_reset_engine_fn,
336360 };
337361
362+static ssize_t
363+ivpu_resume_engine_fn(struct file *file, const char __user *user_buf, size_t size, loff_t *pos)
364+{
365+ struct ivpu_device *vdev = file->private_data;
366+
367+ if (!size)
368+ return -EINVAL;
369+
370+ if (ivpu_jsm_hws_resume_engine(vdev, DRM_IVPU_ENGINE_COMPUTE))
371+ return -ENODEV;
372+ if (ivpu_jsm_hws_resume_engine(vdev, DRM_IVPU_ENGINE_COPY))
373+ return -ENODEV;
374+
375+ return size;
376+}
377+
378+static const struct file_operations ivpu_resume_engine_fops = {
379+ .owner = THIS_MODULE,
380+ .open = simple_open,
381+ .write = ivpu_resume_engine_fn,
382+};
383+
384+static int dct_active_get(void *data, u64 *active_percent)
385+{
386+ struct ivpu_device *vdev = data;
387+
388+ *active_percent = vdev->pm->dct_active_percent;
389+
390+ return 0;
391+}
392+
393+static int dct_active_set(void *data, u64 active_percent)
394+{
395+ struct ivpu_device *vdev = data;
396+ int ret;
397+
398+ if (active_percent > 100)
399+ return -EINVAL;
400+
401+ ret = ivpu_rpm_get(vdev);
402+ if (ret)
403+ return ret;
404+
405+ if (active_percent)
406+ ret = ivpu_pm_dct_enable(vdev, active_percent);
407+ else
408+ ret = ivpu_pm_dct_disable(vdev);
409+
410+ ivpu_rpm_put(vdev);
411+
412+ return ret;
413+}
414+
415+DEFINE_DEBUGFS_ATTRIBUTE(ivpu_dct_fops, dct_active_get, dct_active_set, "%llu\n");
416+
338417 void ivpu_debugfs_init(struct ivpu_device *vdev)
339418 {
340419 struct dentry *debugfs_root = vdev->drm.debugfs_root;
@@ -347,6 +426,8 @@ void ivpu_debugfs_init(struct ivpu_device *vdev) · 6 unmodified lines
347426 debugfs_create_file("dvfs_mode", 0200, debugfs_root, vdev,
348427 &dvfs_mode_fops);
349428
429+ debugfs_create_file("fw_dyndbg", 0200, debugfs_root, vdev,
430+ &fw_dyndbg_fops);
350431 debugfs_create_file("fw_log", 0644, debugfs_root, vdev,
351432 &fw_log_fops);
352433 debugfs_create_file("fw_trace_destination_mask", 0200, debugfs_root, vdev,
@@ -358,8 +439,12 @@ void ivpu_debugfs_init(struct ivpu_device *vdev) · 5 unmodified lines
358439
359440 debugfs_create_file("reset_engine", 0200, debugfs_root, vdev,
360441 &ivpu_reset_engine_fops);
442+ debugfs_create_file("resume_engine", 0200, debugfs_root, vdev,
443+ &ivpu_resume_engine_fops);
361444
362− if (ivpu_hw_gen(vdev) >= IVPU_HW_40XX)
445+ if (ivpu_hw_ip_gen(vdev) >= IVPU_HW_IP_40XX) {
363446 debugfs_create_file("fw_profiling_freq_drive", 0200,
364447 debugfs_root, vdev, &fw_profiling_freq_fops);
448+ debugfs_create_file("dct", 0644, debugfs_root, vdev, &ivpu_dct_fops);
449+ }
365450 }
drivers/accel/ivpu/ivpu_drv.c+99−14
@@ -26,7 +26,9 @@ · 25 unmodified lines
2626 #include "ivpu_jsm_msg.h"
2727 #include "ivpu_mmu.h"
2828 #include "ivpu_mmu_context.h"
29+#include "ivpu_ms.h"
2930 #include "ivpu_pm.h"
31+#include "ivpu_sysfs.h"
3032
3133 #ifndef DRIVER_VERSION_STR
3234 #define DRIVER_VERSION_STR __stringify(DRM_IVPU_DRIVER_MAJOR) "." \
@@ -51,10 +53,18 @@ u8 ivpu_pll_max_ratio = U8_MAX; · 18 unmodified lines
5153 module_param_named(pll_max_ratio, ivpu_pll_max_ratio, byte, 0644);
5254 MODULE_PARM_DESC(pll_max_ratio, "Maximum PLL ratio used to set NPU frequency");
5355
56+int ivpu_sched_mode;
57+module_param_named(sched_mode, ivpu_sched_mode, int, 0444);
58+MODULE_PARM_DESC(sched_mode, "Scheduler mode: 0 - Default scheduler, 1 - Force HW scheduler");
59+
5460 bool ivpu_disable_mmu_cont_pages;
55−module_param_named(disable_mmu_cont_pages, ivpu_disable_mmu_cont_pages, bool, 0644);
61+module_param_named(disable_mmu_cont_pages, ivpu_disable_mmu_cont_pages, bool, 0444);
5662 MODULE_PARM_DESC(disable_mmu_cont_pages, "Disable MMU contiguous pages optimization");
5763
64+bool ivpu_force_snoop;
65+module_param_named(force_snoop, ivpu_force_snoop, bool, 0444);
66+MODULE_PARM_DESC(force_snoop, "Force snooping for NPU host memory access");
67+
5868 struct ivpu_file_priv *ivpu_file_priv_get(struct ivpu_file_priv *file_priv)
5969 {
6070 struct ivpu_device *vdev = file_priv->vdev;
@@ -74,7 +84,6 @@ static void file_priv_unbind(struct ivpu_device *vdev, struct ivpu_file_priv *fi · 13 unmodified lines
7484 ivpu_dbg(vdev, FILE, "file_priv unbind: ctx %u\n", file_priv->ctx.id);
7585
7686 ivpu_cmdq_release_all_locked(file_priv);
77− ivpu_jsm_context_release(vdev, file_priv->ctx.id);
7887 ivpu_bo_unbind_all_bos_from_context(vdev, &file_priv->ctx);
7988 ivpu_mmu_user_context_fini(vdev, &file_priv->ctx);
8089 file_priv->bound = false;
@@ -97,6 +106,7 @@ static void file_priv_release(struct kref *ref) · 16 unmodified lines
97106 mutex_unlock(&vdev->context_list_lock);
98107 pm_runtime_put_autosuspend(vdev->drm.dev);
99108
109+ mutex_destroy(&file_priv->ms_lock);
100110 mutex_destroy(&file_priv->lock);
101111 kfree(file_priv);
102112 }
@@ -119,7 +129,7 @@ static int ivpu_get_capabilities(struct ivpu_device *vdev, struct drm_ivpu_param · 16 unmodified lines
119129 {
120130 switch (args->index) {
121131 case DRM_IVPU_CAP_METRIC_STREAMER:
122− args->value = 0;
132+ args->value = 1;
123133 break;
124134 case DRM_IVPU_CAP_DMA_MEMORY_RANGE:
125135 args->value = 1;
@@ -228,10 +238,13 @@ static int ivpu_open(struct drm_device *dev, struct drm_file *file) · 102 unmodified lines
228238 goto err_dev_exit;
229239 }
230240
241+ INIT_LIST_HEAD(&file_priv->ms_instance_list);
242+
231243 file_priv->vdev = vdev;
232244 file_priv->bound = true;
233245 kref_init(&file_priv->ref);
234246 mutex_init(&file_priv->lock);
247+ mutex_init(&file_priv->ms_lock);
235248
236249 mutex_lock(&vdev->context_list_lock);
237250
@@ -260,6 +273,7 @@ err_xa_erase: · 22 unmodified lines
260273 xa_erase_irq(&vdev->context_xa, ctx_id);
261274 err_unlock:
262275 mutex_unlock(&vdev->context_list_lock);
276+ mutex_destroy(&file_priv->ms_lock);
263277 mutex_destroy(&file_priv->lock);
264278 kfree(file_priv);
265279 err_dev_exit:
@@ -275,6 +289,7 @@ static void ivpu_postclose(struct drm_device *dev, struct drm_file *file) · 9 unmodified lines
275289 ivpu_dbg(vdev, FILE, "file_priv close: ctx %u process %s pid %d\n",
276290 file_priv->ctx.id, current->comm, task_pid_nr(current));
277291
292+ ivpu_ms_cleanup(file_priv);
278293 ivpu_file_priv_put(&file_priv);
279294 }
280295
@@ -285,6 +300,10 @@ static const struct drm_ioctl_desc ivpu_drm_ioctls[] = { · 4 unmodified lines
285300 DRM_IOCTL_DEF_DRV(IVPU_BO_INFO, ivpu_bo_info_ioctl, 0),
286301 DRM_IOCTL_DEF_DRV(IVPU_SUBMIT, ivpu_submit_ioctl, 0),
287302 DRM_IOCTL_DEF_DRV(IVPU_BO_WAIT, ivpu_bo_wait_ioctl, 0),
303+ DRM_IOCTL_DEF_DRV(IVPU_METRIC_STREAMER_START, ivpu_ms_start_ioctl, 0),
304+ DRM_IOCTL_DEF_DRV(IVPU_METRIC_STREAMER_GET_DATA, ivpu_ms_get_data_ioctl, 0),
305+ DRM_IOCTL_DEF_DRV(IVPU_METRIC_STREAMER_STOP, ivpu_ms_stop_ioctl, 0),
306+ DRM_IOCTL_DEF_DRV(IVPU_METRIC_STREAMER_GET_INFO, ivpu_ms_get_info_ioctl, 0),
288307 };
289308
290309 static int ivpu_wait_for_ready(struct ivpu_device *vdev)
@@ -301,7 +320,7 @@ static int ivpu_wait_for_ready(struct ivpu_device *vdev) · 10 unmodified lines
301320
302321 timeout = jiffies + msecs_to_jiffies(vdev->timeout.boot);
303322 while (1) {
304− ivpu_ipc_irq_handler(vdev, NULL);
323+ ivpu_ipc_irq_handler(vdev);
305324 ret = ivpu_ipc_receive(vdev, &cons, &ipc_hdr, NULL, 0);
306325 if (ret != -ETIMEDOUT || time_after_eq(jiffies, timeout))
307326 break;
@@ -323,6 +342,21 @@ static int ivpu_wait_for_ready(struct ivpu_device *vdev) · 15 unmodified lines
323342 return ret;
324343 }
325344
345+static int ivpu_hw_sched_init(struct ivpu_device *vdev)
346+{
347+ int ret = 0;
348+
349+ if (vdev->hw->sched_mode == VPU_SCHEDULING_MODE_HW) {
350+ ret = ivpu_jsm_hws_setup_priority_bands(vdev);
351+ if (ret) {
352+ ivpu_err(vdev, "Failed to enable hw scheduler: %d", ret);
353+ return ret;
354+ }
355+ }
356+
357+ return ret;
358+}
359+
326360 /**
327361 * ivpu_boot() - Start VPU firmware
328362 * @vdev: VPU device
@@ -356,6 +390,15 @@ int ivpu_boot(struct ivpu_device *vdev) · 27 unmodified lines
356390 enable_irq(vdev->irq);
357391 ivpu_hw_irq_enable(vdev);
358392 ivpu_ipc_enable(vdev);
393+
394+ if (ivpu_fw_is_cold_boot(vdev)) {
395+ ret = ivpu_pm_dct_init(vdev);
396+ if (ret)
397+ return ret;
398+
399+ return ivpu_hw_sched_init(vdev);
400+ }
401+
359402 return 0;
360403 }
361404
@@ -408,11 +451,52 @@ static const struct drm_driver driver = { · 46 unmodified lines
408451 .minor = DRM_IVPU_DRIVER_MINOR,
409452 };
410453
454+static void ivpu_context_abort_invalid(struct ivpu_device *vdev)
455+{
456+ struct ivpu_file_priv *file_priv;
457+ unsigned long ctx_id;
458+
459+ mutex_lock(&vdev->context_list_lock);
460+
461+ xa_for_each(&vdev->context_xa, ctx_id, file_priv) {
462+ if (!file_priv->has_mmu_faults || file_priv->aborted)
463+ continue;
464+
465+ mutex_lock(&file_priv->lock);
466+ ivpu_context_abort_locked(file_priv);
467+ file_priv->aborted = true;
468+ mutex_unlock(&file_priv->lock);
469+ }
470+
471+ mutex_unlock(&vdev->context_list_lock);
472+}
473+
411474 static irqreturn_t ivpu_irq_thread_handler(int irq, void *arg)
412475 {
413476 struct ivpu_device *vdev = arg;
477+ u8 irq_src;
478+
479+ if (kfifo_is_empty(&vdev->hw->irq.fifo))
480+ return IRQ_NONE;
414481
415− return ivpu_ipc_irq_thread_handler(vdev);
482+ while (kfifo_get(&vdev->hw->irq.fifo, &irq_src)) {
483+ switch (irq_src) {
484+ case IVPU_HW_IRQ_SRC_IPC:
485+ ivpu_ipc_irq_thread_handler(vdev);
486+ break;
487+ case IVPU_HW_IRQ_SRC_MMU_EVTQ:
488+ ivpu_context_abort_invalid(vdev);
489+ break;
490+ case IVPU_HW_IRQ_SRC_DCT:
491+ ivpu_pm_dct_irq_thread_handler(vdev);
492+ break;
493+ default:
494+ ivpu_err_ratelimited(vdev, "Unknown IRQ source: %u\n", irq_src);
495+ break;
496+ }
497+ }
498+
499+ return IRQ_HANDLED;
416500 }
417501
418502 static int ivpu_irq_init(struct ivpu_device *vdev)
@@ -426,9 +510,11 @@ static int ivpu_irq_init(struct ivpu_device *vdev) · 7 unmodified lines
426510 return ret;
427511 }
428512
513+ ivpu_irq_handlers_init(vdev);
514+
429515 vdev->irq = pci_irq_vector(pdev, 0);
430516
431− ret = devm_request_threaded_irq(vdev->drm.dev, vdev->irq, vdev->hw->ops->irq_handler,
517+ ret = devm_request_threaded_irq(vdev->drm.dev, vdev->irq, ivpu_hw_irq_handler,
432518 ivpu_irq_thread_handler, IRQF_NO_AUTOEN, DRIVER_NAME, vdev);
433519 if (ret)
434520 ivpu_err(vdev, "Failed to request an IRQ %d\n", ret);
@@ -505,13 +591,10 @@ static int ivpu_dev_init(struct ivpu_device *vdev) · 70 unmodified lines
505591 if (!vdev->pm)
506592 return -ENOMEM;
507593
508− if (ivpu_hw_gen(vdev) >= IVPU_HW_40XX) {
509− vdev->hw->ops = &ivpu_hw_40xx_ops;
594+ if (ivpu_hw_ip_gen(vdev) >= IVPU_HW_IP_40XX)
510595 vdev->hw->dma_bits = 48;
511− } else {
512− vdev->hw->ops = &ivpu_hw_37xx_ops;
596+ else
513597 vdev->hw->dma_bits = 38;
514− }
515598
516599 vdev->platform = IVPU_PLATFORM_INVALID;
517600 vdev->context_xa_limit.min = IVPU_USER_CONTEXT_MIN_SSID;
@@ -540,7 +623,7 @@ static int ivpu_dev_init(struct ivpu_device *vdev) · 22 unmodified lines
540623 goto err_xa_destroy;
541624
542625 /* Init basic HW info based on buttress registers which are accessible before power up */
543− ret = ivpu_hw_info_init(vdev);
626+ ret = ivpu_hw_init(vdev);
544627 if (ret)
545628 goto err_xa_destroy;
546629
@@ -612,13 +695,14 @@ static void ivpu_bo_unbind_all_user_contexts(struct ivpu_device *vdev) · 65 unmodified lines
612695
613696 static void ivpu_dev_fini(struct ivpu_device *vdev)
614697 {
698+ ivpu_jobs_abort_all(vdev);
699+ ivpu_pm_cancel_recovery(vdev);
615700 ivpu_pm_disable(vdev);
616701 ivpu_prepare_for_reset(vdev);
617702 ivpu_shutdown(vdev);
618703
619− ivpu_jobs_abort_all(vdev);
704+ ivpu_ms_cleanup_all(vdev);
620705 ivpu_job_done_consumer_fini(vdev);
621− ivpu_pm_cancel_recovery(vdev);
622706 ivpu_bo_unbind_all_user_contexts(vdev);
623707
624708 ivpu_ipc_fini(vdev);
@@ -658,6 +742,7 @@ static int ivpu_probe(struct pci_dev *pdev, const struct pci_device_id *id) · 33 unmodified lines
658742 return ret;
659743
660744 ivpu_debugfs_init(vdev);
745+ ivpu_sysfs_init(vdev);
661746
662747 ret = drm_dev_register(&vdev->drm, 0);
663748 if (ret) {
drivers/accel/ivpu/ivpu_drv.h+53−9
@@ -27,8 +27,15 @@ · 26 unmodified lines
2727 #define PCI_DEVICE_ID_ARL 0xad1d
2828 #define PCI_DEVICE_ID_LNL 0x643e
2929
30−#define IVPU_HW_37XX 37
31−#define IVPU_HW_40XX 40
30+#define IVPU_HW_IP_37XX 37
31+#define IVPU_HW_IP_40XX 40
32+#define IVPU_HW_IP_50XX 50
33+#define IVPU_HW_IP_60XX 60
34+
35+#define IVPU_HW_IP_REV_LNL_B0 4
36+
37+#define IVPU_HW_BTRS_MTL 1
38+#define IVPU_HW_BTRS_LNL 2
3239
3340 #define IVPU_GLOBAL_CONTEXT_MMU_SSID 0
3441 /* SSID 1 is used by the VPU to represent reserved context */
@@ -39,7 +46,11 @@ · 4 unmodified lines
3946 #define IVPU_MIN_DB 1
4047 #define IVPU_MAX_DB 255
4148
42−#define IVPU_NUM_ENGINES 2
49+#define IVPU_NUM_ENGINES 2
50+#define IVPU_NUM_PRIORITIES 4
51+#define IVPU_NUM_CMDQS_PER_CTX (IVPU_NUM_ENGINES * IVPU_NUM_PRIORITIES)
52+
53+#define IVPU_CMDQ_INDEX(engine, priority) ((engine) * IVPU_NUM_PRIORITIES + (priority))
4354
4455 #define IVPU_PLATFORM_SILICON 0
4556 #define IVPU_PLATFORM_SIMICS 2
@@ -93,6 +104,7 @@ struct ivpu_wa_table { · 47 unmodified lines
93104 bool interrupt_clear_with_0;
94105 bool disable_clock_relinquish;
95106 bool disable_d0i3_msg;
107+ bool wp0_during_power_up;
96108 };
97109
98110 struct ivpu_hw_info;
@@ -131,11 +143,13 @@ struct ivpu_device { · 32 unmodified lines
131143
132144 atomic64_t unique_id_counter;
133145
146+ ktime_t busy_start_ts;
147+ ktime_t busy_time;
148+
134149 struct {
135150 int boot;
136151 int jsm;
137152 int tdr;
138− int reschedule_suspend;
139153 int autosuspend;
140154 int d0i3_entry_msg;
141155 } timeout;
@@ -149,22 +163,31 @@ struct ivpu_file_priv { · 7 unmodified lines
149163 struct kref ref;
150164 struct ivpu_device *vdev;
151165 struct mutex lock; /* Protects cmdq */
152− struct ivpu_cmdq *cmdq[IVPU_NUM_ENGINES];
166+ struct ivpu_cmdq *cmdq[IVPU_NUM_CMDQS_PER_CTX];
153167 struct ivpu_mmu_context ctx;
168+ struct mutex ms_lock; /* Protects ms_instance_list, ms_info_bo */
169+ struct list_head ms_instance_list;
170+ struct ivpu_bo *ms_info_bo;
154171 bool has_mmu_faults;
155172 bool bound;
173+ bool aborted;
156174 };
157175
158176 extern int ivpu_dbg_mask;
159177 extern u8 ivpu_pll_min_ratio;
160178 extern u8 ivpu_pll_max_ratio;
179+extern int ivpu_sched_mode;
161180 extern bool ivpu_disable_mmu_cont_pages;
181+extern bool ivpu_force_snoop;
162182
163183 #define IVPU_TEST_MODE_FW_TEST BIT(0)
164184 #define IVPU_TEST_MODE_NULL_HW BIT(1)
165185 #define IVPU_TEST_MODE_NULL_SUBMISSION BIT(2)
166186 #define IVPU_TEST_MODE_D0I3_MSG_DISABLE BIT(4)
167187 #define IVPU_TEST_MODE_D0I3_MSG_ENABLE BIT(5)
188+#define IVPU_TEST_MODE_PREEMPTION_DISABLE BIT(6)
189+#define IVPU_TEST_MODE_HWS_EXTRA_EVENTS BIT(7)
190+#define IVPU_TEST_MODE_DISABLE_TIMEOUTS BIT(8)
168191 extern int ivpu_test_mode;
169192
170193 struct ivpu_file_priv *ivpu_file_priv_get(struct ivpu_file_priv *file_priv);
@@ -184,16 +207,32 @@ static inline u16 ivpu_device_id(struct ivpu_device *vdev) · 13 unmodified lines
184207 return to_pci_dev(vdev->drm.dev)->device;
185208 }
186209
187−static inline int ivpu_hw_gen(struct ivpu_device *vdev)
210+static inline int ivpu_hw_ip_gen(struct ivpu_device *vdev)
188211 {
189212 switch (ivpu_device_id(vdev)) {
190213 case PCI_DEVICE_ID_MTL:
191214 case PCI_DEVICE_ID_ARL:
192− return IVPU_HW_37XX;
215+ return IVPU_HW_IP_37XX;
193216 case PCI_DEVICE_ID_LNL:
194− return IVPU_HW_40XX;
217+ return IVPU_HW_IP_40XX;
195218 default:
196− ivpu_err(vdev, "Unknown NPU device\n");
219+ dump_stack();
220+ ivpu_err(vdev, "Unknown NPU IP generation\n");
221+ return 0;
222+ }
223+}
224+
225+static inline int ivpu_hw_btrs_gen(struct ivpu_device *vdev)
226+{
227+ switch (ivpu_device_id(vdev)) {
228+ case PCI_DEVICE_ID_MTL:
229+ case PCI_DEVICE_ID_ARL:
230+ return IVPU_HW_BTRS_MTL;
231+ case PCI_DEVICE_ID_LNL:
232+ return IVPU_HW_BTRS_LNL;
233+ default:
234+ dump_stack();
235+ ivpu_err(vdev, "Unknown buttress generation\n");
197236 return 0;
198237 }
199238 }
@@ -231,4 +270,9 @@ static inline bool ivpu_is_fpga(struct ivpu_device *vdev) · 31 unmodified lines
231270 return ivpu_get_platform(vdev) == IVPU_PLATFORM_FPGA;
232271 }
233272
273+static inline bool ivpu_is_force_snoop_enabled(struct ivpu_device *vdev)
274+{
275+ return ivpu_force_snoop;
276+}
277+
234278 #endif /* __IVPU_DRV_H__ */
drivers/accel/ivpu/ivpu_fw.c+50−11
@@ -1,6 +1,6 @@
11 // SPDX-License-Identifier: GPL-2.0-only
22 /*
3− * Copyright (C) 2020-2023 Intel Corporation
3+ * Copyright (C) 2020-2024 Intel Corporation
44 */
55
66 #include <linux/firmware.h>
@@ -44,6 +44,8 @@ · 37 unmodified lines
4444 #define IVPU_FW_CHECK_API_VER_LT(vdev, fw_hdr, name, major, minor) \
4545 ivpu_fw_check_api_ver_lt(vdev, fw_hdr, #name, VPU_##name##_API_VER_INDEX, major, minor)
4646
47+#define IVPU_FOCUS_PRESENT_TIMER_MS 1000
48+
4749 static char *ivpu_firmware;
4850 module_param_named_unsafe(firmware, ivpu_firmware, charp, 0644);
4951 MODULE_PARM_DESC(firmware, "NPU firmware binary in /lib/firmware/..");
@@ -52,10 +54,10 @@ static struct { · 2 unmodified lines
5254 int gen;
5355 const char *name;
5456 } fw_names[] = {
55− { IVPU_HW_37XX, "vpu_37xx.bin" },
56− { IVPU_HW_37XX, "intel/vpu/vpu_37xx_v0.0.bin" },
57− { IVPU_HW_40XX, "vpu_40xx.bin" },
58− { IVPU_HW_40XX, "intel/vpu/vpu_40xx_v0.0.bin" },
57+ { IVPU_HW_IP_37XX, "vpu_37xx.bin" },
58+ { IVPU_HW_IP_37XX, "intel/vpu/vpu_37xx_v0.0.bin" },
59+ { IVPU_HW_IP_40XX, "vpu_40xx.bin" },
60+ { IVPU_HW_IP_40XX, "intel/vpu/vpu_40xx_v0.0.bin" },
5961 };
6062
6163 static int ivpu_fw_request(struct ivpu_device *vdev)
@@ -71,7 +73,7 @@ static int ivpu_fw_request(struct ivpu_device *vdev) · 9 unmodified lines
7173 }
7274
7375 for (i = 0; i < ARRAY_SIZE(fw_names); i++) {
74− if (fw_names[i].gen != ivpu_hw_gen(vdev))
76+ if (fw_names[i].gen != ivpu_hw_ip_gen(vdev))
7577 continue;
7678
7779 ret = firmware_request_nowarn(&vdev->fw->file, fw_names[i].name, vdev->drm.dev);
@@ -121,6 +123,14 @@ ivpu_fw_check_api_ver_lt(struct ivpu_device *vdev, const struct vpu_firmware_hea · 43 unmodified lines
121123 return false;
122124 }
123125
126+static bool is_within_range(u64 addr, size_t size, u64 range_start, size_t range_size)
127+{
128+ if (addr < range_start || addr + size > range_start + range_size)
129+ return false;
130+
131+ return true;
132+}
133+
124134 static int ivpu_fw_parse(struct ivpu_device *vdev)
125135 {
126136 struct ivpu_fw_info *fw = vdev->fw;
@@ -200,10 +210,27 @@ static int ivpu_fw_parse(struct ivpu_device *vdev) · 73 unmodified lines
200210
201211 fw->dvfs_mode = 0;
202212
213+ fw->primary_preempt_buf_size = fw_hdr->preemption_buffer_1_size;
214+ fw->secondary_preempt_buf_size = fw_hdr->preemption_buffer_2_size;
215+
216+ if (fw_hdr->ro_section_start_address && !is_within_range(fw_hdr->ro_section_start_address,
217+ fw_hdr->ro_section_size,
218+ fw_hdr->image_load_address,
219+ fw_hdr->image_size)) {
220+ ivpu_err(vdev, "Invalid read-only section: start address 0x%llx, size %u\n",
221+ fw_hdr->ro_section_start_address, fw_hdr->ro_section_size);
222+ return -EINVAL;
223+ }
224+
225+ fw->read_only_addr = fw_hdr->ro_section_start_address;
226+ fw->read_only_size = fw_hdr->ro_section_size;
227+
203228 ivpu_dbg(vdev, FW_BOOT, "Size: file %lu image %u runtime %u shavenn %u\n",
204229 fw->file->size, fw->image_size, fw->runtime_size, fw->shave_nn_size);
205230 ivpu_dbg(vdev, FW_BOOT, "Address: runtime 0x%llx, load 0x%llx, entry point 0x%llx\n",
206231 fw->runtime_addr, image_load_addr, fw->entry_point);
232+ ivpu_dbg(vdev, FW_BOOT, "Read-only section: address 0x%llx, size %u\n",
233+ fw->read_only_addr, fw->read_only_size);
207234
208235 return 0;
209236 }
@@ -241,7 +268,7 @@ static int ivpu_fw_update_global_range(struct ivpu_device *vdev) · 31 unmodified lines
241268 return -EINVAL;
242269 }
243270
244− ivpu_hw_init_range(&vdev->hw->ranges.global, start, size);
271+ ivpu_hw_range_init(&vdev->hw->ranges.global, start, size);
245272 return 0;
246273 }
247274
@@ -265,6 +292,13 @@ static int ivpu_fw_mem_init(struct ivpu_device *vdev) · 17 unmodified lines
265292 return -ENOMEM;
266293 }
267294
295+ ret = ivpu_mmu_context_set_pages_ro(vdev, &vdev->gctx, fw->read_only_addr,
296+ fw->read_only_size);
297+ if (ret) {
298+ ivpu_err(vdev, "Failed to set firmware image read-only\n");
299+ goto err_free_fw_mem;
300+ }
301+
268302 fw->mem_log_crit = ivpu_bo_create_global(vdev, IVPU_FW_CRITICAL_BUFFER_SIZE,
269303 DRM_IVPU_BO_CACHED | DRM_IVPU_BO_MAPPABLE);
270304 if (!fw->mem_log_crit) {
@@ -464,6 +498,8 @@ static void ivpu_fw_boot_params_print(struct ivpu_device *vdev, struct vpu_boot_ · 193 unmodified lines
464498 boot_params->punit_telemetry_sram_size);
465499 ivpu_dbg(vdev, FW_BOOT, "boot_params.vpu_telemetry_enable = 0x%x\n",
466500 boot_params->vpu_telemetry_enable);
501+ ivpu_dbg(vdev, FW_BOOT, "boot_params.vpu_scheduling_mode = 0x%x\n",
502+ boot_params->vpu_scheduling_mode);
467503 ivpu_dbg(vdev, FW_BOOT, "boot_params.dvfs_mode = %u\n",
468504 boot_params->dvfs_mode);
469505 ivpu_dbg(vdev, FW_BOOT, "boot_params.d0i3_delayed_entry = %d\n",
@@ -504,7 +540,7 @@ void ivpu_fw_boot_params_setup(struct ivpu_device *vdev, struct vpu_boot_params · 34 unmodified lines
504540
505541 boot_params->magic = VPU_BOOT_PARAMS_MAGIC;
506542 boot_params->vpu_id = to_pci_dev(vdev->drm.dev)->bus->number;
507− boot_params->frequency = ivpu_hw_reg_pll_freq_get(vdev);
543+ boot_params->frequency = ivpu_hw_pll_freq_get(vdev);
508544
509545 /*
510546 * This param is a debug firmware feature. It switches default clock
@@ -561,9 +597,12 @@ void ivpu_fw_boot_params_setup(struct ivpu_device *vdev, struct vpu_boot_params · 50 unmodified lines
561597 boot_params->verbose_tracing_buff_addr = vdev->fw->mem_log_verb->vpu_addr;
562598 boot_params->verbose_tracing_buff_size = ivpu_bo_size(vdev->fw->mem_log_verb);
563599
564− boot_params->punit_telemetry_sram_base = ivpu_hw_reg_telemetry_offset_get(vdev);
565− boot_params->punit_telemetry_sram_size = ivpu_hw_reg_telemetry_size_get(vdev);
566− boot_params->vpu_telemetry_enable = ivpu_hw_reg_telemetry_enable_get(vdev);
600+ boot_params->punit_telemetry_sram_base = ivpu_hw_telemetry_offset_get(vdev);
601+ boot_params->punit_telemetry_sram_size = ivpu_hw_telemetry_size_get(vdev);
602+ boot_params->vpu_telemetry_enable = ivpu_hw_telemetry_enable_get(vdev);
603+ boot_params->vpu_scheduling_mode = vdev->hw->sched_mode;
604+ if (vdev->hw->sched_mode == VPU_SCHEDULING_MODE_HW)
605+ boot_params->vpu_focus_present_timer_ms = IVPU_FOCUS_PRESENT_TIMER_MS;
567606 boot_params->dvfs_mode = vdev->fw->dvfs_mode;
568607 if (!IVPU_WA(disable_d0i3_msg))
569608 boot_params->d0i3_delayed_entry = 1;
drivers/accel/ivpu/ivpu_fw.h+4−0
@@ -28,6 +28,10 @@ struct ivpu_fw_info { · 27 unmodified lines
2828 u32 trace_destination_mask;
2929 u64 trace_hw_component_mask;
3030 u32 dvfs_mode;
31+ u32 primary_preempt_buf_size;
32+ u32 secondary_preempt_buf_size;
33+ u64 read_only_addr;
34+ u32 read_only_size;
3135 };
3236
3337 int ivpu_fw_init(struct ivpu_device *vdev);
drivers/accel/ivpu/ivpu_gem.h+7−4
@@ -60,14 +60,17 @@ static inline u32 ivpu_bo_cache_mode(struct ivpu_bo *bo) · 59 unmodified lines
6060 return bo->flags & DRM_IVPU_BO_CACHE_MASK;
6161 }
6262
63−static inline bool ivpu_bo_is_snooped(struct ivpu_bo *bo)
63+static inline struct ivpu_device *ivpu_bo_to_vdev(struct ivpu_bo *bo)
6464 {
65− return ivpu_bo_cache_mode(bo) == DRM_IVPU_BO_CACHED;
65+ return to_ivpu_device(bo->base.base.dev);
6666 }
6767
68−static inline struct ivpu_device *ivpu_bo_to_vdev(struct ivpu_bo *bo)
68+static inline bool ivpu_bo_is_snooped(struct ivpu_bo *bo)
6969 {
70− return to_ivpu_device(bo->base.base.dev);
70+ if (ivpu_is_force_snoop_enabled(ivpu_bo_to_vdev(bo)))
71+ return true;
72+
73+ return ivpu_bo_cache_mode(bo) == DRM_IVPU_BO_CACHED;
7174 }
7275
7376 static inline void *ivpu_to_cpu_addr(struct ivpu_bo *bo, u32 vpu_addr)
drivers/accel/ivpu/ivpu_hw.c+331−0
@@ -0,0 +1,331 @@
1+// SPDX-License-Identifier: GPL-2.0-only
2+/*
3+ * Copyright (C) 2020 - 2024 Intel Corporation
4+ */
5+
6+#include "ivpu_drv.h"
7+#include "ivpu_hw.h"
8+#include "ivpu_hw_btrs.h"
9+#include "ivpu_hw_ip.h"
10+
11+#include <linux/dmi.h>
12+
13+static char *platform_to_str(u32 platform)
14+{
15+ switch (platform) {
16+ case IVPU_PLATFORM_SILICON:
17+ return "SILICON";
18+ case IVPU_PLATFORM_SIMICS:
19+ return "SIMICS";
20+ case IVPU_PLATFORM_FPGA:
21+ return "FPGA";
22+ default:
23+ return "Invalid platform";
24+ }
25+}
26+
27+static const struct dmi_system_id dmi_platform_simulation[] = {
28+ {
29+ .ident = "Intel Simics",
30+ .matches = {
31+ DMI_MATCH(DMI_BOARD_NAME, "lnlrvp"),
32+ DMI_MATCH(DMI_BOARD_VERSION, "1.0"),
33+ DMI_MATCH(DMI_BOARD_SERIAL, "123456789"),
34+ },
35+ },
36+ {
37+ .ident = "Intel Simics",
38+ .matches = {
39+ DMI_MATCH(DMI_BOARD_NAME, "Simics"),
40+ },
41+ },
42+ { }
43+};
44+
45+static void platform_init(struct ivpu_device *vdev)
46+{
47+ if (dmi_check_system(dmi_platform_simulation))
48+ vdev->platform = IVPU_PLATFORM_SIMICS;
49+ else
50+ vdev->platform = IVPU_PLATFORM_SILICON;
51+
52+ ivpu_dbg(vdev, MISC, "Platform type: %s (%d)\n",
53+ platform_to_str(vdev->platform), vdev->platform);
54+}
55+
56+static void wa_init(struct ivpu_device *vdev)
57+{
58+ vdev->wa.punit_disabled = ivpu_is_fpga(vdev);
59+ vdev->wa.clear_runtime_mem = false;
60+
61+ if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL)
62+ vdev->wa.interrupt_clear_with_0 = ivpu_hw_btrs_irqs_clear_with_0_mtl(vdev);
63+
64+ if (ivpu_device_id(vdev) == PCI_DEVICE_ID_LNL &&
65+ ivpu_revision(vdev) < IVPU_HW_IP_REV_LNL_B0)
66+ vdev->wa.disable_clock_relinquish = true;
67+
68+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
69+ vdev->wa.wp0_during_power_up = true;
70+
71+ IVPU_PRINT_WA(punit_disabled);
72+ IVPU_PRINT_WA(clear_runtime_mem);
73+ IVPU_PRINT_WA(interrupt_clear_with_0);
74+ IVPU_PRINT_WA(disable_clock_relinquish);
75+ IVPU_PRINT_WA(wp0_during_power_up);
76+}
77+
78+static void timeouts_init(struct ivpu_device *vdev)
79+{
80+ if (ivpu_test_mode & IVPU_TEST_MODE_DISABLE_TIMEOUTS) {
81+ vdev->timeout.boot = -1;
82+ vdev->timeout.jsm = -1;
83+ vdev->timeout.tdr = -1;
84+ vdev->timeout.autosuspend = -1;
85+ vdev->timeout.d0i3_entry_msg = -1;
86+ } else if (ivpu_is_fpga(vdev)) {
87+ vdev->timeout.boot = 100000;
88+ vdev->timeout.jsm = 50000;
89+ vdev->timeout.tdr = 2000000;
90+ vdev->timeout.autosuspend = -1;
91+ vdev->timeout.d0i3_entry_msg = 500;
92+ } else if (ivpu_is_simics(vdev)) {
93+ vdev->timeout.boot = 50;
94+ vdev->timeout.jsm = 500;
95+ vdev->timeout.tdr = 10000;
96+ vdev->timeout.autosuspend = -1;
97+ vdev->timeout.d0i3_entry_msg = 100;
98+ } else {
99+ vdev->timeout.boot = 1000;
100+ vdev->timeout.jsm = 500;
101+ vdev->timeout.tdr = 2000;
102+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
103+ vdev->timeout.autosuspend = 10;
104+ else
105+ vdev->timeout.autosuspend = 100;
106+ vdev->timeout.d0i3_entry_msg = 5;
107+ }
108+}
109+
110+static void memory_ranges_init(struct ivpu_device *vdev)
111+{
112+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX) {
113+ ivpu_hw_range_init(&vdev->hw->ranges.global, 0x80000000, SZ_512M);
114+ ivpu_hw_range_init(&vdev->hw->ranges.user, 0xc0000000, 255 * SZ_1M);
115+ ivpu_hw_range_init(&vdev->hw->ranges.shave, 0x180000000, SZ_2G);
116+ ivpu_hw_range_init(&vdev->hw->ranges.dma, 0x200000000, SZ_8G);
117+ } else {
118+ ivpu_hw_range_init(&vdev->hw->ranges.global, 0x80000000, SZ_512M);
119+ ivpu_hw_range_init(&vdev->hw->ranges.user, 0x80000000, SZ_256M);
120+ ivpu_hw_range_init(&vdev->hw->ranges.shave, 0x80000000 + SZ_256M, SZ_2G - SZ_256M);
121+ ivpu_hw_range_init(&vdev->hw->ranges.dma, 0x200000000, SZ_8G);
122+ }
123+}
124+
125+static int wp_enable(struct ivpu_device *vdev)
126+{
127+ return ivpu_hw_btrs_wp_drive(vdev, true);
128+}
129+
130+static int wp_disable(struct ivpu_device *vdev)
131+{
132+ return ivpu_hw_btrs_wp_drive(vdev, false);
133+}
134+
135+int ivpu_hw_power_up(struct ivpu_device *vdev)
136+{
137+ int ret;
138+
139+ if (IVPU_WA(wp0_during_power_up)) {
140+ /* WP requests may fail when powering down, so issue WP 0 here */
141+ ret = wp_disable(vdev);
142+ if (ret)
143+ ivpu_warn(vdev, "Failed to disable workpoint: %d\n", ret);
144+ }
145+
146+ ret = ivpu_hw_btrs_d0i3_disable(vdev);
147+ if (ret)
148+ ivpu_warn(vdev, "Failed to disable D0I3: %d\n", ret);
149+
150+ ret = wp_enable(vdev);
151+ if (ret) {
152+ ivpu_err(vdev, "Failed to enable workpoint: %d\n", ret);
153+ return ret;
154+ }
155+
156+ if (ivpu_hw_btrs_gen(vdev) >= IVPU_HW_BTRS_LNL) {
157+ if (IVPU_WA(disable_clock_relinquish))
158+ ivpu_hw_btrs_clock_relinquish_disable_lnl(vdev);
159+ ivpu_hw_btrs_profiling_freq_reg_set_lnl(vdev);
160+ ivpu_hw_btrs_ats_print_lnl(vdev);
161+ }
162+
163+ ret = ivpu_hw_ip_host_ss_configure(vdev);
164+ if (ret) {
165+ ivpu_err(vdev, "Failed to configure host SS: %d\n", ret);
166+ return ret;
167+ }
168+
169+ ivpu_hw_ip_idle_gen_disable(vdev);
170+
171+ ret = ivpu_hw_btrs_wait_for_clock_res_own_ack(vdev);
172+ if (ret) {
173+ ivpu_err(vdev, "Timed out waiting for clock resource own ACK\n");
174+ return ret;
175+ }
176+
177+ ret = ivpu_hw_ip_pwr_domain_enable(vdev);
178+ if (ret) {
179+ ivpu_err(vdev, "Failed to enable power domain: %d\n", ret);
180+ return ret;
181+ }
182+
183+ ret = ivpu_hw_ip_host_ss_axi_enable(vdev);
184+ if (ret) {
185+ ivpu_err(vdev, "Failed to enable AXI: %d\n", ret);
186+ return ret;
187+ }
188+
189+ if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_LNL)
190+ ivpu_hw_btrs_set_port_arbitration_weights_lnl(vdev);
191+
192+ ret = ivpu_hw_ip_top_noc_enable(vdev);
193+ if (ret)
194+ ivpu_err(vdev, "Failed to enable TOP NOC: %d\n", ret);
195+
196+ return ret;
197+}
198+
199+static void save_d0i3_entry_timestamp(struct ivpu_device *vdev)
200+{
201+ vdev->hw->d0i3_entry_host_ts = ktime_get_boottime();
202+ vdev->hw->d0i3_entry_vpu_ts = ivpu_hw_ip_read_perf_timer_counter(vdev);
203+}
204+
205+int ivpu_hw_reset(struct ivpu_device *vdev)
206+{
207+ int ret = 0;
208+
209+ if (ivpu_hw_btrs_ip_reset(vdev)) {
210+ ivpu_err(vdev, "Failed to reset NPU IP\n");
211+ ret = -EIO;
212+ }
213+
214+ if (wp_disable(vdev)) {
215+ ivpu_err(vdev, "Failed to disable workpoint\n");
216+ ret = -EIO;
217+ }
218+
219+ return ret;
220+}
221+
222+int ivpu_hw_power_down(struct ivpu_device *vdev)
223+{
224+ int ret = 0;
225+
226+ save_d0i3_entry_timestamp(vdev);
227+
228+ if (!ivpu_hw_is_idle(vdev))
229+ ivpu_warn(vdev, "NPU not idle during power down\n");
230+
231+ if (ivpu_hw_reset(vdev)) {
232+ ivpu_err(vdev, "Failed to reset NPU\n");
233+ ret = -EIO;
234+ }
235+
236+ if (ivpu_hw_btrs_d0i3_enable(vdev)) {
237+ ivpu_err(vdev, "Failed to enter D0I3\n");
238+ ret = -EIO;
239+ }
240+
241+ return ret;
242+}
243+
244+int ivpu_hw_init(struct ivpu_device *vdev)
245+{
246+ ivpu_hw_btrs_info_init(vdev);
247+ ivpu_hw_btrs_freq_ratios_init(vdev);
248+ memory_ranges_init(vdev);
249+ platform_init(vdev);
250+ wa_init(vdev);
251+ timeouts_init(vdev);
252+
253+ return 0;
254+}
255+
256+int ivpu_hw_boot_fw(struct ivpu_device *vdev)
257+{
258+ int ret;
259+
260+ ivpu_hw_ip_snoop_disable(vdev);
261+ ivpu_hw_ip_tbu_mmu_enable(vdev);
262+ ret = ivpu_hw_ip_soc_cpu_boot(vdev);
263+ if (ret)
264+ ivpu_err(vdev, "Failed to boot SOC CPU: %d\n", ret);
265+
266+ return ret;
267+}
268+
269+void ivpu_hw_profiling_freq_drive(struct ivpu_device *vdev, bool enable)
270+{
271+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX) {
272+ vdev->hw->pll.profiling_freq = PLL_PROFILING_FREQ_DEFAULT;
273+ return;
274+ }
275+
276+ if (enable)
277+ vdev->hw->pll.profiling_freq = PLL_PROFILING_FREQ_HIGH;
278+ else
279+ vdev->hw->pll.profiling_freq = PLL_PROFILING_FREQ_DEFAULT;
280+}
281+
282+void ivpu_irq_handlers_init(struct ivpu_device *vdev)
283+{
284+ INIT_KFIFO(vdev->hw->irq.fifo);
285+
286+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
287+ vdev->hw->irq.ip_irq_handler = ivpu_hw_ip_irq_handler_37xx;
288+ else
289+ vdev->hw->irq.ip_irq_handler = ivpu_hw_ip_irq_handler_40xx;
290+
291+ if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL)
292+ vdev->hw->irq.btrs_irq_handler = ivpu_hw_btrs_irq_handler_mtl;
293+ else
294+ vdev->hw->irq.btrs_irq_handler = ivpu_hw_btrs_irq_handler_lnl;
295+}
296+
297+void ivpu_hw_irq_enable(struct ivpu_device *vdev)
298+{
299+ kfifo_reset(&vdev->hw->irq.fifo);
300+ ivpu_hw_ip_irq_enable(vdev);
301+ ivpu_hw_btrs_irq_enable(vdev);
302+}
303+
304+void ivpu_hw_irq_disable(struct ivpu_device *vdev)
305+{
306+ ivpu_hw_btrs_irq_disable(vdev);
307+ ivpu_hw_ip_irq_disable(vdev);
308+}
309+
310+irqreturn_t ivpu_hw_irq_handler(int irq, void *ptr)
311+{
312+ struct ivpu_device *vdev = ptr;
313+ bool ip_handled, btrs_handled;
314+
315+ ivpu_hw_btrs_global_int_disable(vdev);
316+
317+ btrs_handled = ivpu_hw_btrs_irq_handler(vdev, irq);
318+ if (!ivpu_hw_is_idle((vdev)) || !btrs_handled)
319+ ip_handled = ivpu_hw_ip_irq_handler(vdev, irq);
320+ else
321+ ip_handled = false;
322+
323+ /* Re-enable global interrupts to re-trigger MSI for pending interrupts */
324+ ivpu_hw_btrs_global_int_enable(vdev);
325+
326+ if (!kfifo_is_empty(&vdev->hw->irq.fifo))
327+ return IRQ_WAKE_THREAD;
328+ if (ip_handled || btrs_handled)
329+ return IRQ_HANDLED;
330+ return IRQ_NONE;
331+}
drivers/accel/ivpu/ivpu_hw.h+77−122
@@ -1,39 +1,22 @@
11 /* SPDX-License-Identifier: GPL-2.0-only */
22 /*
3− * Copyright (C) 2020-2023 Intel Corporation
3+ * Copyright (C) 2020-2024 Intel Corporation
44 */
55
66 #ifndef __IVPU_HW_H__
77 #define __IVPU_HW_H__
88
9+#include <linux/kfifo.h>
10+
911 #include "ivpu_drv.h"
12+#include "ivpu_hw_btrs.h"
13+#include "ivpu_hw_ip.h"
1014
11−struct ivpu_hw_ops {
12− int (*info_init)(struct ivpu_device *vdev);
13− int (*power_up)(struct ivpu_device *vdev);
14− int (*boot_fw)(struct ivpu_device *vdev);
15− int (*power_down)(struct ivpu_device *vdev);
16− int (*reset)(struct ivpu_device *vdev);
17− bool (*is_idle)(struct ivpu_device *vdev);
18− int (*wait_for_idle)(struct ivpu_device *vdev);
19− void (*wdt_disable)(struct ivpu_device *vdev);
20− void (*diagnose_failure)(struct ivpu_device *vdev);
21− u32 (*profiling_freq_get)(struct ivpu_device *vdev);
22− void (*profiling_freq_drive)(struct ivpu_device *vdev, bool enable);
23− u32 (*reg_pll_freq_get)(struct ivpu_device *vdev);
24− u32 (*ratio_to_freq)(struct ivpu_device *vdev, u32 ratio);
25− u32 (*reg_telemetry_offset_get)(struct ivpu_device *vdev);
26− u32 (*reg_telemetry_size_get)(struct ivpu_device *vdev);
27− u32 (*reg_telemetry_enable_get)(struct ivpu_device *vdev);
28− void (*reg_db_set)(struct ivpu_device *vdev, u32 db_id);
29− u32 (*reg_ipc_rx_addr_get)(struct ivpu_device *vdev);
30− u32 (*reg_ipc_rx_count_get)(struct ivpu_device *vdev);
31− void (*reg_ipc_tx_set)(struct ivpu_device *vdev, u32 vpu_addr);
32− void (*irq_clear)(struct ivpu_device *vdev);
33− void (*irq_enable)(struct ivpu_device *vdev);
34− void (*irq_disable)(struct ivpu_device *vdev);
35− irqreturn_t (*irq_handler)(int irq, void *ptr);
36−};
15+#define IVPU_HW_IRQ_FIFO_LENGTH 1024
16+
17+#define IVPU_HW_IRQ_SRC_IPC 1
18+#define IVPU_HW_IRQ_SRC_MMU_EVTQ 2
19+#define IVPU_HW_IRQ_SRC_DCT 3
3720
3821 struct ivpu_addr_range {
3922 resource_size_t start;
@@ -41,7 +24,11 @@ struct ivpu_addr_range { · 1 unmodified line
4124 };
4225
4326 struct ivpu_hw_info {
44− const struct ivpu_hw_ops *ops;
27+ struct {
28+ bool (*btrs_irq_handler)(struct ivpu_device *vdev, int irq);
29+ bool (*ip_irq_handler)(struct ivpu_device *vdev, int irq);
30+ DECLARE_KFIFO(fifo, u8, IVPU_HW_IRQ_FIFO_LENGTH);
31+ } irq;
4532 struct {
4633 struct ivpu_addr_range global;
4734 struct ivpu_addr_range user;
@@ -59,6 +46,7 @@ struct ivpu_hw_info { · 11 unmodified lines
5946 u32 profiling_freq;
6047 } pll;
6148 u32 tile_fuse;
49+ u32 sched_mode;
6250 u32 sku;
6351 u16 config;
6452 int dma_bits;
@@ -66,140 +54,107 @@ struct ivpu_hw_info { · 1 unmodified line
6654 u64 d0i3_entry_vpu_ts;
6755 };
6856
69−extern const struct ivpu_hw_ops ivpu_hw_37xx_ops;
70−extern const struct ivpu_hw_ops ivpu_hw_40xx_ops;
71−
72−static inline int ivpu_hw_info_init(struct ivpu_device *vdev)
73−{
74− return vdev->hw->ops->info_init(vdev);
75−};
76−
77−static inline int ivpu_hw_power_up(struct ivpu_device *vdev)
78−{
79− ivpu_dbg(vdev, PM, "HW power up\n");
57+int ivpu_hw_init(struct ivpu_device *vdev);
58+int ivpu_hw_power_up(struct ivpu_device *vdev);
59+int ivpu_hw_power_down(struct ivpu_device *vdev);
60+int ivpu_hw_reset(struct ivpu_device *vdev);
61+int ivpu_hw_boot_fw(struct ivpu_device *vdev);
62+void ivpu_hw_profiling_freq_drive(struct ivpu_device *vdev, bool enable);
63+void ivpu_irq_handlers_init(struct ivpu_device *vdev);
64+void ivpu_hw_irq_enable(struct ivpu_device *vdev);
65+void ivpu_hw_irq_disable(struct ivpu_device *vdev);
66+irqreturn_t ivpu_hw_irq_handler(int irq, void *ptr);
8067
81− return vdev->hw->ops->power_up(vdev);
82−};
83−
84−static inline int ivpu_hw_boot_fw(struct ivpu_device *vdev)
85−{
86− return vdev->hw->ops->boot_fw(vdev);
87−};
88−
89−static inline bool ivpu_hw_is_idle(struct ivpu_device *vdev)
90−{
91− return vdev->hw->ops->is_idle(vdev);
92−};
93−
94−static inline int ivpu_hw_wait_for_idle(struct ivpu_device *vdev)
68+static inline u32 ivpu_hw_btrs_irq_handler(struct ivpu_device *vdev, int irq)
9569 {
96− return vdev->hw->ops->wait_for_idle(vdev);
97−};
98−
99−static inline int ivpu_hw_power_down(struct ivpu_device *vdev)
100−{
101− ivpu_dbg(vdev, PM, "HW power down\n");
102−
103− return vdev->hw->ops->power_down(vdev);
104−};
105−
106−static inline int ivpu_hw_reset(struct ivpu_device *vdev)
107−{
108− ivpu_dbg(vdev, PM, "HW reset\n");
109−
110− return vdev->hw->ops->reset(vdev);
111−};
112−
113−static inline void ivpu_hw_wdt_disable(struct ivpu_device *vdev)
114−{
115− vdev->hw->ops->wdt_disable(vdev);
116−};
70+ return vdev->hw->irq.btrs_irq_handler(vdev, irq);
71+}
11772
118−static inline u32 ivpu_hw_profiling_freq_get(struct ivpu_device *vdev)
73+static inline u32 ivpu_hw_ip_irq_handler(struct ivpu_device *vdev, int irq)
11974 {
120− return vdev->hw->ops->profiling_freq_get(vdev);
121−};
75+ return vdev->hw->irq.ip_irq_handler(vdev, irq);
76+}
12277
123−static inline void ivpu_hw_profiling_freq_drive(struct ivpu_device *vdev, bool enable)
78+static inline void ivpu_hw_range_init(struct ivpu_addr_range *range, u64 start, u64 size)
12479 {
125− return vdev->hw->ops->profiling_freq_drive(vdev, enable);
126−};
80+ range->start = start;
81+ range->end = start + size;
82+}
12783
128−/* Register indirect accesses */
129−static inline u32 ivpu_hw_reg_pll_freq_get(struct ivpu_device *vdev)
84+static inline u64 ivpu_hw_range_size(const struct ivpu_addr_range *range)
13085 {
131− return vdev->hw->ops->reg_pll_freq_get(vdev);
132−};
86+ return range->end - range->start;
87+}
13388
13489 static inline u32 ivpu_hw_ratio_to_freq(struct ivpu_device *vdev, u32 ratio)
13590 {
136− return vdev->hw->ops->ratio_to_freq(vdev, ratio);
91+ return ivpu_hw_btrs_ratio_to_freq(vdev, ratio);
13792 }
13893
139−static inline u32 ivpu_hw_reg_telemetry_offset_get(struct ivpu_device *vdev)
94+static inline void ivpu_hw_irq_clear(struct ivpu_device *vdev)
14095 {
141− return vdev->hw->ops->reg_telemetry_offset_get(vdev);
142−};
96+ ivpu_hw_ip_irq_clear(vdev);
97+}
14398
144−static inline u32 ivpu_hw_reg_telemetry_size_get(struct ivpu_device *vdev)
99+static inline u32 ivpu_hw_pll_freq_get(struct ivpu_device *vdev)
145100 {
146− return vdev->hw->ops->reg_telemetry_size_get(vdev);
147−};
101+ return ivpu_hw_btrs_pll_freq_get(vdev);
102+}
148103
149−static inline u32 ivpu_hw_reg_telemetry_enable_get(struct ivpu_device *vdev)
104+static inline u32 ivpu_hw_profiling_freq_get(struct ivpu_device *vdev)
150105 {
151− return vdev->hw->ops->reg_telemetry_enable_get(vdev);
152−};
106+ return vdev->hw->pll.profiling_freq;
107+}
153108
154−static inline void ivpu_hw_reg_db_set(struct ivpu_device *vdev, u32 db_id)
109+static inline void ivpu_hw_diagnose_failure(struct ivpu_device *vdev)
155110 {
156− vdev->hw->ops->reg_db_set(vdev, db_id);
157−};
111+ ivpu_hw_ip_diagnose_failure(vdev);
112+ ivpu_hw_btrs_diagnose_failure(vdev);
113+}
158114
159−static inline u32 ivpu_hw_reg_ipc_rx_addr_get(struct ivpu_device *vdev)
115+static inline u32 ivpu_hw_telemetry_offset_get(struct ivpu_device *vdev)
160116 {
161− return vdev->hw->ops->reg_ipc_rx_addr_get(vdev);
162−};
117+ return ivpu_hw_btrs_telemetry_offset_get(vdev);
118+}
163119
164−static inline u32 ivpu_hw_reg_ipc_rx_count_get(struct ivpu_device *vdev)
120+static inline u32 ivpu_hw_telemetry_size_get(struct ivpu_device *vdev)
165121 {
166− return vdev->hw->ops->reg_ipc_rx_count_get(vdev);
167−};
122+ return ivpu_hw_btrs_telemetry_size_get(vdev);
123+}
168124
169−static inline void ivpu_hw_reg_ipc_tx_set(struct ivpu_device *vdev, u32 vpu_addr)
125+static inline u32 ivpu_hw_telemetry_enable_get(struct ivpu_device *vdev)
170126 {
171− vdev->hw->ops->reg_ipc_tx_set(vdev, vpu_addr);
172−};
127+ return ivpu_hw_btrs_telemetry_enable_get(vdev);
128+}
173129
174−static inline void ivpu_hw_irq_clear(struct ivpu_device *vdev)
130+static inline bool ivpu_hw_is_idle(struct ivpu_device *vdev)
175131 {
176− vdev->hw->ops->irq_clear(vdev);
177−};
132+ return ivpu_hw_btrs_is_idle(vdev);
133+}
178134
179−static inline void ivpu_hw_irq_enable(struct ivpu_device *vdev)
135+static inline int ivpu_hw_wait_for_idle(struct ivpu_device *vdev)
180136 {
181− vdev->hw->ops->irq_enable(vdev);
182−};
137+ return ivpu_hw_btrs_wait_for_idle(vdev);
138+}
183139
184−static inline void ivpu_hw_irq_disable(struct ivpu_device *vdev)
140+static inline void ivpu_hw_ipc_tx_set(struct ivpu_device *vdev, u32 vpu_addr)
185141 {
186− vdev->hw->ops->irq_disable(vdev);
187−};
142+ ivpu_hw_ip_ipc_tx_set(vdev, vpu_addr);
143+}
188144
189−static inline void ivpu_hw_init_range(struct ivpu_addr_range *range, u64 start, u64 size)
145+static inline void ivpu_hw_db_set(struct ivpu_device *vdev, u32 db_id)
190146 {
191− range->start = start;
192− range->end = start + size;
147+ ivpu_hw_ip_db_set(vdev, db_id);
193148 }
194149
195−static inline u64 ivpu_hw_range_size(const struct ivpu_addr_range *range)
150+static inline u32 ivpu_hw_ipc_rx_addr_get(struct ivpu_device *vdev)
196151 {
197− return range->end - range->start;
152+ return ivpu_hw_ip_ipc_rx_addr_get(vdev);
198153 }
199154
200−static inline void ivpu_hw_diagnose_failure(struct ivpu_device *vdev)
155+static inline u32 ivpu_hw_ipc_rx_count_get(struct ivpu_device *vdev)
201156 {
202− vdev->hw->ops->diagnose_failure(vdev);
157+ return ivpu_hw_ip_ipc_rx_count_get(vdev);
203158 }
204159
205160 #endif /* __IVPU_HW_H__ */
drivers/accel/ivpu/ivpu_hw_37xx.c+0−1065
@@ -1,1065 +0,0 @@
1−// SPDX-License-Identifier: GPL-2.0-only
2−/*
3− * Copyright (C) 2020-2024 Intel Corporation
4− */
5−
6−#include "ivpu_drv.h"
7−#include "ivpu_fw.h"
8−#include "ivpu_hw_37xx_reg.h"
9−#include "ivpu_hw_reg_io.h"
10−#include "ivpu_hw.h"
11−#include "ivpu_ipc.h"
12−#include "ivpu_mmu.h"
13−#include "ivpu_pm.h"
14−
15−#define TILE_FUSE_ENABLE_BOTH 0x0
16−#define TILE_SKU_BOTH 0x3630
17−
18−/* Work point configuration values */
19−#define CONFIG_1_TILE 0x01
20−#define CONFIG_2_TILE 0x02
21−#define PLL_RATIO_5_3 0x01
22−#define PLL_RATIO_4_3 0x02
23−#define WP_CONFIG(tile, ratio) (((tile) << 8) | (ratio))
24−#define WP_CONFIG_1_TILE_5_3_RATIO WP_CONFIG(CONFIG_1_TILE, PLL_RATIO_5_3)
25−#define WP_CONFIG_1_TILE_4_3_RATIO WP_CONFIG(CONFIG_1_TILE, PLL_RATIO_4_3)
26−#define WP_CONFIG_2_TILE_5_3_RATIO WP_CONFIG(CONFIG_2_TILE, PLL_RATIO_5_3)
27−#define WP_CONFIG_2_TILE_4_3_RATIO WP_CONFIG(CONFIG_2_TILE, PLL_RATIO_4_3)
28−#define WP_CONFIG_0_TILE_PLL_OFF WP_CONFIG(0, 0)
29−
30−#define PLL_REF_CLK_FREQ (50 * 1000000)
31−#define PLL_SIMULATION_FREQ (10 * 1000000)
32−#define PLL_PROF_CLK_FREQ (38400 * 1000)
33−#define PLL_DEFAULT_EPP_VALUE 0x80
34−
35−#define TIM_SAFE_ENABLE 0xf1d0dead
36−#define TIM_WATCHDOG_RESET_VALUE 0xffffffff
37−
38−#define TIMEOUT_US (150 * USEC_PER_MSEC)
39−#define PWR_ISLAND_STATUS_TIMEOUT_US (5 * USEC_PER_MSEC)
40−#define PLL_TIMEOUT_US (1500 * USEC_PER_MSEC)
41−#define IDLE_TIMEOUT_US (5 * USEC_PER_MSEC)
42−
43−#define ICB_0_IRQ_MASK ((REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, HOST_IPC_FIFO_INT)) | \
44− (REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_0_INT)) | \
45− (REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_1_INT)) | \
46− (REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_2_INT)) | \
47− (REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, NOC_FIREWALL_INT)) | \
48− (REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_0_INT)) | \
49− (REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_1_INT)))
50−
51−#define ICB_1_IRQ_MASK ((REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_1, CPU_INT_REDIRECT_2_INT)) | \
52− (REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_1, CPU_INT_REDIRECT_3_INT)) | \
53− (REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_1, CPU_INT_REDIRECT_4_INT)))
54−
55−#define ICB_0_1_IRQ_MASK ((((u64)ICB_1_IRQ_MASK) << 32) | ICB_0_IRQ_MASK)
56−
57−#define BUTTRESS_IRQ_MASK ((REG_FLD(VPU_37XX_BUTTRESS_INTERRUPT_STAT, ATS_ERR)) | \
58− (REG_FLD(VPU_37XX_BUTTRESS_INTERRUPT_STAT, UFI_ERR)))
59−
60−#define BUTTRESS_ALL_IRQ_MASK (BUTTRESS_IRQ_MASK | \
61− (REG_FLD(VPU_37XX_BUTTRESS_INTERRUPT_STAT, FREQ_CHANGE)))
62−
63−#define BUTTRESS_IRQ_ENABLE_MASK ((u32)~BUTTRESS_IRQ_MASK)
64−#define BUTTRESS_IRQ_DISABLE_MASK ((u32)-1)
65−
66−#define ITF_FIREWALL_VIOLATION_MASK ((REG_FLD(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, CSS_ROM_CMX)) | \
67− (REG_FLD(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, CSS_DBG)) | \
68− (REG_FLD(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, CSS_CTRL)) | \
69− (REG_FLD(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, DEC400)) | \
70− (REG_FLD(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, MSS_NCE)) | \
71− (REG_FLD(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, MSS_MBI)) | \
72− (REG_FLD(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, MSS_MBI_CMX)))
73−
74−static void ivpu_hw_wa_init(struct ivpu_device *vdev)
75−{
76− vdev->wa.punit_disabled = false;
77− vdev->wa.clear_runtime_mem = false;
78−
79− REGB_WR32(VPU_37XX_BUTTRESS_INTERRUPT_STAT, BUTTRESS_ALL_IRQ_MASK);
80− if (REGB_RD32(VPU_37XX_BUTTRESS_INTERRUPT_STAT) == BUTTRESS_ALL_IRQ_MASK) {
81− /* Writing 1s does not clear the interrupt status register */
82− vdev->wa.interrupt_clear_with_0 = true;
83− REGB_WR32(VPU_37XX_BUTTRESS_INTERRUPT_STAT, 0x0);
84− }
85−
86− IVPU_PRINT_WA(punit_disabled);
87− IVPU_PRINT_WA(clear_runtime_mem);
88− IVPU_PRINT_WA(interrupt_clear_with_0);
89−}
90−
91−static void ivpu_hw_timeouts_init(struct ivpu_device *vdev)
92−{
93− vdev->timeout.boot = 1000;
94− vdev->timeout.jsm = 500;
95− vdev->timeout.tdr = 2000;
96− vdev->timeout.reschedule_suspend = 10;
97− vdev->timeout.autosuspend = 10;
98− vdev->timeout.d0i3_entry_msg = 5;
99−}
100−
101−static int ivpu_pll_wait_for_cmd_send(struct ivpu_device *vdev)
102−{
103− return REGB_POLL_FLD(VPU_37XX_BUTTRESS_WP_REQ_CMD, SEND, 0, PLL_TIMEOUT_US);
104−}
105−
106−/* Send KMD initiated workpoint change */
107−static int ivpu_pll_cmd_send(struct ivpu_device *vdev, u16 min_ratio, u16 max_ratio,
108− u16 target_ratio, u16 config)
109−{
110− int ret;
111− u32 val;
112−
113− ret = ivpu_pll_wait_for_cmd_send(vdev);
114− if (ret) {
115− ivpu_err(vdev, "Failed to sync before WP request: %d\n", ret);
116− return ret;
117− }
118−
119− val = REGB_RD32(VPU_37XX_BUTTRESS_WP_REQ_PAYLOAD0);
120− val = REG_SET_FLD_NUM(VPU_37XX_BUTTRESS_WP_REQ_PAYLOAD0, MIN_RATIO, min_ratio, val);
121− val = REG_SET_FLD_NUM(VPU_37XX_BUTTRESS_WP_REQ_PAYLOAD0, MAX_RATIO, max_ratio, val);
122− REGB_WR32(VPU_37XX_BUTTRESS_WP_REQ_PAYLOAD0, val);
123−
124− val = REGB_RD32(VPU_37XX_BUTTRESS_WP_REQ_PAYLOAD1);
125− val = REG_SET_FLD_NUM(VPU_37XX_BUTTRESS_WP_REQ_PAYLOAD1, TARGET_RATIO, target_ratio, val);
126− val = REG_SET_FLD_NUM(VPU_37XX_BUTTRESS_WP_REQ_PAYLOAD1, EPP, PLL_DEFAULT_EPP_VALUE, val);
127− REGB_WR32(VPU_37XX_BUTTRESS_WP_REQ_PAYLOAD1, val);
128−
129− val = REGB_RD32(VPU_37XX_BUTTRESS_WP_REQ_PAYLOAD2);
130− val = REG_SET_FLD_NUM(VPU_37XX_BUTTRESS_WP_REQ_PAYLOAD2, CONFIG, config, val);
131− REGB_WR32(VPU_37XX_BUTTRESS_WP_REQ_PAYLOAD2, val);
132−
133− val = REGB_RD32(VPU_37XX_BUTTRESS_WP_REQ_CMD);
134− val = REG_SET_FLD(VPU_37XX_BUTTRESS_WP_REQ_CMD, SEND, val);
135− REGB_WR32(VPU_37XX_BUTTRESS_WP_REQ_CMD, val);
136−
137− ret = ivpu_pll_wait_for_cmd_send(vdev);
138− if (ret)
139− ivpu_err(vdev, "Failed to sync after WP request: %d\n", ret);
140−
141− return ret;
142−}
143−
144−static int ivpu_pll_wait_for_lock(struct ivpu_device *vdev, bool enable)
145−{
146− u32 exp_val = enable ? 0x1 : 0x0;
147−
148− if (IVPU_WA(punit_disabled))
149− return 0;
150−
151− return REGB_POLL_FLD(VPU_37XX_BUTTRESS_PLL_STATUS, LOCK, exp_val, PLL_TIMEOUT_US);
152−}
153−
154−static int ivpu_pll_wait_for_status_ready(struct ivpu_device *vdev)
155−{
156− if (IVPU_WA(punit_disabled))
157− return 0;
158−
159− return REGB_POLL_FLD(VPU_37XX_BUTTRESS_VPU_STATUS, READY, 1, PLL_TIMEOUT_US);
160−}
161−
162−static void ivpu_pll_init_frequency_ratios(struct ivpu_device *vdev)
163−{
164− struct ivpu_hw_info *hw = vdev->hw;
165− u8 fuse_min_ratio, fuse_max_ratio, fuse_pn_ratio;
166− u32 fmin_fuse, fmax_fuse;
167−
168− fmin_fuse = REGB_RD32(VPU_37XX_BUTTRESS_FMIN_FUSE);
169− fuse_min_ratio = REG_GET_FLD(VPU_37XX_BUTTRESS_FMIN_FUSE, MIN_RATIO, fmin_fuse);
170− fuse_pn_ratio = REG_GET_FLD(VPU_37XX_BUTTRESS_FMIN_FUSE, PN_RATIO, fmin_fuse);
171−
172− fmax_fuse = REGB_RD32(VPU_37XX_BUTTRESS_FMAX_FUSE);
173− fuse_max_ratio = REG_GET_FLD(VPU_37XX_BUTTRESS_FMAX_FUSE, MAX_RATIO, fmax_fuse);
174−
175− hw->pll.min_ratio = clamp_t(u8, ivpu_pll_min_ratio, fuse_min_ratio, fuse_max_ratio);
176− hw->pll.max_ratio = clamp_t(u8, ivpu_pll_max_ratio, hw->pll.min_ratio, fuse_max_ratio);
177− hw->pll.pn_ratio = clamp_t(u8, fuse_pn_ratio, hw->pll.min_ratio, hw->pll.max_ratio);
178−}
179−
180−static int ivpu_hw_37xx_wait_for_vpuip_bar(struct ivpu_device *vdev)
181−{
182− return REGV_POLL_FLD(VPU_37XX_HOST_SS_CPR_RST_CLR, AON, 0, 100);
183−}
184−
185−static int ivpu_pll_drive(struct ivpu_device *vdev, bool enable)
186−{
187− struct ivpu_hw_info *hw = vdev->hw;
188− u16 target_ratio;
189− u16 config;
190− int ret;
191−
192− if (IVPU_WA(punit_disabled)) {
193− ivpu_dbg(vdev, PM, "Skipping PLL request\n");
194− return 0;
195− }
196−
197− if (enable) {
198− target_ratio = hw->pll.pn_ratio;
199− config = hw->config;
200− } else {
201− target_ratio = 0;
202− config = 0;
203− }
204−
205− ivpu_dbg(vdev, PM, "PLL workpoint request: config 0x%04x pll ratio 0x%x\n",
206− config, target_ratio);
207−
208− ret = ivpu_pll_cmd_send(vdev, hw->pll.min_ratio, hw->pll.max_ratio, target_ratio, config);
209− if (ret) {
210− ivpu_err(vdev, "Failed to send PLL workpoint request: %d\n", ret);
211− return ret;
212− }
213−
214− ret = ivpu_pll_wait_for_lock(vdev, enable);
215− if (ret) {
216− ivpu_err(vdev, "Timed out waiting for PLL lock\n");
217− return ret;
218− }
219−
220− if (enable) {
221− ret = ivpu_pll_wait_for_status_ready(vdev);
222− if (ret) {
223− ivpu_err(vdev, "Timed out waiting for PLL ready status\n");
224− return ret;
225− }
226−
227− ret = ivpu_hw_37xx_wait_for_vpuip_bar(vdev);
228− if (ret) {
229− ivpu_err(vdev, "Timed out waiting for NPU IP bar\n");
230− return ret;
231− }
232− }
233−
234− return 0;
235−}
236−
237−static int ivpu_pll_enable(struct ivpu_device *vdev)
238−{
239− return ivpu_pll_drive(vdev, true);
240−}
241−
242−static int ivpu_pll_disable(struct ivpu_device *vdev)
243−{
244− return ivpu_pll_drive(vdev, false);
245−}
246−
247−static void ivpu_boot_host_ss_rst_clr_assert(struct ivpu_device *vdev)
248−{
249− u32 val = 0;
250−
251− val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_RST_CLR, TOP_NOC, val);
252− val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_RST_CLR, DSS_MAS, val);
253− val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_RST_CLR, MSS_MAS, val);
254−
255− REGV_WR32(VPU_37XX_HOST_SS_CPR_RST_CLR, val);
256−}
257−
258−static void ivpu_boot_host_ss_rst_drive(struct ivpu_device *vdev, bool enable)
259−{
260− u32 val = REGV_RD32(VPU_37XX_HOST_SS_CPR_RST_SET);
261−
262− if (enable) {
263− val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_RST_SET, TOP_NOC, val);
264− val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_RST_SET, DSS_MAS, val);
265− val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_RST_SET, MSS_MAS, val);
266− } else {
267− val = REG_CLR_FLD(VPU_37XX_HOST_SS_CPR_RST_SET, TOP_NOC, val);
268− val = REG_CLR_FLD(VPU_37XX_HOST_SS_CPR_RST_SET, DSS_MAS, val);
269− val = REG_CLR_FLD(VPU_37XX_HOST_SS_CPR_RST_SET, MSS_MAS, val);
270− }
271−
272− REGV_WR32(VPU_37XX_HOST_SS_CPR_RST_SET, val);
273−}
274−
275−static void ivpu_boot_host_ss_clk_drive(struct ivpu_device *vdev, bool enable)
276−{
277− u32 val = REGV_RD32(VPU_37XX_HOST_SS_CPR_CLK_SET);
278−
279− if (enable) {
280− val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_CLK_SET, TOP_NOC, val);
281− val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_CLK_SET, DSS_MAS, val);
282− val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_CLK_SET, MSS_MAS, val);
283− } else {
284− val = REG_CLR_FLD(VPU_37XX_HOST_SS_CPR_CLK_SET, TOP_NOC, val);
285− val = REG_CLR_FLD(VPU_37XX_HOST_SS_CPR_CLK_SET, DSS_MAS, val);
286− val = REG_CLR_FLD(VPU_37XX_HOST_SS_CPR_CLK_SET, MSS_MAS, val);
287− }
288−
289− REGV_WR32(VPU_37XX_HOST_SS_CPR_CLK_SET, val);
290−}
291−
292−static int ivpu_boot_noc_qreqn_check(struct ivpu_device *vdev, u32 exp_val)
293−{
294− u32 val = REGV_RD32(VPU_37XX_HOST_SS_NOC_QREQN);
295−
296− if (!REG_TEST_FLD_NUM(VPU_37XX_HOST_SS_NOC_QREQN, TOP_SOCMMIO, exp_val, val))
297− return -EIO;
298−
299− return 0;
300−}
301−
302−static int ivpu_boot_noc_qacceptn_check(struct ivpu_device *vdev, u32 exp_val)
303−{
304− u32 val = REGV_RD32(VPU_37XX_HOST_SS_NOC_QACCEPTN);
305−
306− if (!REG_TEST_FLD_NUM(VPU_37XX_HOST_SS_NOC_QACCEPTN, TOP_SOCMMIO, exp_val, val))
307− return -EIO;
308−
309− return 0;
310−}
311−
312−static int ivpu_boot_noc_qdeny_check(struct ivpu_device *vdev, u32 exp_val)
313−{
314− u32 val = REGV_RD32(VPU_37XX_HOST_SS_NOC_QDENY);
315−
316− if (!REG_TEST_FLD_NUM(VPU_37XX_HOST_SS_NOC_QDENY, TOP_SOCMMIO, exp_val, val))
317− return -EIO;
318−
319− return 0;
320−}
321−
322−static int ivpu_boot_top_noc_qrenqn_check(struct ivpu_device *vdev, u32 exp_val)
323−{
324− u32 val = REGV_RD32(VPU_37XX_TOP_NOC_QREQN);
325−
326− if (!REG_TEST_FLD_NUM(VPU_37XX_TOP_NOC_QREQN, CPU_CTRL, exp_val, val) ||
327− !REG_TEST_FLD_NUM(VPU_37XX_TOP_NOC_QREQN, HOSTIF_L2CACHE, exp_val, val))
328− return -EIO;
329−
330− return 0;
331−}
332−
333−static int ivpu_boot_top_noc_qacceptn_check(struct ivpu_device *vdev, u32 exp_val)
334−{
335− u32 val = REGV_RD32(VPU_37XX_TOP_NOC_QACCEPTN);
336−
337− if (!REG_TEST_FLD_NUM(VPU_37XX_TOP_NOC_QACCEPTN, CPU_CTRL, exp_val, val) ||
338− !REG_TEST_FLD_NUM(VPU_37XX_TOP_NOC_QACCEPTN, HOSTIF_L2CACHE, exp_val, val))
339− return -EIO;
340−
341− return 0;
342−}
343−
344−static int ivpu_boot_top_noc_qdeny_check(struct ivpu_device *vdev, u32 exp_val)
345−{
346− u32 val = REGV_RD32(VPU_37XX_TOP_NOC_QDENY);
347−
348− if (!REG_TEST_FLD_NUM(VPU_37XX_TOP_NOC_QDENY, CPU_CTRL, exp_val, val) ||
349− !REG_TEST_FLD_NUM(VPU_37XX_TOP_NOC_QDENY, HOSTIF_L2CACHE, exp_val, val))
350− return -EIO;
351−
352− return 0;
353−}
354−
355−static int ivpu_boot_host_ss_configure(struct ivpu_device *vdev)
356−{
357− ivpu_boot_host_ss_rst_clr_assert(vdev);
358−
359− return ivpu_boot_noc_qreqn_check(vdev, 0x0);
360−}
361−
362−static void ivpu_boot_vpu_idle_gen_disable(struct ivpu_device *vdev)
363−{
364− REGV_WR32(VPU_37XX_HOST_SS_AON_VPU_IDLE_GEN, 0x0);
365−}
366−
367−static int ivpu_boot_host_ss_axi_drive(struct ivpu_device *vdev, bool enable)
368−{
369− int ret;
370− u32 val;
371−
372− val = REGV_RD32(VPU_37XX_HOST_SS_NOC_QREQN);
373− if (enable)
374− val = REG_SET_FLD(VPU_37XX_HOST_SS_NOC_QREQN, TOP_SOCMMIO, val);
375− else
376− val = REG_CLR_FLD(VPU_37XX_HOST_SS_NOC_QREQN, TOP_SOCMMIO, val);
377− REGV_WR32(VPU_37XX_HOST_SS_NOC_QREQN, val);
378−
379− ret = ivpu_boot_noc_qacceptn_check(vdev, enable ? 0x1 : 0x0);
380− if (ret) {
381− ivpu_err(vdev, "Failed qacceptn check: %d\n", ret);
382− return ret;
383− }
384−
385− ret = ivpu_boot_noc_qdeny_check(vdev, 0x0);
386− if (ret)
387− ivpu_err(vdev, "Failed qdeny check: %d\n", ret);
388−
389− return ret;
390−}
391−
392−static int ivpu_boot_host_ss_axi_enable(struct ivpu_device *vdev)
393−{
394− return ivpu_boot_host_ss_axi_drive(vdev, true);
395−}
396−
397−static int ivpu_boot_host_ss_top_noc_drive(struct ivpu_device *vdev, bool enable)
398−{
399− int ret;
400− u32 val;
401−
402− val = REGV_RD32(VPU_37XX_TOP_NOC_QREQN);
403− if (enable) {
404− val = REG_SET_FLD(VPU_37XX_TOP_NOC_QREQN, CPU_CTRL, val);
405− val = REG_SET_FLD(VPU_37XX_TOP_NOC_QREQN, HOSTIF_L2CACHE, val);
406− } else {
407− val = REG_CLR_FLD(VPU_37XX_TOP_NOC_QREQN, CPU_CTRL, val);
408− val = REG_CLR_FLD(VPU_37XX_TOP_NOC_QREQN, HOSTIF_L2CACHE, val);
409− }
410− REGV_WR32(VPU_37XX_TOP_NOC_QREQN, val);
411−
412− ret = ivpu_boot_top_noc_qacceptn_check(vdev, enable ? 0x1 : 0x0);
413− if (ret) {
414− ivpu_err(vdev, "Failed qacceptn check: %d\n", ret);
415− return ret;
416− }
417−
418− ret = ivpu_boot_top_noc_qdeny_check(vdev, 0x0);
419− if (ret)
420− ivpu_err(vdev, "Failed qdeny check: %d\n", ret);
421−
422− return ret;
423−}
424−
425−static int ivpu_boot_host_ss_top_noc_enable(struct ivpu_device *vdev)
426−{
427− return ivpu_boot_host_ss_top_noc_drive(vdev, true);
428−}
429−
430−static void ivpu_boot_pwr_island_trickle_drive(struct ivpu_device *vdev, bool enable)
431−{
432− u32 val = REGV_RD32(VPU_37XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0);
433−
434− if (enable)
435− val = REG_SET_FLD(VPU_37XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0, MSS_CPU, val);
436− else
437− val = REG_CLR_FLD(VPU_37XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0, MSS_CPU, val);
438−
439− REGV_WR32(VPU_37XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0, val);
440−}
441−
442−static void ivpu_boot_pwr_island_drive(struct ivpu_device *vdev, bool enable)
443−{
444− u32 val = REGV_RD32(VPU_37XX_HOST_SS_AON_PWR_ISLAND_EN0);
445−
446− if (enable)
447− val = REG_SET_FLD(VPU_37XX_HOST_SS_AON_PWR_ISLAND_EN0, MSS_CPU, val);
448− else
449− val = REG_CLR_FLD(VPU_37XX_HOST_SS_AON_PWR_ISLAND_EN0, MSS_CPU, val);
450−
451− REGV_WR32(VPU_37XX_HOST_SS_AON_PWR_ISLAND_EN0, val);
452−}
453−
454−static int ivpu_boot_wait_for_pwr_island_status(struct ivpu_device *vdev, u32 exp_val)
455−{
456− return REGV_POLL_FLD(VPU_37XX_HOST_SS_AON_PWR_ISLAND_STATUS0, MSS_CPU,
457− exp_val, PWR_ISLAND_STATUS_TIMEOUT_US);
458−}
459−
460−static void ivpu_boot_pwr_island_isolation_drive(struct ivpu_device *vdev, bool enable)
461−{
462− u32 val = REGV_RD32(VPU_37XX_HOST_SS_AON_PWR_ISO_EN0);
463−
464− if (enable)
465− val = REG_SET_FLD(VPU_37XX_HOST_SS_AON_PWR_ISO_EN0, MSS_CPU, val);
466− else
467− val = REG_CLR_FLD(VPU_37XX_HOST_SS_AON_PWR_ISO_EN0, MSS_CPU, val);
468−
469− REGV_WR32(VPU_37XX_HOST_SS_AON_PWR_ISO_EN0, val);
470−}
471−
472−static void ivpu_boot_dpu_active_drive(struct ivpu_device *vdev, bool enable)
473−{
474− u32 val = REGV_RD32(VPU_37XX_HOST_SS_AON_DPU_ACTIVE);
475−
476− if (enable)
477− val = REG_SET_FLD(VPU_37XX_HOST_SS_AON_DPU_ACTIVE, DPU_ACTIVE, val);
478− else
479− val = REG_CLR_FLD(VPU_37XX_HOST_SS_AON_DPU_ACTIVE, DPU_ACTIVE, val);
480−
481− REGV_WR32(VPU_37XX_HOST_SS_AON_DPU_ACTIVE, val);
482−}
483−
484−static int ivpu_boot_pwr_domain_enable(struct ivpu_device *vdev)
485−{
486− int ret;
487−
488− ivpu_boot_pwr_island_trickle_drive(vdev, true);
489− ivpu_boot_pwr_island_drive(vdev, true);
490−
491− ret = ivpu_boot_wait_for_pwr_island_status(vdev, 0x1);
492− if (ret) {
493− ivpu_err(vdev, "Timed out waiting for power island status\n");
494− return ret;
495− }
496−
497− ret = ivpu_boot_top_noc_qrenqn_check(vdev, 0x0);
498− if (ret) {
499− ivpu_err(vdev, "Failed qrenqn check %d\n", ret);
500− return ret;
501− }
502−
503− ivpu_boot_host_ss_clk_drive(vdev, true);
504− ivpu_boot_pwr_island_isolation_drive(vdev, false);
505− ivpu_boot_host_ss_rst_drive(vdev, true);
506− ivpu_boot_dpu_active_drive(vdev, true);
507−
508− return ret;
509−}
510−
511−static void ivpu_boot_no_snoop_enable(struct ivpu_device *vdev)
512−{
513− u32 val = REGV_RD32(VPU_37XX_HOST_IF_TCU_PTW_OVERRIDES);
514−
515− val = REG_SET_FLD(VPU_37XX_HOST_IF_TCU_PTW_OVERRIDES, NOSNOOP_OVERRIDE_EN, val);
516− val = REG_CLR_FLD(VPU_37XX_HOST_IF_TCU_PTW_OVERRIDES, AW_NOSNOOP_OVERRIDE, val);
517− val = REG_SET_FLD(VPU_37XX_HOST_IF_TCU_PTW_OVERRIDES, AR_NOSNOOP_OVERRIDE, val);
518−
519− REGV_WR32(VPU_37XX_HOST_IF_TCU_PTW_OVERRIDES, val);
520−}
521−
522−static void ivpu_boot_tbu_mmu_enable(struct ivpu_device *vdev)
523−{
524− u32 val = REGV_RD32(VPU_37XX_HOST_IF_TBU_MMUSSIDV);
525−
526− val = REG_SET_FLD(VPU_37XX_HOST_IF_TBU_MMUSSIDV, TBU0_AWMMUSSIDV, val);
527− val = REG_SET_FLD(VPU_37XX_HOST_IF_TBU_MMUSSIDV, TBU0_ARMMUSSIDV, val);
528− val = REG_SET_FLD(VPU_37XX_HOST_IF_TBU_MMUSSIDV, TBU2_AWMMUSSIDV, val);
529− val = REG_SET_FLD(VPU_37XX_HOST_IF_TBU_MMUSSIDV, TBU2_ARMMUSSIDV, val);
530−
531− REGV_WR32(VPU_37XX_HOST_IF_TBU_MMUSSIDV, val);
532−}
533−
534−static void ivpu_boot_soc_cpu_boot(struct ivpu_device *vdev)
535−{
536− u32 val;
537−
538− val = REGV_RD32(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC);
539− val = REG_SET_FLD(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC, IRQI_RSTRUN0, val);
540−
541− val = REG_CLR_FLD(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC, IRQI_RSTVEC, val);
542− REGV_WR32(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC, val);
543−
544− val = REG_SET_FLD(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC, IRQI_RESUME0, val);
545− REGV_WR32(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC, val);
546−
547− val = REG_CLR_FLD(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC, IRQI_RESUME0, val);
548− REGV_WR32(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC, val);
549−
550− val = vdev->fw->entry_point >> 9;
551− REGV_WR32(VPU_37XX_HOST_SS_LOADING_ADDRESS_LO, val);
552−
553− val = REG_SET_FLD(VPU_37XX_HOST_SS_LOADING_ADDRESS_LO, DONE, val);
554− REGV_WR32(VPU_37XX_HOST_SS_LOADING_ADDRESS_LO, val);
555−
556− ivpu_dbg(vdev, PM, "Booting firmware, mode: %s\n",
557− vdev->fw->entry_point == vdev->fw->cold_boot_entry_point ? "cold boot" : "resume");
558−}
559−
560−static int ivpu_boot_d0i3_drive(struct ivpu_device *vdev, bool enable)
561−{
562− int ret;
563− u32 val;
564−
565− ret = REGB_POLL_FLD(VPU_37XX_BUTTRESS_VPU_D0I3_CONTROL, INPROGRESS, 0, TIMEOUT_US);
566− if (ret) {
567− ivpu_err(vdev, "Failed to sync before D0i3 transition: %d\n", ret);
568− return ret;
569− }
570−
571− val = REGB_RD32(VPU_37XX_BUTTRESS_VPU_D0I3_CONTROL);
572− if (enable)
573− val = REG_SET_FLD(VPU_37XX_BUTTRESS_VPU_D0I3_CONTROL, I3, val);
574− else
575− val = REG_CLR_FLD(VPU_37XX_BUTTRESS_VPU_D0I3_CONTROL, I3, val);
576− REGB_WR32(VPU_37XX_BUTTRESS_VPU_D0I3_CONTROL, val);
577−
578− ret = REGB_POLL_FLD(VPU_37XX_BUTTRESS_VPU_D0I3_CONTROL, INPROGRESS, 0, TIMEOUT_US);
579− if (ret)
580− ivpu_err(vdev, "Failed to sync after D0i3 transition: %d\n", ret);
581−
582− return ret;
583−}
584−
585−static int ivpu_hw_37xx_info_init(struct ivpu_device *vdev)
586−{
587− struct ivpu_hw_info *hw = vdev->hw;
588−
589− hw->tile_fuse = TILE_FUSE_ENABLE_BOTH;
590− hw->sku = TILE_SKU_BOTH;
591− hw->config = WP_CONFIG_2_TILE_4_3_RATIO;
592−
593− ivpu_pll_init_frequency_ratios(vdev);
594−
595− ivpu_hw_init_range(&hw->ranges.global, 0x80000000, SZ_512M);
596− ivpu_hw_init_range(&hw->ranges.user, 0xc0000000, 255 * SZ_1M);
597− ivpu_hw_init_range(&hw->ranges.shave, 0x180000000, SZ_2G);
598− ivpu_hw_init_range(&hw->ranges.dma, 0x200000000, SZ_8G);
599−
600− vdev->platform = IVPU_PLATFORM_SILICON;
601− ivpu_hw_wa_init(vdev);
602− ivpu_hw_timeouts_init(vdev);
603−
604− return 0;
605−}
606−
607−static int ivpu_hw_37xx_ip_reset(struct ivpu_device *vdev)
608−{
609− int ret;
610− u32 val;
611−
612− if (IVPU_WA(punit_disabled))
613− return 0;
614−
615− ret = REGB_POLL_FLD(VPU_37XX_BUTTRESS_VPU_IP_RESET, TRIGGER, 0, TIMEOUT_US);
616− if (ret) {
617− ivpu_err(vdev, "Timed out waiting for TRIGGER bit\n");
618− return ret;
619− }
620−
621− val = REGB_RD32(VPU_37XX_BUTTRESS_VPU_IP_RESET);
622− val = REG_SET_FLD(VPU_37XX_BUTTRESS_VPU_IP_RESET, TRIGGER, val);
623− REGB_WR32(VPU_37XX_BUTTRESS_VPU_IP_RESET, val);
624−
625− ret = REGB_POLL_FLD(VPU_37XX_BUTTRESS_VPU_IP_RESET, TRIGGER, 0, TIMEOUT_US);
626− if (ret)
627− ivpu_err(vdev, "Timed out waiting for RESET completion\n");
628−
629− return ret;
630−}
631−
632−static int ivpu_hw_37xx_reset(struct ivpu_device *vdev)
633−{
634− int ret = 0;
635−
636− if (ivpu_hw_37xx_ip_reset(vdev)) {
637− ivpu_err(vdev, "Failed to reset NPU\n");
638− ret = -EIO;
639− }
640−
641− if (ivpu_pll_disable(vdev)) {
642− ivpu_err(vdev, "Failed to disable PLL\n");
643− ret = -EIO;
644− }
645−
646− return ret;
647−}
648−
649−static int ivpu_hw_37xx_d0i3_enable(struct ivpu_device *vdev)
650−{
651− int ret;
652−
653− ret = ivpu_boot_d0i3_drive(vdev, true);
654− if (ret)
655− ivpu_err(vdev, "Failed to enable D0i3: %d\n", ret);
656−
657− udelay(5); /* VPU requires 5 us to complete the transition */
658−
659− return ret;
660−}
661−
662−static int ivpu_hw_37xx_d0i3_disable(struct ivpu_device *vdev)
663−{
664− int ret;
665−
666− ret = ivpu_boot_d0i3_drive(vdev, false);
667− if (ret)
668− ivpu_err(vdev, "Failed to disable D0i3: %d\n", ret);
669−
670− return ret;
671−}
672−
673−static int ivpu_hw_37xx_power_up(struct ivpu_device *vdev)
674−{
675− int ret;
676−
677− /* PLL requests may fail when powering down, so issue WP 0 here */
678− ret = ivpu_pll_disable(vdev);
679− if (ret)
680− ivpu_warn(vdev, "Failed to disable PLL: %d\n", ret);
681−
682− ret = ivpu_hw_37xx_d0i3_disable(vdev);
683− if (ret)
684− ivpu_warn(vdev, "Failed to disable D0I3: %d\n", ret);
685−
686− ret = ivpu_pll_enable(vdev);
687− if (ret) {
688− ivpu_err(vdev, "Failed to enable PLL: %d\n", ret);
689− return ret;
690− }
691−
692− ret = ivpu_boot_host_ss_configure(vdev);
693− if (ret) {
694− ivpu_err(vdev, "Failed to configure host SS: %d\n", ret);
695− return ret;
696− }
697−
698− /*
699− * The control circuitry for vpu_idle indication logic powers up active.
700− * To ensure unnecessary low power mode signal from LRT during bring up,
701− * KMD disables the circuitry prior to bringing up the Main Power island.
702− */
703− ivpu_boot_vpu_idle_gen_disable(vdev);
704−
705− ret = ivpu_boot_pwr_domain_enable(vdev);
706− if (ret) {
707− ivpu_err(vdev, "Failed to enable power domain: %d\n", ret);
708− return ret;
709− }
710−
711− ret = ivpu_boot_host_ss_axi_enable(vdev);
712− if (ret) {
713− ivpu_err(vdev, "Failed to enable AXI: %d\n", ret);
714− return ret;
715− }
716−
717− ret = ivpu_boot_host_ss_top_noc_enable(vdev);
718− if (ret)
719− ivpu_err(vdev, "Failed to enable TOP NOC: %d\n", ret);
720−
721− return ret;
722−}
723−
724−static int ivpu_hw_37xx_boot_fw(struct ivpu_device *vdev)
725−{
726− ivpu_boot_no_snoop_enable(vdev);
727− ivpu_boot_tbu_mmu_enable(vdev);
728− ivpu_boot_soc_cpu_boot(vdev);
729−
730− return 0;
731−}
732−
733−static bool ivpu_hw_37xx_is_idle(struct ivpu_device *vdev)
734−{
735− u32 val;
736−
737− if (IVPU_WA(punit_disabled))
738− return true;
739−
740− val = REGB_RD32(VPU_37XX_BUTTRESS_VPU_STATUS);
741− return REG_TEST_FLD(VPU_37XX_BUTTRESS_VPU_STATUS, READY, val) &&
742− REG_TEST_FLD(VPU_37XX_BUTTRESS_VPU_STATUS, IDLE, val);
743−}
744−
745−static int ivpu_hw_37xx_wait_for_idle(struct ivpu_device *vdev)
746−{
747− return REGB_POLL_FLD(VPU_37XX_BUTTRESS_VPU_STATUS, IDLE, 0x1, IDLE_TIMEOUT_US);
748−}
749−
750−static void ivpu_hw_37xx_save_d0i3_entry_timestamp(struct ivpu_device *vdev)
751−{
752− vdev->hw->d0i3_entry_host_ts = ktime_get_boottime();
753− vdev->hw->d0i3_entry_vpu_ts = REGV_RD64(VPU_37XX_CPU_SS_TIM_PERF_FREE_CNT);
754−}
755−
756−static int ivpu_hw_37xx_power_down(struct ivpu_device *vdev)
757−{
758− int ret = 0;
759−
760− ivpu_hw_37xx_save_d0i3_entry_timestamp(vdev);
761−
762− if (!ivpu_hw_37xx_is_idle(vdev))
763− ivpu_warn(vdev, "NPU not idle during power down\n");
764−
765− if (ivpu_hw_37xx_reset(vdev)) {
766− ivpu_err(vdev, "Failed to reset NPU\n");
767− ret = -EIO;
768− }
769−
770− if (ivpu_hw_37xx_d0i3_enable(vdev)) {
771− ivpu_err(vdev, "Failed to enter D0I3\n");
772− ret = -EIO;
773− }
774−
775− return ret;
776−}
777−
778−static void ivpu_hw_37xx_wdt_disable(struct ivpu_device *vdev)
779−{
780− u32 val;
781−
782− /* Enable writing and set non-zero WDT value */
783− REGV_WR32(VPU_37XX_CPU_SS_TIM_SAFE, TIM_SAFE_ENABLE);
784− REGV_WR32(VPU_37XX_CPU_SS_TIM_WATCHDOG, TIM_WATCHDOG_RESET_VALUE);
785−
786− /* Enable writing and disable watchdog timer */
787− REGV_WR32(VPU_37XX_CPU_SS_TIM_SAFE, TIM_SAFE_ENABLE);
788− REGV_WR32(VPU_37XX_CPU_SS_TIM_WDOG_EN, 0);
789−
790− /* Now clear the timeout interrupt */
791− val = REGV_RD32(VPU_37XX_CPU_SS_TIM_GEN_CONFIG);
792− val = REG_CLR_FLD(VPU_37XX_CPU_SS_TIM_GEN_CONFIG, WDOG_TO_INT_CLR, val);
793− REGV_WR32(VPU_37XX_CPU_SS_TIM_GEN_CONFIG, val);
794−}
795−
796−static u32 ivpu_hw_37xx_profiling_freq_get(struct ivpu_device *vdev)
797−{
798− return PLL_PROF_CLK_FREQ;
799−}
800−
801−static void ivpu_hw_37xx_profiling_freq_drive(struct ivpu_device *vdev, bool enable)
802−{
803− /* Profiling freq - is a debug feature. Unavailable on VPU 37XX. */
804−}
805−
806−static u32 ivpu_hw_37xx_ratio_to_freq(struct ivpu_device *vdev, u32 ratio)
807−{
808− u32 pll_clock = PLL_REF_CLK_FREQ * ratio;
809− u32 cpu_clock;
810−
811− if ((vdev->hw->config & 0xff) == PLL_RATIO_4_3)
812− cpu_clock = pll_clock * 2 / 4;
813− else
814− cpu_clock = pll_clock * 2 / 5;
815−
816− return cpu_clock;
817−}
818−
819−/* Register indirect accesses */
820−static u32 ivpu_hw_37xx_reg_pll_freq_get(struct ivpu_device *vdev)
821−{
822− u32 pll_curr_ratio;
823−
824− pll_curr_ratio = REGB_RD32(VPU_37XX_BUTTRESS_CURRENT_PLL);
825− pll_curr_ratio &= VPU_37XX_BUTTRESS_CURRENT_PLL_RATIO_MASK;
826−
827− if (!ivpu_is_silicon(vdev))
828− return PLL_SIMULATION_FREQ;
829−
830− return ivpu_hw_37xx_ratio_to_freq(vdev, pll_curr_ratio);
831−}
832−
833−static u32 ivpu_hw_37xx_reg_telemetry_offset_get(struct ivpu_device *vdev)
834−{
835− return REGB_RD32(VPU_37XX_BUTTRESS_VPU_TELEMETRY_OFFSET);
836−}
837−
838−static u32 ivpu_hw_37xx_reg_telemetry_size_get(struct ivpu_device *vdev)
839−{
840− return REGB_RD32(VPU_37XX_BUTTRESS_VPU_TELEMETRY_SIZE);
841−}
842−
843−static u32 ivpu_hw_37xx_reg_telemetry_enable_get(struct ivpu_device *vdev)
844−{
845− return REGB_RD32(VPU_37XX_BUTTRESS_VPU_TELEMETRY_ENABLE);
846−}
847−
848−static void ivpu_hw_37xx_reg_db_set(struct ivpu_device *vdev, u32 db_id)
849−{
850− u32 reg_stride = VPU_37XX_CPU_SS_DOORBELL_1 - VPU_37XX_CPU_SS_DOORBELL_0;
851− u32 val = REG_FLD(VPU_37XX_CPU_SS_DOORBELL_0, SET);
852−
853− REGV_WR32I(VPU_37XX_CPU_SS_DOORBELL_0, reg_stride, db_id, val);
854−}
855−
856−static u32 ivpu_hw_37xx_reg_ipc_rx_addr_get(struct ivpu_device *vdev)
857−{
858− return REGV_RD32(VPU_37XX_HOST_SS_TIM_IPC_FIFO_ATM);
859−}
860−
861−static u32 ivpu_hw_37xx_reg_ipc_rx_count_get(struct ivpu_device *vdev)
862−{
863− u32 count = REGV_RD32_SILENT(VPU_37XX_HOST_SS_TIM_IPC_FIFO_STAT);
864−
865− return REG_GET_FLD(VPU_37XX_HOST_SS_TIM_IPC_FIFO_STAT, FILL_LEVEL, count);
866−}
867−
868−static void ivpu_hw_37xx_reg_ipc_tx_set(struct ivpu_device *vdev, u32 vpu_addr)
869−{
870− REGV_WR32(VPU_37XX_CPU_SS_TIM_IPC_FIFO, vpu_addr);
871−}
872−
873−static void ivpu_hw_37xx_irq_clear(struct ivpu_device *vdev)
874−{
875− REGV_WR64(VPU_37XX_HOST_SS_ICB_CLEAR_0, ICB_0_1_IRQ_MASK);
876−}
877−
878−static void ivpu_hw_37xx_irq_enable(struct ivpu_device *vdev)
879−{
880− REGV_WR32(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, ITF_FIREWALL_VIOLATION_MASK);
881− REGV_WR64(VPU_37XX_HOST_SS_ICB_ENABLE_0, ICB_0_1_IRQ_MASK);
882− REGB_WR32(VPU_37XX_BUTTRESS_LOCAL_INT_MASK, BUTTRESS_IRQ_ENABLE_MASK);
883− REGB_WR32(VPU_37XX_BUTTRESS_GLOBAL_INT_MASK, 0x0);
884−}
885−
886−static void ivpu_hw_37xx_irq_disable(struct ivpu_device *vdev)
887−{
888− REGB_WR32(VPU_37XX_BUTTRESS_GLOBAL_INT_MASK, 0x1);
889− REGB_WR32(VPU_37XX_BUTTRESS_LOCAL_INT_MASK, BUTTRESS_IRQ_DISABLE_MASK);
890− REGV_WR64(VPU_37XX_HOST_SS_ICB_ENABLE_0, 0x0ull);
891− REGV_WR32(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, 0x0);
892−}
893−
894−static void ivpu_hw_37xx_irq_wdt_nce_handler(struct ivpu_device *vdev)
895−{
896− ivpu_pm_trigger_recovery(vdev, "WDT NCE IRQ");
897−}
898−
899−static void ivpu_hw_37xx_irq_wdt_mss_handler(struct ivpu_device *vdev)
900−{
901− ivpu_hw_wdt_disable(vdev);
902− ivpu_pm_trigger_recovery(vdev, "WDT MSS IRQ");
903−}
904−
905−static void ivpu_hw_37xx_irq_noc_firewall_handler(struct ivpu_device *vdev)
906−{
907− ivpu_pm_trigger_recovery(vdev, "NOC Firewall IRQ");
908−}
909−
910−/* Handler for IRQs from VPU core (irqV) */
911−static bool ivpu_hw_37xx_irqv_handler(struct ivpu_device *vdev, int irq, bool *wake_thread)
912−{
913− u32 status = REGV_RD32(VPU_37XX_HOST_SS_ICB_STATUS_0) & ICB_0_IRQ_MASK;
914−
915− if (!status)
916− return false;
917−
918− REGV_WR32(VPU_37XX_HOST_SS_ICB_CLEAR_0, status);
919−
920− if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_0_INT, status))
921− ivpu_mmu_irq_evtq_handler(vdev);
922−
923− if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, HOST_IPC_FIFO_INT, status))
924− ivpu_ipc_irq_handler(vdev, wake_thread);
925−
926− if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_1_INT, status))
927− ivpu_dbg(vdev, IRQ, "MMU sync complete\n");
928−
929− if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_2_INT, status))
930− ivpu_mmu_irq_gerr_handler(vdev);
931−
932− if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_0_INT, status))
933− ivpu_hw_37xx_irq_wdt_mss_handler(vdev);
934−
935− if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_1_INT, status))
936− ivpu_hw_37xx_irq_wdt_nce_handler(vdev);
937−
938− if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, NOC_FIREWALL_INT, status))
939− ivpu_hw_37xx_irq_noc_firewall_handler(vdev);
940−
941− return true;
942−}
943−
944−/* Handler for IRQs from Buttress core (irqB) */
945−static bool ivpu_hw_37xx_irqb_handler(struct ivpu_device *vdev, int irq)
946−{
947− u32 status = REGB_RD32(VPU_37XX_BUTTRESS_INTERRUPT_STAT) & BUTTRESS_IRQ_MASK;
948− bool schedule_recovery = false;
949−
950− if (!status)
951− return false;
952−
953− if (REG_TEST_FLD(VPU_37XX_BUTTRESS_INTERRUPT_STAT, FREQ_CHANGE, status))
954− ivpu_dbg(vdev, IRQ, "FREQ_CHANGE irq: %08x",
955− REGB_RD32(VPU_37XX_BUTTRESS_CURRENT_PLL));
956−
957− if (REG_TEST_FLD(VPU_37XX_BUTTRESS_INTERRUPT_STAT, ATS_ERR, status)) {
958− ivpu_err(vdev, "ATS_ERR irq 0x%016llx", REGB_RD64(VPU_37XX_BUTTRESS_ATS_ERR_LOG_0));
959− REGB_WR32(VPU_37XX_BUTTRESS_ATS_ERR_CLEAR, 0x1);
960− schedule_recovery = true;
961− }
962−
963− if (REG_TEST_FLD(VPU_37XX_BUTTRESS_INTERRUPT_STAT, UFI_ERR, status)) {
964− u32 ufi_log = REGB_RD32(VPU_37XX_BUTTRESS_UFI_ERR_LOG);
965−
966− ivpu_err(vdev, "UFI_ERR irq (0x%08x) opcode: 0x%02lx axi_id: 0x%02lx cq_id: 0x%03lx",
967− ufi_log, REG_GET_FLD(VPU_37XX_BUTTRESS_UFI_ERR_LOG, OPCODE, ufi_log),
968− REG_GET_FLD(VPU_37XX_BUTTRESS_UFI_ERR_LOG, AXI_ID, ufi_log),
969− REG_GET_FLD(VPU_37XX_BUTTRESS_UFI_ERR_LOG, CQ_ID, ufi_log));
970− REGB_WR32(VPU_37XX_BUTTRESS_UFI_ERR_CLEAR, 0x1);
971− schedule_recovery = true;
972− }
973−
974− /* This must be done after interrupts are cleared at the source. */
975− if (IVPU_WA(interrupt_clear_with_0))
976− /*
977− * Writing 1 triggers an interrupt, so we can't perform read update write.
978− * Clear local interrupt status by writing 0 to all bits.
979− */
980− REGB_WR32(VPU_37XX_BUTTRESS_INTERRUPT_STAT, 0x0);
981− else
982− REGB_WR32(VPU_37XX_BUTTRESS_INTERRUPT_STAT, status);
983−
984− if (schedule_recovery)
985− ivpu_pm_trigger_recovery(vdev, "Buttress IRQ");
986−
987− return true;
988−}
989−
990−static irqreturn_t ivpu_hw_37xx_irq_handler(int irq, void *ptr)
991−{
992− struct ivpu_device *vdev = ptr;
993− bool irqv_handled, irqb_handled, wake_thread = false;
994−
995− REGB_WR32(VPU_37XX_BUTTRESS_GLOBAL_INT_MASK, 0x1);
996−
997− irqv_handled = ivpu_hw_37xx_irqv_handler(vdev, irq, &wake_thread);
998− irqb_handled = ivpu_hw_37xx_irqb_handler(vdev, irq);
999−
1000− /* Re-enable global interrupts to re-trigger MSI for pending interrupts */
1001− REGB_WR32(VPU_37XX_BUTTRESS_GLOBAL_INT_MASK, 0x0);
1002−
1003− if (wake_thread)
1004− return IRQ_WAKE_THREAD;
1005− if (irqv_handled || irqb_handled)
1006− return IRQ_HANDLED;
1007− return IRQ_NONE;
1008−}
1009−
1010−static void ivpu_hw_37xx_diagnose_failure(struct ivpu_device *vdev)
1011−{
1012− u32 irqv = REGV_RD32(VPU_37XX_HOST_SS_ICB_STATUS_0) & ICB_0_IRQ_MASK;
1013− u32 irqb = REGB_RD32(VPU_37XX_BUTTRESS_INTERRUPT_STAT) & BUTTRESS_IRQ_MASK;
1014−
1015− if (ivpu_hw_37xx_reg_ipc_rx_count_get(vdev))
1016− ivpu_err(vdev, "IPC FIFO queue not empty, missed IPC IRQ");
1017−
1018− if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_0_INT, irqv))
1019− ivpu_err(vdev, "WDT MSS timeout detected\n");
1020−
1021− if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_1_INT, irqv))
1022− ivpu_err(vdev, "WDT NCE timeout detected\n");
1023−
1024− if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, NOC_FIREWALL_INT, irqv))
1025− ivpu_err(vdev, "NOC Firewall irq detected\n");
1026−
1027− if (REG_TEST_FLD(VPU_37XX_BUTTRESS_INTERRUPT_STAT, ATS_ERR, irqb))
1028− ivpu_err(vdev, "ATS_ERR irq 0x%016llx", REGB_RD64(VPU_37XX_BUTTRESS_ATS_ERR_LOG_0));
1029−
1030− if (REG_TEST_FLD(VPU_37XX_BUTTRESS_INTERRUPT_STAT, UFI_ERR, irqb)) {
1031− u32 ufi_log = REGB_RD32(VPU_37XX_BUTTRESS_UFI_ERR_LOG);
1032−
1033− ivpu_err(vdev, "UFI_ERR irq (0x%08x) opcode: 0x%02lx axi_id: 0x%02lx cq_id: 0x%03lx",
1034− ufi_log, REG_GET_FLD(VPU_37XX_BUTTRESS_UFI_ERR_LOG, OPCODE, ufi_log),
1035− REG_GET_FLD(VPU_37XX_BUTTRESS_UFI_ERR_LOG, AXI_ID, ufi_log),
1036− REG_GET_FLD(VPU_37XX_BUTTRESS_UFI_ERR_LOG, CQ_ID, ufi_log));
1037− }
1038−}
1039−
1040−const struct ivpu_hw_ops ivpu_hw_37xx_ops = {
1041− .info_init = ivpu_hw_37xx_info_init,
1042− .power_up = ivpu_hw_37xx_power_up,
1043− .is_idle = ivpu_hw_37xx_is_idle,
1044− .wait_for_idle = ivpu_hw_37xx_wait_for_idle,
1045− .power_down = ivpu_hw_37xx_power_down,
1046− .reset = ivpu_hw_37xx_reset,
1047− .boot_fw = ivpu_hw_37xx_boot_fw,
1048− .wdt_disable = ivpu_hw_37xx_wdt_disable,
1049− .diagnose_failure = ivpu_hw_37xx_diagnose_failure,
1050− .profiling_freq_get = ivpu_hw_37xx_profiling_freq_get,
1051− .profiling_freq_drive = ivpu_hw_37xx_profiling_freq_drive,
1052− .reg_pll_freq_get = ivpu_hw_37xx_reg_pll_freq_get,
1053− .ratio_to_freq = ivpu_hw_37xx_ratio_to_freq,
1054− .reg_telemetry_offset_get = ivpu_hw_37xx_reg_telemetry_offset_get,
1055− .reg_telemetry_size_get = ivpu_hw_37xx_reg_telemetry_size_get,
1056− .reg_telemetry_enable_get = ivpu_hw_37xx_reg_telemetry_enable_get,
1057− .reg_db_set = ivpu_hw_37xx_reg_db_set,
1058− .reg_ipc_rx_addr_get = ivpu_hw_37xx_reg_ipc_rx_addr_get,
1059− .reg_ipc_rx_count_get = ivpu_hw_37xx_reg_ipc_rx_count_get,
1060− .reg_ipc_tx_set = ivpu_hw_37xx_reg_ipc_tx_set,
1061− .irq_clear = ivpu_hw_37xx_irq_clear,
1062− .irq_enable = ivpu_hw_37xx_irq_enable,
1063− .irq_disable = ivpu_hw_37xx_irq_disable,
1064− .irq_handler = ivpu_hw_37xx_irq_handler,
1065−};
drivers/accel/ivpu/ivpu_hw_37xx_reg.h+0−72
@@ -8,78 +8,6 @@ · 7 unmodified lines
88
99 #include <linux/bits.h>
1010
11−#define VPU_37XX_BUTTRESS_INTERRUPT_TYPE 0x00000000u
12−
13−#define VPU_37XX_BUTTRESS_INTERRUPT_STAT 0x00000004u
14−#define VPU_37XX_BUTTRESS_INTERRUPT_STAT_FREQ_CHANGE_MASK BIT_MASK(0)
15−#define VPU_37XX_BUTTRESS_INTERRUPT_STAT_ATS_ERR_MASK BIT_MASK(1)
16−#define VPU_37XX_BUTTRESS_INTERRUPT_STAT_UFI_ERR_MASK BIT_MASK(2)
17−
18−#define VPU_37XX_BUTTRESS_WP_REQ_PAYLOAD0 0x00000008u
19−#define VPU_37XX_BUTTRESS_WP_REQ_PAYLOAD0_MIN_RATIO_MASK GENMASK(15, 0)
20−#define VPU_37XX_BUTTRESS_WP_REQ_PAYLOAD0_MAX_RATIO_MASK GENMASK(31, 16)
21−
22−#define VPU_37XX_BUTTRESS_WP_REQ_PAYLOAD1 0x0000000cu
23−#define VPU_37XX_BUTTRESS_WP_REQ_PAYLOAD1_TARGET_RATIO_MASK GENMASK(15, 0)
24−#define VPU_37XX_BUTTRESS_WP_REQ_PAYLOAD1_EPP_MASK GENMASK(31, 16)
25−
26−#define VPU_37XX_BUTTRESS_WP_REQ_PAYLOAD2 0x00000010u
27−#define VPU_37XX_BUTTRESS_WP_REQ_PAYLOAD2_CONFIG_MASK GENMASK(15, 0)
28−
29−#define VPU_37XX_BUTTRESS_WP_REQ_CMD 0x00000014u
30−#define VPU_37XX_BUTTRESS_WP_REQ_CMD_SEND_MASK BIT_MASK(0)
31−
32−#define VPU_37XX_BUTTRESS_WP_DOWNLOAD 0x00000018u
33−#define VPU_37XX_BUTTRESS_WP_DOWNLOAD_TARGET_RATIO_MASK GENMASK(15, 0)
34−
35−#define VPU_37XX_BUTTRESS_CURRENT_PLL 0x0000001cu
36−#define VPU_37XX_BUTTRESS_CURRENT_PLL_RATIO_MASK GENMASK(15, 0)
37−
38−#define VPU_37XX_BUTTRESS_PLL_ENABLE 0x00000020u
39−
40−#define VPU_37XX_BUTTRESS_FMIN_FUSE 0x00000024u
41−#define VPU_37XX_BUTTRESS_FMIN_FUSE_MIN_RATIO_MASK GENMASK(7, 0)
42−#define VPU_37XX_BUTTRESS_FMIN_FUSE_PN_RATIO_MASK GENMASK(15, 8)
43−
44−#define VPU_37XX_BUTTRESS_FMAX_FUSE 0x00000028u
45−#define VPU_37XX_BUTTRESS_FMAX_FUSE_MAX_RATIO_MASK GENMASK(7, 0)
46−
47−#define VPU_37XX_BUTTRESS_TILE_FUSE 0x0000002cu
48−#define VPU_37XX_BUTTRESS_TILE_FUSE_VALID_MASK BIT_MASK(0)
49−#define VPU_37XX_BUTTRESS_TILE_FUSE_SKU_MASK GENMASK(3, 2)
50−
51−#define VPU_37XX_BUTTRESS_LOCAL_INT_MASK 0x00000030u
52−#define VPU_37XX_BUTTRESS_GLOBAL_INT_MASK 0x00000034u
53−
54−#define VPU_37XX_BUTTRESS_PLL_STATUS 0x00000040u
55−#define VPU_37XX_BUTTRESS_PLL_STATUS_LOCK_MASK BIT_MASK(1)
56−
57−#define VPU_37XX_BUTTRESS_VPU_STATUS 0x00000044u
58−#define VPU_37XX_BUTTRESS_VPU_STATUS_READY_MASK BIT_MASK(0)
59−#define VPU_37XX_BUTTRESS_VPU_STATUS_IDLE_MASK BIT_MASK(1)
60−
61−#define VPU_37XX_BUTTRESS_VPU_D0I3_CONTROL 0x00000060u
62−#define VPU_37XX_BUTTRESS_VPU_D0I3_CONTROL_INPROGRESS_MASK BIT_MASK(0)
63−#define VPU_37XX_BUTTRESS_VPU_D0I3_CONTROL_I3_MASK BIT_MASK(2)
64−
65−#define VPU_37XX_BUTTRESS_VPU_IP_RESET 0x00000050u
66−#define VPU_37XX_BUTTRESS_VPU_IP_RESET_TRIGGER_MASK BIT_MASK(0)
67−
68−#define VPU_37XX_BUTTRESS_VPU_TELEMETRY_OFFSET 0x00000080u
69−#define VPU_37XX_BUTTRESS_VPU_TELEMETRY_SIZE 0x00000084u
70−#define VPU_37XX_BUTTRESS_VPU_TELEMETRY_ENABLE 0x00000088u
71−
72−#define VPU_37XX_BUTTRESS_ATS_ERR_LOG_0 0x000000a0u
73−#define VPU_37XX_BUTTRESS_ATS_ERR_LOG_1 0x000000a4u
74−#define VPU_37XX_BUTTRESS_ATS_ERR_CLEAR 0x000000a8u
75−
76−#define VPU_37XX_BUTTRESS_UFI_ERR_LOG 0x000000b0u
77−#define VPU_37XX_BUTTRESS_UFI_ERR_LOG_CQ_ID_MASK GENMASK(11, 0)
78−#define VPU_37XX_BUTTRESS_UFI_ERR_LOG_AXI_ID_MASK GENMASK(19, 12)
79−#define VPU_37XX_BUTTRESS_UFI_ERR_LOG_OPCODE_MASK GENMASK(24, 20)
80−
81−#define VPU_37XX_BUTTRESS_UFI_ERR_CLEAR 0x000000b4u
82−
8311 #define VPU_37XX_HOST_SS_CPR_CLK_SET 0x00000084u
8412 #define VPU_37XX_HOST_SS_CPR_CLK_SET_TOP_NOC_MASK BIT_MASK(1)
8513 #define VPU_37XX_HOST_SS_CPR_CLK_SET_DSS_MAS_MASK BIT_MASK(10)
drivers/accel/ivpu/ivpu_hw_40xx.c+0−1250
@@ -1,1250 +0,0 @@
1−// SPDX-License-Identifier: GPL-2.0-only
2−/*
3− * Copyright (C) 2020-2023 Intel Corporation
4− */
5−
6−#include "ivpu_drv.h"
7−#include "ivpu_fw.h"
8−#include "ivpu_hw.h"
9−#include "ivpu_hw_40xx_reg.h"
10−#include "ivpu_hw_reg_io.h"
11−#include "ivpu_ipc.h"
12−#include "ivpu_mmu.h"
13−#include "ivpu_pm.h"
14−
15−#include <linux/dmi.h>
16−
17−#define TILE_MAX_NUM 6
18−#define TILE_MAX_MASK 0x3f
19−
20−#define LNL_HW_ID 0x4040
21−
22−#define SKU_TILE_SHIFT 0u
23−#define SKU_TILE_MASK 0x0000ffffu
24−#define SKU_HW_ID_SHIFT 16u
25−#define SKU_HW_ID_MASK 0xffff0000u
26−
27−#define PLL_CONFIG_DEFAULT 0x0
28−#define PLL_CDYN_DEFAULT 0x80
29−#define PLL_EPP_DEFAULT 0x80
30−#define PLL_REF_CLK_FREQ (50 * 1000000)
31−#define PLL_RATIO_TO_FREQ(x) ((x) * PLL_REF_CLK_FREQ)
32−
33−#define PLL_PROFILING_FREQ_DEFAULT 38400000
34−#define PLL_PROFILING_FREQ_HIGH 400000000
35−
36−#define TIM_SAFE_ENABLE 0xf1d0dead
37−#define TIM_WATCHDOG_RESET_VALUE 0xffffffff
38−
39−#define TIMEOUT_US (150 * USEC_PER_MSEC)
40−#define PWR_ISLAND_STATUS_TIMEOUT_US (5 * USEC_PER_MSEC)
41−#define PLL_TIMEOUT_US (1500 * USEC_PER_MSEC)
42−#define IDLE_TIMEOUT_US (5 * USEC_PER_MSEC)
43−
44−#define WEIGHTS_DEFAULT 0xf711f711u
45−#define WEIGHTS_ATS_DEFAULT 0x0000f711u
46−
47−#define ICB_0_IRQ_MASK ((REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, HOST_IPC_FIFO_INT)) | \
48− (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_0_INT)) | \
49− (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_1_INT)) | \
50− (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_2_INT)) | \
51− (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, NOC_FIREWALL_INT)) | \
52− (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_0_INT)) | \
53− (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_1_INT)))
54−
55−#define ICB_1_IRQ_MASK ((REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_1, CPU_INT_REDIRECT_2_INT)) | \
56− (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_1, CPU_INT_REDIRECT_3_INT)) | \
57− (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_1, CPU_INT_REDIRECT_4_INT)))
58−
59−#define ICB_0_1_IRQ_MASK ((((u64)ICB_1_IRQ_MASK) << 32) | ICB_0_IRQ_MASK)
60−
61−#define BUTTRESS_IRQ_MASK ((REG_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, ATS_ERR)) | \
62− (REG_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, CFI0_ERR)) | \
63− (REG_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, CFI1_ERR)) | \
64− (REG_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, IMR0_ERR)) | \
65− (REG_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, IMR1_ERR)) | \
66− (REG_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, SURV_ERR)))
67−
68−#define BUTTRESS_IRQ_ENABLE_MASK ((u32)~BUTTRESS_IRQ_MASK)
69−#define BUTTRESS_IRQ_DISABLE_MASK ((u32)-1)
70−
71−#define ITF_FIREWALL_VIOLATION_MASK ((REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, CSS_ROM_CMX)) | \
72− (REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, CSS_DBG)) | \
73− (REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, CSS_CTRL)) | \
74− (REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, DEC400)) | \
75− (REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, MSS_NCE)) | \
76− (REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, MSS_MBI)) | \
77− (REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, MSS_MBI_CMX)))
78−
79−static char *ivpu_platform_to_str(u32 platform)
80−{
81− switch (platform) {
82− case IVPU_PLATFORM_SILICON:
83− return "SILICON";
84− case IVPU_PLATFORM_SIMICS:
85− return "SIMICS";
86− case IVPU_PLATFORM_FPGA:
87− return "FPGA";
88− default:
89− return "Invalid platform";
90− }
91−}
92−
93−static const struct dmi_system_id ivpu_dmi_platform_simulation[] = {
94− {
95− .ident = "Intel Simics",
96− .matches = {
97− DMI_MATCH(DMI_BOARD_NAME, "lnlrvp"),
98− DMI_MATCH(DMI_BOARD_VERSION, "1.0"),
99− DMI_MATCH(DMI_BOARD_SERIAL, "123456789"),
100− },
101− },
102− {
103− .ident = "Intel Simics",
104− .matches = {
105− DMI_MATCH(DMI_BOARD_NAME, "Simics"),
106− },
107− },
108− { }
109−};
110−
111−static void ivpu_hw_read_platform(struct ivpu_device *vdev)
112−{
113− if (dmi_check_system(ivpu_dmi_platform_simulation))
114− vdev->platform = IVPU_PLATFORM_SIMICS;
115− else
116− vdev->platform = IVPU_PLATFORM_SILICON;
117−
118− ivpu_dbg(vdev, MISC, "Platform type: %s (%d)\n",
119− ivpu_platform_to_str(vdev->platform), vdev->platform);
120−}
121−
122−static void ivpu_hw_wa_init(struct ivpu_device *vdev)
123−{
124− vdev->wa.punit_disabled = ivpu_is_fpga(vdev);
125− vdev->wa.clear_runtime_mem = false;
126−
127− if (ivpu_hw_gen(vdev) == IVPU_HW_40XX)
128− vdev->wa.disable_clock_relinquish = true;
129−
130− IVPU_PRINT_WA(punit_disabled);
131− IVPU_PRINT_WA(clear_runtime_mem);
132− IVPU_PRINT_WA(disable_clock_relinquish);
133−}
134−
135−static void ivpu_hw_timeouts_init(struct ivpu_device *vdev)
136−{
137− if (ivpu_is_fpga(vdev)) {
138− vdev->timeout.boot = 100000;
139− vdev->timeout.jsm = 50000;
140− vdev->timeout.tdr = 2000000;
141− vdev->timeout.reschedule_suspend = 1000;
142− vdev->timeout.autosuspend = -1;
143− vdev->timeout.d0i3_entry_msg = 500;
144− } else if (ivpu_is_simics(vdev)) {
145− vdev->timeout.boot = 50;
146− vdev->timeout.jsm = 500;
147− vdev->timeout.tdr = 10000;
148− vdev->timeout.reschedule_suspend = 10;
149− vdev->timeout.autosuspend = -1;
150− vdev->timeout.d0i3_entry_msg = 100;
151− } else {
152− vdev->timeout.boot = 1000;
153− vdev->timeout.jsm = 500;
154− vdev->timeout.tdr = 2000;
155− vdev->timeout.reschedule_suspend = 10;
156− vdev->timeout.autosuspend = 10;
157− vdev->timeout.d0i3_entry_msg = 5;
158− }
159−}
160−
161−static int ivpu_pll_wait_for_cmd_send(struct ivpu_device *vdev)
162−{
163− return REGB_POLL_FLD(VPU_40XX_BUTTRESS_WP_REQ_CMD, SEND, 0, PLL_TIMEOUT_US);
164−}
165−
166−static int ivpu_pll_cmd_send(struct ivpu_device *vdev, u16 min_ratio, u16 max_ratio,
167− u16 target_ratio, u16 epp, u16 config, u16 cdyn)
168−{
169− int ret;
170− u32 val;
171−
172− ret = ivpu_pll_wait_for_cmd_send(vdev);
173− if (ret) {
174− ivpu_err(vdev, "Failed to sync before WP request: %d\n", ret);
175− return ret;
176− }
177−
178− val = REGB_RD32(VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD0);
179− val = REG_SET_FLD_NUM(VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD0, MIN_RATIO, min_ratio, val);
180− val = REG_SET_FLD_NUM(VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD0, MAX_RATIO, max_ratio, val);
181− REGB_WR32(VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD0, val);
182−
183− val = REGB_RD32(VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD1);
184− val = REG_SET_FLD_NUM(VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD1, TARGET_RATIO, target_ratio, val);
185− val = REG_SET_FLD_NUM(VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD1, EPP, epp, val);
186− REGB_WR32(VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD1, val);
187−
188− val = REGB_RD32(VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD2);
189− val = REG_SET_FLD_NUM(VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD2, CONFIG, config, val);
190− val = REG_SET_FLD_NUM(VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD2, CDYN, cdyn, val);
191− REGB_WR32(VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD2, val);
192−
193− val = REGB_RD32(VPU_40XX_BUTTRESS_WP_REQ_CMD);
194− val = REG_SET_FLD(VPU_40XX_BUTTRESS_WP_REQ_CMD, SEND, val);
195− REGB_WR32(VPU_40XX_BUTTRESS_WP_REQ_CMD, val);
196−
197− ret = ivpu_pll_wait_for_cmd_send(vdev);
198− if (ret)
199− ivpu_err(vdev, "Failed to sync after WP request: %d\n", ret);
200−
201− return ret;
202−}
203−
204−static int ivpu_pll_wait_for_status_ready(struct ivpu_device *vdev)
205−{
206− return REGB_POLL_FLD(VPU_40XX_BUTTRESS_VPU_STATUS, READY, 1, PLL_TIMEOUT_US);
207−}
208−
209−static int ivpu_wait_for_clock_own_resource_ack(struct ivpu_device *vdev)
210−{
211− if (ivpu_is_simics(vdev))
212− return 0;
213−
214− return REGB_POLL_FLD(VPU_40XX_BUTTRESS_VPU_STATUS, CLOCK_RESOURCE_OWN_ACK, 1, TIMEOUT_US);
215−}
216−
217−static void ivpu_pll_init_frequency_ratios(struct ivpu_device *vdev)
218−{
219− struct ivpu_hw_info *hw = vdev->hw;
220− u8 fuse_min_ratio, fuse_pn_ratio, fuse_max_ratio;
221− u32 fmin_fuse, fmax_fuse;
222−
223− fmin_fuse = REGB_RD32(VPU_40XX_BUTTRESS_FMIN_FUSE);
224− fuse_min_ratio = REG_GET_FLD(VPU_40XX_BUTTRESS_FMIN_FUSE, MIN_RATIO, fmin_fuse);
225− fuse_pn_ratio = REG_GET_FLD(VPU_40XX_BUTTRESS_FMIN_FUSE, PN_RATIO, fmin_fuse);
226−
227− fmax_fuse = REGB_RD32(VPU_40XX_BUTTRESS_FMAX_FUSE);
228− fuse_max_ratio = REG_GET_FLD(VPU_40XX_BUTTRESS_FMAX_FUSE, MAX_RATIO, fmax_fuse);
229−
230− hw->pll.min_ratio = clamp_t(u8, ivpu_pll_min_ratio, fuse_min_ratio, fuse_max_ratio);
231− hw->pll.max_ratio = clamp_t(u8, ivpu_pll_max_ratio, hw->pll.min_ratio, fuse_max_ratio);
232− hw->pll.pn_ratio = clamp_t(u8, fuse_pn_ratio, hw->pll.min_ratio, hw->pll.max_ratio);
233−}
234−
235−static int ivpu_pll_drive(struct ivpu_device *vdev, bool enable)
236−{
237− u16 config = enable ? PLL_CONFIG_DEFAULT : 0;
238− u16 cdyn = enable ? PLL_CDYN_DEFAULT : 0;
239− u16 epp = enable ? PLL_EPP_DEFAULT : 0;
240− struct ivpu_hw_info *hw = vdev->hw;
241− u16 target_ratio = hw->pll.pn_ratio;
242− int ret;
243−
244− ivpu_dbg(vdev, PM, "PLL workpoint request: %u Hz, epp: 0x%x, config: 0x%x, cdyn: 0x%x\n",
245− PLL_RATIO_TO_FREQ(target_ratio), epp, config, cdyn);
246−
247− ret = ivpu_pll_cmd_send(vdev, hw->pll.min_ratio, hw->pll.max_ratio,
248− target_ratio, epp, config, cdyn);
249− if (ret) {
250− ivpu_err(vdev, "Failed to send PLL workpoint request: %d\n", ret);
251− return ret;
252− }
253−
254− if (enable) {
255− ret = ivpu_pll_wait_for_status_ready(vdev);
256− if (ret) {
257− ivpu_err(vdev, "Timed out waiting for PLL ready status\n");
258− return ret;
259− }
260− }
261−
262− return 0;
263−}
264−
265−static int ivpu_pll_enable(struct ivpu_device *vdev)
266−{
267− return ivpu_pll_drive(vdev, true);
268−}
269−
270−static int ivpu_pll_disable(struct ivpu_device *vdev)
271−{
272− return ivpu_pll_drive(vdev, false);
273−}
274−
275−static void ivpu_boot_host_ss_rst_drive(struct ivpu_device *vdev, bool enable)
276−{
277− u32 val = REGV_RD32(VPU_40XX_HOST_SS_CPR_RST_EN);
278−
279− if (enable) {
280− val = REG_SET_FLD(VPU_40XX_HOST_SS_CPR_RST_EN, TOP_NOC, val);
281− val = REG_SET_FLD(VPU_40XX_HOST_SS_CPR_RST_EN, DSS_MAS, val);
282− val = REG_SET_FLD(VPU_40XX_HOST_SS_CPR_RST_EN, CSS_MAS, val);
283− } else {
284− val = REG_CLR_FLD(VPU_40XX_HOST_SS_CPR_RST_EN, TOP_NOC, val);
285− val = REG_CLR_FLD(VPU_40XX_HOST_SS_CPR_RST_EN, DSS_MAS, val);
286− val = REG_CLR_FLD(VPU_40XX_HOST_SS_CPR_RST_EN, CSS_MAS, val);
287− }
288−
289− REGV_WR32(VPU_40XX_HOST_SS_CPR_RST_EN, val);
290−}
291−
292−static void ivpu_boot_host_ss_clk_drive(struct ivpu_device *vdev, bool enable)
293−{
294− u32 val = REGV_RD32(VPU_40XX_HOST_SS_CPR_CLK_EN);
295−
296− if (enable) {
297− val = REG_SET_FLD(VPU_40XX_HOST_SS_CPR_CLK_EN, TOP_NOC, val);
298− val = REG_SET_FLD(VPU_40XX_HOST_SS_CPR_CLK_EN, DSS_MAS, val);
299− val = REG_SET_FLD(VPU_40XX_HOST_SS_CPR_CLK_EN, CSS_MAS, val);
300− } else {
301− val = REG_CLR_FLD(VPU_40XX_HOST_SS_CPR_CLK_EN, TOP_NOC, val);
302− val = REG_CLR_FLD(VPU_40XX_HOST_SS_CPR_CLK_EN, DSS_MAS, val);
303− val = REG_CLR_FLD(VPU_40XX_HOST_SS_CPR_CLK_EN, CSS_MAS, val);
304− }
305−
306− REGV_WR32(VPU_40XX_HOST_SS_CPR_CLK_EN, val);
307−}
308−
309−static int ivpu_boot_noc_qreqn_check(struct ivpu_device *vdev, u32 exp_val)
310−{
311− u32 val = REGV_RD32(VPU_40XX_HOST_SS_NOC_QREQN);
312−
313− if (!REG_TEST_FLD_NUM(VPU_40XX_HOST_SS_NOC_QREQN, TOP_SOCMMIO, exp_val, val))
314− return -EIO;
315−
316− return 0;
317−}
318−
319−static int ivpu_boot_noc_qacceptn_check(struct ivpu_device *vdev, u32 exp_val)
320−{
321− u32 val = REGV_RD32(VPU_40XX_HOST_SS_NOC_QACCEPTN);
322−
323− if (!REG_TEST_FLD_NUM(VPU_40XX_HOST_SS_NOC_QACCEPTN, TOP_SOCMMIO, exp_val, val))
324− return -EIO;
325−
326− return 0;
327−}
328−
329−static int ivpu_boot_noc_qdeny_check(struct ivpu_device *vdev, u32 exp_val)
330−{
331− u32 val = REGV_RD32(VPU_40XX_HOST_SS_NOC_QDENY);
332−
333− if (!REG_TEST_FLD_NUM(VPU_40XX_HOST_SS_NOC_QDENY, TOP_SOCMMIO, exp_val, val))
334− return -EIO;
335−
336− return 0;
337−}
338−
339−static int ivpu_boot_top_noc_qrenqn_check(struct ivpu_device *vdev, u32 exp_val)
340−{
341− u32 val = REGV_RD32(VPU_40XX_TOP_NOC_QREQN);
342−
343− if (!REG_TEST_FLD_NUM(VPU_40XX_TOP_NOC_QREQN, CPU_CTRL, exp_val, val) ||
344− !REG_TEST_FLD_NUM(VPU_40XX_TOP_NOC_QREQN, HOSTIF_L2CACHE, exp_val, val))
345− return -EIO;
346−
347− return 0;
348−}
349−
350−static int ivpu_boot_top_noc_qacceptn_check(struct ivpu_device *vdev, u32 exp_val)
351−{
352− u32 val = REGV_RD32(VPU_40XX_TOP_NOC_QACCEPTN);
353−
354− if (!REG_TEST_FLD_NUM(VPU_40XX_TOP_NOC_QACCEPTN, CPU_CTRL, exp_val, val) ||
355− !REG_TEST_FLD_NUM(VPU_40XX_TOP_NOC_QACCEPTN, HOSTIF_L2CACHE, exp_val, val))
356− return -EIO;
357−
358− return 0;
359−}
360−
361−static int ivpu_boot_top_noc_qdeny_check(struct ivpu_device *vdev, u32 exp_val)
362−{
363− u32 val = REGV_RD32(VPU_40XX_TOP_NOC_QDENY);
364−
365− if (!REG_TEST_FLD_NUM(VPU_40XX_TOP_NOC_QDENY, CPU_CTRL, exp_val, val) ||
366− !REG_TEST_FLD_NUM(VPU_40XX_TOP_NOC_QDENY, HOSTIF_L2CACHE, exp_val, val))
367− return -EIO;
368−
369− return 0;
370−}
371−
372−static void ivpu_boot_idle_gen_drive(struct ivpu_device *vdev, bool enable)
373−{
374− u32 val = REGV_RD32(VPU_40XX_HOST_SS_AON_IDLE_GEN);
375−
376− if (enable)
377− val = REG_SET_FLD(VPU_40XX_HOST_SS_AON_IDLE_GEN, EN, val);
378− else
379− val = REG_CLR_FLD(VPU_40XX_HOST_SS_AON_IDLE_GEN, EN, val);
380−
381− REGV_WR32(VPU_40XX_HOST_SS_AON_IDLE_GEN, val);
382−}
383−
384−static int ivpu_boot_host_ss_check(struct ivpu_device *vdev)
385−{
386− int ret;
387−
388− ret = ivpu_boot_noc_qreqn_check(vdev, 0x0);
389− if (ret) {
390− ivpu_err(vdev, "Failed qreqn check: %d\n", ret);
391− return ret;
392− }
393−
394− ret = ivpu_boot_noc_qacceptn_check(vdev, 0x0);
395− if (ret) {
396− ivpu_err(vdev, "Failed qacceptn check: %d\n", ret);
397− return ret;
398− }
399−
400− ret = ivpu_boot_noc_qdeny_check(vdev, 0x0);
401− if (ret)
402− ivpu_err(vdev, "Failed qdeny check %d\n", ret);
403−
404− return ret;
405−}
406−
407−static int ivpu_boot_host_ss_axi_drive(struct ivpu_device *vdev, bool enable)
408−{
409− int ret;
410− u32 val;
411−
412− val = REGV_RD32(VPU_40XX_HOST_SS_NOC_QREQN);
413− if (enable)
414− val = REG_SET_FLD(VPU_40XX_HOST_SS_NOC_QREQN, TOP_SOCMMIO, val);
415− else
416− val = REG_CLR_FLD(VPU_40XX_HOST_SS_NOC_QREQN, TOP_SOCMMIO, val);
417− REGV_WR32(VPU_40XX_HOST_SS_NOC_QREQN, val);
418−
419− ret = ivpu_boot_noc_qacceptn_check(vdev, enable ? 0x1 : 0x0);
420− if (ret) {
421− ivpu_err(vdev, "Failed qacceptn check: %d\n", ret);
422− return ret;
423− }
424−
425− ret = ivpu_boot_noc_qdeny_check(vdev, 0x0);
426− if (ret) {
427− ivpu_err(vdev, "Failed qdeny check: %d\n", ret);
428− return ret;
429− }
430−
431− if (enable) {
432− REGB_WR32(VPU_40XX_BUTTRESS_PORT_ARBITRATION_WEIGHTS, WEIGHTS_DEFAULT);
433− REGB_WR32(VPU_40XX_BUTTRESS_PORT_ARBITRATION_WEIGHTS_ATS, WEIGHTS_ATS_DEFAULT);
434− }
435−
436− return ret;
437−}
438−
439−static int ivpu_boot_host_ss_axi_enable(struct ivpu_device *vdev)
440−{
441− return ivpu_boot_host_ss_axi_drive(vdev, true);
442−}
443−
444−static int ivpu_boot_host_ss_top_noc_drive(struct ivpu_device *vdev, bool enable)
445−{
446− int ret;
447− u32 val;
448−
449− val = REGV_RD32(VPU_40XX_TOP_NOC_QREQN);
450− if (enable) {
451− val = REG_SET_FLD(VPU_40XX_TOP_NOC_QREQN, CPU_CTRL, val);
452− val = REG_SET_FLD(VPU_40XX_TOP_NOC_QREQN, HOSTIF_L2CACHE, val);
453− } else {
454− val = REG_CLR_FLD(VPU_40XX_TOP_NOC_QREQN, CPU_CTRL, val);
455− val = REG_CLR_FLD(VPU_40XX_TOP_NOC_QREQN, HOSTIF_L2CACHE, val);
456− }
457− REGV_WR32(VPU_40XX_TOP_NOC_QREQN, val);
458−
459− ret = ivpu_boot_top_noc_qacceptn_check(vdev, enable ? 0x1 : 0x0);
460− if (ret) {
461− ivpu_err(vdev, "Failed qacceptn check: %d\n", ret);
462− return ret;
463− }
464−
465− ret = ivpu_boot_top_noc_qdeny_check(vdev, 0x0);
466− if (ret)
467− ivpu_err(vdev, "Failed qdeny check: %d\n", ret);
468−
469− return ret;
470−}
471−
472−static int ivpu_boot_host_ss_top_noc_enable(struct ivpu_device *vdev)
473−{
474− return ivpu_boot_host_ss_top_noc_drive(vdev, true);
475−}
476−
477−static void ivpu_boot_pwr_island_trickle_drive(struct ivpu_device *vdev, bool enable)
478−{
479− u32 val = REGV_RD32(VPU_40XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0);
480−
481− if (enable)
482− val = REG_SET_FLD(VPU_40XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0, CSS_CPU, val);
483− else
484− val = REG_CLR_FLD(VPU_40XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0, CSS_CPU, val);
485−
486− REGV_WR32(VPU_40XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0, val);
487−
488− if (enable)
489− ndelay(500);
490−}
491−
492−static void ivpu_boot_pwr_island_drive(struct ivpu_device *vdev, bool enable)
493−{
494− u32 val = REGV_RD32(VPU_40XX_HOST_SS_AON_PWR_ISLAND_EN0);
495−
496− if (enable)
497− val = REG_SET_FLD(VPU_40XX_HOST_SS_AON_PWR_ISLAND_EN0, CSS_CPU, val);
498− else
499− val = REG_CLR_FLD(VPU_40XX_HOST_SS_AON_PWR_ISLAND_EN0, CSS_CPU, val);
500−
501− REGV_WR32(VPU_40XX_HOST_SS_AON_PWR_ISLAND_EN0, val);
502−
503− if (!enable)
504− ndelay(500);
505−}
506−
507−static int ivpu_boot_wait_for_pwr_island_status(struct ivpu_device *vdev, u32 exp_val)
508−{
509− if (ivpu_is_fpga(vdev))
510− return 0;
511−
512− return REGV_POLL_FLD(VPU_40XX_HOST_SS_AON_PWR_ISLAND_STATUS0, CSS_CPU,
513− exp_val, PWR_ISLAND_STATUS_TIMEOUT_US);
514−}
515−
516−static void ivpu_boot_pwr_island_isolation_drive(struct ivpu_device *vdev, bool enable)
517−{
518− u32 val = REGV_RD32(VPU_40XX_HOST_SS_AON_PWR_ISO_EN0);
519−
520− if (enable)
521− val = REG_SET_FLD(VPU_40XX_HOST_SS_AON_PWR_ISO_EN0, CSS_CPU, val);
522− else
523− val = REG_CLR_FLD(VPU_40XX_HOST_SS_AON_PWR_ISO_EN0, CSS_CPU, val);
524−
525− REGV_WR32(VPU_40XX_HOST_SS_AON_PWR_ISO_EN0, val);
526−}
527−
528−static void ivpu_boot_no_snoop_enable(struct ivpu_device *vdev)
529−{
530− u32 val = REGV_RD32(VPU_40XX_HOST_IF_TCU_PTW_OVERRIDES);
531−
532− val = REG_SET_FLD(VPU_40XX_HOST_IF_TCU_PTW_OVERRIDES, SNOOP_OVERRIDE_EN, val);
533− val = REG_SET_FLD(VPU_40XX_HOST_IF_TCU_PTW_OVERRIDES, AW_SNOOP_OVERRIDE, val);
534− val = REG_CLR_FLD(VPU_40XX_HOST_IF_TCU_PTW_OVERRIDES, AR_SNOOP_OVERRIDE, val);
535−
536− REGV_WR32(VPU_40XX_HOST_IF_TCU_PTW_OVERRIDES, val);
537−}
538−
539−static void ivpu_boot_tbu_mmu_enable(struct ivpu_device *vdev)
540−{
541− u32 val = REGV_RD32(VPU_40XX_HOST_IF_TBU_MMUSSIDV);
542−
543− val = REG_SET_FLD(VPU_40XX_HOST_IF_TBU_MMUSSIDV, TBU0_AWMMUSSIDV, val);
544− val = REG_SET_FLD(VPU_40XX_HOST_IF_TBU_MMUSSIDV, TBU0_ARMMUSSIDV, val);
545− val = REG_SET_FLD(VPU_40XX_HOST_IF_TBU_MMUSSIDV, TBU1_AWMMUSSIDV, val);
546− val = REG_SET_FLD(VPU_40XX_HOST_IF_TBU_MMUSSIDV, TBU1_ARMMUSSIDV, val);
547− val = REG_SET_FLD(VPU_40XX_HOST_IF_TBU_MMUSSIDV, TBU2_AWMMUSSIDV, val);
548− val = REG_SET_FLD(VPU_40XX_HOST_IF_TBU_MMUSSIDV, TBU2_ARMMUSSIDV, val);
549−
550− REGV_WR32(VPU_40XX_HOST_IF_TBU_MMUSSIDV, val);
551−}
552−
553−static int ivpu_boot_cpu_noc_qacceptn_check(struct ivpu_device *vdev, u32 exp_val)
554−{
555− u32 val = REGV_RD32(VPU_40XX_CPU_SS_CPR_NOC_QACCEPTN);
556−
557− if (!REG_TEST_FLD_NUM(VPU_40XX_CPU_SS_CPR_NOC_QACCEPTN, TOP_MMIO, exp_val, val))
558− return -EIO;
559−
560− return 0;
561−}
562−
563−static int ivpu_boot_cpu_noc_qdeny_check(struct ivpu_device *vdev, u32 exp_val)
564−{
565− u32 val = REGV_RD32(VPU_40XX_CPU_SS_CPR_NOC_QDENY);
566−
567− if (!REG_TEST_FLD_NUM(VPU_40XX_CPU_SS_CPR_NOC_QDENY, TOP_MMIO, exp_val, val))
568− return -EIO;
569−
570− return 0;
571−}
572−
573−static int ivpu_boot_pwr_domain_enable(struct ivpu_device *vdev)
574−{
575− int ret;
576−
577− ret = ivpu_wait_for_clock_own_resource_ack(vdev);
578− if (ret) {
579− ivpu_err(vdev, "Timed out waiting for clock own resource ACK\n");
580− return ret;
581− }
582−
583− ivpu_boot_pwr_island_trickle_drive(vdev, true);
584− ivpu_boot_pwr_island_drive(vdev, true);
585−
586− ret = ivpu_boot_wait_for_pwr_island_status(vdev, 0x1);
587− if (ret) {
588− ivpu_err(vdev, "Timed out waiting for power island status\n");
589− return ret;
590− }
591−
592− ret = ivpu_boot_top_noc_qrenqn_check(vdev, 0x0);
593− if (ret) {
594− ivpu_err(vdev, "Failed qrenqn check %d\n", ret);
595− return ret;
596− }
597−
598− ivpu_boot_host_ss_clk_drive(vdev, true);
599− ivpu_boot_host_ss_rst_drive(vdev, true);
600− ivpu_boot_pwr_island_isolation_drive(vdev, false);
601−
602− return ret;
603−}
604−
605−static int ivpu_boot_soc_cpu_drive(struct ivpu_device *vdev, bool enable)
606−{
607− int ret;
608− u32 val;
609−
610− val = REGV_RD32(VPU_40XX_CPU_SS_CPR_NOC_QREQN);
611− if (enable)
612− val = REG_SET_FLD(VPU_40XX_CPU_SS_CPR_NOC_QREQN, TOP_MMIO, val);
613− else
614− val = REG_CLR_FLD(VPU_40XX_CPU_SS_CPR_NOC_QREQN, TOP_MMIO, val);
615− REGV_WR32(VPU_40XX_CPU_SS_CPR_NOC_QREQN, val);
616−
617− ret = ivpu_boot_cpu_noc_qacceptn_check(vdev, enable ? 0x1 : 0x0);
618− if (ret) {
619− ivpu_err(vdev, "Failed qacceptn check: %d\n", ret);
620− return ret;
621− }
622−
623− ret = ivpu_boot_cpu_noc_qdeny_check(vdev, 0x0);
624− if (ret)
625− ivpu_err(vdev, "Failed qdeny check: %d\n", ret);
626−
627− return ret;
628−}
629−
630−static int ivpu_boot_soc_cpu_enable(struct ivpu_device *vdev)
631−{
632− return ivpu_boot_soc_cpu_drive(vdev, true);
633−}
634−
635−static int ivpu_boot_soc_cpu_boot(struct ivpu_device *vdev)
636−{
637− int ret;
638− u32 val;
639− u64 val64;
640−
641− ret = ivpu_boot_soc_cpu_enable(vdev);
642− if (ret) {
643− ivpu_err(vdev, "Failed to enable SOC CPU: %d\n", ret);
644− return ret;
645− }
646−
647− val64 = vdev->fw->entry_point;
648− val64 <<= ffs(VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO_IMAGE_LOCATION_MASK) - 1;
649− REGV_WR64(VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO, val64);
650−
651− val = REGV_RD32(VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO);
652− val = REG_SET_FLD(VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO, DONE, val);
653− REGV_WR32(VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO, val);
654−
655− ivpu_dbg(vdev, PM, "Booting firmware, mode: %s\n",
656− ivpu_fw_is_cold_boot(vdev) ? "cold boot" : "resume");
657−
658− return 0;
659−}
660−
661−static int ivpu_boot_d0i3_drive(struct ivpu_device *vdev, bool enable)
662−{
663− int ret;
664− u32 val;
665−
666− ret = REGB_POLL_FLD(VPU_40XX_BUTTRESS_D0I3_CONTROL, INPROGRESS, 0, TIMEOUT_US);
667− if (ret) {
668− ivpu_err(vdev, "Failed to sync before D0i3 transition: %d\n", ret);
669− return ret;
670− }
671−
672− val = REGB_RD32(VPU_40XX_BUTTRESS_D0I3_CONTROL);
673− if (enable)
674− val = REG_SET_FLD(VPU_40XX_BUTTRESS_D0I3_CONTROL, I3, val);
675− else
676− val = REG_CLR_FLD(VPU_40XX_BUTTRESS_D0I3_CONTROL, I3, val);
677− REGB_WR32(VPU_40XX_BUTTRESS_D0I3_CONTROL, val);
678−
679− ret = REGB_POLL_FLD(VPU_40XX_BUTTRESS_D0I3_CONTROL, INPROGRESS, 0, TIMEOUT_US);
680− if (ret) {
681− ivpu_err(vdev, "Failed to sync after D0i3 transition: %d\n", ret);
682− return ret;
683− }
684−
685− return 0;
686−}
687−
688−static bool ivpu_tile_disable_check(u32 config)
689−{
690− /* Allowed values: 0 or one bit from range 0-5 (6 tiles) */
691− if (config == 0)
692− return true;
693−
694− if (config > BIT(TILE_MAX_NUM - 1))
695− return false;
696−
697− if ((config & (config - 1)) == 0)
698− return true;
699−
700− return false;
701−}
702−
703−static int ivpu_hw_40xx_info_init(struct ivpu_device *vdev)
704−{
705− struct ivpu_hw_info *hw = vdev->hw;
706− u32 tile_disable;
707− u32 fuse;
708−
709− fuse = REGB_RD32(VPU_40XX_BUTTRESS_TILE_FUSE);
710− if (!REG_TEST_FLD(VPU_40XX_BUTTRESS_TILE_FUSE, VALID, fuse)) {
711− ivpu_err(vdev, "Fuse: invalid (0x%x)\n", fuse);
712− return -EIO;
713− }
714−
715− tile_disable = REG_GET_FLD(VPU_40XX_BUTTRESS_TILE_FUSE, CONFIG, fuse);
716− if (!ivpu_tile_disable_check(tile_disable)) {
717− ivpu_err(vdev, "Fuse: Invalid tile disable config (0x%x)\n", tile_disable);
718− return -EIO;
719− }
720−
721− if (tile_disable)
722− ivpu_dbg(vdev, MISC, "Fuse: %d tiles enabled. Tile number %d disabled\n",
723− TILE_MAX_NUM - 1, ffs(tile_disable) - 1);
724− else
725− ivpu_dbg(vdev, MISC, "Fuse: All %d tiles enabled\n", TILE_MAX_NUM);
726−
727− hw->tile_fuse = tile_disable;
728− hw->pll.profiling_freq = PLL_PROFILING_FREQ_DEFAULT;
729−
730− ivpu_pll_init_frequency_ratios(vdev);
731−
732− ivpu_hw_init_range(&vdev->hw->ranges.global, 0x80000000, SZ_512M);
733− ivpu_hw_init_range(&vdev->hw->ranges.user, 0x80000000, SZ_256M);
734− ivpu_hw_init_range(&vdev->hw->ranges.shave, 0x80000000 + SZ_256M, SZ_2G - SZ_256M);
735− ivpu_hw_init_range(&vdev->hw->ranges.dma, 0x200000000, SZ_8G);
736−
737− ivpu_hw_read_platform(vdev);
738− ivpu_hw_wa_init(vdev);
739− ivpu_hw_timeouts_init(vdev);
740−
741− return 0;
742−}
743−
744−static int ivpu_hw_40xx_ip_reset(struct ivpu_device *vdev)
745−{
746− int ret;
747− u32 val;
748−
749− ret = REGB_POLL_FLD(VPU_40XX_BUTTRESS_IP_RESET, TRIGGER, 0, TIMEOUT_US);
750− if (ret) {
751− ivpu_err(vdev, "Wait for *_TRIGGER timed out\n");
752− return ret;
753− }
754−
755− val = REGB_RD32(VPU_40XX_BUTTRESS_IP_RESET);
756− val = REG_SET_FLD(VPU_40XX_BUTTRESS_IP_RESET, TRIGGER, val);
757− REGB_WR32(VPU_40XX_BUTTRESS_IP_RESET, val);
758−
759− ret = REGB_POLL_FLD(VPU_40XX_BUTTRESS_IP_RESET, TRIGGER, 0, TIMEOUT_US);
760− if (ret)
761− ivpu_err(vdev, "Timed out waiting for RESET completion\n");
762−
763− return ret;
764−}
765−
766−static int ivpu_hw_40xx_reset(struct ivpu_device *vdev)
767−{
768− int ret = 0;
769−
770− if (ivpu_hw_40xx_ip_reset(vdev)) {
771− ivpu_err(vdev, "Failed to reset NPU IP\n");
772− ret = -EIO;
773− }
774−
775− if (ivpu_pll_disable(vdev)) {
776− ivpu_err(vdev, "Failed to disable PLL\n");
777− ret = -EIO;
778− }
779−
780− return ret;
781−}
782−
783−static int ivpu_hw_40xx_d0i3_enable(struct ivpu_device *vdev)
784−{
785− int ret;
786−
787− if (IVPU_WA(punit_disabled))
788− return 0;
789−
790− ret = ivpu_boot_d0i3_drive(vdev, true);
791− if (ret)
792− ivpu_err(vdev, "Failed to enable D0i3: %d\n", ret);
793−
794− udelay(5); /* VPU requires 5 us to complete the transition */
795−
796− return ret;
797−}
798−
799−static int ivpu_hw_40xx_d0i3_disable(struct ivpu_device *vdev)
800−{
801− int ret;
802−
803− if (IVPU_WA(punit_disabled))
804− return 0;
805−
806− ret = ivpu_boot_d0i3_drive(vdev, false);
807− if (ret)
808− ivpu_err(vdev, "Failed to disable D0i3: %d\n", ret);
809−
810− return ret;
811−}
812−
813−static void ivpu_hw_40xx_profiling_freq_reg_set(struct ivpu_device *vdev)
814−{
815− u32 val = REGB_RD32(VPU_40XX_BUTTRESS_VPU_STATUS);
816−
817− if (vdev->hw->pll.profiling_freq == PLL_PROFILING_FREQ_DEFAULT)
818− val = REG_CLR_FLD(VPU_40XX_BUTTRESS_VPU_STATUS, PERF_CLK, val);
819− else
820− val = REG_SET_FLD(VPU_40XX_BUTTRESS_VPU_STATUS, PERF_CLK, val);
821−
822− REGB_WR32(VPU_40XX_BUTTRESS_VPU_STATUS, val);
823−}
824−
825−static void ivpu_hw_40xx_ats_print(struct ivpu_device *vdev)
826−{
827− ivpu_dbg(vdev, MISC, "Buttress ATS: %s\n",
828− REGB_RD32(VPU_40XX_BUTTRESS_HM_ATS) ? "Enable" : "Disable");
829−}
830−
831−static void ivpu_hw_40xx_clock_relinquish_disable(struct ivpu_device *vdev)
832−{
833− u32 val = REGB_RD32(VPU_40XX_BUTTRESS_VPU_STATUS);
834−
835− val = REG_SET_FLD(VPU_40XX_BUTTRESS_VPU_STATUS, DISABLE_CLK_RELINQUISH, val);
836− REGB_WR32(VPU_40XX_BUTTRESS_VPU_STATUS, val);
837−}
838−
839−static int ivpu_hw_40xx_power_up(struct ivpu_device *vdev)
840−{
841− int ret;
842−
843− ret = ivpu_hw_40xx_d0i3_disable(vdev);
844− if (ret)
845− ivpu_warn(vdev, "Failed to disable D0I3: %d\n", ret);
846−
847− ret = ivpu_pll_enable(vdev);
848− if (ret) {
849− ivpu_err(vdev, "Failed to enable PLL: %d\n", ret);
850− return ret;
851− }
852−
853− if (IVPU_WA(disable_clock_relinquish))
854− ivpu_hw_40xx_clock_relinquish_disable(vdev);
855− ivpu_hw_40xx_profiling_freq_reg_set(vdev);
856− ivpu_hw_40xx_ats_print(vdev);
857−
858− ret = ivpu_boot_host_ss_check(vdev);
859− if (ret) {
860− ivpu_err(vdev, "Failed to configure host SS: %d\n", ret);
861− return ret;
862− }
863−
864− ivpu_boot_idle_gen_drive(vdev, false);
865−
866− ret = ivpu_boot_pwr_domain_enable(vdev);
867− if (ret) {
868− ivpu_err(vdev, "Failed to enable power domain: %d\n", ret);
869− return ret;
870− }
871−
872− ret = ivpu_boot_host_ss_axi_enable(vdev);
873− if (ret) {
874− ivpu_err(vdev, "Failed to enable AXI: %d\n", ret);
875− return ret;
876− }
877−
878− ret = ivpu_boot_host_ss_top_noc_enable(vdev);
879− if (ret)
880− ivpu_err(vdev, "Failed to enable TOP NOC: %d\n", ret);
881−
882− return ret;
883−}
884−
885−static int ivpu_hw_40xx_boot_fw(struct ivpu_device *vdev)
886−{
887− int ret;
888−
889− ivpu_boot_no_snoop_enable(vdev);
890− ivpu_boot_tbu_mmu_enable(vdev);
891−
892− ret = ivpu_boot_soc_cpu_boot(vdev);
893− if (ret)
894− ivpu_err(vdev, "Failed to boot SOC CPU: %d\n", ret);
895−
896− return ret;
897−}
898−
899−static bool ivpu_hw_40xx_is_idle(struct ivpu_device *vdev)
900−{
901− u32 val;
902−
903− if (IVPU_WA(punit_disabled))
904− return true;
905−
906− val = REGB_RD32(VPU_40XX_BUTTRESS_VPU_STATUS);
907− return REG_TEST_FLD(VPU_40XX_BUTTRESS_VPU_STATUS, READY, val) &&
908− REG_TEST_FLD(VPU_40XX_BUTTRESS_VPU_STATUS, IDLE, val);
909−}
910−
911−static int ivpu_hw_40xx_wait_for_idle(struct ivpu_device *vdev)
912−{
913− return REGB_POLL_FLD(VPU_40XX_BUTTRESS_VPU_STATUS, IDLE, 0x1, IDLE_TIMEOUT_US);
914−}
915−
916−static void ivpu_hw_40xx_save_d0i3_entry_timestamp(struct ivpu_device *vdev)
917−{
918− vdev->hw->d0i3_entry_host_ts = ktime_get_boottime();
919− vdev->hw->d0i3_entry_vpu_ts = REGV_RD64(VPU_40XX_CPU_SS_TIM_PERF_EXT_FREE_CNT);
920−}
921−
922−static int ivpu_hw_40xx_power_down(struct ivpu_device *vdev)
923−{
924− int ret = 0;
925−
926− ivpu_hw_40xx_save_d0i3_entry_timestamp(vdev);
927−
928− if (!ivpu_hw_40xx_is_idle(vdev) && ivpu_hw_40xx_ip_reset(vdev))
929− ivpu_warn(vdev, "Failed to reset the NPU\n");
930−
931− if (ivpu_pll_disable(vdev)) {
932− ivpu_err(vdev, "Failed to disable PLL\n");
933− ret = -EIO;
934− }
935−
936− if (ivpu_hw_40xx_d0i3_enable(vdev)) {
937− ivpu_err(vdev, "Failed to enter D0I3\n");
938− ret = -EIO;
939− }
940−
941− return ret;
942−}
943−
944−static void ivpu_hw_40xx_wdt_disable(struct ivpu_device *vdev)
945−{
946− u32 val;
947−
948− REGV_WR32(VPU_40XX_CPU_SS_TIM_SAFE, TIM_SAFE_ENABLE);
949− REGV_WR32(VPU_40XX_CPU_SS_TIM_WATCHDOG, TIM_WATCHDOG_RESET_VALUE);
950−
951− REGV_WR32(VPU_40XX_CPU_SS_TIM_SAFE, TIM_SAFE_ENABLE);
952− REGV_WR32(VPU_40XX_CPU_SS_TIM_WDOG_EN, 0);
953−
954− val = REGV_RD32(VPU_40XX_CPU_SS_TIM_GEN_CONFIG);
955− val = REG_CLR_FLD(VPU_40XX_CPU_SS_TIM_GEN_CONFIG, WDOG_TO_INT_CLR, val);
956− REGV_WR32(VPU_40XX_CPU_SS_TIM_GEN_CONFIG, val);
957−}
958−
959−static u32 ivpu_hw_40xx_profiling_freq_get(struct ivpu_device *vdev)
960−{
961− return vdev->hw->pll.profiling_freq;
962−}
963−
964−static void ivpu_hw_40xx_profiling_freq_drive(struct ivpu_device *vdev, bool enable)
965−{
966− if (enable)
967− vdev->hw->pll.profiling_freq = PLL_PROFILING_FREQ_HIGH;
968− else
969− vdev->hw->pll.profiling_freq = PLL_PROFILING_FREQ_DEFAULT;
970−}
971−
972−/* Register indirect accesses */
973−static u32 ivpu_hw_40xx_reg_pll_freq_get(struct ivpu_device *vdev)
974−{
975− u32 pll_curr_ratio;
976−
977− pll_curr_ratio = REGB_RD32(VPU_40XX_BUTTRESS_PLL_FREQ);
978− pll_curr_ratio &= VPU_40XX_BUTTRESS_PLL_FREQ_RATIO_MASK;
979−
980− return PLL_RATIO_TO_FREQ(pll_curr_ratio);
981−}
982−
983−static u32 ivpu_hw_40xx_ratio_to_freq(struct ivpu_device *vdev, u32 ratio)
984−{
985− return PLL_RATIO_TO_FREQ(ratio);
986−}
987−
988−static u32 ivpu_hw_40xx_reg_telemetry_offset_get(struct ivpu_device *vdev)
989−{
990− return REGB_RD32(VPU_40XX_BUTTRESS_VPU_TELEMETRY_OFFSET);
991−}
992−
993−static u32 ivpu_hw_40xx_reg_telemetry_size_get(struct ivpu_device *vdev)
994−{
995− return REGB_RD32(VPU_40XX_BUTTRESS_VPU_TELEMETRY_SIZE);
996−}
997−
998−static u32 ivpu_hw_40xx_reg_telemetry_enable_get(struct ivpu_device *vdev)
999−{
1000− return REGB_RD32(VPU_40XX_BUTTRESS_VPU_TELEMETRY_ENABLE);
1001−}
1002−
1003−static void ivpu_hw_40xx_reg_db_set(struct ivpu_device *vdev, u32 db_id)
1004−{
1005− u32 reg_stride = VPU_40XX_CPU_SS_DOORBELL_1 - VPU_40XX_CPU_SS_DOORBELL_0;
1006− u32 val = REG_FLD(VPU_40XX_CPU_SS_DOORBELL_0, SET);
1007−
1008− REGV_WR32I(VPU_40XX_CPU_SS_DOORBELL_0, reg_stride, db_id, val);
1009−}
1010−
1011−static u32 ivpu_hw_40xx_reg_ipc_rx_addr_get(struct ivpu_device *vdev)
1012−{
1013− return REGV_RD32(VPU_40XX_HOST_SS_TIM_IPC_FIFO_ATM);
1014−}
1015−
1016−static u32 ivpu_hw_40xx_reg_ipc_rx_count_get(struct ivpu_device *vdev)
1017−{
1018− u32 count = REGV_RD32_SILENT(VPU_40XX_HOST_SS_TIM_IPC_FIFO_STAT);
1019−
1020− return REG_GET_FLD(VPU_40XX_HOST_SS_TIM_IPC_FIFO_STAT, FILL_LEVEL, count);
1021−}
1022−
1023−static void ivpu_hw_40xx_reg_ipc_tx_set(struct ivpu_device *vdev, u32 vpu_addr)
1024−{
1025− REGV_WR32(VPU_40XX_CPU_SS_TIM_IPC_FIFO, vpu_addr);
1026−}
1027−
1028−static void ivpu_hw_40xx_irq_clear(struct ivpu_device *vdev)
1029−{
1030− REGV_WR64(VPU_40XX_HOST_SS_ICB_CLEAR_0, ICB_0_1_IRQ_MASK);
1031−}
1032−
1033−static void ivpu_hw_40xx_irq_enable(struct ivpu_device *vdev)
1034−{
1035− REGV_WR32(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, ITF_FIREWALL_VIOLATION_MASK);
1036− REGV_WR64(VPU_40XX_HOST_SS_ICB_ENABLE_0, ICB_0_1_IRQ_MASK);
1037− REGB_WR32(VPU_40XX_BUTTRESS_LOCAL_INT_MASK, BUTTRESS_IRQ_ENABLE_MASK);
1038− REGB_WR32(VPU_40XX_BUTTRESS_GLOBAL_INT_MASK, 0x0);
1039−}
1040−
1041−static void ivpu_hw_40xx_irq_disable(struct ivpu_device *vdev)
1042−{
1043− REGB_WR32(VPU_40XX_BUTTRESS_GLOBAL_INT_MASK, 0x1);
1044− REGB_WR32(VPU_40XX_BUTTRESS_LOCAL_INT_MASK, BUTTRESS_IRQ_DISABLE_MASK);
1045− REGV_WR64(VPU_40XX_HOST_SS_ICB_ENABLE_0, 0x0ull);
1046− REGV_WR32(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, 0x0ul);
1047−}
1048−
1049−static void ivpu_hw_40xx_irq_wdt_nce_handler(struct ivpu_device *vdev)
1050−{
1051− /* TODO: For LNN hang consider engine reset instead of full recovery */
1052− ivpu_pm_trigger_recovery(vdev, "WDT NCE IRQ");
1053−}
1054−
1055−static void ivpu_hw_40xx_irq_wdt_mss_handler(struct ivpu_device *vdev)
1056−{
1057− ivpu_hw_wdt_disable(vdev);
1058− ivpu_pm_trigger_recovery(vdev, "WDT MSS IRQ");
1059−}
1060−
1061−static void ivpu_hw_40xx_irq_noc_firewall_handler(struct ivpu_device *vdev)
1062−{
1063− ivpu_pm_trigger_recovery(vdev, "NOC Firewall IRQ");
1064−}
1065−
1066−/* Handler for IRQs from VPU core (irqV) */
1067−static bool ivpu_hw_40xx_irqv_handler(struct ivpu_device *vdev, int irq, bool *wake_thread)
1068−{
1069− u32 status = REGV_RD32(VPU_40XX_HOST_SS_ICB_STATUS_0) & ICB_0_IRQ_MASK;
1070−
1071− if (!status)
1072− return false;
1073−
1074− REGV_WR32(VPU_40XX_HOST_SS_ICB_CLEAR_0, status);
1075−
1076− if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_0_INT, status))
1077− ivpu_mmu_irq_evtq_handler(vdev);
1078−
1079− if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, HOST_IPC_FIFO_INT, status))
1080− ivpu_ipc_irq_handler(vdev, wake_thread);
1081−
1082− if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_1_INT, status))
1083− ivpu_dbg(vdev, IRQ, "MMU sync complete\n");
1084−
1085− if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_2_INT, status))
1086− ivpu_mmu_irq_gerr_handler(vdev);
1087−
1088− if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_0_INT, status))
1089− ivpu_hw_40xx_irq_wdt_mss_handler(vdev);
1090−
1091− if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_1_INT, status))
1092− ivpu_hw_40xx_irq_wdt_nce_handler(vdev);
1093−
1094− if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, NOC_FIREWALL_INT, status))
1095− ivpu_hw_40xx_irq_noc_firewall_handler(vdev);
1096−
1097− return true;
1098−}
1099−
1100−/* Handler for IRQs from Buttress core (irqB) */
1101−static bool ivpu_hw_40xx_irqb_handler(struct ivpu_device *vdev, int irq)
1102−{
1103− bool schedule_recovery = false;
1104− u32 status = REGB_RD32(VPU_40XX_BUTTRESS_INTERRUPT_STAT) & BUTTRESS_IRQ_MASK;
1105−
1106− if (!status)
1107− return false;
1108−
1109− if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, FREQ_CHANGE, status))
1110− ivpu_dbg(vdev, IRQ, "FREQ_CHANGE");
1111−
1112− if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, ATS_ERR, status)) {
1113− ivpu_err(vdev, "ATS_ERR LOG1 0x%08x ATS_ERR_LOG2 0x%08x\n",
1114− REGB_RD32(VPU_40XX_BUTTRESS_ATS_ERR_LOG1),
1115− REGB_RD32(VPU_40XX_BUTTRESS_ATS_ERR_LOG2));
1116− REGB_WR32(VPU_40XX_BUTTRESS_ATS_ERR_CLEAR, 0x1);
1117− schedule_recovery = true;
1118− }
1119−
1120− if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, CFI0_ERR, status)) {
1121− ivpu_err(vdev, "CFI0_ERR 0x%08x", REGB_RD32(VPU_40XX_BUTTRESS_CFI0_ERR_LOG));
1122− REGB_WR32(VPU_40XX_BUTTRESS_CFI0_ERR_CLEAR, 0x1);
1123− schedule_recovery = true;
1124− }
1125−
1126− if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, CFI1_ERR, status)) {
1127− ivpu_err(vdev, "CFI1_ERR 0x%08x", REGB_RD32(VPU_40XX_BUTTRESS_CFI1_ERR_LOG));
1128− REGB_WR32(VPU_40XX_BUTTRESS_CFI1_ERR_CLEAR, 0x1);
1129− schedule_recovery = true;
1130− }
1131−
1132− if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, IMR0_ERR, status)) {
1133− ivpu_err(vdev, "IMR_ERR_CFI0 LOW: 0x%08x HIGH: 0x%08x",
1134− REGB_RD32(VPU_40XX_BUTTRESS_IMR_ERR_CFI0_LOW),
1135− REGB_RD32(VPU_40XX_BUTTRESS_IMR_ERR_CFI0_HIGH));
1136− REGB_WR32(VPU_40XX_BUTTRESS_IMR_ERR_CFI0_CLEAR, 0x1);
1137− schedule_recovery = true;
1138− }
1139−
1140− if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, IMR1_ERR, status)) {
1141− ivpu_err(vdev, "IMR_ERR_CFI1 LOW: 0x%08x HIGH: 0x%08x",
1142− REGB_RD32(VPU_40XX_BUTTRESS_IMR_ERR_CFI1_LOW),
1143− REGB_RD32(VPU_40XX_BUTTRESS_IMR_ERR_CFI1_HIGH));
1144− REGB_WR32(VPU_40XX_BUTTRESS_IMR_ERR_CFI1_CLEAR, 0x1);
1145− schedule_recovery = true;
1146− }
1147−
1148− if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, SURV_ERR, status)) {
1149− ivpu_err(vdev, "Survivability error detected\n");
1150− schedule_recovery = true;
1151− }
1152−
1153− /* This must be done after interrupts are cleared at the source. */
1154− REGB_WR32(VPU_40XX_BUTTRESS_INTERRUPT_STAT, status);
1155−
1156− if (schedule_recovery)
1157− ivpu_pm_trigger_recovery(vdev, "Buttress IRQ");
1158−
1159− return true;
1160−}
1161−
1162−static irqreturn_t ivpu_hw_40xx_irq_handler(int irq, void *ptr)
1163−{
1164− bool irqv_handled, irqb_handled, wake_thread = false;
1165− struct ivpu_device *vdev = ptr;
1166−
1167− REGB_WR32(VPU_40XX_BUTTRESS_GLOBAL_INT_MASK, 0x1);
1168−
1169− irqv_handled = ivpu_hw_40xx_irqv_handler(vdev, irq, &wake_thread);
1170− irqb_handled = ivpu_hw_40xx_irqb_handler(vdev, irq);
1171−
1172− /* Re-enable global interrupts to re-trigger MSI for pending interrupts */
1173− REGB_WR32(VPU_40XX_BUTTRESS_GLOBAL_INT_MASK, 0x0);
1174−
1175− if (wake_thread)
1176− return IRQ_WAKE_THREAD;
1177− if (irqv_handled || irqb_handled)
1178− return IRQ_HANDLED;
1179− return IRQ_NONE;
1180−}
1181−
1182−static void ivpu_hw_40xx_diagnose_failure(struct ivpu_device *vdev)
1183−{
1184− u32 irqv = REGV_RD32(VPU_40XX_HOST_SS_ICB_STATUS_0) & ICB_0_IRQ_MASK;
1185− u32 irqb = REGB_RD32(VPU_40XX_BUTTRESS_INTERRUPT_STAT) & BUTTRESS_IRQ_MASK;
1186−
1187− if (ivpu_hw_40xx_reg_ipc_rx_count_get(vdev))
1188− ivpu_err(vdev, "IPC FIFO queue not empty, missed IPC IRQ");
1189−
1190− if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_0_INT, irqv))
1191− ivpu_err(vdev, "WDT MSS timeout detected\n");
1192−
1193− if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_1_INT, irqv))
1194− ivpu_err(vdev, "WDT NCE timeout detected\n");
1195−
1196− if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, NOC_FIREWALL_INT, irqv))
1197− ivpu_err(vdev, "NOC Firewall irq detected\n");
1198−
1199− if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, ATS_ERR, irqb)) {
1200− ivpu_err(vdev, "ATS_ERR_LOG1 0x%08x ATS_ERR_LOG2 0x%08x\n",
1201− REGB_RD32(VPU_40XX_BUTTRESS_ATS_ERR_LOG1),
1202− REGB_RD32(VPU_40XX_BUTTRESS_ATS_ERR_LOG2));
1203− }
1204−
1205− if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, CFI0_ERR, irqb))
1206− ivpu_err(vdev, "CFI0_ERR_LOG 0x%08x\n", REGB_RD32(VPU_40XX_BUTTRESS_CFI0_ERR_LOG));
1207−
1208− if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, CFI1_ERR, irqb))
1209− ivpu_err(vdev, "CFI1_ERR_LOG 0x%08x\n", REGB_RD32(VPU_40XX_BUTTRESS_CFI1_ERR_LOG));
1210−
1211− if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, IMR0_ERR, irqb))
1212− ivpu_err(vdev, "IMR_ERR_CFI0 LOW: 0x%08x HIGH: 0x%08x\n",
1213− REGB_RD32(VPU_40XX_BUTTRESS_IMR_ERR_CFI0_LOW),
1214− REGB_RD32(VPU_40XX_BUTTRESS_IMR_ERR_CFI0_HIGH));
1215−
1216− if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, IMR1_ERR, irqb))
1217− ivpu_err(vdev, "IMR_ERR_CFI1 LOW: 0x%08x HIGH: 0x%08x\n",
1218− REGB_RD32(VPU_40XX_BUTTRESS_IMR_ERR_CFI1_LOW),
1219− REGB_RD32(VPU_40XX_BUTTRESS_IMR_ERR_CFI1_HIGH));
1220−
1221− if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, SURV_ERR, irqb))
1222− ivpu_err(vdev, "Survivability error detected\n");
1223−}
1224−
1225−const struct ivpu_hw_ops ivpu_hw_40xx_ops = {
1226− .info_init = ivpu_hw_40xx_info_init,
1227− .power_up = ivpu_hw_40xx_power_up,
1228− .is_idle = ivpu_hw_40xx_is_idle,
1229− .wait_for_idle = ivpu_hw_40xx_wait_for_idle,
1230− .power_down = ivpu_hw_40xx_power_down,
1231− .reset = ivpu_hw_40xx_reset,
1232− .boot_fw = ivpu_hw_40xx_boot_fw,
1233− .wdt_disable = ivpu_hw_40xx_wdt_disable,
1234− .diagnose_failure = ivpu_hw_40xx_diagnose_failure,
1235− .profiling_freq_get = ivpu_hw_40xx_profiling_freq_get,
1236− .profiling_freq_drive = ivpu_hw_40xx_profiling_freq_drive,
1237− .reg_pll_freq_get = ivpu_hw_40xx_reg_pll_freq_get,
1238− .ratio_to_freq = ivpu_hw_40xx_ratio_to_freq,
1239− .reg_telemetry_offset_get = ivpu_hw_40xx_reg_telemetry_offset_get,
1240− .reg_telemetry_size_get = ivpu_hw_40xx_reg_telemetry_size_get,
1241− .reg_telemetry_enable_get = ivpu_hw_40xx_reg_telemetry_enable_get,
1242− .reg_db_set = ivpu_hw_40xx_reg_db_set,
1243− .reg_ipc_rx_addr_get = ivpu_hw_40xx_reg_ipc_rx_addr_get,
1244− .reg_ipc_rx_count_get = ivpu_hw_40xx_reg_ipc_rx_count_get,
1245− .reg_ipc_tx_set = ivpu_hw_40xx_reg_ipc_tx_set,
1246− .irq_clear = ivpu_hw_40xx_irq_clear,
1247− .irq_enable = ivpu_hw_40xx_irq_enable,
1248− .irq_disable = ivpu_hw_40xx_irq_disable,
1249− .irq_handler = ivpu_hw_40xx_irq_handler,
1250−};
drivers/accel/ivpu/ivpu_hw_40xx_reg.h+9−85
@@ -8,91 +8,6 @@ · 7 unmodified lines
88
99 #include <linux/bits.h>
1010
11−#define VPU_40XX_BUTTRESS_INTERRUPT_STAT 0x00000000u
12−#define VPU_40XX_BUTTRESS_INTERRUPT_STAT_FREQ_CHANGE_MASK BIT_MASK(0)
13−#define VPU_40XX_BUTTRESS_INTERRUPT_STAT_ATS_ERR_MASK BIT_MASK(1)
14−#define VPU_40XX_BUTTRESS_INTERRUPT_STAT_CFI0_ERR_MASK BIT_MASK(2)
15−#define VPU_40XX_BUTTRESS_INTERRUPT_STAT_CFI1_ERR_MASK BIT_MASK(3)
16−#define VPU_40XX_BUTTRESS_INTERRUPT_STAT_IMR0_ERR_MASK BIT_MASK(4)
17−#define VPU_40XX_BUTTRESS_INTERRUPT_STAT_IMR1_ERR_MASK BIT_MASK(5)
18−#define VPU_40XX_BUTTRESS_INTERRUPT_STAT_SURV_ERR_MASK BIT_MASK(6)
19−
20−#define VPU_40XX_BUTTRESS_LOCAL_INT_MASK 0x00000004u
21−#define VPU_40XX_BUTTRESS_GLOBAL_INT_MASK 0x00000008u
22−
23−#define VPU_40XX_BUTTRESS_HM_ATS 0x0000000cu
24−
25−#define VPU_40XX_BUTTRESS_ATS_ERR_LOG1 0x00000010u
26−#define VPU_40XX_BUTTRESS_ATS_ERR_LOG2 0x00000014u
27−#define VPU_40XX_BUTTRESS_ATS_ERR_CLEAR 0x00000018u
28−
29−#define VPU_40XX_BUTTRESS_CFI0_ERR_LOG 0x0000001cu
30−#define VPU_40XX_BUTTRESS_CFI0_ERR_CLEAR 0x00000020u
31−
32−#define VPU_40XX_BUTTRESS_PORT_ARBITRATION_WEIGHTS_ATS 0x00000024u
33−
34−#define VPU_40XX_BUTTRESS_CFI1_ERR_LOG 0x00000040u
35−#define VPU_40XX_BUTTRESS_CFI1_ERR_CLEAR 0x00000044u
36−
37−#define VPU_40XX_BUTTRESS_IMR_ERR_CFI0_LOW 0x00000048u
38−#define VPU_40XX_BUTTRESS_IMR_ERR_CFI0_HIGH 0x0000004cu
39−#define VPU_40XX_BUTTRESS_IMR_ERR_CFI0_CLEAR 0x00000050u
40−
41−#define VPU_40XX_BUTTRESS_PORT_ARBITRATION_WEIGHTS 0x00000054u
42−
43−#define VPU_40XX_BUTTRESS_IMR_ERR_CFI1_LOW 0x00000058u
44−#define VPU_40XX_BUTTRESS_IMR_ERR_CFI1_HIGH 0x0000005cu
45−#define VPU_40XX_BUTTRESS_IMR_ERR_CFI1_CLEAR 0x00000060u
46−
47−#define VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD0 0x00000130u
48−#define VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD0_MIN_RATIO_MASK GENMASK(15, 0)
49−#define VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD0_MAX_RATIO_MASK GENMASK(31, 16)
50−
51−#define VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD1 0x00000134u
52−#define VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD1_TARGET_RATIO_MASK GENMASK(15, 0)
53−#define VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD1_EPP_MASK GENMASK(31, 16)
54−
55−#define VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD2 0x00000138u
56−#define VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD2_CONFIG_MASK GENMASK(15, 0)
57−#define VPU_40XX_BUTTRESS_WP_REQ_PAYLOAD2_CDYN_MASK GENMASK(31, 16)
58−
59−#define VPU_40XX_BUTTRESS_WP_REQ_CMD 0x0000013cu
60−#define VPU_40XX_BUTTRESS_WP_REQ_CMD_SEND_MASK BIT_MASK(0)
61−
62−#define VPU_40XX_BUTTRESS_PLL_FREQ 0x00000148u
63−#define VPU_40XX_BUTTRESS_PLL_FREQ_RATIO_MASK GENMASK(15, 0)
64−
65−#define VPU_40XX_BUTTRESS_TILE_FUSE 0x00000150u
66−#define VPU_40XX_BUTTRESS_TILE_FUSE_VALID_MASK BIT_MASK(0)
67−#define VPU_40XX_BUTTRESS_TILE_FUSE_CONFIG_MASK GENMASK(6, 1)
68−
69−#define VPU_40XX_BUTTRESS_VPU_STATUS 0x00000154u
70−#define VPU_40XX_BUTTRESS_VPU_STATUS_READY_MASK BIT_MASK(0)
71−#define VPU_40XX_BUTTRESS_VPU_STATUS_IDLE_MASK BIT_MASK(1)
72−#define VPU_40XX_BUTTRESS_VPU_STATUS_DUP_IDLE_MASK BIT_MASK(2)
73−#define VPU_40XX_BUTTRESS_VPU_STATUS_CLOCK_RESOURCE_OWN_ACK_MASK BIT_MASK(6)
74−#define VPU_40XX_BUTTRESS_VPU_STATUS_POWER_RESOURCE_OWN_ACK_MASK BIT_MASK(7)
75−#define VPU_40XX_BUTTRESS_VPU_STATUS_PERF_CLK_MASK BIT_MASK(11)
76−#define VPU_40XX_BUTTRESS_VPU_STATUS_DISABLE_CLK_RELINQUISH_MASK BIT_MASK(12)
77−
78−#define VPU_40XX_BUTTRESS_IP_RESET 0x00000160u
79−#define VPU_40XX_BUTTRESS_IP_RESET_TRIGGER_MASK BIT_MASK(0)
80−
81−#define VPU_40XX_BUTTRESS_D0I3_CONTROL 0x00000164u
82−#define VPU_40XX_BUTTRESS_D0I3_CONTROL_INPROGRESS_MASK BIT_MASK(0)
83−#define VPU_40XX_BUTTRESS_D0I3_CONTROL_I3_MASK BIT_MASK(2)
84−
85−#define VPU_40XX_BUTTRESS_VPU_TELEMETRY_OFFSET 0x00000168u
86−#define VPU_40XX_BUTTRESS_VPU_TELEMETRY_SIZE 0x0000016cu
87−#define VPU_40XX_BUTTRESS_VPU_TELEMETRY_ENABLE 0x00000170u
88−
89−#define VPU_40XX_BUTTRESS_FMIN_FUSE 0x00000174u
90−#define VPU_40XX_BUTTRESS_FMIN_FUSE_MIN_RATIO_MASK GENMASK(7, 0)
91−#define VPU_40XX_BUTTRESS_FMIN_FUSE_PN_RATIO_MASK GENMASK(15, 8)
92−
93−#define VPU_40XX_BUTTRESS_FMAX_FUSE 0x00000178u
94−#define VPU_40XX_BUTTRESS_FMAX_FUSE_MAX_RATIO_MASK GENMASK(7, 0)
95−
9611 #define VPU_40XX_HOST_SS_CPR_CLK_EN 0x00000080u
9712 #define VPU_40XX_HOST_SS_CPR_CLK_EN_TOP_NOC_MASK BIT_MASK(1)
9813 #define VPU_40XX_HOST_SS_CPR_CLK_EN_DSS_MAS_MASK BIT_MASK(10)
@@ -198,6 +113,12 @@ · 99 unmodified lines
198113 #define VPU_40XX_HOST_SS_AON_PWR_ISLAND_STATUS0 0x0003002cu
199114 #define VPU_40XX_HOST_SS_AON_PWR_ISLAND_STATUS0_CSS_CPU_MASK BIT_MASK(3)
200115
116+#define VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY 0x00030068u
117+#define VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY_POST_DLY_MASK GENMASK(7, 0)
118+
119+#define VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY 0x0003006cu
120+#define VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY_STATUS_DLY_MASK GENMASK(7, 0)
121+
201122 #define VPU_40XX_HOST_SS_AON_IDLE_GEN 0x00030200u
202123 #define VPU_40XX_HOST_SS_AON_IDLE_GEN_EN_MASK BIT_MASK(0)
203124 #define VPU_40XX_HOST_SS_AON_IDLE_GEN_HW_PG_EN_MASK BIT_MASK(1)
@@ -205,6 +126,9 @@ · 1 unmodified line
205126 #define VPU_40XX_HOST_SS_AON_DPU_ACTIVE 0x00030204u
206127 #define VPU_40XX_HOST_SS_AON_DPU_ACTIVE_DPU_ACTIVE_MASK BIT_MASK(0)
207128
129+#define VPU_50XX_HOST_SS_AON_FABRIC_REQ_OVERRIDE 0x00030210u
130+#define VPU_50XX_HOST_SS_AON_FABRIC_REQ_OVERRIDE_REQ_OVERRIDE_MASK BIT_MASK(0)
131+
208132 #define VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO 0x00040040u
209133 #define VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO_DONE_MASK BIT_MASK(0)
210134 #define VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO_IOSF_RS_ID_MASK GENMASK(2, 1)
drivers/accel/ivpu/ivpu_hw_btrs.c+905−0
@@ -0,0 +1,905 @@
1+// SPDX-License-Identifier: GPL-2.0-only
2+/*
3+ * Copyright (C) 2020-2024 Intel Corporation
4+ */
5+
6+#include "ivpu_drv.h"
7+#include "ivpu_hw.h"
8+#include "ivpu_hw_btrs.h"
9+#include "ivpu_hw_btrs_lnl_reg.h"
10+#include "ivpu_hw_btrs_mtl_reg.h"
11+#include "ivpu_hw_reg_io.h"
12+#include "ivpu_pm.h"
13+
14+#define BTRS_MTL_IRQ_MASK ((REG_FLD(VPU_HW_BTRS_MTL_INTERRUPT_STAT, ATS_ERR)) | \
15+ (REG_FLD(VPU_HW_BTRS_MTL_INTERRUPT_STAT, UFI_ERR)))
16+
17+#define BTRS_LNL_IRQ_MASK ((REG_FLD(VPU_HW_BTRS_LNL_INTERRUPT_STAT, ATS_ERR)) | \
18+ (REG_FLD(VPU_HW_BTRS_LNL_INTERRUPT_STAT, CFI0_ERR)) | \
19+ (REG_FLD(VPU_HW_BTRS_LNL_INTERRUPT_STAT, CFI1_ERR)) | \
20+ (REG_FLD(VPU_HW_BTRS_LNL_INTERRUPT_STAT, IMR0_ERR)) | \
21+ (REG_FLD(VPU_HW_BTRS_LNL_INTERRUPT_STAT, IMR1_ERR)) | \
22+ (REG_FLD(VPU_HW_BTRS_LNL_INTERRUPT_STAT, SURV_ERR)))
23+
24+#define BTRS_MTL_ALL_IRQ_MASK (BTRS_MTL_IRQ_MASK | (REG_FLD(VPU_HW_BTRS_MTL_INTERRUPT_STAT, \
25+ FREQ_CHANGE)))
26+
27+#define BTRS_IRQ_DISABLE_MASK ((u32)-1)
28+
29+#define BTRS_LNL_ALL_IRQ_MASK ((u32)-1)
30+
31+#define BTRS_MTL_WP_CONFIG_1_TILE_5_3_RATIO WP_CONFIG(MTL_CONFIG_1_TILE, MTL_PLL_RATIO_5_3)
32+#define BTRS_MTL_WP_CONFIG_1_TILE_4_3_RATIO WP_CONFIG(MTL_CONFIG_1_TILE, MTL_PLL_RATIO_4_3)
33+#define BTRS_MTL_WP_CONFIG_2_TILE_5_3_RATIO WP_CONFIG(MTL_CONFIG_2_TILE, MTL_PLL_RATIO_5_3)
34+#define BTRS_MTL_WP_CONFIG_2_TILE_4_3_RATIO WP_CONFIG(MTL_CONFIG_2_TILE, MTL_PLL_RATIO_4_3)
35+#define BTRS_MTL_WP_CONFIG_0_TILE_PLL_OFF WP_CONFIG(0, 0)
36+
37+#define PLL_CDYN_DEFAULT 0x80
38+#define PLL_EPP_DEFAULT 0x80
39+#define PLL_CONFIG_DEFAULT 0x0
40+#define PLL_SIMULATION_FREQ 10000000
41+#define PLL_REF_CLK_FREQ 50000000
42+#define PLL_TIMEOUT_US (1500 * USEC_PER_MSEC)
43+#define IDLE_TIMEOUT_US (5 * USEC_PER_MSEC)
44+#define TIMEOUT_US (150 * USEC_PER_MSEC)
45+
46+/* Work point configuration values */
47+#define WP_CONFIG(tile, ratio) (((tile) << 8) | (ratio))
48+#define MTL_CONFIG_1_TILE 0x01
49+#define MTL_CONFIG_2_TILE 0x02
50+#define MTL_PLL_RATIO_5_3 0x01
51+#define MTL_PLL_RATIO_4_3 0x02
52+#define BTRS_MTL_TILE_FUSE_ENABLE_BOTH 0x0
53+#define BTRS_MTL_TILE_SKU_BOTH 0x3630
54+
55+#define BTRS_LNL_TILE_MAX_NUM 6
56+#define BTRS_LNL_TILE_MAX_MASK 0x3f
57+
58+#define WEIGHTS_DEFAULT 0xf711f711u
59+#define WEIGHTS_ATS_DEFAULT 0x0000f711u
60+
61+#define DCT_REQ 0x2
62+#define DCT_ENABLE 0x1
63+#define DCT_DISABLE 0x0
64+
65+int ivpu_hw_btrs_irqs_clear_with_0_mtl(struct ivpu_device *vdev)
66+{
67+ REGB_WR32(VPU_HW_BTRS_MTL_INTERRUPT_STAT, BTRS_MTL_ALL_IRQ_MASK);
68+ if (REGB_RD32(VPU_HW_BTRS_MTL_INTERRUPT_STAT) == BTRS_MTL_ALL_IRQ_MASK) {
69+ /* Writing 1s does not clear the interrupt status register */
70+ REGB_WR32(VPU_HW_BTRS_MTL_INTERRUPT_STAT, 0x0);
71+ return true;
72+ }
73+
74+ return false;
75+}
76+
77+static void freq_ratios_init_mtl(struct ivpu_device *vdev)
78+{
79+ struct ivpu_hw_info *hw = vdev->hw;
80+ u32 fmin_fuse, fmax_fuse;
81+
82+ fmin_fuse = REGB_RD32(VPU_HW_BTRS_MTL_FMIN_FUSE);
83+ hw->pll.min_ratio = REG_GET_FLD(VPU_HW_BTRS_MTL_FMIN_FUSE, MIN_RATIO, fmin_fuse);
84+ hw->pll.pn_ratio = REG_GET_FLD(VPU_HW_BTRS_MTL_FMIN_FUSE, PN_RATIO, fmin_fuse);
85+
86+ fmax_fuse = REGB_RD32(VPU_HW_BTRS_MTL_FMAX_FUSE);
87+ hw->pll.max_ratio = REG_GET_FLD(VPU_HW_BTRS_MTL_FMAX_FUSE, MAX_RATIO, fmax_fuse);
88+}
89+
90+static void freq_ratios_init_lnl(struct ivpu_device *vdev)
91+{
92+ struct ivpu_hw_info *hw = vdev->hw;
93+ u32 fmin_fuse, fmax_fuse;
94+
95+ fmin_fuse = REGB_RD32(VPU_HW_BTRS_LNL_FMIN_FUSE);
96+ hw->pll.min_ratio = REG_GET_FLD(VPU_HW_BTRS_LNL_FMIN_FUSE, MIN_RATIO, fmin_fuse);
97+ hw->pll.pn_ratio = REG_GET_FLD(VPU_HW_BTRS_LNL_FMIN_FUSE, PN_RATIO, fmin_fuse);
98+
99+ fmax_fuse = REGB_RD32(VPU_HW_BTRS_LNL_FMAX_FUSE);
100+ hw->pll.max_ratio = REG_GET_FLD(VPU_HW_BTRS_LNL_FMAX_FUSE, MAX_RATIO, fmax_fuse);
101+}
102+
103+void ivpu_hw_btrs_freq_ratios_init(struct ivpu_device *vdev)
104+{
105+ struct ivpu_hw_info *hw = vdev->hw;
106+
107+ if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL)
108+ freq_ratios_init_mtl(vdev);
109+ else
110+ freq_ratios_init_lnl(vdev);
111+
112+ hw->pll.min_ratio = clamp_t(u8, ivpu_pll_min_ratio, hw->pll.min_ratio, hw->pll.max_ratio);
113+ hw->pll.max_ratio = clamp_t(u8, ivpu_pll_max_ratio, hw->pll.min_ratio, hw->pll.max_ratio);
114+ hw->pll.pn_ratio = clamp_t(u8, hw->pll.pn_ratio, hw->pll.min_ratio, hw->pll.max_ratio);
115+}
116+
117+static bool tile_disable_check(u32 config)
118+{
119+ /* Allowed values: 0 or one bit from range 0-5 (6 tiles) */
120+ if (config == 0)
121+ return true;
122+
123+ if (config > BIT(BTRS_LNL_TILE_MAX_NUM - 1))
124+ return false;
125+
126+ if ((config & (config - 1)) == 0)
127+ return true;
128+
129+ return false;
130+}
131+
132+static int read_tile_config_fuse(struct ivpu_device *vdev, u32 *tile_fuse_config)
133+{
134+ u32 fuse;
135+ u32 config;
136+
137+ fuse = REGB_RD32(VPU_HW_BTRS_LNL_TILE_FUSE);
138+ if (!REG_TEST_FLD(VPU_HW_BTRS_LNL_TILE_FUSE, VALID, fuse)) {
139+ ivpu_err(vdev, "Fuse: invalid (0x%x)\n", fuse);
140+ return -EIO;
141+ }
142+
143+ config = REG_GET_FLD(VPU_HW_BTRS_LNL_TILE_FUSE, CONFIG, fuse);
144+ if (!tile_disable_check(config)) {
145+ ivpu_err(vdev, "Fuse: Invalid tile disable config (0x%x)\n", config);
146+ return -EIO;
147+ }
148+
149+ if (config)
150+ ivpu_dbg(vdev, MISC, "Fuse: %d tiles enabled. Tile number %d disabled\n",
151+ BTRS_LNL_TILE_MAX_NUM - 1, ffs(config) - 1);
152+ else
153+ ivpu_dbg(vdev, MISC, "Fuse: All %d tiles enabled\n", BTRS_LNL_TILE_MAX_NUM);
154+
155+ *tile_fuse_config = config;
156+ return 0;
157+}
158+
159+static int info_init_mtl(struct ivpu_device *vdev)
160+{
161+ struct ivpu_hw_info *hw = vdev->hw;
162+
163+ hw->tile_fuse = BTRS_MTL_TILE_FUSE_ENABLE_BOTH;
164+ hw->sku = BTRS_MTL_TILE_SKU_BOTH;
165+ hw->config = BTRS_MTL_WP_CONFIG_2_TILE_4_3_RATIO;
166+ hw->sched_mode = ivpu_sched_mode;
167+
168+ return 0;
169+}
170+
171+static int info_init_lnl(struct ivpu_device *vdev)
172+{
173+ struct ivpu_hw_info *hw = vdev->hw;
174+ u32 tile_fuse_config;
175+ int ret;
176+
177+ ret = read_tile_config_fuse(vdev, &tile_fuse_config);
178+ if (ret)
179+ return ret;
180+
181+ hw->sched_mode = ivpu_sched_mode;
182+ hw->tile_fuse = tile_fuse_config;
183+ hw->pll.profiling_freq = PLL_PROFILING_FREQ_DEFAULT;
184+
185+ return 0;
186+}
187+
188+int ivpu_hw_btrs_info_init(struct ivpu_device *vdev)
189+{
190+ if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL)
191+ return info_init_mtl(vdev);
192+ else
193+ return info_init_lnl(vdev);
194+}
195+
196+static int wp_request_sync(struct ivpu_device *vdev)
197+{
198+ if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL)
199+ return REGB_POLL_FLD(VPU_HW_BTRS_MTL_WP_REQ_CMD, SEND, 0, PLL_TIMEOUT_US);
200+ else
201+ return REGB_POLL_FLD(VPU_HW_BTRS_LNL_WP_REQ_CMD, SEND, 0, PLL_TIMEOUT_US);
202+}
203+
204+static int wait_for_status_ready(struct ivpu_device *vdev, bool enable)
205+{
206+ u32 exp_val = enable ? 0x1 : 0x0;
207+
208+ if (IVPU_WA(punit_disabled))
209+ return 0;
210+
211+ if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL)
212+ return REGB_POLL_FLD(VPU_HW_BTRS_MTL_VPU_STATUS, READY, exp_val, PLL_TIMEOUT_US);
213+ else
214+ return REGB_POLL_FLD(VPU_HW_BTRS_LNL_VPU_STATUS, READY, exp_val, PLL_TIMEOUT_US);
215+}
216+
217+struct wp_request {
218+ u16 min;
219+ u16 max;
220+ u16 target;
221+ u16 cfg;
222+ u16 epp;
223+ u16 cdyn;
224+};
225+
226+static void wp_request_mtl(struct ivpu_device *vdev, struct wp_request *wp)
227+{
228+ u32 val;
229+
230+ val = REGB_RD32(VPU_HW_BTRS_MTL_WP_REQ_PAYLOAD0);
231+ val = REG_SET_FLD_NUM(VPU_HW_BTRS_MTL_WP_REQ_PAYLOAD0, MIN_RATIO, wp->min, val);
232+ val = REG_SET_FLD_NUM(VPU_HW_BTRS_MTL_WP_REQ_PAYLOAD0, MAX_RATIO, wp->max, val);
233+ REGB_WR32(VPU_HW_BTRS_MTL_WP_REQ_PAYLOAD0, val);
234+
235+ val = REGB_RD32(VPU_HW_BTRS_MTL_WP_REQ_PAYLOAD1);
236+ val = REG_SET_FLD_NUM(VPU_HW_BTRS_MTL_WP_REQ_PAYLOAD1, TARGET_RATIO, wp->target, val);
237+ val = REG_SET_FLD_NUM(VPU_HW_BTRS_MTL_WP_REQ_PAYLOAD1, EPP, PLL_EPP_DEFAULT, val);
238+ REGB_WR32(VPU_HW_BTRS_MTL_WP_REQ_PAYLOAD1, val);
239+
240+ val = REGB_RD32(VPU_HW_BTRS_MTL_WP_REQ_PAYLOAD2);
241+ val = REG_SET_FLD_NUM(VPU_HW_BTRS_MTL_WP_REQ_PAYLOAD2, CONFIG, wp->cfg, val);
242+ REGB_WR32(VPU_HW_BTRS_MTL_WP_REQ_PAYLOAD2, val);
243+
244+ val = REGB_RD32(VPU_HW_BTRS_MTL_WP_REQ_CMD);
245+ val = REG_SET_FLD(VPU_HW_BTRS_MTL_WP_REQ_CMD, SEND, val);
246+ REGB_WR32(VPU_HW_BTRS_MTL_WP_REQ_CMD, val);
247+}
248+
249+static void wp_request_lnl(struct ivpu_device *vdev, struct wp_request *wp)
250+{
251+ u32 val;
252+
253+ val = REGB_RD32(VPU_HW_BTRS_LNL_WP_REQ_PAYLOAD0);
254+ val = REG_SET_FLD_NUM(VPU_HW_BTRS_LNL_WP_REQ_PAYLOAD0, MIN_RATIO, wp->min, val);
255+ val = REG_SET_FLD_NUM(VPU_HW_BTRS_LNL_WP_REQ_PAYLOAD0, MAX_RATIO, wp->max, val);
256+ REGB_WR32(VPU_HW_BTRS_LNL_WP_REQ_PAYLOAD0, val);
257+
258+ val = REGB_RD32(VPU_HW_BTRS_LNL_WP_REQ_PAYLOAD1);
259+ val = REG_SET_FLD_NUM(VPU_HW_BTRS_LNL_WP_REQ_PAYLOAD1, TARGET_RATIO, wp->target, val);
260+ val = REG_SET_FLD_NUM(VPU_HW_BTRS_LNL_WP_REQ_PAYLOAD1, EPP, wp->epp, val);
261+ REGB_WR32(VPU_HW_BTRS_LNL_WP_REQ_PAYLOAD1, val);
262+
263+ val = REGB_RD32(VPU_HW_BTRS_LNL_WP_REQ_PAYLOAD2);
264+ val = REG_SET_FLD_NUM(VPU_HW_BTRS_LNL_WP_REQ_PAYLOAD2, CONFIG, wp->cfg, val);
265+ val = REG_SET_FLD_NUM(VPU_HW_BTRS_LNL_WP_REQ_PAYLOAD2, CDYN, wp->cdyn, val);
266+ REGB_WR32(VPU_HW_BTRS_LNL_WP_REQ_PAYLOAD2, val);
267+
268+ val = REGB_RD32(VPU_HW_BTRS_LNL_WP_REQ_CMD);
269+ val = REG_SET_FLD(VPU_HW_BTRS_LNL_WP_REQ_CMD, SEND, val);
270+ REGB_WR32(VPU_HW_BTRS_LNL_WP_REQ_CMD, val);
271+}
272+
273+static void wp_request(struct ivpu_device *vdev, struct wp_request *wp)
274+{
275+ if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL)
276+ wp_request_mtl(vdev, wp);
277+ else
278+ wp_request_lnl(vdev, wp);
279+}
280+
281+static int wp_request_send(struct ivpu_device *vdev, struct wp_request *wp)
282+{
283+ int ret;
284+
285+ ret = wp_request_sync(vdev);
286+ if (ret) {
287+ ivpu_err(vdev, "Failed to sync before workpoint request: %d\n", ret);
288+ return ret;
289+ }
290+
291+ wp_request(vdev, wp);
292+
293+ ret = wp_request_sync(vdev);
294+ if (ret)
295+ ivpu_err(vdev, "Failed to sync after workpoint request: %d\n", ret);
296+
297+ return ret;
298+}
299+
300+static void prepare_wp_request(struct ivpu_device *vdev, struct wp_request *wp, bool enable)
301+{
302+ struct ivpu_hw_info *hw = vdev->hw;
303+
304+ wp->min = hw->pll.min_ratio;
305+ wp->max = hw->pll.max_ratio;
306+
307+ if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL) {
308+ wp->target = enable ? hw->pll.pn_ratio : 0;
309+ wp->cfg = enable ? hw->config : 0;
310+ wp->cdyn = 0;
311+ wp->epp = 0;
312+ } else {
313+ wp->target = hw->pll.pn_ratio;
314+ wp->cfg = enable ? PLL_CONFIG_DEFAULT : 0;
315+ wp->cdyn = enable ? PLL_CDYN_DEFAULT : 0;
316+ wp->epp = enable ? PLL_EPP_DEFAULT : 0;
317+ }
318+
319+ /* Simics cannot start without at least one tile */
320+ if (enable && ivpu_is_simics(vdev))
321+ wp->cfg = 1;
322+}
323+
324+static int wait_for_pll_lock(struct ivpu_device *vdev, bool enable)
325+{
326+ u32 exp_val = enable ? 0x1 : 0x0;
327+
328+ if (ivpu_hw_btrs_gen(vdev) != IVPU_HW_BTRS_MTL)
329+ return 0;
330+
331+ if (IVPU_WA(punit_disabled))
332+ return 0;
333+
334+ return REGB_POLL_FLD(VPU_HW_BTRS_MTL_PLL_STATUS, LOCK, exp_val, PLL_TIMEOUT_US);
335+}
336+
337+int ivpu_hw_btrs_wp_drive(struct ivpu_device *vdev, bool enable)
338+{
339+ struct wp_request wp;
340+ int ret;
341+
342+ if (IVPU_WA(punit_disabled)) {
343+ ivpu_dbg(vdev, PM, "Skipping workpoint request\n");
344+ return 0;
345+ }
346+
347+ prepare_wp_request(vdev, &wp, enable);
348+
349+ ivpu_dbg(vdev, PM, "PLL workpoint request: %u Hz, config: 0x%x, epp: 0x%x, cdyn: 0x%x\n",
350+ PLL_RATIO_TO_FREQ(wp.target), wp.cfg, wp.epp, wp.cdyn);
351+
352+ ret = wp_request_send(vdev, &wp);
353+ if (ret) {
354+ ivpu_err(vdev, "Failed to send workpoint request: %d\n", ret);
355+ return ret;
356+ }
357+
358+ ret = wait_for_pll_lock(vdev, enable);
359+ if (ret) {
360+ ivpu_err(vdev, "Timed out waiting for PLL lock\n");
361+ return ret;
362+ }
363+
364+ ret = wait_for_status_ready(vdev, enable);
365+ if (ret) {
366+ ivpu_err(vdev, "Timed out waiting for NPU ready status\n");
367+ return ret;
368+ }
369+
370+ return 0;
371+}
372+
373+static int d0i3_drive_mtl(struct ivpu_device *vdev, bool enable)
374+{
375+ int ret;
376+ u32 val;
377+
378+ ret = REGB_POLL_FLD(VPU_HW_BTRS_MTL_VPU_D0I3_CONTROL, INPROGRESS, 0, TIMEOUT_US);
379+ if (ret) {
380+ ivpu_err(vdev, "Failed to sync before D0i3 transition: %d\n", ret);
381+ return ret;
382+ }
383+
384+ val = REGB_RD32(VPU_HW_BTRS_MTL_VPU_D0I3_CONTROL);
385+ if (enable)
386+ val = REG_SET_FLD(VPU_HW_BTRS_MTL_VPU_D0I3_CONTROL, I3, val);
387+ else
388+ val = REG_CLR_FLD(VPU_HW_BTRS_MTL_VPU_D0I3_CONTROL, I3, val);
389+ REGB_WR32(VPU_HW_BTRS_MTL_VPU_D0I3_CONTROL, val);
390+
391+ ret = REGB_POLL_FLD(VPU_HW_BTRS_MTL_VPU_D0I3_CONTROL, INPROGRESS, 0, TIMEOUT_US);
392+ if (ret)
393+ ivpu_err(vdev, "Failed to sync after D0i3 transition: %d\n", ret);
394+
395+ return ret;
396+}
397+
398+static int d0i3_drive_lnl(struct ivpu_device *vdev, bool enable)
399+{
400+ int ret;
401+ u32 val;
402+
403+ ret = REGB_POLL_FLD(VPU_HW_BTRS_LNL_D0I3_CONTROL, INPROGRESS, 0, TIMEOUT_US);
404+ if (ret) {
405+ ivpu_err(vdev, "Failed to sync before D0i3 transition: %d\n", ret);
406+ return ret;
407+ }
408+
409+ val = REGB_RD32(VPU_HW_BTRS_LNL_D0I3_CONTROL);
410+ if (enable)
411+ val = REG_SET_FLD(VPU_HW_BTRS_LNL_D0I3_CONTROL, I3, val);
412+ else
413+ val = REG_CLR_FLD(VPU_HW_BTRS_LNL_D0I3_CONTROL, I3, val);
414+ REGB_WR32(VPU_HW_BTRS_LNL_D0I3_CONTROL, val);
415+
416+ ret = REGB_POLL_FLD(VPU_HW_BTRS_LNL_D0I3_CONTROL, INPROGRESS, 0, TIMEOUT_US);
417+ if (ret) {
418+ ivpu_err(vdev, "Failed to sync after D0i3 transition: %d\n", ret);
419+ return ret;
420+ }
421+
422+ return 0;
423+}
424+
425+static int d0i3_drive(struct ivpu_device *vdev, bool enable)
426+{
427+ if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL)
428+ return d0i3_drive_mtl(vdev, enable);
429+ else
430+ return d0i3_drive_lnl(vdev, enable);
431+}
432+
433+int ivpu_hw_btrs_d0i3_enable(struct ivpu_device *vdev)
434+{
435+ int ret;
436+
437+ if (IVPU_WA(punit_disabled))
438+ return 0;
439+
440+ ret = d0i3_drive(vdev, true);
441+ if (ret)
442+ ivpu_err(vdev, "Failed to enable D0i3: %d\n", ret);
443+
444+ udelay(5); /* VPU requires 5 us to complete the transition */
445+
446+ return ret;
447+}
448+
449+int ivpu_hw_btrs_d0i3_disable(struct ivpu_device *vdev)
450+{
451+ int ret;
452+
453+ if (IVPU_WA(punit_disabled))
454+ return 0;
455+
456+ ret = d0i3_drive(vdev, false);
457+ if (ret)
458+ ivpu_err(vdev, "Failed to disable D0i3: %d\n", ret);
459+
460+ return ret;
461+}
462+
463+int ivpu_hw_btrs_wait_for_clock_res_own_ack(struct ivpu_device *vdev)
464+{
465+ if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL)
466+ return 0;
467+
468+ if (ivpu_is_simics(vdev))
469+ return 0;
470+
471+ return REGB_POLL_FLD(VPU_HW_BTRS_LNL_VPU_STATUS, CLOCK_RESOURCE_OWN_ACK, 1, TIMEOUT_US);
472+}
473+
474+void ivpu_hw_btrs_set_port_arbitration_weights_lnl(struct ivpu_device *vdev)
475+{
476+ REGB_WR32(VPU_HW_BTRS_LNL_PORT_ARBITRATION_WEIGHTS, WEIGHTS_DEFAULT);
477+ REGB_WR32(VPU_HW_BTRS_LNL_PORT_ARBITRATION_WEIGHTS_ATS, WEIGHTS_ATS_DEFAULT);
478+}
479+
480+static int ip_reset_mtl(struct ivpu_device *vdev)
481+{
482+ int ret;
483+ u32 val;
484+
485+ ret = REGB_POLL_FLD(VPU_HW_BTRS_MTL_VPU_IP_RESET, TRIGGER, 0, TIMEOUT_US);
486+ if (ret) {
487+ ivpu_err(vdev, "Timed out waiting for TRIGGER bit\n");
488+ return ret;
489+ }
490+
491+ val = REGB_RD32(VPU_HW_BTRS_MTL_VPU_IP_RESET);
492+ val = REG_SET_FLD(VPU_HW_BTRS_MTL_VPU_IP_RESET, TRIGGER, val);
493+ REGB_WR32(VPU_HW_BTRS_MTL_VPU_IP_RESET, val);
494+
495+ ret = REGB_POLL_FLD(VPU_HW_BTRS_MTL_VPU_IP_RESET, TRIGGER, 0, TIMEOUT_US);
496+ if (ret)
497+ ivpu_err(vdev, "Timed out waiting for RESET completion\n");
498+
499+ return ret;
500+}
501+
502+static int ip_reset_lnl(struct ivpu_device *vdev)
503+{
504+ int ret;
505+ u32 val;
506+
507+ ivpu_hw_btrs_clock_relinquish_disable_lnl(vdev);
508+
509+ ret = REGB_POLL_FLD(VPU_HW_BTRS_LNL_IP_RESET, TRIGGER, 0, TIMEOUT_US);
510+ if (ret) {
511+ ivpu_err(vdev, "Wait for *_TRIGGER timed out\n");
512+ return ret;
513+ }
514+
515+ val = REGB_RD32(VPU_HW_BTRS_LNL_IP_RESET);
516+ val = REG_SET_FLD(VPU_HW_BTRS_LNL_IP_RESET, TRIGGER, val);
517+ REGB_WR32(VPU_HW_BTRS_LNL_IP_RESET, val);
518+
519+ ret = REGB_POLL_FLD(VPU_HW_BTRS_LNL_IP_RESET, TRIGGER, 0, TIMEOUT_US);
520+ if (ret)
521+ ivpu_err(vdev, "Timed out waiting for RESET completion\n");
522+
523+ return ret;
524+}
525+
526+int ivpu_hw_btrs_ip_reset(struct ivpu_device *vdev)
527+{
528+ if (IVPU_WA(punit_disabled))
529+ return 0;
530+
531+ if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL)
532+ return ip_reset_mtl(vdev);
533+ else
534+ return ip_reset_lnl(vdev);
535+}
536+
537+void ivpu_hw_btrs_profiling_freq_reg_set_lnl(struct ivpu_device *vdev)
538+{
539+ u32 val = REGB_RD32(VPU_HW_BTRS_LNL_VPU_STATUS);
540+
541+ if (vdev->hw->pll.profiling_freq == PLL_PROFILING_FREQ_DEFAULT)
542+ val = REG_CLR_FLD(VPU_HW_BTRS_LNL_VPU_STATUS, PERF_CLK, val);
543+ else
544+ val = REG_SET_FLD(VPU_HW_BTRS_LNL_VPU_STATUS, PERF_CLK, val);
545+
546+ REGB_WR32(VPU_HW_BTRS_LNL_VPU_STATUS, val);
547+}
548+
549+void ivpu_hw_btrs_ats_print_lnl(struct ivpu_device *vdev)
550+{
551+ ivpu_dbg(vdev, MISC, "Buttress ATS: %s\n",
552+ REGB_RD32(VPU_HW_BTRS_LNL_HM_ATS) ? "Enable" : "Disable");
553+}
554+
555+void ivpu_hw_btrs_clock_relinquish_disable_lnl(struct ivpu_device *vdev)
556+{
557+ u32 val = REGB_RD32(VPU_HW_BTRS_LNL_VPU_STATUS);
558+
559+ val = REG_SET_FLD(VPU_HW_BTRS_LNL_VPU_STATUS, DISABLE_CLK_RELINQUISH, val);
560+ REGB_WR32(VPU_HW_BTRS_LNL_VPU_STATUS, val);
561+}
562+
563+bool ivpu_hw_btrs_is_idle(struct ivpu_device *vdev)
564+{
565+ u32 val;
566+
567+ if (IVPU_WA(punit_disabled))
568+ return true;
569+
570+ if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL) {
571+ val = REGB_RD32(VPU_HW_BTRS_MTL_VPU_STATUS);
572+
573+ return REG_TEST_FLD(VPU_HW_BTRS_MTL_VPU_STATUS, READY, val) &&
574+ REG_TEST_FLD(VPU_HW_BTRS_MTL_VPU_STATUS, IDLE, val);
575+ } else {
576+ val = REGB_RD32(VPU_HW_BTRS_LNL_VPU_STATUS);
577+
578+ return REG_TEST_FLD(VPU_HW_BTRS_LNL_VPU_STATUS, READY, val) &&
579+ REG_TEST_FLD(VPU_HW_BTRS_LNL_VPU_STATUS, IDLE, val);
580+ }
581+}
582+
583+int ivpu_hw_btrs_wait_for_idle(struct ivpu_device *vdev)
584+{
585+ if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL)
586+ return REGB_POLL_FLD(VPU_HW_BTRS_MTL_VPU_STATUS, IDLE, 0x1, IDLE_TIMEOUT_US);
587+ else
588+ return REGB_POLL_FLD(VPU_HW_BTRS_LNL_VPU_STATUS, IDLE, 0x1, IDLE_TIMEOUT_US);
589+}
590+
591+/* Handler for IRQs from Buttress core (irqB) */
592+bool ivpu_hw_btrs_irq_handler_mtl(struct ivpu_device *vdev, int irq)
593+{
594+ u32 status = REGB_RD32(VPU_HW_BTRS_MTL_INTERRUPT_STAT) & BTRS_MTL_IRQ_MASK;
595+ bool schedule_recovery = false;
596+
597+ if (!status)
598+ return false;
599+
600+ if (REG_TEST_FLD(VPU_HW_BTRS_MTL_INTERRUPT_STAT, FREQ_CHANGE, status))
601+ ivpu_dbg(vdev, IRQ, "FREQ_CHANGE irq: %08x",
602+ REGB_RD32(VPU_HW_BTRS_MTL_CURRENT_PLL));
603+
604+ if (REG_TEST_FLD(VPU_HW_BTRS_MTL_INTERRUPT_STAT, ATS_ERR, status)) {
605+ ivpu_err(vdev, "ATS_ERR irq 0x%016llx", REGB_RD64(VPU_HW_BTRS_MTL_ATS_ERR_LOG_0));
606+ REGB_WR32(VPU_HW_BTRS_MTL_ATS_ERR_CLEAR, 0x1);
607+ schedule_recovery = true;
608+ }
609+
610+ if (REG_TEST_FLD(VPU_HW_BTRS_MTL_INTERRUPT_STAT, UFI_ERR, status)) {
611+ u32 ufi_log = REGB_RD32(VPU_HW_BTRS_MTL_UFI_ERR_LOG);
612+
613+ ivpu_err(vdev, "UFI_ERR irq (0x%08x) opcode: 0x%02lx axi_id: 0x%02lx cq_id: 0x%03lx",
614+ ufi_log, REG_GET_FLD(VPU_HW_BTRS_MTL_UFI_ERR_LOG, OPCODE, ufi_log),
615+ REG_GET_FLD(VPU_HW_BTRS_MTL_UFI_ERR_LOG, AXI_ID, ufi_log),
616+ REG_GET_FLD(VPU_HW_BTRS_MTL_UFI_ERR_LOG, CQ_ID, ufi_log));
617+ REGB_WR32(VPU_HW_BTRS_MTL_UFI_ERR_CLEAR, 0x1);
618+ schedule_recovery = true;
619+ }
620+
621+ /* This must be done after interrupts are cleared at the source. */
622+ if (IVPU_WA(interrupt_clear_with_0))
623+ /*
624+ * Writing 1 triggers an interrupt, so we can't perform read update write.
625+ * Clear local interrupt status by writing 0 to all bits.
626+ */
627+ REGB_WR32(VPU_HW_BTRS_MTL_INTERRUPT_STAT, 0x0);
628+ else
629+ REGB_WR32(VPU_HW_BTRS_MTL_INTERRUPT_STAT, status);
630+
631+ if (schedule_recovery)
632+ ivpu_pm_trigger_recovery(vdev, "Buttress IRQ");
633+
634+ return true;
635+}
636+
637+/* Handler for IRQs from Buttress core (irqB) */
638+bool ivpu_hw_btrs_irq_handler_lnl(struct ivpu_device *vdev, int irq)
639+{
640+ u32 status = REGB_RD32(VPU_HW_BTRS_LNL_INTERRUPT_STAT) & BTRS_LNL_IRQ_MASK;
641+ bool schedule_recovery = false;
642+
643+ if (!status)
644+ return false;
645+
646+ if (REG_TEST_FLD(VPU_HW_BTRS_LNL_INTERRUPT_STAT, SURV_ERR, status)) {
647+ ivpu_dbg(vdev, IRQ, "Survivability IRQ\n");
648+ if (!kfifo_put(&vdev->hw->irq.fifo, IVPU_HW_IRQ_SRC_DCT))
649+ ivpu_err_ratelimited(vdev, "IRQ FIFO full\n");
650+ }
651+
652+ if (REG_TEST_FLD(VPU_HW_BTRS_LNL_INTERRUPT_STAT, FREQ_CHANGE, status))
653+ ivpu_dbg(vdev, IRQ, "FREQ_CHANGE irq: %08x", REGB_RD32(VPU_HW_BTRS_LNL_PLL_FREQ));
654+
655+ if (REG_TEST_FLD(VPU_HW_BTRS_LNL_INTERRUPT_STAT, ATS_ERR, status)) {
656+ ivpu_err(vdev, "ATS_ERR LOG1 0x%08x ATS_ERR_LOG2 0x%08x\n",
657+ REGB_RD32(VPU_HW_BTRS_LNL_ATS_ERR_LOG1),
658+ REGB_RD32(VPU_HW_BTRS_LNL_ATS_ERR_LOG2));
659+ REGB_WR32(VPU_HW_BTRS_LNL_ATS_ERR_CLEAR, 0x1);
660+ schedule_recovery = true;
661+ }
662+
663+ if (REG_TEST_FLD(VPU_HW_BTRS_LNL_INTERRUPT_STAT, CFI0_ERR, status)) {
664+ ivpu_err(vdev, "CFI0_ERR 0x%08x", REGB_RD32(VPU_HW_BTRS_LNL_CFI0_ERR_LOG));
665+ REGB_WR32(VPU_HW_BTRS_LNL_CFI0_ERR_CLEAR, 0x1);
666+ schedule_recovery = true;
667+ }
668+
669+ if (REG_TEST_FLD(VPU_HW_BTRS_LNL_INTERRUPT_STAT, CFI1_ERR, status)) {
670+ ivpu_err(vdev, "CFI1_ERR 0x%08x", REGB_RD32(VPU_HW_BTRS_LNL_CFI1_ERR_LOG));
671+ REGB_WR32(VPU_HW_BTRS_LNL_CFI1_ERR_CLEAR, 0x1);
672+ schedule_recovery = true;
673+ }
674+
675+ if (REG_TEST_FLD(VPU_HW_BTRS_LNL_INTERRUPT_STAT, IMR0_ERR, status)) {
676+ ivpu_err(vdev, "IMR_ERR_CFI0 LOW: 0x%08x HIGH: 0x%08x",
677+ REGB_RD32(VPU_HW_BTRS_LNL_IMR_ERR_CFI0_LOW),
678+ REGB_RD32(VPU_HW_BTRS_LNL_IMR_ERR_CFI0_HIGH));
679+ REGB_WR32(VPU_HW_BTRS_LNL_IMR_ERR_CFI0_CLEAR, 0x1);
680+ schedule_recovery = true;
681+ }
682+
683+ if (REG_TEST_FLD(VPU_HW_BTRS_LNL_INTERRUPT_STAT, IMR1_ERR, status)) {
684+ ivpu_err(vdev, "IMR_ERR_CFI1 LOW: 0x%08x HIGH: 0x%08x",
685+ REGB_RD32(VPU_HW_BTRS_LNL_IMR_ERR_CFI1_LOW),
686+ REGB_RD32(VPU_HW_BTRS_LNL_IMR_ERR_CFI1_HIGH));
687+ REGB_WR32(VPU_HW_BTRS_LNL_IMR_ERR_CFI1_CLEAR, 0x1);
688+ schedule_recovery = true;
689+ }
690+
691+ /* This must be done after interrupts are cleared at the source. */
692+ REGB_WR32(VPU_HW_BTRS_LNL_INTERRUPT_STAT, status);
693+
694+ if (schedule_recovery)
695+ ivpu_pm_trigger_recovery(vdev, "Buttress IRQ");
696+
697+ return true;
698+}
699+
700+int ivpu_hw_btrs_dct_get_request(struct ivpu_device *vdev, bool *enable)
701+{
702+ u32 val = REGB_RD32(VPU_HW_BTRS_LNL_PCODE_MAILBOX_SHADOW);
703+ u32 cmd = REG_GET_FLD(VPU_HW_BTRS_LNL_PCODE_MAILBOX_SHADOW, CMD, val);
704+ u32 param1 = REG_GET_FLD(VPU_HW_BTRS_LNL_PCODE_MAILBOX_SHADOW, PARAM1, val);
705+
706+ if (cmd != DCT_REQ) {
707+ ivpu_err_ratelimited(vdev, "Unsupported PCODE command: 0x%x\n", cmd);
708+ return -EBADR;
709+ }
710+
711+ switch (param1) {
712+ case DCT_ENABLE:
713+ *enable = true;
714+ return 0;
715+ case DCT_DISABLE:
716+ *enable = false;
717+ return 0;
718+ default:
719+ ivpu_err_ratelimited(vdev, "Invalid PARAM1 value: %u\n", param1);
720+ return -EINVAL;
721+ }
722+}
723+
724+void ivpu_hw_btrs_dct_set_status(struct ivpu_device *vdev, bool enable, u32 active_percent)
725+{
726+ u32 val = 0;
727+ u32 cmd = enable ? DCT_ENABLE : DCT_DISABLE;
728+
729+ val = REG_SET_FLD_NUM(VPU_HW_BTRS_LNL_PCODE_MAILBOX_STATUS, CMD, DCT_REQ, val);
730+ val = REG_SET_FLD_NUM(VPU_HW_BTRS_LNL_PCODE_MAILBOX_STATUS, PARAM1, cmd, val);
731+ val = REG_SET_FLD_NUM(VPU_HW_BTRS_LNL_PCODE_MAILBOX_STATUS, PARAM2, active_percent, val);
732+
733+ REGB_WR32(VPU_HW_BTRS_LNL_PCODE_MAILBOX_STATUS, val);
734+}
735+
736+static u32 pll_ratio_to_freq_mtl(u32 ratio, u32 config)
737+{
738+ u32 pll_clock = PLL_REF_CLK_FREQ * ratio;
739+ u32 cpu_clock;
740+
741+ if ((config & 0xff) == MTL_PLL_RATIO_4_3)
742+ cpu_clock = pll_clock * 2 / 4;
743+ else
744+ cpu_clock = pll_clock * 2 / 5;
745+
746+ return cpu_clock;
747+}
748+
749+u32 ivpu_hw_btrs_ratio_to_freq(struct ivpu_device *vdev, u32 ratio)
750+{
751+ struct ivpu_hw_info *hw = vdev->hw;
752+
753+ if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL)
754+ return pll_ratio_to_freq_mtl(ratio, hw->config);
755+ else
756+ return PLL_RATIO_TO_FREQ(ratio);
757+}
758+
759+static u32 pll_freq_get_mtl(struct ivpu_device *vdev)
760+{
761+ u32 pll_curr_ratio;
762+
763+ pll_curr_ratio = REGB_RD32(VPU_HW_BTRS_MTL_CURRENT_PLL);
764+ pll_curr_ratio &= VPU_HW_BTRS_MTL_CURRENT_PLL_RATIO_MASK;
765+
766+ if (!ivpu_is_silicon(vdev))
767+ return PLL_SIMULATION_FREQ;
768+
769+ return pll_ratio_to_freq_mtl(pll_curr_ratio, vdev->hw->config);
770+}
771+
772+static u32 pll_freq_get_lnl(struct ivpu_device *vdev)
773+{
774+ u32 pll_curr_ratio;
775+
776+ pll_curr_ratio = REGB_RD32(VPU_HW_BTRS_LNL_PLL_FREQ);
777+ pll_curr_ratio &= VPU_HW_BTRS_LNL_PLL_FREQ_RATIO_MASK;
778+
779+ return PLL_RATIO_TO_FREQ(pll_curr_ratio);
780+}
781+
782+u32 ivpu_hw_btrs_pll_freq_get(struct ivpu_device *vdev)
783+{
784+ if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL)
785+ return pll_freq_get_mtl(vdev);
786+ else
787+ return pll_freq_get_lnl(vdev);
788+}
789+
790+u32 ivpu_hw_btrs_telemetry_offset_get(struct ivpu_device *vdev)
791+{
792+ if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL)
793+ return REGB_RD32(VPU_HW_BTRS_MTL_VPU_TELEMETRY_OFFSET);
794+ else
795+ return REGB_RD32(VPU_HW_BTRS_LNL_VPU_TELEMETRY_OFFSET);
796+}
797+
798+u32 ivpu_hw_btrs_telemetry_size_get(struct ivpu_device *vdev)
799+{
800+ if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL)
801+ return REGB_RD32(VPU_HW_BTRS_MTL_VPU_TELEMETRY_SIZE);
802+ else
803+ return REGB_RD32(VPU_HW_BTRS_LNL_VPU_TELEMETRY_SIZE);
804+}
805+
806+u32 ivpu_hw_btrs_telemetry_enable_get(struct ivpu_device *vdev)
807+{
808+ if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL)
809+ return REGB_RD32(VPU_HW_BTRS_MTL_VPU_TELEMETRY_ENABLE);
810+ else
811+ return REGB_RD32(VPU_HW_BTRS_LNL_VPU_TELEMETRY_ENABLE);
812+}
813+
814+void ivpu_hw_btrs_global_int_disable(struct ivpu_device *vdev)
815+{
816+ if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL)
817+ REGB_WR32(VPU_HW_BTRS_MTL_GLOBAL_INT_MASK, 0x1);
818+ else
819+ REGB_WR32(VPU_HW_BTRS_LNL_GLOBAL_INT_MASK, 0x1);
820+}
821+
822+void ivpu_hw_btrs_global_int_enable(struct ivpu_device *vdev)
823+{
824+ if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL)
825+ REGB_WR32(VPU_HW_BTRS_MTL_GLOBAL_INT_MASK, 0x0);
826+ else
827+ REGB_WR32(VPU_HW_BTRS_LNL_GLOBAL_INT_MASK, 0x0);
828+}
829+
830+void ivpu_hw_btrs_irq_enable(struct ivpu_device *vdev)
831+{
832+ if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL) {
833+ REGB_WR32(VPU_HW_BTRS_MTL_LOCAL_INT_MASK, (u32)(~BTRS_MTL_IRQ_MASK));
834+ REGB_WR32(VPU_HW_BTRS_MTL_GLOBAL_INT_MASK, 0x0);
835+ } else {
836+ REGB_WR32(VPU_HW_BTRS_LNL_LOCAL_INT_MASK, (u32)(~BTRS_LNL_IRQ_MASK));
837+ REGB_WR32(VPU_HW_BTRS_LNL_GLOBAL_INT_MASK, 0x0);
838+ }
839+}
840+
841+void ivpu_hw_btrs_irq_disable(struct ivpu_device *vdev)
842+{
843+ if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL) {
844+ REGB_WR32(VPU_HW_BTRS_MTL_GLOBAL_INT_MASK, 0x1);
845+ REGB_WR32(VPU_HW_BTRS_MTL_LOCAL_INT_MASK, BTRS_IRQ_DISABLE_MASK);
846+ } else {
847+ REGB_WR32(VPU_HW_BTRS_LNL_GLOBAL_INT_MASK, 0x1);
848+ REGB_WR32(VPU_HW_BTRS_LNL_LOCAL_INT_MASK, BTRS_IRQ_DISABLE_MASK);
849+ }
850+}
851+
852+static void diagnose_failure_mtl(struct ivpu_device *vdev)
853+{
854+ u32 reg = REGB_RD32(VPU_HW_BTRS_MTL_INTERRUPT_STAT) & BTRS_MTL_IRQ_MASK;
855+
856+ if (REG_TEST_FLD(VPU_HW_BTRS_MTL_INTERRUPT_STAT, ATS_ERR, reg))
857+ ivpu_err(vdev, "ATS_ERR irq 0x%016llx", REGB_RD64(VPU_HW_BTRS_MTL_ATS_ERR_LOG_0));
858+
859+ if (REG_TEST_FLD(VPU_HW_BTRS_MTL_INTERRUPT_STAT, UFI_ERR, reg)) {
860+ u32 log = REGB_RD32(VPU_HW_BTRS_MTL_UFI_ERR_LOG);
861+
862+ ivpu_err(vdev, "UFI_ERR irq (0x%08x) opcode: 0x%02lx axi_id: 0x%02lx cq_id: 0x%03lx",
863+ log, REG_GET_FLD(VPU_HW_BTRS_MTL_UFI_ERR_LOG, OPCODE, log),
864+ REG_GET_FLD(VPU_HW_BTRS_MTL_UFI_ERR_LOG, AXI_ID, log),
865+ REG_GET_FLD(VPU_HW_BTRS_MTL_UFI_ERR_LOG, CQ_ID, log));
866+ }
867+}
868+
869+static void diagnose_failure_lnl(struct ivpu_device *vdev)
870+{
871+ u32 reg = REGB_RD32(VPU_HW_BTRS_MTL_INTERRUPT_STAT) & BTRS_LNL_IRQ_MASK;
872+
873+ if (REG_TEST_FLD(VPU_HW_BTRS_LNL_INTERRUPT_STAT, ATS_ERR, reg)) {
874+ ivpu_err(vdev, "ATS_ERR_LOG1 0x%08x ATS_ERR_LOG2 0x%08x\n",
875+ REGB_RD32(VPU_HW_BTRS_LNL_ATS_ERR_LOG1),
876+ REGB_RD32(VPU_HW_BTRS_LNL_ATS_ERR_LOG2));
877+ }
878+
879+ if (REG_TEST_FLD(VPU_HW_BTRS_LNL_INTERRUPT_STAT, CFI0_ERR, reg))
880+ ivpu_err(vdev, "CFI0_ERR_LOG 0x%08x\n", REGB_RD32(VPU_HW_BTRS_LNL_CFI0_ERR_LOG));
881+
882+ if (REG_TEST_FLD(VPU_HW_BTRS_LNL_INTERRUPT_STAT, CFI1_ERR, reg))
883+ ivpu_err(vdev, "CFI1_ERR_LOG 0x%08x\n", REGB_RD32(VPU_HW_BTRS_LNL_CFI1_ERR_LOG));
884+
885+ if (REG_TEST_FLD(VPU_HW_BTRS_LNL_INTERRUPT_STAT, IMR0_ERR, reg))
886+ ivpu_err(vdev, "IMR_ERR_CFI0 LOW: 0x%08x HIGH: 0x%08x\n",
887+ REGB_RD32(VPU_HW_BTRS_LNL_IMR_ERR_CFI0_LOW),
888+ REGB_RD32(VPU_HW_BTRS_LNL_IMR_ERR_CFI0_HIGH));
889+
890+ if (REG_TEST_FLD(VPU_HW_BTRS_LNL_INTERRUPT_STAT, IMR1_ERR, reg))
891+ ivpu_err(vdev, "IMR_ERR_CFI1 LOW: 0x%08x HIGH: 0x%08x\n",
892+ REGB_RD32(VPU_HW_BTRS_LNL_IMR_ERR_CFI1_LOW),
893+ REGB_RD32(VPU_HW_BTRS_LNL_IMR_ERR_CFI1_HIGH));
894+
895+ if (REG_TEST_FLD(VPU_HW_BTRS_LNL_INTERRUPT_STAT, SURV_ERR, reg))
896+ ivpu_err(vdev, "Survivability IRQ\n");
897+}
898+
899+void ivpu_hw_btrs_diagnose_failure(struct ivpu_device *vdev)
900+{
901+ if (ivpu_hw_btrs_gen(vdev) == IVPU_HW_BTRS_MTL)
902+ return diagnose_failure_mtl(vdev);
903+ else
904+ return diagnose_failure_lnl(vdev);
905+}
drivers/accel/ivpu/ivpu_hw_btrs.h+50−0
@@ -0,0 +1,50 @@
1+/* SPDX-License-Identifier: GPL-2.0-only */
2+/*
3+ * Copyright (C) 2020-2024 Intel Corporation
4+ */
5+
6+#ifndef __IVPU_HW_BTRS_H__
7+#define __IVPU_HW_BTRS_H__
8+
9+#include "ivpu_drv.h"
10+#include "ivpu_hw_37xx_reg.h"
11+#include "ivpu_hw_40xx_reg.h"
12+#include "ivpu_hw_reg_io.h"
13+
14+#define PLL_PROFILING_FREQ_DEFAULT 38400000
15+#define PLL_PROFILING_FREQ_HIGH 400000000
16+#define PLL_RATIO_TO_FREQ(x) ((x) * PLL_REF_CLK_FREQ)
17+
18+#define DCT_DEFAULT_ACTIVE_PERCENT 15u
19+#define DCT_PERIOD_US 35300u
20+
21+int ivpu_hw_btrs_info_init(struct ivpu_device *vdev);
22+void ivpu_hw_btrs_freq_ratios_init(struct ivpu_device *vdev);
23+int ivpu_hw_btrs_irqs_clear_with_0_mtl(struct ivpu_device *vdev);
24+int ivpu_hw_btrs_wp_drive(struct ivpu_device *vdev, bool enable);
25+int ivpu_hw_btrs_wait_for_clock_res_own_ack(struct ivpu_device *vdev);
26+int ivpu_hw_btrs_d0i3_enable(struct ivpu_device *vdev);
27+int ivpu_hw_btrs_d0i3_disable(struct ivpu_device *vdev);
28+void ivpu_hw_btrs_set_port_arbitration_weights_lnl(struct ivpu_device *vdev);
29+bool ivpu_hw_btrs_is_idle(struct ivpu_device *vdev);
30+int ivpu_hw_btrs_wait_for_idle(struct ivpu_device *vdev);
31+int ivpu_hw_btrs_ip_reset(struct ivpu_device *vdev);
32+void ivpu_hw_btrs_profiling_freq_reg_set_lnl(struct ivpu_device *vdev);
33+void ivpu_hw_btrs_ats_print_lnl(struct ivpu_device *vdev);
34+void ivpu_hw_btrs_clock_relinquish_disable_lnl(struct ivpu_device *vdev);
35+bool ivpu_hw_btrs_irq_handler_mtl(struct ivpu_device *vdev, int irq);
36+bool ivpu_hw_btrs_irq_handler_lnl(struct ivpu_device *vdev, int irq);
37+int ivpu_hw_btrs_dct_get_request(struct ivpu_device *vdev, bool *enable);
38+void ivpu_hw_btrs_dct_set_status(struct ivpu_device *vdev, bool enable, u32 dct_percent);
39+u32 ivpu_hw_btrs_pll_freq_get(struct ivpu_device *vdev);
40+u32 ivpu_hw_btrs_ratio_to_freq(struct ivpu_device *vdev, u32 ratio);
41+u32 ivpu_hw_btrs_telemetry_offset_get(struct ivpu_device *vdev);
42+u32 ivpu_hw_btrs_telemetry_size_get(struct ivpu_device *vdev);
43+u32 ivpu_hw_btrs_telemetry_enable_get(struct ivpu_device *vdev);
44+void ivpu_hw_btrs_global_int_enable(struct ivpu_device *vdev);
45+void ivpu_hw_btrs_global_int_disable(struct ivpu_device *vdev);
46+void ivpu_hw_btrs_irq_enable(struct ivpu_device *vdev);
47+void ivpu_hw_btrs_irq_disable(struct ivpu_device *vdev);
48+void ivpu_hw_btrs_diagnose_failure(struct ivpu_device *vdev);
49+
50+#endif /* __IVPU_HW_BTRS_H__ */
drivers/accel/ivpu/ivpu_hw_btrs_lnl_reg.h+108−0
@@ -0,0 +1,108 @@
1+/* SPDX-License-Identifier: GPL-2.0-only */
2+/*
3+ * Copyright (C) 2020-2024 Intel Corporation
4+ */
5+
6+#ifndef __IVPU_HW_BTRS_LNL_REG_H__
7+#define __IVPU_HW_BTRS_LNL_REG_H__
8+
9+#include <linux/bits.h>
10+
11+#define VPU_HW_BTRS_LNL_INTERRUPT_STAT 0x00000000u
12+#define VPU_HW_BTRS_LNL_INTERRUPT_STAT_FREQ_CHANGE_MASK BIT_MASK(0)
13+#define VPU_HW_BTRS_LNL_INTERRUPT_STAT_ATS_ERR_MASK BIT_MASK(1)
14+#define VPU_HW_BTRS_LNL_INTERRUPT_STAT_CFI0_ERR_MASK BIT_MASK(2)
15+#define VPU_HW_BTRS_LNL_INTERRUPT_STAT_CFI1_ERR_MASK BIT_MASK(3)
16+#define VPU_HW_BTRS_LNL_INTERRUPT_STAT_IMR0_ERR_MASK BIT_MASK(4)
17+#define VPU_HW_BTRS_LNL_INTERRUPT_STAT_IMR1_ERR_MASK BIT_MASK(5)
18+#define VPU_HW_BTRS_LNL_INTERRUPT_STAT_SURV_ERR_MASK BIT_MASK(6)
19+
20+#define VPU_HW_BTRS_LNL_LOCAL_INT_MASK 0x00000004u
21+#define VPU_HW_BTRS_LNL_GLOBAL_INT_MASK 0x00000008u
22+
23+#define VPU_HW_BTRS_LNL_HM_ATS 0x0000000cu
24+
25+#define VPU_HW_BTRS_LNL_ATS_ERR_LOG1 0x00000010u
26+#define VPU_HW_BTRS_LNL_ATS_ERR_LOG2 0x00000014u
27+#define VPU_HW_BTRS_LNL_ATS_ERR_CLEAR 0x00000018u
28+
29+#define VPU_HW_BTRS_LNL_CFI0_ERR_LOG 0x0000001cu
30+#define VPU_HW_BTRS_LNL_CFI0_ERR_CLEAR 0x00000020u
31+
32+#define VPU_HW_BTRS_LNL_PORT_ARBITRATION_WEIGHTS_ATS 0x00000024u
33+
34+#define VPU_HW_BTRS_LNL_CFI1_ERR_LOG 0x00000040u
35+#define VPU_HW_BTRS_LNL_CFI1_ERR_CLEAR 0x00000044u
36+
37+#define VPU_HW_BTRS_LNL_IMR_ERR_CFI0_LOW 0x00000048u
38+#define VPU_HW_BTRS_LNL_IMR_ERR_CFI0_HIGH 0x0000004cu
39+#define VPU_HW_BTRS_LNL_IMR_ERR_CFI0_CLEAR 0x00000050u
40+
41+#define VPU_HW_BTRS_LNL_PORT_ARBITRATION_WEIGHTS 0x00000054u
42+
43+#define VPU_HW_BTRS_LNL_IMR_ERR_CFI1_LOW 0x00000058u
44+#define VPU_HW_BTRS_LNL_IMR_ERR_CFI1_HIGH 0x0000005cu
45+#define VPU_HW_BTRS_LNL_IMR_ERR_CFI1_CLEAR 0x00000060u
46+
47+#define VPU_HW_BTRS_LNL_PCODE_MAILBOX_STATUS 0x00000070u
48+#define VPU_HW_BTRS_LNL_PCODE_MAILBOX_STATUS_CMD_MASK GENMASK(7, 0)
49+#define VPU_HW_BTRS_LNL_PCODE_MAILBOX_STATUS_PARAM1_MASK GENMASK(15, 8)
50+#define VPU_HW_BTRS_LNL_PCODE_MAILBOX_STATUS_PARAM2_MASK GENMASK(23, 16)
51+#define VPU_HW_BTRS_LNL_PCODE_MAILBOX_STATUS_PARAM3_MASK GENMASK(31, 24)
52+
53+#define VPU_HW_BTRS_LNL_PCODE_MAILBOX_SHADOW 0x00000074u
54+#define VPU_HW_BTRS_LNL_PCODE_MAILBOX_SHADOW_CMD_MASK GENMASK(7, 0)
55+#define VPU_HW_BTRS_LNL_PCODE_MAILBOX_SHADOW_PARAM1_MASK GENMASK(15, 8)
56+#define VPU_HW_BTRS_LNL_PCODE_MAILBOX_SHADOW_PARAM2_MASK GENMASK(23, 16)
57+#define VPU_HW_BTRS_LNL_PCODE_MAILBOX_SHADOW_PARAM3_MASK GENMASK(31, 24)
58+
59+#define VPU_HW_BTRS_LNL_WP_REQ_PAYLOAD0 0x00000130u
60+#define VPU_HW_BTRS_LNL_WP_REQ_PAYLOAD0_MIN_RATIO_MASK GENMASK(15, 0)
61+#define VPU_HW_BTRS_LNL_WP_REQ_PAYLOAD0_MAX_RATIO_MASK GENMASK(31, 16)
62+
63+#define VPU_HW_BTRS_LNL_WP_REQ_PAYLOAD1 0x00000134u
64+#define VPU_HW_BTRS_LNL_WP_REQ_PAYLOAD1_TARGET_RATIO_MASK GENMASK(15, 0)
65+#define VPU_HW_BTRS_LNL_WP_REQ_PAYLOAD1_EPP_MASK GENMASK(31, 16)
66+
67+#define VPU_HW_BTRS_LNL_WP_REQ_PAYLOAD2 0x00000138u
68+#define VPU_HW_BTRS_LNL_WP_REQ_PAYLOAD2_CONFIG_MASK GENMASK(15, 0)
69+#define VPU_HW_BTRS_LNL_WP_REQ_PAYLOAD2_CDYN_MASK GENMASK(31, 16)
70+
71+#define VPU_HW_BTRS_LNL_WP_REQ_CMD 0x0000013cu
72+#define VPU_HW_BTRS_LNL_WP_REQ_CMD_SEND_MASK BIT_MASK(0)
73+
74+#define VPU_HW_BTRS_LNL_PLL_FREQ 0x00000148u
75+#define VPU_HW_BTRS_LNL_PLL_FREQ_RATIO_MASK GENMASK(15, 0)
76+
77+#define VPU_HW_BTRS_LNL_TILE_FUSE 0x00000150u
78+#define VPU_HW_BTRS_LNL_TILE_FUSE_VALID_MASK BIT_MASK(0)
79+#define VPU_HW_BTRS_LNL_TILE_FUSE_CONFIG_MASK GENMASK(6, 1)
80+
81+#define VPU_HW_BTRS_LNL_VPU_STATUS 0x00000154u
82+#define VPU_HW_BTRS_LNL_VPU_STATUS_READY_MASK BIT_MASK(0)
83+#define VPU_HW_BTRS_LNL_VPU_STATUS_IDLE_MASK BIT_MASK(1)
84+#define VPU_HW_BTRS_LNL_VPU_STATUS_DUP_IDLE_MASK BIT_MASK(2)
85+#define VPU_HW_BTRS_LNL_VPU_STATUS_CLOCK_RESOURCE_OWN_ACK_MASK BIT_MASK(6)
86+#define VPU_HW_BTRS_LNL_VPU_STATUS_POWER_RESOURCE_OWN_ACK_MASK BIT_MASK(7)
87+#define VPU_HW_BTRS_LNL_VPU_STATUS_PERF_CLK_MASK BIT_MASK(11)
88+#define VPU_HW_BTRS_LNL_VPU_STATUS_DISABLE_CLK_RELINQUISH_MASK BIT_MASK(12)
89+
90+#define VPU_HW_BTRS_LNL_IP_RESET 0x00000160u
91+#define VPU_HW_BTRS_LNL_IP_RESET_TRIGGER_MASK BIT_MASK(0)
92+
93+#define VPU_HW_BTRS_LNL_D0I3_CONTROL 0x00000164u
94+#define VPU_HW_BTRS_LNL_D0I3_CONTROL_INPROGRESS_MASK BIT_MASK(0)
95+#define VPU_HW_BTRS_LNL_D0I3_CONTROL_I3_MASK BIT_MASK(2)
96+
97+#define VPU_HW_BTRS_LNL_VPU_TELEMETRY_OFFSET 0x00000168u
98+#define VPU_HW_BTRS_LNL_VPU_TELEMETRY_SIZE 0x0000016cu
99+#define VPU_HW_BTRS_LNL_VPU_TELEMETRY_ENABLE 0x00000170u
100+
101+#define VPU_HW_BTRS_LNL_FMIN_FUSE 0x00000174u
102+#define VPU_HW_BTRS_LNL_FMIN_FUSE_MIN_RATIO_MASK GENMASK(7, 0)
103+#define VPU_HW_BTRS_LNL_FMIN_FUSE_PN_RATIO_MASK GENMASK(15, 8)
104+
105+#define VPU_HW_BTRS_LNL_FMAX_FUSE 0x00000178u
106+#define VPU_HW_BTRS_LNL_FMAX_FUSE_MAX_RATIO_MASK GENMASK(7, 0)
107+
108+#endif /* __IVPU_HW_BTRS_LNL_REG_H__ */
drivers/accel/ivpu/ivpu_hw_btrs_mtl_reg.h+83−0
@@ -0,0 +1,83 @@
1+/* SPDX-License-Identifier: GPL-2.0-only */
2+/*
3+ * Copyright (C) 2020-2023 Intel Corporation
4+ */
5+
6+#ifndef __IVPU_HW_BTRS_MTL_REG_H__
7+#define __IVPU_HW_BTRS_MTL_REG_H__
8+
9+#include <linux/bits.h>
10+
11+#define VPU_HW_BTRS_MTL_INTERRUPT_TYPE 0x00000000u
12+
13+#define VPU_HW_BTRS_MTL_INTERRUPT_STAT 0x00000004u
14+#define VPU_HW_BTRS_MTL_INTERRUPT_STAT_FREQ_CHANGE_MASK BIT_MASK(0)
15+#define VPU_HW_BTRS_MTL_INTERRUPT_STAT_ATS_ERR_MASK BIT_MASK(1)
16+#define VPU_HW_BTRS_MTL_INTERRUPT_STAT_UFI_ERR_MASK BIT_MASK(2)
17+
18+#define VPU_HW_BTRS_MTL_WP_REQ_PAYLOAD0 0x00000008u
19+#define VPU_HW_BTRS_MTL_WP_REQ_PAYLOAD0_MIN_RATIO_MASK GENMASK(15, 0)
20+#define VPU_HW_BTRS_MTL_WP_REQ_PAYLOAD0_MAX_RATIO_MASK GENMASK(31, 16)
21+
22+#define VPU_HW_BTRS_MTL_WP_REQ_PAYLOAD1 0x0000000cu
23+#define VPU_HW_BTRS_MTL_WP_REQ_PAYLOAD1_TARGET_RATIO_MASK GENMASK(15, 0)
24+#define VPU_HW_BTRS_MTL_WP_REQ_PAYLOAD1_EPP_MASK GENMASK(31, 16)
25+
26+#define VPU_HW_BTRS_MTL_WP_REQ_PAYLOAD2 0x00000010u
27+#define VPU_HW_BTRS_MTL_WP_REQ_PAYLOAD2_CONFIG_MASK GENMASK(15, 0)
28+
29+#define VPU_HW_BTRS_MTL_WP_REQ_CMD 0x00000014u
30+#define VPU_HW_BTRS_MTL_WP_REQ_CMD_SEND_MASK BIT_MASK(0)
31+
32+#define VPU_HW_BTRS_MTL_WP_DOWNLOAD 0x00000018u
33+#define VPU_HW_BTRS_MTL_WP_DOWNLOAD_TARGET_RATIO_MASK GENMASK(15, 0)
34+
35+#define VPU_HW_BTRS_MTL_CURRENT_PLL 0x0000001cu
36+#define VPU_HW_BTRS_MTL_CURRENT_PLL_RATIO_MASK GENMASK(15, 0)
37+
38+#define VPU_HW_BTRS_MTL_PLL_ENABLE 0x00000020u
39+
40+#define VPU_HW_BTRS_MTL_FMIN_FUSE 0x00000024u
41+#define VPU_HW_BTRS_MTL_FMIN_FUSE_MIN_RATIO_MASK GENMASK(7, 0)
42+#define VPU_HW_BTRS_MTL_FMIN_FUSE_PN_RATIO_MASK GENMASK(15, 8)
43+
44+#define VPU_HW_BTRS_MTL_FMAX_FUSE 0x00000028u
45+#define VPU_HW_BTRS_MTL_FMAX_FUSE_MAX_RATIO_MASK GENMASK(7, 0)
46+
47+#define VPU_HW_BTRS_MTL_TILE_FUSE 0x0000002cu
48+#define VPU_HW_BTRS_MTL_TILE_FUSE_VALID_MASK BIT_MASK(0)
49+#define VPU_HW_BTRS_MTL_TILE_FUSE_SKU_MASK GENMASK(3, 2)
50+
51+#define VPU_HW_BTRS_MTL_LOCAL_INT_MASK 0x00000030u
52+#define VPU_HW_BTRS_MTL_GLOBAL_INT_MASK 0x00000034u
53+
54+#define VPU_HW_BTRS_MTL_PLL_STATUS 0x00000040u
55+#define VPU_HW_BTRS_MTL_PLL_STATUS_LOCK_MASK BIT_MASK(1)
56+
57+#define VPU_HW_BTRS_MTL_VPU_STATUS 0x00000044u
58+#define VPU_HW_BTRS_MTL_VPU_STATUS_READY_MASK BIT_MASK(0)
59+#define VPU_HW_BTRS_MTL_VPU_STATUS_IDLE_MASK BIT_MASK(1)
60+
61+#define VPU_HW_BTRS_MTL_VPU_D0I3_CONTROL 0x00000060u
62+#define VPU_HW_BTRS_MTL_VPU_D0I3_CONTROL_INPROGRESS_MASK BIT_MASK(0)
63+#define VPU_HW_BTRS_MTL_VPU_D0I3_CONTROL_I3_MASK BIT_MASK(2)
64+
65+#define VPU_HW_BTRS_MTL_VPU_IP_RESET 0x00000050u
66+#define VPU_HW_BTRS_MTL_VPU_IP_RESET_TRIGGER_MASK BIT_MASK(0)
67+
68+#define VPU_HW_BTRS_MTL_VPU_TELEMETRY_OFFSET 0x00000080u
69+#define VPU_HW_BTRS_MTL_VPU_TELEMETRY_SIZE 0x00000084u
70+#define VPU_HW_BTRS_MTL_VPU_TELEMETRY_ENABLE 0x00000088u
71+
72+#define VPU_HW_BTRS_MTL_ATS_ERR_LOG_0 0x000000a0u
73+#define VPU_HW_BTRS_MTL_ATS_ERR_LOG_1 0x000000a4u
74+#define VPU_HW_BTRS_MTL_ATS_ERR_CLEAR 0x000000a8u
75+
76+#define VPU_HW_BTRS_MTL_UFI_ERR_LOG 0x000000b0u
77+#define VPU_HW_BTRS_MTL_UFI_ERR_LOG_CQ_ID_MASK GENMASK(11, 0)
78+#define VPU_HW_BTRS_MTL_UFI_ERR_LOG_AXI_ID_MASK GENMASK(19, 12)
79+#define VPU_HW_BTRS_MTL_UFI_ERR_LOG_OPCODE_MASK GENMASK(24, 20)
80+
81+#define VPU_HW_BTRS_MTL_UFI_ERR_CLEAR 0x000000b4u
82+
83+#endif /* __IVPU_HW_BTRS_MTL_REG_H__ */
drivers/accel/ivpu/ivpu_hw_ip.c+1174−0
@@ -0,0 +1,1174 @@
1+// SPDX-License-Identifier: GPL-2.0-only
2+/*
3+ * Copyright (C) 2020-2024 Intel Corporation
4+ */
5+
6+#include "ivpu_drv.h"
7+#include "ivpu_fw.h"
8+#include "ivpu_hw.h"
9+#include "ivpu_hw_37xx_reg.h"
10+#include "ivpu_hw_40xx_reg.h"
11+#include "ivpu_hw_ip.h"
12+#include "ivpu_hw_reg_io.h"
13+#include "ivpu_mmu.h"
14+#include "ivpu_pm.h"
15+
16+#define PWR_ISLAND_EN_POST_DLY_FREQ_DEFAULT 0
17+#define PWR_ISLAND_EN_POST_DLY_FREQ_HIGH 18
18+#define PWR_ISLAND_STATUS_DLY_FREQ_DEFAULT 3
19+#define PWR_ISLAND_STATUS_DLY_FREQ_HIGH 46
20+#define PWR_ISLAND_STATUS_TIMEOUT_US (5 * USEC_PER_MSEC)
21+
22+#define TIM_SAFE_ENABLE 0xf1d0dead
23+#define TIM_WATCHDOG_RESET_VALUE 0xffffffff
24+
25+#define ICB_0_IRQ_MASK_37XX ((REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, HOST_IPC_FIFO_INT)) | \
26+ (REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_0_INT)) | \
27+ (REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_1_INT)) | \
28+ (REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_2_INT)) | \
29+ (REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, NOC_FIREWALL_INT)) | \
30+ (REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_0_INT)) | \
31+ (REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_1_INT)))
32+
33+#define ICB_1_IRQ_MASK_37XX ((REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_1, CPU_INT_REDIRECT_2_INT)) | \
34+ (REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_1, CPU_INT_REDIRECT_3_INT)) | \
35+ (REG_FLD(VPU_37XX_HOST_SS_ICB_STATUS_1, CPU_INT_REDIRECT_4_INT)))
36+
37+#define ICB_0_1_IRQ_MASK_37XX ((((u64)ICB_1_IRQ_MASK_37XX) << 32) | ICB_0_IRQ_MASK_37XX)
38+
39+#define ICB_0_IRQ_MASK_40XX ((REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, HOST_IPC_FIFO_INT)) | \
40+ (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_0_INT)) | \
41+ (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_1_INT)) | \
42+ (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_2_INT)) | \
43+ (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, NOC_FIREWALL_INT)) | \
44+ (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_0_INT)) | \
45+ (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_1_INT)))
46+
47+#define ICB_1_IRQ_MASK_40XX ((REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_1, CPU_INT_REDIRECT_2_INT)) | \
48+ (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_1, CPU_INT_REDIRECT_3_INT)) | \
49+ (REG_FLD(VPU_40XX_HOST_SS_ICB_STATUS_1, CPU_INT_REDIRECT_4_INT)))
50+
51+#define ICB_0_1_IRQ_MASK_40XX ((((u64)ICB_1_IRQ_MASK_40XX) << 32) | ICB_0_IRQ_MASK_40XX)
52+
53+#define ITF_FIREWALL_VIOLATION_MASK_37XX ((REG_FLD(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, CSS_ROM_CMX)) | \
54+ (REG_FLD(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, CSS_DBG)) | \
55+ (REG_FLD(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, CSS_CTRL)) | \
56+ (REG_FLD(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, DEC400)) | \
57+ (REG_FLD(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, MSS_NCE)) | \
58+ (REG_FLD(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, MSS_MBI)) | \
59+ (REG_FLD(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, MSS_MBI_CMX)))
60+
61+#define ITF_FIREWALL_VIOLATION_MASK_40XX ((REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, CSS_ROM_CMX)) | \
62+ (REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, CSS_DBG)) | \
63+ (REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, CSS_CTRL)) | \
64+ (REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, DEC400)) | \
65+ (REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, MSS_NCE)) | \
66+ (REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, MSS_MBI)) | \
67+ (REG_FLD(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, MSS_MBI_CMX)))
68+
69+static int wait_for_ip_bar(struct ivpu_device *vdev)
70+{
71+ return REGV_POLL_FLD(VPU_37XX_HOST_SS_CPR_RST_CLR, AON, 0, 100);
72+}
73+
74+static void host_ss_rst_clr(struct ivpu_device *vdev)
75+{
76+ u32 val = 0;
77+
78+ val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_RST_CLR, TOP_NOC, val);
79+ val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_RST_CLR, DSS_MAS, val);
80+ val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_RST_CLR, MSS_MAS, val);
81+
82+ REGV_WR32(VPU_37XX_HOST_SS_CPR_RST_CLR, val);
83+}
84+
85+static int host_ss_noc_qreqn_check_37xx(struct ivpu_device *vdev, u32 exp_val)
86+{
87+ u32 val = REGV_RD32(VPU_37XX_HOST_SS_NOC_QREQN);
88+
89+ if (!REG_TEST_FLD_NUM(VPU_37XX_HOST_SS_NOC_QREQN, TOP_SOCMMIO, exp_val, val))
90+ return -EIO;
91+
92+ return 0;
93+}
94+
95+static int host_ss_noc_qreqn_check_40xx(struct ivpu_device *vdev, u32 exp_val)
96+{
97+ u32 val = REGV_RD32(VPU_40XX_HOST_SS_NOC_QREQN);
98+
99+ if (!REG_TEST_FLD_NUM(VPU_40XX_HOST_SS_NOC_QREQN, TOP_SOCMMIO, exp_val, val))
100+ return -EIO;
101+
102+ return 0;
103+}
104+
105+static int host_ss_noc_qreqn_check(struct ivpu_device *vdev, u32 exp_val)
106+{
107+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
108+ return host_ss_noc_qreqn_check_37xx(vdev, exp_val);
109+ else
110+ return host_ss_noc_qreqn_check_40xx(vdev, exp_val);
111+}
112+
113+static int host_ss_noc_qacceptn_check_37xx(struct ivpu_device *vdev, u32 exp_val)
114+{
115+ u32 val = REGV_RD32(VPU_37XX_HOST_SS_NOC_QACCEPTN);
116+
117+ if (!REG_TEST_FLD_NUM(VPU_37XX_HOST_SS_NOC_QACCEPTN, TOP_SOCMMIO, exp_val, val))
118+ return -EIO;
119+
120+ return 0;
121+}
122+
123+static int host_ss_noc_qacceptn_check_40xx(struct ivpu_device *vdev, u32 exp_val)
124+{
125+ u32 val = REGV_RD32(VPU_40XX_HOST_SS_NOC_QACCEPTN);
126+
127+ if (!REG_TEST_FLD_NUM(VPU_40XX_HOST_SS_NOC_QACCEPTN, TOP_SOCMMIO, exp_val, val))
128+ return -EIO;
129+
130+ return 0;
131+}
132+
133+static int host_ss_noc_qacceptn_check(struct ivpu_device *vdev, u32 exp_val)
134+{
135+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
136+ return host_ss_noc_qacceptn_check_37xx(vdev, exp_val);
137+ else
138+ return host_ss_noc_qacceptn_check_40xx(vdev, exp_val);
139+}
140+
141+static int host_ss_noc_qdeny_check_37xx(struct ivpu_device *vdev, u32 exp_val)
142+{
143+ u32 val = REGV_RD32(VPU_37XX_HOST_SS_NOC_QDENY);
144+
145+ if (!REG_TEST_FLD_NUM(VPU_37XX_HOST_SS_NOC_QDENY, TOP_SOCMMIO, exp_val, val))
146+ return -EIO;
147+
148+ return 0;
149+}
150+
151+static int host_ss_noc_qdeny_check_40xx(struct ivpu_device *vdev, u32 exp_val)
152+{
153+ u32 val = REGV_RD32(VPU_40XX_HOST_SS_NOC_QDENY);
154+
155+ if (!REG_TEST_FLD_NUM(VPU_40XX_HOST_SS_NOC_QDENY, TOP_SOCMMIO, exp_val, val))
156+ return -EIO;
157+
158+ return 0;
159+}
160+
161+static int host_ss_noc_qdeny_check(struct ivpu_device *vdev, u32 exp_val)
162+{
163+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
164+ return host_ss_noc_qdeny_check_37xx(vdev, exp_val);
165+ else
166+ return host_ss_noc_qdeny_check_40xx(vdev, exp_val);
167+}
168+
169+static int top_noc_qrenqn_check_37xx(struct ivpu_device *vdev, u32 exp_val)
170+{
171+ u32 val = REGV_RD32(VPU_37XX_TOP_NOC_QREQN);
172+
173+ if (!REG_TEST_FLD_NUM(VPU_37XX_TOP_NOC_QREQN, CPU_CTRL, exp_val, val) ||
174+ !REG_TEST_FLD_NUM(VPU_37XX_TOP_NOC_QREQN, HOSTIF_L2CACHE, exp_val, val))
175+ return -EIO;
176+
177+ return 0;
178+}
179+
180+static int top_noc_qrenqn_check_40xx(struct ivpu_device *vdev, u32 exp_val)
181+{
182+ u32 val = REGV_RD32(VPU_40XX_TOP_NOC_QREQN);
183+
184+ if (!REG_TEST_FLD_NUM(VPU_40XX_TOP_NOC_QREQN, CPU_CTRL, exp_val, val) ||
185+ !REG_TEST_FLD_NUM(VPU_40XX_TOP_NOC_QREQN, HOSTIF_L2CACHE, exp_val, val))
186+ return -EIO;
187+
188+ return 0;
189+}
190+
191+static int top_noc_qreqn_check(struct ivpu_device *vdev, u32 exp_val)
192+{
193+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
194+ return top_noc_qrenqn_check_37xx(vdev, exp_val);
195+ else
196+ return top_noc_qrenqn_check_40xx(vdev, exp_val);
197+}
198+
199+int ivpu_hw_ip_host_ss_configure(struct ivpu_device *vdev)
200+{
201+ int ret;
202+
203+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX) {
204+ ret = wait_for_ip_bar(vdev);
205+ if (ret) {
206+ ivpu_err(vdev, "Timed out waiting for NPU IP bar\n");
207+ return ret;
208+ }
209+ host_ss_rst_clr(vdev);
210+ }
211+
212+ ret = host_ss_noc_qreqn_check(vdev, 0x0);
213+ if (ret) {
214+ ivpu_err(vdev, "Failed qreqn check: %d\n", ret);
215+ return ret;
216+ }
217+
218+ ret = host_ss_noc_qacceptn_check(vdev, 0x0);
219+ if (ret) {
220+ ivpu_err(vdev, "Failed qacceptn check: %d\n", ret);
221+ return ret;
222+ }
223+
224+ ret = host_ss_noc_qdeny_check(vdev, 0x0);
225+ if (ret)
226+ ivpu_err(vdev, "Failed qdeny check %d\n", ret);
227+
228+ return ret;
229+}
230+
231+static void idle_gen_drive_37xx(struct ivpu_device *vdev, bool enable)
232+{
233+ u32 val = REGV_RD32(VPU_37XX_HOST_SS_AON_VPU_IDLE_GEN);
234+
235+ if (enable)
236+ val = REG_SET_FLD(VPU_37XX_HOST_SS_AON_VPU_IDLE_GEN, EN, val);
237+ else
238+ val = REG_CLR_FLD(VPU_37XX_HOST_SS_AON_VPU_IDLE_GEN, EN, val);
239+
240+ REGV_WR32(VPU_37XX_HOST_SS_AON_VPU_IDLE_GEN, val);
241+}
242+
243+static void idle_gen_drive_40xx(struct ivpu_device *vdev, bool enable)
244+{
245+ u32 val = REGV_RD32(VPU_40XX_HOST_SS_AON_IDLE_GEN);
246+
247+ if (enable)
248+ val = REG_SET_FLD(VPU_40XX_HOST_SS_AON_IDLE_GEN, EN, val);
249+ else
250+ val = REG_CLR_FLD(VPU_40XX_HOST_SS_AON_IDLE_GEN, EN, val);
251+
252+ REGV_WR32(VPU_40XX_HOST_SS_AON_IDLE_GEN, val);
253+}
254+
255+void ivpu_hw_ip_idle_gen_enable(struct ivpu_device *vdev)
256+{
257+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
258+ idle_gen_drive_37xx(vdev, true);
259+ else
260+ idle_gen_drive_40xx(vdev, true);
261+}
262+
263+void ivpu_hw_ip_idle_gen_disable(struct ivpu_device *vdev)
264+{
265+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
266+ idle_gen_drive_37xx(vdev, false);
267+ else
268+ idle_gen_drive_40xx(vdev, false);
269+}
270+
271+static void pwr_island_delay_set_50xx(struct ivpu_device *vdev)
272+{
273+ u32 val, post, status;
274+
275+ if (vdev->hw->pll.profiling_freq == PLL_PROFILING_FREQ_DEFAULT) {
276+ post = PWR_ISLAND_EN_POST_DLY_FREQ_DEFAULT;
277+ status = PWR_ISLAND_STATUS_DLY_FREQ_DEFAULT;
278+ } else {
279+ post = PWR_ISLAND_EN_POST_DLY_FREQ_HIGH;
280+ status = PWR_ISLAND_STATUS_DLY_FREQ_HIGH;
281+ }
282+
283+ val = REGV_RD32(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY);
284+ val = REG_SET_FLD_NUM(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY, POST_DLY, post, val);
285+ REGV_WR32(VPU_50XX_HOST_SS_AON_PWR_ISLAND_EN_POST_DLY, val);
286+
287+ val = REGV_RD32(VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY);
288+ val = REG_SET_FLD_NUM(VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY, STATUS_DLY, status, val);
289+ REGV_WR32(VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY, val);
290+}
291+
292+static void pwr_island_trickle_drive_37xx(struct ivpu_device *vdev, bool enable)
293+{
294+ u32 val = REGV_RD32(VPU_37XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0);
295+
296+ if (enable)
297+ val = REG_SET_FLD(VPU_37XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0, MSS_CPU, val);
298+ else
299+ val = REG_CLR_FLD(VPU_37XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0, MSS_CPU, val);
300+
301+ REGV_WR32(VPU_37XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0, val);
302+}
303+
304+static void pwr_island_trickle_drive_40xx(struct ivpu_device *vdev, bool enable)
305+{
306+ u32 val = REGV_RD32(VPU_40XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0);
307+
308+ if (enable)
309+ val = REG_SET_FLD(VPU_40XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0, CSS_CPU, val);
310+ else
311+ val = REG_CLR_FLD(VPU_40XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0, CSS_CPU, val);
312+
313+ REGV_WR32(VPU_40XX_HOST_SS_AON_PWR_ISLAND_TRICKLE_EN0, val);
314+
315+ if (enable)
316+ ndelay(500);
317+}
318+
319+static void pwr_island_drive_37xx(struct ivpu_device *vdev, bool enable)
320+{
321+ u32 val = REGV_RD32(VPU_40XX_HOST_SS_AON_PWR_ISLAND_EN0);
322+
323+ if (enable)
324+ val = REG_SET_FLD(VPU_40XX_HOST_SS_AON_PWR_ISLAND_EN0, CSS_CPU, val);
325+ else
326+ val = REG_CLR_FLD(VPU_40XX_HOST_SS_AON_PWR_ISLAND_EN0, CSS_CPU, val);
327+
328+ REGV_WR32(VPU_40XX_HOST_SS_AON_PWR_ISLAND_EN0, val);
329+
330+ if (!enable)
331+ ndelay(500);
332+}
333+
334+static void pwr_island_drive_40xx(struct ivpu_device *vdev, bool enable)
335+{
336+ u32 val = REGV_RD32(VPU_37XX_HOST_SS_AON_PWR_ISLAND_EN0);
337+
338+ if (enable)
339+ val = REG_SET_FLD(VPU_37XX_HOST_SS_AON_PWR_ISLAND_EN0, MSS_CPU, val);
340+ else
341+ val = REG_CLR_FLD(VPU_37XX_HOST_SS_AON_PWR_ISLAND_EN0, MSS_CPU, val);
342+
343+ REGV_WR32(VPU_37XX_HOST_SS_AON_PWR_ISLAND_EN0, val);
344+}
345+
346+static void pwr_island_enable(struct ivpu_device *vdev)
347+{
348+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX) {
349+ pwr_island_trickle_drive_37xx(vdev, true);
350+ pwr_island_drive_37xx(vdev, true);
351+ } else {
352+ pwr_island_trickle_drive_40xx(vdev, true);
353+ pwr_island_drive_40xx(vdev, true);
354+ }
355+}
356+
357+static int wait_for_pwr_island_status(struct ivpu_device *vdev, u32 exp_val)
358+{
359+ if (IVPU_WA(punit_disabled))
360+ return 0;
361+
362+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
363+ return REGV_POLL_FLD(VPU_37XX_HOST_SS_AON_PWR_ISLAND_STATUS0, MSS_CPU, exp_val,
364+ PWR_ISLAND_STATUS_TIMEOUT_US);
365+ else
366+ return REGV_POLL_FLD(VPU_40XX_HOST_SS_AON_PWR_ISLAND_STATUS0, CSS_CPU, exp_val,
367+ PWR_ISLAND_STATUS_TIMEOUT_US);
368+}
369+
370+static void pwr_island_isolation_drive_37xx(struct ivpu_device *vdev, bool enable)
371+{
372+ u32 val = REGV_RD32(VPU_37XX_HOST_SS_AON_PWR_ISO_EN0);
373+
374+ if (enable)
375+ val = REG_SET_FLD(VPU_37XX_HOST_SS_AON_PWR_ISO_EN0, MSS_CPU, val);
376+ else
377+ val = REG_CLR_FLD(VPU_37XX_HOST_SS_AON_PWR_ISO_EN0, MSS_CPU, val);
378+
379+ REGV_WR32(VPU_37XX_HOST_SS_AON_PWR_ISO_EN0, val);
380+}
381+
382+static void pwr_island_isolation_drive_40xx(struct ivpu_device *vdev, bool enable)
383+{
384+ u32 val = REGV_RD32(VPU_40XX_HOST_SS_AON_PWR_ISO_EN0);
385+
386+ if (enable)
387+ val = REG_SET_FLD(VPU_40XX_HOST_SS_AON_PWR_ISO_EN0, CSS_CPU, val);
388+ else
389+ val = REG_CLR_FLD(VPU_40XX_HOST_SS_AON_PWR_ISO_EN0, CSS_CPU, val);
390+
391+ REGV_WR32(VPU_40XX_HOST_SS_AON_PWR_ISO_EN0, val);
392+}
393+
394+static void pwr_island_isolation_drive(struct ivpu_device *vdev, bool enable)
395+{
396+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
397+ pwr_island_isolation_drive_37xx(vdev, enable);
398+ else
399+ pwr_island_isolation_drive_40xx(vdev, enable);
400+}
401+
402+static void pwr_island_isolation_disable(struct ivpu_device *vdev)
403+{
404+ pwr_island_isolation_drive(vdev, false);
405+}
406+
407+static void host_ss_clk_drive_37xx(struct ivpu_device *vdev, bool enable)
408+{
409+ u32 val = REGV_RD32(VPU_37XX_HOST_SS_CPR_CLK_SET);
410+
411+ if (enable) {
412+ val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_CLK_SET, TOP_NOC, val);
413+ val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_CLK_SET, DSS_MAS, val);
414+ val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_CLK_SET, MSS_MAS, val);
415+ } else {
416+ val = REG_CLR_FLD(VPU_37XX_HOST_SS_CPR_CLK_SET, TOP_NOC, val);
417+ val = REG_CLR_FLD(VPU_37XX_HOST_SS_CPR_CLK_SET, DSS_MAS, val);
418+ val = REG_CLR_FLD(VPU_37XX_HOST_SS_CPR_CLK_SET, MSS_MAS, val);
419+ }
420+
421+ REGV_WR32(VPU_37XX_HOST_SS_CPR_CLK_SET, val);
422+}
423+
424+static void host_ss_clk_drive_40xx(struct ivpu_device *vdev, bool enable)
425+{
426+ u32 val = REGV_RD32(VPU_40XX_HOST_SS_CPR_CLK_EN);
427+
428+ if (enable) {
429+ val = REG_SET_FLD(VPU_40XX_HOST_SS_CPR_CLK_EN, TOP_NOC, val);
430+ val = REG_SET_FLD(VPU_40XX_HOST_SS_CPR_CLK_EN, DSS_MAS, val);
431+ val = REG_SET_FLD(VPU_40XX_HOST_SS_CPR_CLK_EN, CSS_MAS, val);
432+ } else {
433+ val = REG_CLR_FLD(VPU_40XX_HOST_SS_CPR_CLK_EN, TOP_NOC, val);
434+ val = REG_CLR_FLD(VPU_40XX_HOST_SS_CPR_CLK_EN, DSS_MAS, val);
435+ val = REG_CLR_FLD(VPU_40XX_HOST_SS_CPR_CLK_EN, CSS_MAS, val);
436+ }
437+
438+ REGV_WR32(VPU_40XX_HOST_SS_CPR_CLK_EN, val);
439+}
440+
441+static void host_ss_clk_drive(struct ivpu_device *vdev, bool enable)
442+{
443+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
444+ host_ss_clk_drive_37xx(vdev, enable);
445+ else
446+ host_ss_clk_drive_40xx(vdev, enable);
447+}
448+
449+static void host_ss_clk_enable(struct ivpu_device *vdev)
450+{
451+ host_ss_clk_drive(vdev, true);
452+}
453+
454+static void host_ss_rst_drive_37xx(struct ivpu_device *vdev, bool enable)
455+{
456+ u32 val = REGV_RD32(VPU_37XX_HOST_SS_CPR_RST_SET);
457+
458+ if (enable) {
459+ val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_RST_SET, TOP_NOC, val);
460+ val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_RST_SET, DSS_MAS, val);
461+ val = REG_SET_FLD(VPU_37XX_HOST_SS_CPR_RST_SET, MSS_MAS, val);
462+ } else {
463+ val = REG_CLR_FLD(VPU_37XX_HOST_SS_CPR_RST_SET, TOP_NOC, val);
464+ val = REG_CLR_FLD(VPU_37XX_HOST_SS_CPR_RST_SET, DSS_MAS, val);
465+ val = REG_CLR_FLD(VPU_37XX_HOST_SS_CPR_RST_SET, MSS_MAS, val);
466+ }
467+
468+ REGV_WR32(VPU_37XX_HOST_SS_CPR_RST_SET, val);
469+}
470+
471+static void host_ss_rst_drive_40xx(struct ivpu_device *vdev, bool enable)
472+{
473+ u32 val = REGV_RD32(VPU_40XX_HOST_SS_CPR_RST_EN);
474+
475+ if (enable) {
476+ val = REG_SET_FLD(VPU_40XX_HOST_SS_CPR_RST_EN, TOP_NOC, val);
477+ val = REG_SET_FLD(VPU_40XX_HOST_SS_CPR_RST_EN, DSS_MAS, val);
478+ val = REG_SET_FLD(VPU_40XX_HOST_SS_CPR_RST_EN, CSS_MAS, val);
479+ } else {
480+ val = REG_CLR_FLD(VPU_40XX_HOST_SS_CPR_RST_EN, TOP_NOC, val);
481+ val = REG_CLR_FLD(VPU_40XX_HOST_SS_CPR_RST_EN, DSS_MAS, val);
482+ val = REG_CLR_FLD(VPU_40XX_HOST_SS_CPR_RST_EN, CSS_MAS, val);
483+ }
484+
485+ REGV_WR32(VPU_40XX_HOST_SS_CPR_RST_EN, val);
486+}
487+
488+static void host_ss_rst_drive(struct ivpu_device *vdev, bool enable)
489+{
490+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
491+ host_ss_rst_drive_37xx(vdev, enable);
492+ else
493+ host_ss_rst_drive_40xx(vdev, enable);
494+}
495+
496+static void host_ss_rst_enable(struct ivpu_device *vdev)
497+{
498+ host_ss_rst_drive(vdev, true);
499+}
500+
501+static void host_ss_noc_qreqn_top_socmmio_drive_37xx(struct ivpu_device *vdev, bool enable)
502+{
503+ u32 val = REGV_RD32(VPU_37XX_HOST_SS_NOC_QREQN);
504+
505+ if (enable)
506+ val = REG_SET_FLD(VPU_37XX_HOST_SS_NOC_QREQN, TOP_SOCMMIO, val);
507+ else
508+ val = REG_CLR_FLD(VPU_37XX_HOST_SS_NOC_QREQN, TOP_SOCMMIO, val);
509+ REGV_WR32(VPU_37XX_HOST_SS_NOC_QREQN, val);
510+}
511+
512+static void host_ss_noc_qreqn_top_socmmio_drive_40xx(struct ivpu_device *vdev, bool enable)
513+{
514+ u32 val = REGV_RD32(VPU_40XX_HOST_SS_NOC_QREQN);
515+
516+ if (enable)
517+ val = REG_SET_FLD(VPU_40XX_HOST_SS_NOC_QREQN, TOP_SOCMMIO, val);
518+ else
519+ val = REG_CLR_FLD(VPU_40XX_HOST_SS_NOC_QREQN, TOP_SOCMMIO, val);
520+ REGV_WR32(VPU_40XX_HOST_SS_NOC_QREQN, val);
521+}
522+
523+static void host_ss_noc_qreqn_top_socmmio_drive(struct ivpu_device *vdev, bool enable)
524+{
525+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
526+ host_ss_noc_qreqn_top_socmmio_drive_37xx(vdev, enable);
527+ else
528+ host_ss_noc_qreqn_top_socmmio_drive_40xx(vdev, enable);
529+}
530+
531+static int host_ss_axi_drive(struct ivpu_device *vdev, bool enable)
532+{
533+ int ret;
534+
535+ host_ss_noc_qreqn_top_socmmio_drive(vdev, enable);
536+
537+ ret = host_ss_noc_qacceptn_check(vdev, enable ? 0x1 : 0x0);
538+ if (ret) {
539+ ivpu_err(vdev, "Failed HOST SS NOC QACCEPTN check: %d\n", ret);
540+ return ret;
541+ }
542+
543+ ret = host_ss_noc_qdeny_check(vdev, 0x0);
544+ if (ret)
545+ ivpu_err(vdev, "Failed HOST SS NOC QDENY check: %d\n", ret);
546+
547+ return ret;
548+}
549+
550+static void top_noc_qreqn_drive_40xx(struct ivpu_device *vdev, bool enable)
551+{
552+ u32 val = REGV_RD32(VPU_40XX_TOP_NOC_QREQN);
553+
554+ if (enable) {
555+ val = REG_SET_FLD(VPU_40XX_TOP_NOC_QREQN, CPU_CTRL, val);
556+ val = REG_SET_FLD(VPU_40XX_TOP_NOC_QREQN, HOSTIF_L2CACHE, val);
557+ } else {
558+ val = REG_CLR_FLD(VPU_40XX_TOP_NOC_QREQN, CPU_CTRL, val);
559+ val = REG_CLR_FLD(VPU_40XX_TOP_NOC_QREQN, HOSTIF_L2CACHE, val);
560+ }
561+
562+ REGV_WR32(VPU_40XX_TOP_NOC_QREQN, val);
563+}
564+
565+static void top_noc_qreqn_drive_37xx(struct ivpu_device *vdev, bool enable)
566+{
567+ u32 val = REGV_RD32(VPU_37XX_TOP_NOC_QREQN);
568+
569+ if (enable) {
570+ val = REG_SET_FLD(VPU_37XX_TOP_NOC_QREQN, CPU_CTRL, val);
571+ val = REG_SET_FLD(VPU_37XX_TOP_NOC_QREQN, HOSTIF_L2CACHE, val);
572+ } else {
573+ val = REG_CLR_FLD(VPU_37XX_TOP_NOC_QREQN, CPU_CTRL, val);
574+ val = REG_CLR_FLD(VPU_37XX_TOP_NOC_QREQN, HOSTIF_L2CACHE, val);
575+ }
576+
577+ REGV_WR32(VPU_37XX_TOP_NOC_QREQN, val);
578+}
579+
580+static void top_noc_qreqn_drive(struct ivpu_device *vdev, bool enable)
581+{
582+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
583+ top_noc_qreqn_drive_37xx(vdev, enable);
584+ else
585+ top_noc_qreqn_drive_40xx(vdev, enable);
586+}
587+
588+int ivpu_hw_ip_host_ss_axi_enable(struct ivpu_device *vdev)
589+{
590+ return host_ss_axi_drive(vdev, true);
591+}
592+
593+static int top_noc_qacceptn_check_37xx(struct ivpu_device *vdev, u32 exp_val)
594+{
595+ u32 val = REGV_RD32(VPU_37XX_TOP_NOC_QACCEPTN);
596+
597+ if (!REG_TEST_FLD_NUM(VPU_37XX_TOP_NOC_QACCEPTN, CPU_CTRL, exp_val, val) ||
598+ !REG_TEST_FLD_NUM(VPU_37XX_TOP_NOC_QACCEPTN, HOSTIF_L2CACHE, exp_val, val))
599+ return -EIO;
600+
601+ return 0;
602+}
603+
604+static int top_noc_qacceptn_check_40xx(struct ivpu_device *vdev, u32 exp_val)
605+{
606+ u32 val = REGV_RD32(VPU_40XX_TOP_NOC_QACCEPTN);
607+
608+ if (!REG_TEST_FLD_NUM(VPU_40XX_TOP_NOC_QACCEPTN, CPU_CTRL, exp_val, val) ||
609+ !REG_TEST_FLD_NUM(VPU_40XX_TOP_NOC_QACCEPTN, HOSTIF_L2CACHE, exp_val, val))
610+ return -EIO;
611+
612+ return 0;
613+}
614+
615+static int top_noc_qacceptn_check(struct ivpu_device *vdev, u32 exp_val)
616+{
617+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
618+ return top_noc_qacceptn_check_37xx(vdev, exp_val);
619+ else
620+ return top_noc_qacceptn_check_40xx(vdev, exp_val);
621+}
622+
623+static int top_noc_qdeny_check_37xx(struct ivpu_device *vdev, u32 exp_val)
624+{
625+ u32 val = REGV_RD32(VPU_37XX_TOP_NOC_QDENY);
626+
627+ if (!REG_TEST_FLD_NUM(VPU_37XX_TOP_NOC_QDENY, CPU_CTRL, exp_val, val) ||
628+ !REG_TEST_FLD_NUM(VPU_37XX_TOP_NOC_QDENY, HOSTIF_L2CACHE, exp_val, val))
629+ return -EIO;
630+
631+ return 0;
632+}
633+
634+static int top_noc_qdeny_check_40xx(struct ivpu_device *vdev, u32 exp_val)
635+{
636+ u32 val = REGV_RD32(VPU_40XX_TOP_NOC_QDENY);
637+
638+ if (!REG_TEST_FLD_NUM(VPU_40XX_TOP_NOC_QDENY, CPU_CTRL, exp_val, val) ||
639+ !REG_TEST_FLD_NUM(VPU_40XX_TOP_NOC_QDENY, HOSTIF_L2CACHE, exp_val, val))
640+ return -EIO;
641+
642+ return 0;
643+}
644+
645+static int top_noc_qdeny_check(struct ivpu_device *vdev, u32 exp_val)
646+{
647+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
648+ return top_noc_qdeny_check_37xx(vdev, exp_val);
649+ else
650+ return top_noc_qdeny_check_40xx(vdev, exp_val);
651+}
652+
653+static int top_noc_drive(struct ivpu_device *vdev, bool enable)
654+{
655+ int ret;
656+
657+ top_noc_qreqn_drive(vdev, enable);
658+
659+ ret = top_noc_qacceptn_check(vdev, enable ? 0x1 : 0x0);
660+ if (ret) {
661+ ivpu_err(vdev, "Failed TOP NOC QACCEPTN check: %d\n", ret);
662+ return ret;
663+ }
664+
665+ ret = top_noc_qdeny_check(vdev, 0x0);
666+ if (ret)
667+ ivpu_err(vdev, "Failed TOP NOC QDENY check: %d\n", ret);
668+
669+ return ret;
670+}
671+
672+int ivpu_hw_ip_top_noc_enable(struct ivpu_device *vdev)
673+{
674+ return top_noc_drive(vdev, true);
675+}
676+
677+static void dpu_active_drive_37xx(struct ivpu_device *vdev, bool enable)
678+{
679+ u32 val = REGV_RD32(VPU_37XX_HOST_SS_AON_DPU_ACTIVE);
680+
681+ if (enable)
682+ val = REG_SET_FLD(VPU_37XX_HOST_SS_AON_DPU_ACTIVE, DPU_ACTIVE, val);
683+ else
684+ val = REG_CLR_FLD(VPU_37XX_HOST_SS_AON_DPU_ACTIVE, DPU_ACTIVE, val);
685+
686+ REGV_WR32(VPU_37XX_HOST_SS_AON_DPU_ACTIVE, val);
687+}
688+
689+int ivpu_hw_ip_pwr_domain_enable(struct ivpu_device *vdev)
690+{
691+ int ret;
692+
693+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_50XX)
694+ pwr_island_delay_set_50xx(vdev);
695+
696+ pwr_island_enable(vdev);
697+
698+ ret = wait_for_pwr_island_status(vdev, 0x1);
699+ if (ret) {
700+ ivpu_err(vdev, "Timed out waiting for power island status\n");
701+ return ret;
702+ }
703+
704+ ret = top_noc_qreqn_check(vdev, 0x0);
705+ if (ret) {
706+ ivpu_err(vdev, "Failed TOP NOC QREQN check %d\n", ret);
707+ return ret;
708+ }
709+
710+ host_ss_clk_enable(vdev);
711+ pwr_island_isolation_disable(vdev);
712+ host_ss_rst_enable(vdev);
713+
714+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
715+ dpu_active_drive_37xx(vdev, true);
716+
717+ return ret;
718+}
719+
720+u64 ivpu_hw_ip_read_perf_timer_counter(struct ivpu_device *vdev)
721+{
722+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
723+ return REGV_RD64(VPU_37XX_CPU_SS_TIM_PERF_FREE_CNT);
724+ else
725+ return REGV_RD64(VPU_40XX_CPU_SS_TIM_PERF_EXT_FREE_CNT);
726+}
727+
728+static void ivpu_hw_ip_snoop_disable_37xx(struct ivpu_device *vdev)
729+{
730+ u32 val = REGV_RD32(VPU_37XX_HOST_IF_TCU_PTW_OVERRIDES);
731+
732+ val = REG_SET_FLD(VPU_37XX_HOST_IF_TCU_PTW_OVERRIDES, NOSNOOP_OVERRIDE_EN, val);
733+ val = REG_CLR_FLD(VPU_37XX_HOST_IF_TCU_PTW_OVERRIDES, AW_NOSNOOP_OVERRIDE, val);
734+
735+ if (ivpu_is_force_snoop_enabled(vdev))
736+ val = REG_CLR_FLD(VPU_37XX_HOST_IF_TCU_PTW_OVERRIDES, AR_NOSNOOP_OVERRIDE, val);
737+ else
738+ val = REG_SET_FLD(VPU_37XX_HOST_IF_TCU_PTW_OVERRIDES, AR_NOSNOOP_OVERRIDE, val);
739+
740+ REGV_WR32(VPU_37XX_HOST_IF_TCU_PTW_OVERRIDES, val);
741+}
742+
743+static void ivpu_hw_ip_snoop_disable_40xx(struct ivpu_device *vdev)
744+{
745+ u32 val = REGV_RD32(VPU_40XX_HOST_IF_TCU_PTW_OVERRIDES);
746+
747+ val = REG_SET_FLD(VPU_40XX_HOST_IF_TCU_PTW_OVERRIDES, SNOOP_OVERRIDE_EN, val);
748+ val = REG_SET_FLD(VPU_40XX_HOST_IF_TCU_PTW_OVERRIDES, AW_SNOOP_OVERRIDE, val);
749+
750+ if (ivpu_is_force_snoop_enabled(vdev))
751+ val = REG_SET_FLD(VPU_40XX_HOST_IF_TCU_PTW_OVERRIDES, AR_SNOOP_OVERRIDE, val);
752+ else
753+ val = REG_CLR_FLD(VPU_40XX_HOST_IF_TCU_PTW_OVERRIDES, AR_SNOOP_OVERRIDE, val);
754+
755+ REGV_WR32(VPU_40XX_HOST_IF_TCU_PTW_OVERRIDES, val);
756+}
757+
758+void ivpu_hw_ip_snoop_disable(struct ivpu_device *vdev)
759+{
760+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
761+ return ivpu_hw_ip_snoop_disable_37xx(vdev);
762+ else
763+ return ivpu_hw_ip_snoop_disable_40xx(vdev);
764+}
765+
766+static void ivpu_hw_ip_tbu_mmu_enable_37xx(struct ivpu_device *vdev)
767+{
768+ u32 val = REGV_RD32(VPU_37XX_HOST_IF_TBU_MMUSSIDV);
769+
770+ val = REG_SET_FLD(VPU_37XX_HOST_IF_TBU_MMUSSIDV, TBU0_AWMMUSSIDV, val);
771+ val = REG_SET_FLD(VPU_37XX_HOST_IF_TBU_MMUSSIDV, TBU0_ARMMUSSIDV, val);
772+ val = REG_SET_FLD(VPU_37XX_HOST_IF_TBU_MMUSSIDV, TBU2_AWMMUSSIDV, val);
773+ val = REG_SET_FLD(VPU_37XX_HOST_IF_TBU_MMUSSIDV, TBU2_ARMMUSSIDV, val);
774+
775+ REGV_WR32(VPU_37XX_HOST_IF_TBU_MMUSSIDV, val);
776+}
777+
778+static void ivpu_hw_ip_tbu_mmu_enable_40xx(struct ivpu_device *vdev)
779+{
780+ u32 val = REGV_RD32(VPU_40XX_HOST_IF_TBU_MMUSSIDV);
781+
782+ val = REG_SET_FLD(VPU_40XX_HOST_IF_TBU_MMUSSIDV, TBU0_AWMMUSSIDV, val);
783+ val = REG_SET_FLD(VPU_40XX_HOST_IF_TBU_MMUSSIDV, TBU0_ARMMUSSIDV, val);
784+ val = REG_SET_FLD(VPU_40XX_HOST_IF_TBU_MMUSSIDV, TBU1_AWMMUSSIDV, val);
785+ val = REG_SET_FLD(VPU_40XX_HOST_IF_TBU_MMUSSIDV, TBU1_ARMMUSSIDV, val);
786+ val = REG_SET_FLD(VPU_40XX_HOST_IF_TBU_MMUSSIDV, TBU2_AWMMUSSIDV, val);
787+ val = REG_SET_FLD(VPU_40XX_HOST_IF_TBU_MMUSSIDV, TBU2_ARMMUSSIDV, val);
788+
789+ REGV_WR32(VPU_40XX_HOST_IF_TBU_MMUSSIDV, val);
790+}
791+
792+void ivpu_hw_ip_tbu_mmu_enable(struct ivpu_device *vdev)
793+{
794+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
795+ return ivpu_hw_ip_tbu_mmu_enable_37xx(vdev);
796+ else
797+ return ivpu_hw_ip_tbu_mmu_enable_40xx(vdev);
798+}
799+
800+static int soc_cpu_boot_37xx(struct ivpu_device *vdev)
801+{
802+ u32 val;
803+
804+ val = REGV_RD32(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC);
805+ val = REG_SET_FLD(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC, IRQI_RSTRUN0, val);
806+
807+ val = REG_CLR_FLD(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC, IRQI_RSTVEC, val);
808+ REGV_WR32(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC, val);
809+
810+ val = REG_SET_FLD(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC, IRQI_RESUME0, val);
811+ REGV_WR32(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC, val);
812+
813+ val = REG_CLR_FLD(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC, IRQI_RESUME0, val);
814+ REGV_WR32(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC, val);
815+
816+ val = vdev->fw->entry_point >> 9;
817+ REGV_WR32(VPU_37XX_HOST_SS_LOADING_ADDRESS_LO, val);
818+
819+ val = REG_SET_FLD(VPU_37XX_HOST_SS_LOADING_ADDRESS_LO, DONE, val);
820+ REGV_WR32(VPU_37XX_HOST_SS_LOADING_ADDRESS_LO, val);
821+
822+ ivpu_dbg(vdev, PM, "Booting firmware, mode: %s\n",
823+ vdev->fw->entry_point == vdev->fw->cold_boot_entry_point ? "cold boot" : "resume");
824+
825+ return 0;
826+}
827+
828+static int cpu_noc_qacceptn_check_40xx(struct ivpu_device *vdev, u32 exp_val)
829+{
830+ u32 val = REGV_RD32(VPU_40XX_CPU_SS_CPR_NOC_QACCEPTN);
831+
832+ if (!REG_TEST_FLD_NUM(VPU_40XX_CPU_SS_CPR_NOC_QACCEPTN, TOP_MMIO, exp_val, val))
833+ return -EIO;
834+
835+ return 0;
836+}
837+
838+static int cpu_noc_qdeny_check_40xx(struct ivpu_device *vdev, u32 exp_val)
839+{
840+ u32 val = REGV_RD32(VPU_40XX_CPU_SS_CPR_NOC_QDENY);
841+
842+ if (!REG_TEST_FLD_NUM(VPU_40XX_CPU_SS_CPR_NOC_QDENY, TOP_MMIO, exp_val, val))
843+ return -EIO;
844+
845+ return 0;
846+}
847+
848+static void cpu_noc_top_mmio_drive_40xx(struct ivpu_device *vdev, bool enable)
849+{
850+ u32 val = REGV_RD32(VPU_40XX_CPU_SS_CPR_NOC_QREQN);
851+
852+ if (enable)
853+ val = REG_SET_FLD(VPU_40XX_CPU_SS_CPR_NOC_QREQN, TOP_MMIO, val);
854+ else
855+ val = REG_CLR_FLD(VPU_40XX_CPU_SS_CPR_NOC_QREQN, TOP_MMIO, val);
856+ REGV_WR32(VPU_40XX_CPU_SS_CPR_NOC_QREQN, val);
857+}
858+
859+static int soc_cpu_drive_40xx(struct ivpu_device *vdev, bool enable)
860+{
861+ int ret;
862+
863+ cpu_noc_top_mmio_drive_40xx(vdev, enable);
864+
865+ ret = cpu_noc_qacceptn_check_40xx(vdev, enable ? 0x1 : 0x0);
866+ if (ret) {
867+ ivpu_err(vdev, "Failed qacceptn check: %d\n", ret);
868+ return ret;
869+ }
870+
871+ ret = cpu_noc_qdeny_check_40xx(vdev, 0x0);
872+ if (ret)
873+ ivpu_err(vdev, "Failed qdeny check: %d\n", ret);
874+
875+ return ret;
876+}
877+
878+static int soc_cpu_enable(struct ivpu_device *vdev)
879+{
880+ return soc_cpu_drive_40xx(vdev, true);
881+}
882+
883+static int soc_cpu_boot_40xx(struct ivpu_device *vdev)
884+{
885+ int ret;
886+ u32 val;
887+ u64 val64;
888+
889+ ret = soc_cpu_enable(vdev);
890+ if (ret) {
891+ ivpu_err(vdev, "Failed to enable SOC CPU: %d\n", ret);
892+ return ret;
893+ }
894+
895+ val64 = vdev->fw->entry_point;
896+ val64 <<= ffs(VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO_IMAGE_LOCATION_MASK) - 1;
897+ REGV_WR64(VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO, val64);
898+
899+ val = REGV_RD32(VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO);
900+ val = REG_SET_FLD(VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO, DONE, val);
901+ REGV_WR32(VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO, val);
902+
903+ ivpu_dbg(vdev, PM, "Booting firmware, mode: %s\n",
904+ ivpu_fw_is_cold_boot(vdev) ? "cold boot" : "resume");
905+
906+ return 0;
907+}
908+
909+int ivpu_hw_ip_soc_cpu_boot(struct ivpu_device *vdev)
910+{
911+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
912+ return soc_cpu_boot_37xx(vdev);
913+ else
914+ return soc_cpu_boot_40xx(vdev);
915+}
916+
917+static void wdt_disable_37xx(struct ivpu_device *vdev)
918+{
919+ u32 val;
920+
921+ /* Enable writing and set non-zero WDT value */
922+ REGV_WR32(VPU_37XX_CPU_SS_TIM_SAFE, TIM_SAFE_ENABLE);
923+ REGV_WR32(VPU_37XX_CPU_SS_TIM_WATCHDOG, TIM_WATCHDOG_RESET_VALUE);
924+
925+ /* Enable writing and disable watchdog timer */
926+ REGV_WR32(VPU_37XX_CPU_SS_TIM_SAFE, TIM_SAFE_ENABLE);
927+ REGV_WR32(VPU_37XX_CPU_SS_TIM_WDOG_EN, 0);
928+
929+ /* Now clear the timeout interrupt */
930+ val = REGV_RD32(VPU_37XX_CPU_SS_TIM_GEN_CONFIG);
931+ val = REG_CLR_FLD(VPU_37XX_CPU_SS_TIM_GEN_CONFIG, WDOG_TO_INT_CLR, val);
932+ REGV_WR32(VPU_37XX_CPU_SS_TIM_GEN_CONFIG, val);
933+}
934+
935+static void wdt_disable_40xx(struct ivpu_device *vdev)
936+{
937+ u32 val;
938+
939+ REGV_WR32(VPU_40XX_CPU_SS_TIM_SAFE, TIM_SAFE_ENABLE);
940+ REGV_WR32(VPU_40XX_CPU_SS_TIM_WATCHDOG, TIM_WATCHDOG_RESET_VALUE);
941+
942+ REGV_WR32(VPU_40XX_CPU_SS_TIM_SAFE, TIM_SAFE_ENABLE);
943+ REGV_WR32(VPU_40XX_CPU_SS_TIM_WDOG_EN, 0);
944+
945+ val = REGV_RD32(VPU_40XX_CPU_SS_TIM_GEN_CONFIG);
946+ val = REG_CLR_FLD(VPU_40XX_CPU_SS_TIM_GEN_CONFIG, WDOG_TO_INT_CLR, val);
947+ REGV_WR32(VPU_40XX_CPU_SS_TIM_GEN_CONFIG, val);
948+}
949+
950+void ivpu_hw_ip_wdt_disable(struct ivpu_device *vdev)
951+{
952+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
953+ return wdt_disable_37xx(vdev);
954+ else
955+ return wdt_disable_40xx(vdev);
956+}
957+
958+static u32 ipc_rx_count_get_37xx(struct ivpu_device *vdev)
959+{
960+ u32 count = REGV_RD32_SILENT(VPU_37XX_HOST_SS_TIM_IPC_FIFO_STAT);
961+
962+ return REG_GET_FLD(VPU_37XX_HOST_SS_TIM_IPC_FIFO_STAT, FILL_LEVEL, count);
963+}
964+
965+static u32 ipc_rx_count_get_40xx(struct ivpu_device *vdev)
966+{
967+ u32 count = REGV_RD32_SILENT(VPU_40XX_HOST_SS_TIM_IPC_FIFO_STAT);
968+
969+ return REG_GET_FLD(VPU_40XX_HOST_SS_TIM_IPC_FIFO_STAT, FILL_LEVEL, count);
970+}
971+
972+u32 ivpu_hw_ip_ipc_rx_count_get(struct ivpu_device *vdev)
973+{
974+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
975+ return ipc_rx_count_get_37xx(vdev);
976+ else
977+ return ipc_rx_count_get_40xx(vdev);
978+}
979+
980+void ivpu_hw_ip_irq_enable(struct ivpu_device *vdev)
981+{
982+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX) {
983+ REGV_WR32(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, ITF_FIREWALL_VIOLATION_MASK_37XX);
984+ REGV_WR64(VPU_37XX_HOST_SS_ICB_ENABLE_0, ICB_0_1_IRQ_MASK_37XX);
985+ } else {
986+ REGV_WR32(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, ITF_FIREWALL_VIOLATION_MASK_40XX);
987+ REGV_WR64(VPU_40XX_HOST_SS_ICB_ENABLE_0, ICB_0_1_IRQ_MASK_40XX);
988+ }
989+}
990+
991+void ivpu_hw_ip_irq_disable(struct ivpu_device *vdev)
992+{
993+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX) {
994+ REGV_WR64(VPU_37XX_HOST_SS_ICB_ENABLE_0, 0x0ull);
995+ REGV_WR32(VPU_37XX_HOST_SS_FW_SOC_IRQ_EN, 0x0);
996+ } else {
997+ REGV_WR64(VPU_40XX_HOST_SS_ICB_ENABLE_0, 0x0ull);
998+ REGV_WR32(VPU_40XX_HOST_SS_FW_SOC_IRQ_EN, 0x0ul);
999+ }
1000+}
1001+
1002+static void diagnose_failure_37xx(struct ivpu_device *vdev)
1003+{
1004+ u32 reg = REGV_RD32(VPU_37XX_HOST_SS_ICB_STATUS_0) & ICB_0_IRQ_MASK_37XX;
1005+
1006+ if (ipc_rx_count_get_37xx(vdev))
1007+ ivpu_err(vdev, "IPC FIFO queue not empty, missed IPC IRQ");
1008+
1009+ if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_0_INT, reg))
1010+ ivpu_err(vdev, "WDT MSS timeout detected\n");
1011+
1012+ if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_1_INT, reg))
1013+ ivpu_err(vdev, "WDT NCE timeout detected\n");
1014+
1015+ if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, NOC_FIREWALL_INT, reg))
1016+ ivpu_err(vdev, "NOC Firewall irq detected\n");
1017+}
1018+
1019+static void diagnose_failure_40xx(struct ivpu_device *vdev)
1020+{
1021+ u32 reg = REGV_RD32(VPU_40XX_HOST_SS_ICB_STATUS_0) & ICB_0_IRQ_MASK_40XX;
1022+
1023+ if (ipc_rx_count_get_40xx(vdev))
1024+ ivpu_err(vdev, "IPC FIFO queue not empty, missed IPC IRQ");
1025+
1026+ if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_0_INT, reg))
1027+ ivpu_err(vdev, "WDT MSS timeout detected\n");
1028+
1029+ if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_1_INT, reg))
1030+ ivpu_err(vdev, "WDT NCE timeout detected\n");
1031+
1032+ if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, NOC_FIREWALL_INT, reg))
1033+ ivpu_err(vdev, "NOC Firewall irq detected\n");
1034+}
1035+
1036+void ivpu_hw_ip_diagnose_failure(struct ivpu_device *vdev)
1037+{
1038+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
1039+ diagnose_failure_37xx(vdev);
1040+ else
1041+ diagnose_failure_40xx(vdev);
1042+}
1043+
1044+void ivpu_hw_ip_irq_clear(struct ivpu_device *vdev)
1045+{
1046+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
1047+ REGV_WR64(VPU_37XX_HOST_SS_ICB_CLEAR_0, ICB_0_1_IRQ_MASK_37XX);
1048+ else
1049+ REGV_WR64(VPU_40XX_HOST_SS_ICB_CLEAR_0, ICB_0_1_IRQ_MASK_40XX);
1050+}
1051+
1052+static void irq_wdt_nce_handler(struct ivpu_device *vdev)
1053+{
1054+ ivpu_pm_trigger_recovery(vdev, "WDT NCE IRQ");
1055+}
1056+
1057+static void irq_wdt_mss_handler(struct ivpu_device *vdev)
1058+{
1059+ ivpu_hw_ip_wdt_disable(vdev);
1060+ ivpu_pm_trigger_recovery(vdev, "WDT MSS IRQ");
1061+}
1062+
1063+static void irq_noc_firewall_handler(struct ivpu_device *vdev)
1064+{
1065+ ivpu_pm_trigger_recovery(vdev, "NOC Firewall IRQ");
1066+}
1067+
1068+/* Handler for IRQs from NPU core */
1069+bool ivpu_hw_ip_irq_handler_37xx(struct ivpu_device *vdev, int irq)
1070+{
1071+ u32 status = REGV_RD32(VPU_37XX_HOST_SS_ICB_STATUS_0) & ICB_0_IRQ_MASK_37XX;
1072+
1073+ if (!status)
1074+ return false;
1075+
1076+ REGV_WR32(VPU_37XX_HOST_SS_ICB_CLEAR_0, status);
1077+
1078+ if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_0_INT, status))
1079+ ivpu_mmu_irq_evtq_handler(vdev);
1080+
1081+ if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, HOST_IPC_FIFO_INT, status))
1082+ ivpu_ipc_irq_handler(vdev);
1083+
1084+ if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_1_INT, status))
1085+ ivpu_dbg(vdev, IRQ, "MMU sync complete\n");
1086+
1087+ if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_2_INT, status))
1088+ ivpu_mmu_irq_gerr_handler(vdev);
1089+
1090+ if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_0_INT, status))
1091+ irq_wdt_mss_handler(vdev);
1092+
1093+ if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_1_INT, status))
1094+ irq_wdt_nce_handler(vdev);
1095+
1096+ if (REG_TEST_FLD(VPU_37XX_HOST_SS_ICB_STATUS_0, NOC_FIREWALL_INT, status))
1097+ irq_noc_firewall_handler(vdev);
1098+
1099+ return true;
1100+}
1101+
1102+/* Handler for IRQs from NPU core */
1103+bool ivpu_hw_ip_irq_handler_40xx(struct ivpu_device *vdev, int irq)
1104+{
1105+ u32 status = REGV_RD32(VPU_40XX_HOST_SS_ICB_STATUS_0) & ICB_0_IRQ_MASK_40XX;
1106+
1107+ if (!status)
1108+ return false;
1109+
1110+ REGV_WR32(VPU_40XX_HOST_SS_ICB_CLEAR_0, status);
1111+
1112+ if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_0_INT, status))
1113+ ivpu_mmu_irq_evtq_handler(vdev);
1114+
1115+ if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, HOST_IPC_FIFO_INT, status))
1116+ ivpu_ipc_irq_handler(vdev);
1117+
1118+ if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_1_INT, status))
1119+ ivpu_dbg(vdev, IRQ, "MMU sync complete\n");
1120+
1121+ if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, MMU_IRQ_2_INT, status))
1122+ ivpu_mmu_irq_gerr_handler(vdev);
1123+
1124+ if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_0_INT, status))
1125+ irq_wdt_mss_handler(vdev);
1126+
1127+ if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, CPU_INT_REDIRECT_1_INT, status))
1128+ irq_wdt_nce_handler(vdev);
1129+
1130+ if (REG_TEST_FLD(VPU_40XX_HOST_SS_ICB_STATUS_0, NOC_FIREWALL_INT, status))
1131+ irq_noc_firewall_handler(vdev);
1132+
1133+ return true;
1134+}
1135+
1136+static void db_set_37xx(struct ivpu_device *vdev, u32 db_id)
1137+{
1138+ u32 reg_stride = VPU_37XX_CPU_SS_DOORBELL_1 - VPU_37XX_CPU_SS_DOORBELL_0;
1139+ u32 val = REG_FLD(VPU_37XX_CPU_SS_DOORBELL_0, SET);
1140+
1141+ REGV_WR32I(VPU_37XX_CPU_SS_DOORBELL_0, reg_stride, db_id, val);
1142+}
1143+
1144+static void db_set_40xx(struct ivpu_device *vdev, u32 db_id)
1145+{
1146+ u32 reg_stride = VPU_40XX_CPU_SS_DOORBELL_1 - VPU_40XX_CPU_SS_DOORBELL_0;
1147+ u32 val = REG_FLD(VPU_40XX_CPU_SS_DOORBELL_0, SET);
1148+
1149+ REGV_WR32I(VPU_40XX_CPU_SS_DOORBELL_0, reg_stride, db_id, val);
1150+}
1151+
1152+void ivpu_hw_ip_db_set(struct ivpu_device *vdev, u32 db_id)
1153+{
1154+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
1155+ db_set_37xx(vdev, db_id);
1156+ else
1157+ db_set_40xx(vdev, db_id);
1158+}
1159+
1160+u32 ivpu_hw_ip_ipc_rx_addr_get(struct ivpu_device *vdev)
1161+{
1162+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
1163+ return REGV_RD32(VPU_37XX_HOST_SS_TIM_IPC_FIFO_ATM);
1164+ else
1165+ return REGV_RD32(VPU_40XX_HOST_SS_TIM_IPC_FIFO_ATM);
1166+}
1167+
1168+void ivpu_hw_ip_ipc_tx_set(struct ivpu_device *vdev, u32 vpu_addr)
1169+{
1170+ if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
1171+ REGV_WR32(VPU_37XX_CPU_SS_TIM_IPC_FIFO, vpu_addr);
1172+ else
1173+ REGV_WR32(VPU_40XX_CPU_SS_TIM_IPC_FIFO, vpu_addr);
1174+}
drivers/accel/ivpu/ivpu_hw_ip.h+36−0
@@ -0,0 +1,36 @@
1+/* SPDX-License-Identifier: GPL-2.0-only */
2+/*
3+ * Copyright (C) 2020-2024 Intel Corporation
4+ */
5+
6+#ifndef __IVPU_HW_IP_H__
7+#define __IVPU_HW_IP_H__
8+
9+#include "ivpu_drv.h"
10+
11+int ivpu_hw_ip_host_ss_configure(struct ivpu_device *vdev);
12+void ivpu_hw_ip_idle_gen_enable(struct ivpu_device *vdev);
13+void ivpu_hw_ip_idle_gen_disable(struct ivpu_device *vdev);
14+int ivpu_hw_ip_pwr_domain_enable(struct ivpu_device *vdev);
15+int ivpu_hw_ip_host_ss_axi_enable(struct ivpu_device *vdev);
16+int ivpu_hw_ip_top_noc_enable(struct ivpu_device *vdev);
17+u64 ivpu_hw_ip_read_perf_timer_counter(struct ivpu_device *vdev);
18+void ivpu_hw_ip_snoop_disable(struct ivpu_device *vdev);
19+void ivpu_hw_ip_tbu_mmu_enable(struct ivpu_device *vdev);
20+int ivpu_hw_ip_soc_cpu_boot(struct ivpu_device *vdev);
21+void ivpu_hw_ip_wdt_disable(struct ivpu_device *vdev);
22+void ivpu_hw_ip_diagnose_failure(struct ivpu_device *vdev);
23+u32 ivpu_hw_ip_ipc_rx_count_get(struct ivpu_device *vdev);
24+void ivpu_hw_ip_irq_clear(struct ivpu_device *vdev);
25+bool ivpu_hw_ip_irq_handler_37xx(struct ivpu_device *vdev, int irq);
26+bool ivpu_hw_ip_irq_handler_40xx(struct ivpu_device *vdev, int irq);
27+void ivpu_hw_ip_db_set(struct ivpu_device *vdev, u32 db_id);
28+u32 ivpu_hw_ip_ipc_rx_addr_get(struct ivpu_device *vdev);
29+void ivpu_hw_ip_ipc_tx_set(struct ivpu_device *vdev, u32 vpu_addr);
30+void ivpu_hw_ip_irq_enable(struct ivpu_device *vdev);
31+void ivpu_hw_ip_irq_disable(struct ivpu_device *vdev);
32+void ivpu_hw_ip_diagnose_failure(struct ivpu_device *vdev);
33+void ivpu_hw_ip_fabric_req_override_enable_50xx(struct ivpu_device *vdev);
34+void ivpu_hw_ip_fabric_req_override_disable_50xx(struct ivpu_device *vdev);
35+
36+#endif /* __IVPU_HW_IP_H__ */
drivers/accel/ivpu/ivpu_ipc.c+9−11
@@ -129,7 +129,7 @@ static void ivpu_ipc_tx_release(struct ivpu_device *vdev, u32 vpu_addr) · 128 unmodified lines
129129
130130 static void ivpu_ipc_tx(struct ivpu_device *vdev, u32 vpu_addr)
131131 {
132− ivpu_hw_reg_ipc_tx_set(vdev, vpu_addr);
132+ ivpu_hw_ipc_tx_set(vdev, vpu_addr);
133133 }
134134
135135 static void
@@ -210,8 +210,7 @@ void ivpu_ipc_consumer_del(struct ivpu_device *vdev, struct ivpu_ipc_consumer *c · 74 unmodified lines
210210 ivpu_ipc_tx_release(vdev, cons->tx_vpu_addr);
211211 }
212212
213−static int
214−ivpu_ipc_send(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons, struct vpu_jsm_msg *req)
213+int ivpu_ipc_send(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons, struct vpu_jsm_msg *req)
215214 {
216215 struct ivpu_ipc_info *ipc = vdev->ipc;
217216 int ret;
@@ -378,7 +377,7 @@ ivpu_ipc_match_consumer(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons · 160 unmodified lines
378377 return false;
379378 }
380379
381−void ivpu_ipc_irq_handler(struct ivpu_device *vdev, bool *wake_thread)
380+void ivpu_ipc_irq_handler(struct ivpu_device *vdev)
382381 {
383382 struct ivpu_ipc_info *ipc = vdev->ipc;
384383 struct ivpu_ipc_consumer *cons;
@@ -392,8 +391,8 @@ void ivpu_ipc_irq_handler(struct ivpu_device *vdev, bool *wake_thread) · 7 unmodified lines
392391 * Driver needs to purge all messages from IPC FIFO to clear IPC interrupt.
393392 * Without purge IPC FIFO to 0 next IPC interrupts won't be generated.
394393 */
395− while (ivpu_hw_reg_ipc_rx_count_get(vdev)) {
396− vpu_addr = ivpu_hw_reg_ipc_rx_addr_get(vdev);
394+ while (ivpu_hw_ipc_rx_count_get(vdev)) {
395+ vpu_addr = ivpu_hw_ipc_rx_addr_get(vdev);
397396 if (vpu_addr == REG_IO_ERROR) {
398397 ivpu_err_ratelimited(vdev, "Failed to read IPC rx addr register\n");
399398 return;
@@ -442,11 +441,12 @@ void ivpu_ipc_irq_handler(struct ivpu_device *vdev, bool *wake_thread) · 42 unmodified lines
442441 }
443442 }
444443
445− if (wake_thread)
446− *wake_thread = !list_empty(&ipc->cb_msg_list);
444+ if (!list_empty(&ipc->cb_msg_list))
445+ if (!kfifo_put(&vdev->hw->irq.fifo, IVPU_HW_IRQ_SRC_IPC))
446+ ivpu_err_ratelimited(vdev, "IRQ FIFO full\n");
447447 }
448448
449−irqreturn_t ivpu_ipc_irq_thread_handler(struct ivpu_device *vdev)
449+void ivpu_ipc_irq_thread_handler(struct ivpu_device *vdev)
450450 {
451451 struct ivpu_ipc_info *ipc = vdev->ipc;
452452 struct ivpu_ipc_rx_msg *rx_msg, *r;
@@ -462,8 +462,6 @@ irqreturn_t ivpu_ipc_irq_thread_handler(struct ivpu_device *vdev) · 9 unmodified lines
462462 rx_msg->callback(vdev, rx_msg->ipc_hdr, rx_msg->jsm_msg);
463463 ivpu_ipc_rx_msg_del(vdev, rx_msg);
464464 }
465−
466− return IRQ_HANDLED;
467465 }
468466
469467 int ivpu_ipc_init(struct ivpu_device *vdev)
drivers/accel/ivpu/ivpu_ipc.h+5−3
@@ -1,6 +1,6 @@
11 /* SPDX-License-Identifier: GPL-2.0-only */
22 /*
3− * Copyright (C) 2020-2023 Intel Corporation
3+ * Copyright (C) 2020-2024 Intel Corporation
44 */
55
66 #ifndef __IVPU_IPC_H__
@@ -89,13 +89,15 @@ void ivpu_ipc_enable(struct ivpu_device *vdev); · 82 unmodified lines
8989 void ivpu_ipc_disable(struct ivpu_device *vdev);
9090 void ivpu_ipc_reset(struct ivpu_device *vdev);
9191
92−void ivpu_ipc_irq_handler(struct ivpu_device *vdev, bool *wake_thread);
93−irqreturn_t ivpu_ipc_irq_thread_handler(struct ivpu_device *vdev);
92+void ivpu_ipc_irq_handler(struct ivpu_device *vdev);
93+void ivpu_ipc_irq_thread_handler(struct ivpu_device *vdev);
9494
9595 void ivpu_ipc_consumer_add(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons,
9696 u32 channel, ivpu_ipc_rx_callback_t callback);
9797 void ivpu_ipc_consumer_del(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons);
9898
99+int ivpu_ipc_send(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons,
100+ struct vpu_jsm_msg *req);
99101 int ivpu_ipc_receive(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons,
100102 struct ivpu_ipc_hdr *ipc_buf, struct vpu_jsm_msg *jsm_msg,
101103 unsigned long timeout_ms);
drivers/accel/ivpu/ivpu_job.c+263−61
@@ -1,6 +1,6 @@
11 // SPDX-License-Identifier: GPL-2.0-only
22 /*
3− * Copyright (C) 2020-2023 Intel Corporation
3+ * Copyright (C) 2020-2024 Intel Corporation
44 */
55
66 #include <drm/drm_file.h>
@@ -12,11 +12,13 @@ · 5 unmodified lines
1212 #include <uapi/drm/ivpu_accel.h>
1313
1414 #include "ivpu_drv.h"
15+#include "ivpu_fw.h"
1516 #include "ivpu_hw.h"
1617 #include "ivpu_ipc.h"
1718 #include "ivpu_job.h"
1819 #include "ivpu_jsm_msg.h"
1920 #include "ivpu_pm.h"
21+#include "vpu_boot_api.h"
2022
2123 #define CMD_BUF_IDX 0
2224 #define JOB_ID_JOB_MASK GENMASK(7, 0)
@@ -25,14 +27,60 @@ · 2 unmodified lines
2527
2628 static void ivpu_cmdq_ring_db(struct ivpu_device *vdev, struct ivpu_cmdq *cmdq)
2729 {
28− ivpu_hw_reg_db_set(vdev, cmdq->db_id);
30+ ivpu_hw_db_set(vdev, cmdq->db_id);
2931 }
3032
31−static struct ivpu_cmdq *ivpu_cmdq_alloc(struct ivpu_file_priv *file_priv, u16 engine)
33+static int ivpu_preemption_buffers_create(struct ivpu_device *vdev,
34+ struct ivpu_file_priv *file_priv, struct ivpu_cmdq *cmdq)
35+{
36+ u64 primary_size = ALIGN(vdev->fw->primary_preempt_buf_size, PAGE_SIZE);
37+ u64 secondary_size = ALIGN(vdev->fw->secondary_preempt_buf_size, PAGE_SIZE);
38+ struct ivpu_addr_range range;
39+
40+ if (vdev->hw->sched_mode != VPU_SCHEDULING_MODE_HW)
41+ return 0;
42+
43+ range.start = vdev->hw->ranges.user.end - (primary_size * IVPU_NUM_CMDQS_PER_CTX);
44+ range.end = vdev->hw->ranges.user.end;
45+ cmdq->primary_preempt_buf = ivpu_bo_create(vdev, &file_priv->ctx, &range, primary_size,
46+ DRM_IVPU_BO_WC);
47+ if (!cmdq->primary_preempt_buf) {
48+ ivpu_err(vdev, "Failed to create primary preemption buffer\n");
49+ return -ENOMEM;
50+ }
51+
52+ range.start = vdev->hw->ranges.shave.end - (secondary_size * IVPU_NUM_CMDQS_PER_CTX);
53+ range.end = vdev->hw->ranges.shave.end;
54+ cmdq->secondary_preempt_buf = ivpu_bo_create(vdev, &file_priv->ctx, &range, secondary_size,
55+ DRM_IVPU_BO_WC);
56+ if (!cmdq->secondary_preempt_buf) {
57+ ivpu_err(vdev, "Failed to create secondary preemption buffer\n");
58+ goto err_free_primary;
59+ }
60+
61+ return 0;
62+
63+err_free_primary:
64+ ivpu_bo_free(cmdq->primary_preempt_buf);
65+ return -ENOMEM;
66+}
67+
68+static void ivpu_preemption_buffers_free(struct ivpu_device *vdev,
69+ struct ivpu_file_priv *file_priv, struct ivpu_cmdq *cmdq)
70+{
71+ if (vdev->hw->sched_mode != VPU_SCHEDULING_MODE_HW)
72+ return;
73+
74+ drm_WARN_ON(&vdev->drm, !cmdq->primary_preempt_buf);
75+ drm_WARN_ON(&vdev->drm, !cmdq->secondary_preempt_buf);
76+ ivpu_bo_free(cmdq->primary_preempt_buf);
77+ ivpu_bo_free(cmdq->secondary_preempt_buf);
78+}
79+
80+static struct ivpu_cmdq *ivpu_cmdq_alloc(struct ivpu_file_priv *file_priv)
3281 {
3382 struct xa_limit db_xa_limit = {.max = IVPU_MAX_DB, .min = IVPU_MIN_DB};
3483 struct ivpu_device *vdev = file_priv->vdev;
35− struct vpu_job_queue_header *jobq_header;
3684 struct ivpu_cmdq *cmdq;
3785 int ret;
3886
@@ -50,18 +98,14 @@ static struct ivpu_cmdq *ivpu_cmdq_alloc(struct ivpu_file_priv *file_priv, u16 e · 11 unmodified lines
5098 if (!cmdq->mem)
5199 goto err_erase_xa;
52100
53− cmdq->entry_count = (u32)((ivpu_bo_size(cmdq->mem) - sizeof(struct vpu_job_queue_header)) /
54− sizeof(struct vpu_job_queue_entry));
55−
56− cmdq->jobq = (struct vpu_job_queue *)ivpu_bo_vaddr(cmdq->mem);
57− jobq_header = &cmdq->jobq->header;
58− jobq_header->engine_idx = engine;
59− jobq_header->head = 0;
60− jobq_header->tail = 0;
61− wmb(); /* Flush WC buffer for jobq->header */
101+ ret = ivpu_preemption_buffers_create(vdev, file_priv, cmdq);
102+ if (ret)
103+ goto err_free_cmdq_mem;
62104
63105 return cmdq;
64106
107+err_free_cmdq_mem:
108+ ivpu_bo_free(cmdq->mem);
65109 err_erase_xa:
66110 xa_erase(&vdev->db_xa, cmdq->db_id);
67111 err_free_cmdq:
@@ -74,92 +118,183 @@ static void ivpu_cmdq_free(struct ivpu_file_priv *file_priv, struct ivpu_cmdq *c · 6 unmodified lines
74118 if (!cmdq)
75119 return;
76120
121+ ivpu_preemption_buffers_free(file_priv->vdev, file_priv, cmdq);
77122 ivpu_bo_free(cmdq->mem);
78123 xa_erase(&file_priv->vdev->db_xa, cmdq->db_id);
79124 kfree(cmdq);
80125 }
81126
82−static struct ivpu_cmdq *ivpu_cmdq_acquire(struct ivpu_file_priv *file_priv, u16 engine)
127+static int ivpu_hws_cmdq_init(struct ivpu_file_priv *file_priv, struct ivpu_cmdq *cmdq, u16 engine,
128+ u8 priority)
83129 {
84130 struct ivpu_device *vdev = file_priv->vdev;
85− struct ivpu_cmdq *cmdq = file_priv->cmdq[engine];
131+ int ret;
132+
133+ ret = ivpu_jsm_hws_create_cmdq(vdev, file_priv->ctx.id, file_priv->ctx.id, cmdq->db_id,
134+ task_pid_nr(current), engine,
135+ cmdq->mem->vpu_addr, ivpu_bo_size(cmdq->mem));
136+ if (ret)
137+ return ret;
138+
139+ ret = ivpu_jsm_hws_set_context_sched_properties(vdev, file_priv->ctx.id, cmdq->db_id,
140+ priority);
141+ if (ret)
142+ return ret;
143+
144+ return 0;
145+}
146+
147+static int ivpu_register_db(struct ivpu_file_priv *file_priv, struct ivpu_cmdq *cmdq)
148+{
149+ struct ivpu_device *vdev = file_priv->vdev;
150+ int ret;
151+
152+ if (vdev->hw->sched_mode == VPU_SCHEDULING_MODE_HW)
153+ ret = ivpu_jsm_hws_register_db(vdev, file_priv->ctx.id, cmdq->db_id, cmdq->db_id,
154+ cmdq->mem->vpu_addr, ivpu_bo_size(cmdq->mem));
155+ else
156+ ret = ivpu_jsm_register_db(vdev, file_priv->ctx.id, cmdq->db_id,
157+ cmdq->mem->vpu_addr, ivpu_bo_size(cmdq->mem));
158+
159+ if (!ret)
160+ ivpu_dbg(vdev, JOB, "DB %d registered to ctx %d\n", cmdq->db_id, file_priv->ctx.id);
161+
162+ return ret;
163+}
164+
165+static int
166+ivpu_cmdq_init(struct ivpu_file_priv *file_priv, struct ivpu_cmdq *cmdq, u16 engine, u8 priority)
167+{
168+ struct ivpu_device *vdev = file_priv->vdev;
169+ struct vpu_job_queue_header *jobq_header;
170+ int ret;
171+
172+ lockdep_assert_held(&file_priv->lock);
173+
174+ if (cmdq->db_registered)
175+ return 0;
176+
177+ cmdq->entry_count = (u32)((ivpu_bo_size(cmdq->mem) - sizeof(struct vpu_job_queue_header)) /
178+ sizeof(struct vpu_job_queue_entry));
179+
180+ cmdq->jobq = (struct vpu_job_queue *)ivpu_bo_vaddr(cmdq->mem);
181+ jobq_header = &cmdq->jobq->header;
182+ jobq_header->engine_idx = engine;
183+ jobq_header->head = 0;
184+ jobq_header->tail = 0;
185+ wmb(); /* Flush WC buffer for jobq->header */
186+
187+ if (vdev->hw->sched_mode == VPU_SCHEDULING_MODE_HW) {
188+ ret = ivpu_hws_cmdq_init(file_priv, cmdq, engine, priority);
189+ if (ret)
190+ return ret;
191+ }
192+
193+ ret = ivpu_register_db(file_priv, cmdq);
194+ if (ret)
195+ return ret;
196+
197+ cmdq->db_registered = true;
198+
199+ return 0;
200+}
201+
202+static int ivpu_cmdq_fini(struct ivpu_file_priv *file_priv, struct ivpu_cmdq *cmdq)
203+{
204+ struct ivpu_device *vdev = file_priv->vdev;
205+ int ret;
206+
207+ lockdep_assert_held(&file_priv->lock);
208+
209+ if (!cmdq->db_registered)
210+ return 0;
211+
212+ cmdq->db_registered = false;
213+
214+ if (vdev->hw->sched_mode == VPU_SCHEDULING_MODE_HW) {
215+ ret = ivpu_jsm_hws_destroy_cmdq(vdev, file_priv->ctx.id, cmdq->db_id);
216+ if (!ret)
217+ ivpu_dbg(vdev, JOB, "Command queue %d destroyed\n", cmdq->db_id);
218+ }
219+
220+ ret = ivpu_jsm_unregister_db(vdev, cmdq->db_id);
221+ if (!ret)
222+ ivpu_dbg(vdev, JOB, "DB %d unregistered\n", cmdq->db_id);
223+
224+ return 0;
225+}
226+
227+static struct ivpu_cmdq *ivpu_cmdq_acquire(struct ivpu_file_priv *file_priv, u16 engine,
228+ u8 priority)
229+{
230+ int cmdq_idx = IVPU_CMDQ_INDEX(engine, priority);
231+ struct ivpu_cmdq *cmdq = file_priv->cmdq[cmdq_idx];
86232 int ret;
87233
88234 lockdep_assert_held(&file_priv->lock);
89235
90236 if (!cmdq) {
91− cmdq = ivpu_cmdq_alloc(file_priv, engine);
237+ cmdq = ivpu_cmdq_alloc(file_priv);
92238 if (!cmdq)
93239 return NULL;
94− file_priv->cmdq[engine] = cmdq;
240+ file_priv->cmdq[cmdq_idx] = cmdq;
95241 }
96242
97− if (cmdq->db_registered)
98− return cmdq;
99−
100− ret = ivpu_jsm_register_db(vdev, file_priv->ctx.id, cmdq->db_id,
101− cmdq->mem->vpu_addr, ivpu_bo_size(cmdq->mem));
243+ ret = ivpu_cmdq_init(file_priv, cmdq, engine, priority);
102244 if (ret)
103245 return NULL;
104246
105− cmdq->db_registered = true;
106−
107247 return cmdq;
108248 }
109249
110−static void ivpu_cmdq_release_locked(struct ivpu_file_priv *file_priv, u16 engine)
250+static void ivpu_cmdq_release_locked(struct ivpu_file_priv *file_priv, u16 engine, u8 priority)
111251 {
112− struct ivpu_cmdq *cmdq = file_priv->cmdq[engine];
252+ int cmdq_idx = IVPU_CMDQ_INDEX(engine, priority);
253+ struct ivpu_cmdq *cmdq = file_priv->cmdq[cmdq_idx];
113254
114255 lockdep_assert_held(&file_priv->lock);
115256
116257 if (cmdq) {
117− file_priv->cmdq[engine] = NULL;
118− if (cmdq->db_registered)
119− ivpu_jsm_unregister_db(file_priv->vdev, cmdq->db_id);
120−
258+ file_priv->cmdq[cmdq_idx] = NULL;
259+ ivpu_cmdq_fini(file_priv, cmdq);
121260 ivpu_cmdq_free(file_priv, cmdq);
122261 }
123262 }
124263
125264 void ivpu_cmdq_release_all_locked(struct ivpu_file_priv *file_priv)
126265 {
127− int i;
266+ u16 engine;
267+ u8 priority;
128268
129269 lockdep_assert_held(&file_priv->lock);
130270
131− for (i = 0; i < IVPU_NUM_ENGINES; i++)
132− ivpu_cmdq_release_locked(file_priv, i);
271+ for (engine = 0; engine < IVPU_NUM_ENGINES; engine++)
272+ for (priority = 0; priority < IVPU_NUM_PRIORITIES; priority++)
273+ ivpu_cmdq_release_locked(file_priv, engine, priority);
133274 }
134275
135276 /*
136− * Mark the doorbell as unregistered and reset job queue pointers.
277+ * Mark the doorbell as unregistered
137278 * This function needs to be called when the VPU hardware is restarted
138279 * and FW loses job queue state. The next time job queue is used it
139280 * will be registered again.
140281 */
141−static void ivpu_cmdq_reset_locked(struct ivpu_file_priv *file_priv, u16 engine)
142−{
143− struct ivpu_cmdq *cmdq = file_priv->cmdq[engine];
144−
145− lockdep_assert_held(&file_priv->lock);
146−
147− if (cmdq) {
148− cmdq->db_registered = false;
149− cmdq->jobq->header.head = 0;
150− cmdq->jobq->header.tail = 0;
151− wmb(); /* Flush WC buffer for jobq header */
152− }
153−}
154−
155−static void ivpu_cmdq_reset_all(struct ivpu_file_priv *file_priv)
282+static void ivpu_cmdq_reset(struct ivpu_file_priv *file_priv)
156283 {
157− int i;
284+ u16 engine;
285+ u8 priority;
158286
159287 mutex_lock(&file_priv->lock);
160288
161− for (i = 0; i < IVPU_NUM_ENGINES; i++)
162− ivpu_cmdq_reset_locked(file_priv, i);
289+ for (engine = 0; engine < IVPU_NUM_ENGINES; engine++) {
290+ for (priority = 0; priority < IVPU_NUM_PRIORITIES; priority++) {
291+ int cmdq_idx = IVPU_CMDQ_INDEX(engine, priority);
292+ struct ivpu_cmdq *cmdq = file_priv->cmdq[cmdq_idx];
293+
294+ if (cmdq)
295+ cmdq->db_registered = false;
296+ }
297+ }
163298
164299 mutex_unlock(&file_priv->lock);
165300 }
@@ -172,10 +307,36 @@ void ivpu_cmdq_reset_all_contexts(struct ivpu_device *vdev) · 6 unmodified lines
172307 mutex_lock(&vdev->context_list_lock);
173308
174309 xa_for_each(&vdev->context_xa, ctx_id, file_priv)
175− ivpu_cmdq_reset_all(file_priv);
310+ ivpu_cmdq_reset(file_priv);
176311
177312 mutex_unlock(&vdev->context_list_lock);
313+}
314+
315+static void ivpu_cmdq_fini_all(struct ivpu_file_priv *file_priv)
316+{
317+ u16 engine;
318+ u8 priority;
319+
320+ for (engine = 0; engine < IVPU_NUM_ENGINES; engine++) {
321+ for (priority = 0; priority < IVPU_NUM_PRIORITIES; priority++) {
322+ int cmdq_idx = IVPU_CMDQ_INDEX(engine, priority);
323+
324+ if (file_priv->cmdq[cmdq_idx])
325+ ivpu_cmdq_fini(file_priv, file_priv->cmdq[cmdq_idx]);
326+ }
327+ }
328+}
178329
330+void ivpu_context_abort_locked(struct ivpu_file_priv *file_priv)
331+{
332+ struct ivpu_device *vdev = file_priv->vdev;
333+
334+ lockdep_assert_held(&file_priv->lock);
335+
336+ ivpu_cmdq_fini_all(file_priv);
337+
338+ if (vdev->hw->sched_mode == VPU_SCHEDULING_MODE_OS)
339+ ivpu_jsm_context_release(vdev, file_priv->ctx.id);
179340 }
180341
181342 static int ivpu_cmdq_push_job(struct ivpu_cmdq *cmdq, struct ivpu_job *job)
@@ -199,6 +360,15 @@ static int ivpu_cmdq_push_job(struct ivpu_cmdq *cmdq, struct ivpu_job *job) · 17 unmodified lines
199360 entry->flags = 0;
200361 if (unlikely(ivpu_test_mode & IVPU_TEST_MODE_NULL_SUBMISSION))
201362 entry->flags = VPU_JOB_FLAGS_NULL_SUBMISSION_MASK;
363+
364+ if (vdev->hw->sched_mode == VPU_SCHEDULING_MODE_HW &&
365+ (unlikely(!(ivpu_test_mode & IVPU_TEST_MODE_PREEMPTION_DISABLE)))) {
366+ entry->primary_preempt_buf_addr = cmdq->primary_preempt_buf->vpu_addr;
367+ entry->primary_preempt_buf_size = ivpu_bo_size(cmdq->primary_preempt_buf);
368+ entry->secondary_preempt_buf_addr = cmdq->secondary_preempt_buf->vpu_addr;
369+ entry->secondary_preempt_buf_size = ivpu_bo_size(cmdq->secondary_preempt_buf);
370+ }
371+
202372 wmb(); /* Ensure that tail is updated after filling entry */
203373 header->tail = next_entry;
204374 wmb(); /* Flush WC buffer for jobq header */
@@ -295,11 +465,28 @@ err_free_job: · 90 unmodified lines
295465 return NULL;
296466 }
297467
468+static struct ivpu_job *ivpu_job_remove_from_submitted_jobs(struct ivpu_device *vdev, u32 job_id)
469+{
470+ struct ivpu_job *job;
471+
472+ xa_lock(&vdev->submitted_jobs_xa);
473+ job = __xa_erase(&vdev->submitted_jobs_xa, job_id);
474+
475+ if (xa_empty(&vdev->submitted_jobs_xa) && job) {
476+ vdev->busy_time = ktime_add(ktime_sub(ktime_get(), vdev->busy_start_ts),
477+ vdev->busy_time);
478+ }
479+
480+ xa_unlock(&vdev->submitted_jobs_xa);
481+
482+ return job;
483+}
484+
298485 static int ivpu_job_signal_and_destroy(struct ivpu_device *vdev, u32 job_id, u32 job_status)
299486 {
300487 struct ivpu_job *job;
301488
302− job = xa_erase(&vdev->submitted_jobs_xa, job_id);
489+ job = ivpu_job_remove_from_submitted_jobs(vdev, job_id);
303490 if (!job)
304491 return -ENOENT;
305492
@@ -328,12 +515,13 @@ void ivpu_jobs_abort_all(struct ivpu_device *vdev) · 22 unmodified lines
328515 ivpu_job_signal_and_destroy(vdev, id, DRM_IVPU_JOB_STATUS_ABORTED);
329516 }
330517
331−static int ivpu_job_submit(struct ivpu_job *job)
518+static int ivpu_job_submit(struct ivpu_job *job, u8 priority)
332519 {
333520 struct ivpu_file_priv *file_priv = job->file_priv;
334521 struct ivpu_device *vdev = job->vdev;
335522 struct xa_limit job_id_range;
336523 struct ivpu_cmdq *cmdq;
524+ bool is_first_job;
337525 int ret;
338526
339527 ret = ivpu_rpm_get(vdev);
@@ -342,10 +530,10 @@ static int ivpu_job_submit(struct ivpu_job *job) · 2 unmodified lines
342530
343531 mutex_lock(&file_priv->lock);
344532
345− cmdq = ivpu_cmdq_acquire(job->file_priv, job->engine_idx);
533+ cmdq = ivpu_cmdq_acquire(job->file_priv, job->engine_idx, priority);
346534 if (!cmdq) {
347− ivpu_warn_ratelimited(vdev, "Failed get job queue, ctx %d engine %d\n",
348− file_priv->ctx.id, job->engine_idx);
535+ ivpu_warn_ratelimited(vdev, "Failed to get job queue, ctx %d engine %d prio %d\n",
536+ file_priv->ctx.id, job->engine_idx, priority);
349537 ret = -EINVAL;
350538 goto err_unlock_file_priv;
351539 }
@@ -354,6 +542,7 @@ static int ivpu_job_submit(struct ivpu_job *job) · 2 unmodified lines
354542 job_id_range.max = job_id_range.min | JOB_ID_JOB_MASK;
355543
356544 xa_lock(&vdev->submitted_jobs_xa);
545+ is_first_job = xa_empty(&vdev->submitted_jobs_xa);
357546 ret = __xa_alloc(&vdev->submitted_jobs_xa, &job->job_id, job, job_id_range, GFP_KERNEL);
358547 if (ret) {
359548 ivpu_dbg(vdev, JOB, "Too many active jobs in ctx %d\n",
@@ -373,10 +562,12 @@ static int ivpu_job_submit(struct ivpu_job *job) · 13 unmodified lines
373562 wmb(); /* Flush WC buffer for jobq header */
374563 } else {
375564 ivpu_cmdq_ring_db(vdev, cmdq);
565+ if (is_first_job)
566+ vdev->busy_start_ts = ktime_get();
376567 }
377568
378− ivpu_dbg(vdev, JOB, "Job submitted: id %3u ctx %2d engine %d addr 0x%llx next %d\n",
379− job->job_id, file_priv->ctx.id, job->engine_idx,
569+ ivpu_dbg(vdev, JOB, "Job submitted: id %3u ctx %2d engine %d prio %d addr 0x%llx next %d\n",
570+ job->job_id, file_priv->ctx.id, job->engine_idx, priority,
380571 job->cmd_buf_vpu_addr, cmdq->jobq->header.tail);
381572
382573 xa_unlock(&vdev->submitted_jobs_xa);
@@ -464,6 +655,14 @@ unlock_reservations: · 81 unmodified lines
464655 return ret;
465656 }
466657
658+static inline u8 ivpu_job_to_hws_priority(struct ivpu_file_priv *file_priv, u8 priority)
659+{
660+ if (priority == DRM_IVPU_JOB_PRIORITY_DEFAULT)
661+ return DRM_IVPU_JOB_PRIORITY_NORMAL;
662+
663+ return priority - 1;
664+}
665+
467666 int ivpu_submit_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
468667 {
469668 struct ivpu_file_priv *file_priv = file->driver_priv;
@@ -472,6 +671,7 @@ int ivpu_submit_ioctl(struct drm_device *dev, void *data, struct drm_file *file) · 2 unmodified lines
472671 struct ivpu_job *job;
473672 u32 *buf_handles;
474673 int idx, ret;
674+ u8 priority;
475675
476676 if (params->engine > DRM_IVPU_ENGINE_COPY)
477677 return -EINVAL;
@@ -525,8 +725,10 @@ int ivpu_submit_ioctl(struct drm_device *dev, void *data, struct drm_file *file) · 47 unmodified lines
525725 goto err_destroy_job;
526726 }
527727
728+ priority = ivpu_job_to_hws_priority(file_priv, params->priority);
729+
528730 down_read(&vdev->pm->reset_lock);
529− ret = ivpu_job_submit(job);
731+ ret = ivpu_job_submit(job, priority);
530732 up_read(&vdev->pm->reset_lock);
531733 if (ret)
532734 goto err_signal_fence;
drivers/accel/ivpu/ivpu_job.h+5−1
@@ -1,6 +1,6 @@
11 /* SPDX-License-Identifier: GPL-2.0-only */
22 /*
3− * Copyright (C) 2020-2023 Intel Corporation
3+ * Copyright (C) 2020-2024 Intel Corporation
44 */
55
66 #ifndef __IVPU_JOB_H__
@@ -24,6 +24,8 @@ struct ivpu_file_priv; · 17 unmodified lines
2424 */
2525 struct ivpu_cmdq {
2626 struct vpu_job_queue *jobq;
27+ struct ivpu_bo *primary_preempt_buf;
28+ struct ivpu_bo *secondary_preempt_buf;
2729 struct ivpu_bo *mem;
2830 u32 entry_count;
2931 u32 db_id;
@@ -55,6 +57,8 @@ struct ivpu_job { · 25 unmodified lines
5557
5658 int ivpu_submit_ioctl(struct drm_device *dev, void *data, struct drm_file *file);
5759
60+void ivpu_context_abort_locked(struct ivpu_file_priv *file_priv);
61+
5862 void ivpu_cmdq_release_all_locked(struct ivpu_file_priv *file_priv);
5963 void ivpu_cmdq_reset_all_contexts(struct ivpu_device *vdev);
6064
drivers/accel/ivpu/ivpu_jsm_msg.c+294−17
@@ -1,6 +1,6 @@
11 // SPDX-License-Identifier: GPL-2.0-only
22 /*
3− * Copyright (C) 2020-2023 Intel Corporation
3+ * Copyright (C) 2020-2024 Intel Corporation
44 */
55
66 #include "ivpu_drv.h"
@@ -103,14 +103,10 @@ int ivpu_jsm_register_db(struct ivpu_device *vdev, u32 ctx_id, u32 db_id, · 96 unmodified lines
103103
104104 ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_REGISTER_DB_DONE, &resp,
105105 VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm);
106− if (ret) {
107− ivpu_err_ratelimited(vdev, "Failed to register doorbell %d: %d\n", db_id, ret);
108− return ret;
109− }
110−
111− ivpu_dbg(vdev, JSM, "Doorbell %d registered to context %d\n", db_id, ctx_id);
106+ if (ret)
107+ ivpu_err_ratelimited(vdev, "Failed to register doorbell %u: %d\n", db_id, ret);
112108
113− return 0;
109+ return ret;
114110 }
115111
116112 int ivpu_jsm_unregister_db(struct ivpu_device *vdev, u32 db_id)
@@ -123,14 +119,10 @@ int ivpu_jsm_unregister_db(struct ivpu_device *vdev, u32 db_id) · 6 unmodified lines
123119
124120 ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_UNREGISTER_DB_DONE, &resp,
125121 VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm);
126− if (ret) {
127− ivpu_warn_ratelimited(vdev, "Failed to unregister doorbell %d: %d\n", db_id, ret);
128− return ret;
129− }
130−
131− ivpu_dbg(vdev, JSM, "Doorbell %d unregistered\n", db_id);
122+ if (ret)
123+ ivpu_warn_ratelimited(vdev, "Failed to unregister doorbell %u: %d\n", db_id, ret);
132124
133− return 0;
125+ return ret;
134126 }
135127
136128 int ivpu_jsm_get_heartbeat(struct ivpu_device *vdev, u32 engine, u64 *heartbeat)
@@ -255,11 +247,16 @@ int ivpu_jsm_context_release(struct ivpu_device *vdev, u32 host_ssid) · 118 unmodified lines
255247 {
256248 struct vpu_jsm_msg req = { .type = VPU_JSM_MSG_SSID_RELEASE };
257249 struct vpu_jsm_msg resp;
250+ int ret;
258251
259252 req.payload.ssid_release.host_ssid = host_ssid;
260253
261− return ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_SSID_RELEASE_DONE, &resp,
262− VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm);
254+ ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_SSID_RELEASE_DONE, &resp,
255+ VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm);
256+ if (ret)
257+ ivpu_warn_ratelimited(vdev, "Failed to release context: %d\n", ret);
258+
259+ return ret;
263260 }
264261
265262 int ivpu_jsm_pwr_d0i3_enter(struct ivpu_device *vdev)
@@ -281,3 +278,283 @@ int ivpu_jsm_pwr_d0i3_enter(struct ivpu_device *vdev) · 15 unmodified lines
281278
282279 return ivpu_hw_wait_for_idle(vdev);
283280 }
281+
282+int ivpu_jsm_hws_create_cmdq(struct ivpu_device *vdev, u32 ctx_id, u32 cmdq_group, u32 cmdq_id,
283+ u32 pid, u32 engine, u64 cmdq_base, u32 cmdq_size)
284+{
285+ struct vpu_jsm_msg req = { .type = VPU_JSM_MSG_CREATE_CMD_QUEUE };
286+ struct vpu_jsm_msg resp;
287+ int ret;
288+
289+ req.payload.hws_create_cmdq.host_ssid = ctx_id;
290+ req.payload.hws_create_cmdq.process_id = pid;
291+ req.payload.hws_create_cmdq.engine_idx = engine;
292+ req.payload.hws_create_cmdq.cmdq_group = cmdq_group;
293+ req.payload.hws_create_cmdq.cmdq_id = cmdq_id;
294+ req.payload.hws_create_cmdq.cmdq_base = cmdq_base;
295+ req.payload.hws_create_cmdq.cmdq_size = cmdq_size;
296+
297+ ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_CREATE_CMD_QUEUE_RSP, &resp,
298+ VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm);
299+ if (ret)
300+ ivpu_warn_ratelimited(vdev, "Failed to create command queue: %d\n", ret);
301+
302+ return ret;
303+}
304+
305+int ivpu_jsm_hws_destroy_cmdq(struct ivpu_device *vdev, u32 ctx_id, u32 cmdq_id)
306+{
307+ struct vpu_jsm_msg req = { .type = VPU_JSM_MSG_DESTROY_CMD_QUEUE };
308+ struct vpu_jsm_msg resp;
309+ int ret;
310+
311+ req.payload.hws_destroy_cmdq.host_ssid = ctx_id;
312+ req.payload.hws_destroy_cmdq.cmdq_id = cmdq_id;
313+
314+ ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_DESTROY_CMD_QUEUE_RSP, &resp,
315+ VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm);
316+ if (ret)
317+ ivpu_warn_ratelimited(vdev, "Failed to destroy command queue: %d\n", ret);
318+
319+ return ret;
320+}
321+
322+int ivpu_jsm_hws_register_db(struct ivpu_device *vdev, u32 ctx_id, u32 cmdq_id, u32 db_id,
323+ u64 cmdq_base, u32 cmdq_size)
324+{
325+ struct vpu_jsm_msg req = { .type = VPU_JSM_MSG_HWS_REGISTER_DB };
326+ struct vpu_jsm_msg resp;
327+ int ret = 0;
328+
329+ req.payload.hws_register_db.db_id = db_id;
330+ req.payload.hws_register_db.host_ssid = ctx_id;
331+ req.payload.hws_register_db.cmdq_id = cmdq_id;
332+ req.payload.hws_register_db.cmdq_base = cmdq_base;
333+ req.payload.hws_register_db.cmdq_size = cmdq_size;
334+
335+ ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_REGISTER_DB_DONE, &resp,
336+ VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm);
337+ if (ret)
338+ ivpu_err_ratelimited(vdev, "Failed to register doorbell %u: %d\n", db_id, ret);
339+
340+ return ret;
341+}
342+
343+int ivpu_jsm_hws_resume_engine(struct ivpu_device *vdev, u32 engine)
344+{
345+ struct vpu_jsm_msg req = { .type = VPU_JSM_MSG_HWS_ENGINE_RESUME };
346+ struct vpu_jsm_msg resp;
347+ int ret;
348+
349+ if (engine >= VPU_ENGINE_NB)
350+ return -EINVAL;
351+
352+ req.payload.hws_resume_engine.engine_idx = engine;
353+
354+ ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_HWS_RESUME_ENGINE_DONE, &resp,
355+ VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm);
356+ if (ret)
357+ ivpu_err_ratelimited(vdev, "Failed to resume engine %d: %d\n", engine, ret);
358+
359+ return ret;
360+}
361+
362+int ivpu_jsm_hws_set_context_sched_properties(struct ivpu_device *vdev, u32 ctx_id, u32 cmdq_id,
363+ u32 priority)
364+{
365+ struct vpu_jsm_msg req = { .type = VPU_JSM_MSG_SET_CONTEXT_SCHED_PROPERTIES };
366+ struct vpu_jsm_msg resp;
367+ int ret;
368+
369+ req.payload.hws_set_context_sched_properties.host_ssid = ctx_id;
370+ req.payload.hws_set_context_sched_properties.cmdq_id = cmdq_id;
371+ req.payload.hws_set_context_sched_properties.priority_band = priority;
372+ req.payload.hws_set_context_sched_properties.realtime_priority_level = 0;
373+ req.payload.hws_set_context_sched_properties.in_process_priority = 0;
374+ req.payload.hws_set_context_sched_properties.context_quantum = 20000;
375+ req.payload.hws_set_context_sched_properties.grace_period_same_priority = 10000;
376+ req.payload.hws_set_context_sched_properties.grace_period_lower_priority = 0;
377+
378+ ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_SET_CONTEXT_SCHED_PROPERTIES_RSP, &resp,
379+ VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm);
380+ if (ret)
381+ ivpu_warn_ratelimited(vdev, "Failed to set context sched properties: %d\n", ret);
382+
383+ return ret;
384+}
385+
386+int ivpu_jsm_hws_set_scheduling_log(struct ivpu_device *vdev, u32 engine_idx, u32 host_ssid,
387+ u64 vpu_log_buffer_va)
388+{
389+ struct vpu_jsm_msg req = { .type = VPU_JSM_MSG_HWS_SET_SCHEDULING_LOG };
390+ struct vpu_jsm_msg resp;
391+ int ret;
392+
393+ req.payload.hws_set_scheduling_log.engine_idx = engine_idx;
394+ req.payload.hws_set_scheduling_log.host_ssid = host_ssid;
395+ req.payload.hws_set_scheduling_log.vpu_log_buffer_va = vpu_log_buffer_va;
396+ req.payload.hws_set_scheduling_log.notify_index = 0;
397+ req.payload.hws_set_scheduling_log.enable_extra_events =
398+ ivpu_test_mode & IVPU_TEST_MODE_HWS_EXTRA_EVENTS;
399+
400+ ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_HWS_SET_SCHEDULING_LOG_RSP, &resp,
401+ VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm);
402+ if (ret)
403+ ivpu_warn_ratelimited(vdev, "Failed to set scheduling log: %d\n", ret);
404+
405+ return ret;
406+}
407+
408+int ivpu_jsm_hws_setup_priority_bands(struct ivpu_device *vdev)
409+{
410+ struct vpu_jsm_msg req = { .type = VPU_JSM_MSG_SET_PRIORITY_BAND_SETUP };
411+ struct vpu_jsm_msg resp;
412+ int ret;
413+
414+ /* Idle */
415+ req.payload.hws_priority_band_setup.grace_period[0] = 0;
416+ req.payload.hws_priority_band_setup.process_grace_period[0] = 50000;
417+ req.payload.hws_priority_band_setup.process_quantum[0] = 160000;
418+ /* Normal */
419+ req.payload.hws_priority_band_setup.grace_period[1] = 50000;
420+ req.payload.hws_priority_band_setup.process_grace_period[1] = 50000;
421+ req.payload.hws_priority_band_setup.process_quantum[1] = 300000;
422+ /* Focus */
423+ req.payload.hws_priority_band_setup.grace_period[2] = 50000;
424+ req.payload.hws_priority_band_setup.process_grace_period[2] = 50000;
425+ req.payload.hws_priority_band_setup.process_quantum[2] = 200000;
426+ /* Realtime */
427+ req.payload.hws_priority_band_setup.grace_period[3] = 0;
428+ req.payload.hws_priority_band_setup.process_grace_period[3] = 50000;
429+ req.payload.hws_priority_band_setup.process_quantum[3] = 200000;
430+
431+ req.payload.hws_priority_band_setup.normal_band_percentage = 10;
432+
433+ ret = ivpu_ipc_send_receive_active(vdev, &req, VPU_JSM_MSG_SET_PRIORITY_BAND_SETUP_RSP,
434+ &resp, VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm);
435+ if (ret)
436+ ivpu_warn_ratelimited(vdev, "Failed to set priority bands: %d\n", ret);
437+
438+ return ret;
439+}
440+
441+int ivpu_jsm_metric_streamer_start(struct ivpu_device *vdev, u64 metric_group_mask,
442+ u64 sampling_rate, u64 buffer_addr, u64 buffer_size)
443+{
444+ struct vpu_jsm_msg req = { .type = VPU_JSM_MSG_METRIC_STREAMER_START };
445+ struct vpu_jsm_msg resp;
446+ int ret;
447+
448+ req.payload.metric_streamer_start.metric_group_mask = metric_group_mask;
449+ req.payload.metric_streamer_start.sampling_rate = sampling_rate;
450+ req.payload.metric_streamer_start.buffer_addr = buffer_addr;
451+ req.payload.metric_streamer_start.buffer_size = buffer_size;
452+
453+ ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_METRIC_STREAMER_START_DONE, &resp,
454+ VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm);
455+ if (ret) {
456+ ivpu_warn_ratelimited(vdev, "Failed to start metric streamer: ret %d\n", ret);
457+ return ret;
458+ }
459+
460+ return ret;
461+}
462+
463+int ivpu_jsm_metric_streamer_stop(struct ivpu_device *vdev, u64 metric_group_mask)
464+{
465+ struct vpu_jsm_msg req = { .type = VPU_JSM_MSG_METRIC_STREAMER_STOP };
466+ struct vpu_jsm_msg resp;
467+ int ret;
468+
469+ req.payload.metric_streamer_stop.metric_group_mask = metric_group_mask;
470+
471+ ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_METRIC_STREAMER_STOP_DONE, &resp,
472+ VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm);
473+ if (ret)
474+ ivpu_warn_ratelimited(vdev, "Failed to stop metric streamer: ret %d\n", ret);
475+
476+ return ret;
477+}
478+
479+int ivpu_jsm_metric_streamer_update(struct ivpu_device *vdev, u64 metric_group_mask,
480+ u64 buffer_addr, u64 buffer_size, u64 *bytes_written)
481+{
482+ struct vpu_jsm_msg req = { .type = VPU_JSM_MSG_METRIC_STREAMER_UPDATE };
483+ struct vpu_jsm_msg resp;
484+ int ret;
485+
486+ req.payload.metric_streamer_update.metric_group_mask = metric_group_mask;
487+ req.payload.metric_streamer_update.buffer_addr = buffer_addr;
488+ req.payload.metric_streamer_update.buffer_size = buffer_size;
489+
490+ ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_METRIC_STREAMER_UPDATE_DONE, &resp,
491+ VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm);
492+ if (ret) {
493+ ivpu_warn_ratelimited(vdev, "Failed to update metric streamer: ret %d\n", ret);
494+ return ret;
495+ }
496+
497+ if (buffer_size && resp.payload.metric_streamer_done.bytes_written > buffer_size) {
498+ ivpu_warn_ratelimited(vdev, "MS buffer overflow: bytes_written %#llx > buffer_size %#llx\n",
499+ resp.payload.metric_streamer_done.bytes_written, buffer_size);
500+ return -EOVERFLOW;
501+ }
502+
503+ *bytes_written = resp.payload.metric_streamer_done.bytes_written;
504+
505+ return ret;
506+}
507+
508+int ivpu_jsm_metric_streamer_info(struct ivpu_device *vdev, u64 metric_group_mask, u64 buffer_addr,
509+ u64 buffer_size, u32 *sample_size, u64 *info_size)
510+{
511+ struct vpu_jsm_msg req = { .type = VPU_JSM_MSG_METRIC_STREAMER_INFO };
512+ struct vpu_jsm_msg resp;
513+ int ret;
514+
515+ req.payload.metric_streamer_start.metric_group_mask = metric_group_mask;
516+ req.payload.metric_streamer_start.buffer_addr = buffer_addr;
517+ req.payload.metric_streamer_start.buffer_size = buffer_size;
518+
519+ ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_METRIC_STREAMER_INFO_DONE, &resp,
520+ VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm);
521+ if (ret) {
522+ ivpu_warn_ratelimited(vdev, "Failed to get metric streamer info: ret %d\n", ret);
523+ return ret;
524+ }
525+
526+ if (!resp.payload.metric_streamer_done.sample_size) {
527+ ivpu_warn_ratelimited(vdev, "Invalid sample size\n");
528+ return -EBADMSG;
529+ }
530+
531+ if (sample_size)
532+ *sample_size = resp.payload.metric_streamer_done.sample_size;
533+ if (info_size)
534+ *info_size = resp.payload.metric_streamer_done.bytes_written;
535+
536+ return ret;
537+}
538+
539+int ivpu_jsm_dct_enable(struct ivpu_device *vdev, u32 active_us, u32 inactive_us)
540+{
541+ struct vpu_jsm_msg req = { .type = VPU_JSM_MSG_DCT_ENABLE };
542+ struct vpu_jsm_msg resp;
543+
544+ req.payload.pwr_dct_control.dct_active_us = active_us;
545+ req.payload.pwr_dct_control.dct_inactive_us = inactive_us;
546+
547+ return ivpu_ipc_send_receive_active(vdev, &req, VPU_JSM_MSG_DCT_ENABLE_DONE,
548+ &resp, VPU_IPC_CHAN_ASYNC_CMD,
549+ vdev->timeout.jsm);
550+}
551+
552+int ivpu_jsm_dct_disable(struct ivpu_device *vdev)
553+{
554+ struct vpu_jsm_msg req = { .type = VPU_JSM_MSG_DCT_DISABLE };
555+ struct vpu_jsm_msg resp;
556+
557+ return ivpu_ipc_send_receive_active(vdev, &req, VPU_JSM_MSG_DCT_DISABLE_DONE,
558+ &resp, VPU_IPC_CHAN_ASYNC_CMD,
559+ vdev->timeout.jsm);
560+}
drivers/accel/ivpu/ivpu_jsm_msg.h+21−1
@@ -1,6 +1,6 @@
11 /* SPDX-License-Identifier: GPL-2.0-only */
22 /*
3− * Copyright (C) 2020-2023 Intel Corporation
3+ * Copyright (C) 2020-2024 Intel Corporation
44 */
55
66 #ifndef __IVPU_JSM_MSG_H__
@@ -23,4 +23,24 @@ int ivpu_jsm_trace_set_config(struct ivpu_device *vdev, u32 trace_level, u32 tra · 16 unmodified lines
2323 u64 trace_hw_component_mask);
2424 int ivpu_jsm_context_release(struct ivpu_device *vdev, u32 host_ssid);
2525 int ivpu_jsm_pwr_d0i3_enter(struct ivpu_device *vdev);
26+int ivpu_jsm_hws_create_cmdq(struct ivpu_device *vdev, u32 ctx_id, u32 cmdq_group, u32 cmdq_id,
27+ u32 pid, u32 engine, u64 cmdq_base, u32 cmdq_size);
28+int ivpu_jsm_hws_destroy_cmdq(struct ivpu_device *vdev, u32 ctx_id, u32 cmdq_id);
29+int ivpu_jsm_hws_register_db(struct ivpu_device *vdev, u32 ctx_id, u32 cmdq_id, u32 db_id,
30+ u64 cmdq_base, u32 cmdq_size);
31+int ivpu_jsm_hws_resume_engine(struct ivpu_device *vdev, u32 engine);
32+int ivpu_jsm_hws_set_context_sched_properties(struct ivpu_device *vdev, u32 ctx_id, u32 cmdq_id,
33+ u32 priority);
34+int ivpu_jsm_hws_set_scheduling_log(struct ivpu_device *vdev, u32 engine_idx, u32 host_ssid,
35+ u64 vpu_log_buffer_va);
36+int ivpu_jsm_hws_setup_priority_bands(struct ivpu_device *vdev);
37+int ivpu_jsm_metric_streamer_start(struct ivpu_device *vdev, u64 metric_group_mask,
38+ u64 sampling_rate, u64 buffer_addr, u64 buffer_size);
39+int ivpu_jsm_metric_streamer_stop(struct ivpu_device *vdev, u64 metric_group_mask);
40+int ivpu_jsm_metric_streamer_update(struct ivpu_device *vdev, u64 metric_group_mask,
41+ u64 buffer_addr, u64 buffer_size, u64 *bytes_written);
42+int ivpu_jsm_metric_streamer_info(struct ivpu_device *vdev, u64 metric_group_mask, u64 buffer_addr,
43+ u64 buffer_size, u32 *sample_size, u64 *info_size);
44+int ivpu_jsm_dct_enable(struct ivpu_device *vdev, u32 active_us, u32 inactive_us);
45+int ivpu_jsm_dct_disable(struct ivpu_device *vdev);
2646 #endif
drivers/accel/ivpu/ivpu_mmu.c+15−7
@@ -1,6 +1,6 @@
11 // SPDX-License-Identifier: GPL-2.0-only
22 /*
3− * Copyright (C) 2020-2023 Intel Corporation
3+ * Copyright (C) 2020-2024 Intel Corporation
44 */
55
66 #include <linux/circ_buf.h>
@@ -519,7 +519,8 @@ static int ivpu_mmu_cmdq_sync(struct ivpu_device *vdev) · 512 unmodified lines
519519 if (ret)
520520 return ret;
521521
522− clflush_cache_range(q->base, IVPU_MMU_CMDQ_SIZE);
522+ if (!ivpu_is_force_snoop_enabled(vdev))
523+ clflush_cache_range(q->base, IVPU_MMU_CMDQ_SIZE);
523524 REGV_WR32(IVPU_MMU_REG_CMDQ_PROD, q->prod);
524525
525526 ret = ivpu_mmu_cmdq_wait_for_cons(vdev);
@@ -567,7 +568,8 @@ static int ivpu_mmu_reset(struct ivpu_device *vdev) · 41 unmodified lines
567568 int ret;
568569
569570 memset(mmu->cmdq.base, 0, IVPU_MMU_CMDQ_SIZE);
570− clflush_cache_range(mmu->cmdq.base, IVPU_MMU_CMDQ_SIZE);
571+ if (!ivpu_is_force_snoop_enabled(vdev))
572+ clflush_cache_range(mmu->cmdq.base, IVPU_MMU_CMDQ_SIZE);
571573 mmu->cmdq.prod = 0;
572574 mmu->cmdq.cons = 0;
573575
@@ -661,7 +663,8 @@ static void ivpu_mmu_strtab_link_cd(struct ivpu_device *vdev, u32 sid) · 87 unmodified lines
661663 WRITE_ONCE(entry[1], str[1]);
662664 WRITE_ONCE(entry[0], str[0]);
663665
664− clflush_cache_range(entry, IVPU_MMU_STRTAB_ENT_SIZE);
666+ if (!ivpu_is_force_snoop_enabled(vdev))
667+ clflush_cache_range(entry, IVPU_MMU_STRTAB_ENT_SIZE);
665668
666669 ivpu_dbg(vdev, MMU, "STRTAB write entry (SSID=%u): 0x%llx, 0x%llx\n", sid, str[0], str[1]);
667670 }
@@ -735,7 +738,8 @@ static int ivpu_mmu_cd_add(struct ivpu_device *vdev, u32 ssid, u64 cd_dma) · 67 unmodified lines
735738 WRITE_ONCE(entry[3], cd[3]);
736739 WRITE_ONCE(entry[0], cd[0]);
737740
738− clflush_cache_range(entry, IVPU_MMU_CDTAB_ENT_SIZE);
741+ if (!ivpu_is_force_snoop_enabled(vdev))
742+ clflush_cache_range(entry, IVPU_MMU_CDTAB_ENT_SIZE);
739743
740744 ivpu_dbg(vdev, MMU, "CDTAB %s entry (SSID=%u, dma=%pad): 0x%llx, 0x%llx, 0x%llx, 0x%llx\n",
741745 cd_dma ? "write" : "clear", ssid, &cd_dma, cd[0], cd[1], cd[2], cd[3]);
@@ -874,8 +878,9 @@ static void ivpu_mmu_dump_event(struct ivpu_device *vdev, u32 *event) · 132 unmodified lines
874878 u64 in_addr = ((u64)event[5]) << 32 | event[4];
875879 u32 sid = event[1];
876880
877− ivpu_err(vdev, "MMU EVTQ: 0x%x (%s) SSID: %d SID: %d, e[2] %08x, e[3] %08x, in addr: 0x%llx, fetch addr: 0x%llx\n",
878− op, ivpu_mmu_event_to_str(op), ssid, sid, event[2], event[3], in_addr, fetch_addr);
881+ ivpu_err_ratelimited(vdev, "MMU EVTQ: 0x%x (%s) SSID: %d SID: %d, e[2] %08x, e[3] %08x, in addr: 0x%llx, fetch addr: 0x%llx\n",
882+ op, ivpu_mmu_event_to_str(op), ssid, sid,
883+ event[2], event[3], in_addr, fetch_addr);
879884 }
880885
881886 static u32 *ivpu_mmu_get_event(struct ivpu_device *vdev)
@@ -911,6 +916,9 @@ void ivpu_mmu_irq_evtq_handler(struct ivpu_device *vdev) · 29 unmodified lines
911916 ivpu_mmu_user_context_mark_invalid(vdev, ssid);
912917 REGV_WR32(IVPU_MMU_REG_EVTQ_CONS_SEC, vdev->mmu->evtq.cons);
913918 }
919+
920+ if (!kfifo_put(&vdev->hw->irq.fifo, IVPU_HW_IRQ_SRC_MMU_EVTQ))
921+ ivpu_err_ratelimited(vdev, "IRQ FIFO full\n");
914922 }
915923
916924 void ivpu_mmu_evtq_dump(struct ivpu_device *vdev)
drivers/accel/ivpu/ivpu_mmu_context.c+86−0
@@ -24,6 +24,7 @@ · 23 unmodified lines
2424 #define IVPU_MMU_ENTRY_FLAG_CONT BIT(52)
2525 #define IVPU_MMU_ENTRY_FLAG_NG BIT(11)
2626 #define IVPU_MMU_ENTRY_FLAG_AF BIT(10)
27+#define IVPU_MMU_ENTRY_FLAG_RO BIT(7)
2728 #define IVPU_MMU_ENTRY_FLAG_USER BIT(6)
2829 #define IVPU_MMU_ENTRY_FLAG_LLC_COHERENT BIT(2)
2930 #define IVPU_MMU_ENTRY_FLAG_TYPE_PAGE BIT(1)
@@ -319,6 +320,91 @@ ivpu_mmu_context_map_pages(struct ivpu_device *vdev, struct ivpu_mmu_context *ct · 289 unmodified lines
319320 return 0;
320321 }
321322
323+static void ivpu_mmu_context_set_page_ro(struct ivpu_device *vdev, struct ivpu_mmu_context *ctx,
324+ u64 vpu_addr)
325+{
326+ int pgd_idx = FIELD_GET(IVPU_MMU_PGD_INDEX_MASK, vpu_addr);
327+ int pud_idx = FIELD_GET(IVPU_MMU_PUD_INDEX_MASK, vpu_addr);
328+ int pmd_idx = FIELD_GET(IVPU_MMU_PMD_INDEX_MASK, vpu_addr);
329+ int pte_idx = FIELD_GET(IVPU_MMU_PTE_INDEX_MASK, vpu_addr);
330+
331+ ctx->pgtable.pte_ptrs[pgd_idx][pud_idx][pmd_idx][pte_idx] |= IVPU_MMU_ENTRY_FLAG_RO;
332+}
333+
334+static void ivpu_mmu_context_split_page(struct ivpu_device *vdev, struct ivpu_mmu_context *ctx,
335+ u64 vpu_addr)
336+{
337+ int pgd_idx = FIELD_GET(IVPU_MMU_PGD_INDEX_MASK, vpu_addr);
338+ int pud_idx = FIELD_GET(IVPU_MMU_PUD_INDEX_MASK, vpu_addr);
339+ int pmd_idx = FIELD_GET(IVPU_MMU_PMD_INDEX_MASK, vpu_addr);
340+ int pte_idx = FIELD_GET(IVPU_MMU_PTE_INDEX_MASK, vpu_addr);
341+
342+ ctx->pgtable.pte_ptrs[pgd_idx][pud_idx][pmd_idx][pte_idx] &= ~IVPU_MMU_ENTRY_FLAG_CONT;
343+}
344+
345+static void ivpu_mmu_context_split_64k_page(struct ivpu_device *vdev, struct ivpu_mmu_context *ctx,
346+ u64 vpu_addr)
347+{
348+ u64 start = ALIGN_DOWN(vpu_addr, IVPU_MMU_CONT_PAGES_SIZE);
349+ u64 end = ALIGN(vpu_addr, IVPU_MMU_CONT_PAGES_SIZE);
350+ u64 offset = 0;
351+
352+ ivpu_dbg(vdev, MMU_MAP, "Split 64K page ctx: %u vpu_addr: 0x%llx\n", ctx->id, vpu_addr);
353+
354+ while (start + offset < end) {
355+ ivpu_mmu_context_split_page(vdev, ctx, start + offset);
356+ offset += IVPU_MMU_PAGE_SIZE;
357+ }
358+}
359+
360+int
361+ivpu_mmu_context_set_pages_ro(struct ivpu_device *vdev, struct ivpu_mmu_context *ctx, u64 vpu_addr,
362+ size_t size)
363+{
364+ u64 end = vpu_addr + size;
365+ size_t size_left = size;
366+ int ret;
367+
368+ if (size == 0)
369+ return 0;
370+
371+ if (drm_WARN_ON(&vdev->drm, !IS_ALIGNED(vpu_addr | size, IVPU_MMU_PAGE_SIZE)))
372+ return -EINVAL;
373+
374+ mutex_lock(&ctx->lock);
375+
376+ ivpu_dbg(vdev, MMU_MAP, "Set read-only pages ctx: %u vpu_addr: 0x%llx size: %lu\n",
377+ ctx->id, vpu_addr, size);
378+
379+ if (!ivpu_disable_mmu_cont_pages) {
380+ /* Split 64K contiguous page at the beginning if needed */
381+ if (!IS_ALIGNED(vpu_addr, IVPU_MMU_CONT_PAGES_SIZE))
382+ ivpu_mmu_context_split_64k_page(vdev, ctx, vpu_addr);
383+
384+ /* Split 64K contiguous page at the end if needed */
385+ if (!IS_ALIGNED(vpu_addr + size, IVPU_MMU_CONT_PAGES_SIZE))
386+ ivpu_mmu_context_split_64k_page(vdev, ctx, vpu_addr + size);
387+ }
388+
389+ while (size_left) {
390+ if (vpu_addr < end)
391+ ivpu_mmu_context_set_page_ro(vdev, ctx, vpu_addr);
392+
393+ vpu_addr += IVPU_MMU_PAGE_SIZE;
394+ size_left -= IVPU_MMU_PAGE_SIZE;
395+ }
396+
397+ /* Ensure page table modifications are flushed from wc buffers to memory */
398+ wmb();
399+
400+ mutex_unlock(&ctx->lock);
401+ ret = ivpu_mmu_invalidate_tlb(vdev, ctx->id);
402+ if (ret)
403+ ivpu_err(vdev, "Failed to invalidate TLB for ctx %u: %d\n", ctx->id, ret);
404+
405+ return 0;
406+}
407+
322408 static void ivpu_mmu_context_unmap_pages(struct ivpu_mmu_context *ctx, u64 vpu_addr, size_t size)
323409 {
324410 while (size) {
drivers/accel/ivpu/ivpu_mmu_context.h+2−0
@@ -46,5 +46,7 @@ int ivpu_mmu_context_map_sgt(struct ivpu_device *vdev, struct ivpu_mmu_context * · 45 unmodified lines
4646 u64 vpu_addr, struct sg_table *sgt, bool llc_coherent);
4747 void ivpu_mmu_context_unmap_sgt(struct ivpu_device *vdev, struct ivpu_mmu_context *ctx,
4848 u64 vpu_addr, struct sg_table *sgt);
49+int ivpu_mmu_context_set_pages_ro(struct ivpu_device *vdev, struct ivpu_mmu_context *ctx,
50+ u64 vpu_addr, size_t size);
4951
5052 #endif /* __IVPU_MMU_CONTEXT_H__ */
drivers/accel/ivpu/ivpu_ms.c+309−0
@@ -0,0 +1,309 @@
1+// SPDX-License-Identifier: GPL-2.0-only OR MIT
2+/*
3+ * Copyright (C) 2020-2024 Intel Corporation
4+ */
5+
6+#include <drm/drm_file.h>
7+
8+#include "ivpu_drv.h"
9+#include "ivpu_gem.h"
10+#include "ivpu_jsm_msg.h"
11+#include "ivpu_ms.h"
12+#include "ivpu_pm.h"
13+
14+#define MS_INFO_BUFFER_SIZE SZ_16K
15+#define MS_NUM_BUFFERS 2
16+#define MS_READ_PERIOD_MULTIPLIER 2
17+#define MS_MIN_SAMPLE_PERIOD_NS 1000000
18+
19+static struct ivpu_ms_instance *
20+get_instance_by_mask(struct ivpu_file_priv *file_priv, u64 metric_mask)
21+{
22+ struct ivpu_ms_instance *ms;
23+
24+ lockdep_assert_held(&file_priv->ms_lock);
25+
26+ list_for_each_entry(ms, &file_priv->ms_instance_list, ms_instance_node)
27+ if (ms->mask == metric_mask)
28+ return ms;
29+
30+ return NULL;
31+}
32+
33+int ivpu_ms_start_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
34+{
35+ struct ivpu_file_priv *file_priv = file->driver_priv;
36+ struct drm_ivpu_metric_streamer_start *args = data;
37+ struct ivpu_device *vdev = file_priv->vdev;
38+ struct ivpu_ms_instance *ms;
39+ u64 single_buff_size;
40+ u32 sample_size;
41+ int ret;
42+
43+ if (!args->metric_group_mask || !args->read_period_samples ||
44+ args->sampling_period_ns < MS_MIN_SAMPLE_PERIOD_NS)
45+ return -EINVAL;
46+
47+ mutex_lock(&file_priv->ms_lock);
48+
49+ if (get_instance_by_mask(file_priv, args->metric_group_mask)) {
50+ ivpu_err(vdev, "Instance already exists (mask %#llx)\n", args->metric_group_mask);
51+ ret = -EALREADY;
52+ goto unlock;
53+ }
54+
55+ ms = kzalloc(sizeof(*ms), GFP_KERNEL);
56+ if (!ms) {
57+ ret = -ENOMEM;
58+ goto unlock;
59+ }
60+
61+ ms->mask = args->metric_group_mask;
62+
63+ ret = ivpu_jsm_metric_streamer_info(vdev, ms->mask, 0, 0, &sample_size, NULL);
64+ if (ret)
65+ goto err_free_ms;
66+
67+ single_buff_size = sample_size *
68+ ((u64)args->read_period_samples * MS_READ_PERIOD_MULTIPLIER);
69+ ms->bo = ivpu_bo_create_global(vdev, PAGE_ALIGN(single_buff_size * MS_NUM_BUFFERS),
70+ DRM_IVPU_BO_CACHED | DRM_IVPU_BO_MAPPABLE);
71+ if (!ms->bo) {
72+ ivpu_err(vdev, "Failed to allocate MS buffer (size %llu)\n", single_buff_size);
73+ ret = -ENOMEM;
74+ goto err_free_ms;
75+ }
76+
77+ ms->buff_size = ivpu_bo_size(ms->bo) / MS_NUM_BUFFERS;
78+ ms->active_buff_vpu_addr = ms->bo->vpu_addr;
79+ ms->inactive_buff_vpu_addr = ms->bo->vpu_addr + ms->buff_size;
80+ ms->active_buff_ptr = ivpu_bo_vaddr(ms->bo);
81+ ms->inactive_buff_ptr = ivpu_bo_vaddr(ms->bo) + ms->buff_size;
82+
83+ ret = ivpu_jsm_metric_streamer_start(vdev, ms->mask, args->sampling_period_ns,
84+ ms->active_buff_vpu_addr, ms->buff_size);
85+ if (ret)
86+ goto err_free_bo;
87+
88+ args->sample_size = sample_size;
89+ args->max_data_size = ivpu_bo_size(ms->bo);
90+ list_add_tail(&ms->ms_instance_node, &file_priv->ms_instance_list);
91+ goto unlock;
92+
93+err_free_bo:
94+ ivpu_bo_free(ms->bo);
95+err_free_ms:
96+ kfree(ms);
97+unlock:
98+ mutex_unlock(&file_priv->ms_lock);
99+ return ret;
100+}
101+
102+static int
103+copy_leftover_bytes(struct ivpu_ms_instance *ms,
104+ void __user *user_ptr, u64 user_size, u64 *user_bytes_copied)
105+{
106+ u64 copy_bytes;
107+
108+ if (ms->leftover_bytes) {
109+ copy_bytes = min(user_size - *user_bytes_copied, ms->leftover_bytes);
110+ if (copy_to_user(user_ptr + *user_bytes_copied, ms->leftover_addr, copy_bytes))
111+ return -EFAULT;
112+
113+ ms->leftover_bytes -= copy_bytes;
114+ ms->leftover_addr += copy_bytes;
115+ *user_bytes_copied += copy_bytes;
116+ }
117+
118+ return 0;
119+}
120+
121+static int
122+copy_samples_to_user(struct ivpu_device *vdev, struct ivpu_ms_instance *ms,
123+ void __user *user_ptr, u64 user_size, u64 *user_bytes_copied)
124+{
125+ u64 bytes_written;
126+ int ret;
127+
128+ *user_bytes_copied = 0;
129+
130+ ret = copy_leftover_bytes(ms, user_ptr, user_size, user_bytes_copied);
131+ if (ret)
132+ return ret;
133+
134+ if (*user_bytes_copied == user_size)
135+ return 0;
136+
137+ ret = ivpu_jsm_metric_streamer_update(vdev, ms->mask, ms->inactive_buff_vpu_addr,
138+ ms->buff_size, &bytes_written);
139+ if (ret)
140+ return ret;
141+
142+ swap(ms->active_buff_vpu_addr, ms->inactive_buff_vpu_addr);
143+ swap(ms->active_buff_ptr, ms->inactive_buff_ptr);
144+
145+ ms->leftover_bytes = bytes_written;
146+ ms->leftover_addr = ms->inactive_buff_ptr;
147+
148+ return copy_leftover_bytes(ms, user_ptr, user_size, user_bytes_copied);
149+}
150+
151+int ivpu_ms_get_data_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
152+{
153+ struct drm_ivpu_metric_streamer_get_data *args = data;
154+ struct ivpu_file_priv *file_priv = file->driver_priv;
155+ struct ivpu_device *vdev = file_priv->vdev;
156+ struct ivpu_ms_instance *ms;
157+ u64 bytes_written;
158+ int ret;
159+
160+ if (!args->metric_group_mask)
161+ return -EINVAL;
162+
163+ mutex_lock(&file_priv->ms_lock);
164+
165+ ms = get_instance_by_mask(file_priv, args->metric_group_mask);
166+ if (!ms) {
167+ ivpu_err(vdev, "Instance doesn't exist for mask: %#llx\n", args->metric_group_mask);
168+ ret = -EINVAL;
169+ goto unlock;
170+ }
171+
172+ if (!args->buffer_size) {
173+ ret = ivpu_jsm_metric_streamer_update(vdev, ms->mask, 0, 0, &bytes_written);
174+ if (ret)
175+ goto unlock;
176+ args->data_size = bytes_written + ms->leftover_bytes;
177+ goto unlock;
178+ }
179+
180+ if (!args->buffer_ptr) {
181+ ret = -EINVAL;
182+ goto unlock;
183+ }
184+
185+ ret = copy_samples_to_user(vdev, ms, u64_to_user_ptr(args->buffer_ptr),
186+ args->buffer_size, &args->data_size);
187+unlock:
188+ mutex_unlock(&file_priv->ms_lock);
189+
190+ return ret;
191+}
192+
193+static void free_instance(struct ivpu_file_priv *file_priv, struct ivpu_ms_instance *ms)
194+{
195+ lockdep_assert_held(&file_priv->ms_lock);
196+
197+ list_del(&ms->ms_instance_node);
198+ ivpu_jsm_metric_streamer_stop(file_priv->vdev, ms->mask);
199+ ivpu_bo_free(ms->bo);
200+ kfree(ms);
201+}
202+
203+int ivpu_ms_stop_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
204+{
205+ struct ivpu_file_priv *file_priv = file->driver_priv;
206+ struct drm_ivpu_metric_streamer_stop *args = data;
207+ struct ivpu_ms_instance *ms;
208+
209+ if (!args->metric_group_mask)
210+ return -EINVAL;
211+
212+ mutex_lock(&file_priv->ms_lock);
213+
214+ ms = get_instance_by_mask(file_priv, args->metric_group_mask);
215+ if (ms)
216+ free_instance(file_priv, ms);
217+
218+ mutex_unlock(&file_priv->ms_lock);
219+
220+ return ms ? 0 : -EINVAL;
221+}
222+
223+static inline struct ivpu_bo *get_ms_info_bo(struct ivpu_file_priv *file_priv)
224+{
225+ lockdep_assert_held(&file_priv->ms_lock);
226+
227+ if (file_priv->ms_info_bo)
228+ return file_priv->ms_info_bo;
229+
230+ file_priv->ms_info_bo = ivpu_bo_create_global(file_priv->vdev, MS_INFO_BUFFER_SIZE,
231+ DRM_IVPU_BO_CACHED | DRM_IVPU_BO_MAPPABLE);
232+ return file_priv->ms_info_bo;
233+}
234+
235+int ivpu_ms_get_info_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
236+{
237+ struct drm_ivpu_metric_streamer_get_data *args = data;
238+ struct ivpu_file_priv *file_priv = file->driver_priv;
239+ struct ivpu_device *vdev = file_priv->vdev;
240+ struct ivpu_bo *bo;
241+ u64 info_size;
242+ int ret;
243+
244+ if (!args->metric_group_mask)
245+ return -EINVAL;
246+
247+ if (!args->buffer_size)
248+ return ivpu_jsm_metric_streamer_info(vdev, args->metric_group_mask,
249+ 0, 0, NULL, &args->data_size);
250+ if (!args->buffer_ptr)
251+ return -EINVAL;
252+
253+ mutex_lock(&file_priv->ms_lock);
254+
255+ bo = get_ms_info_bo(file_priv);
256+ if (!bo) {
257+ ret = -ENOMEM;
258+ goto unlock;
259+ }
260+
261+ ret = ivpu_jsm_metric_streamer_info(vdev, args->metric_group_mask, bo->vpu_addr,
262+ ivpu_bo_size(bo), NULL, &info_size);
263+ if (ret)
264+ goto unlock;
265+
266+ if (args->buffer_size < info_size) {
267+ ret = -ENOSPC;
268+ goto unlock;
269+ }
270+
271+ if (copy_to_user(u64_to_user_ptr(args->buffer_ptr), ivpu_bo_vaddr(bo), info_size))
272+ ret = -EFAULT;
273+
274+ args->data_size = info_size;
275+unlock:
276+ mutex_unlock(&file_priv->ms_lock);
277+
278+ return ret;
279+}
280+
281+void ivpu_ms_cleanup(struct ivpu_file_priv *file_priv)
282+{
283+ struct ivpu_ms_instance *ms, *tmp;
284+
285+ mutex_lock(&file_priv->ms_lock);
286+
287+ if (file_priv->ms_info_bo) {
288+ ivpu_bo_free(file_priv->ms_info_bo);
289+ file_priv->ms_info_bo = NULL;
290+ }
291+
292+ list_for_each_entry_safe(ms, tmp, &file_priv->ms_instance_list, ms_instance_node)
293+ free_instance(file_priv, ms);
294+
295+ mutex_unlock(&file_priv->ms_lock);
296+}
297+
298+void ivpu_ms_cleanup_all(struct ivpu_device *vdev)
299+{
300+ struct ivpu_file_priv *file_priv;
301+ unsigned long ctx_id;
302+
303+ mutex_lock(&vdev->context_list_lock);
304+
305+ xa_for_each(&vdev->context_xa, ctx_id, file_priv)
306+ ivpu_ms_cleanup(file_priv);
307+
308+ mutex_unlock(&vdev->context_list_lock);
309+}
drivers/accel/ivpu/ivpu_ms.h+36−0
@@ -0,0 +1,36 @@
1+/* SPDX-License-Identifier: GPL-2.0-only OR MIT */
2+/*
3+ * Copyright (C) 2020-2024 Intel Corporation
4+ */
5+#ifndef __IVPU_MS_H__
6+#define __IVPU_MS_H__
7+
8+#include <linux/list.h>
9+
10+struct drm_device;
11+struct drm_file;
12+struct ivpu_bo;
13+struct ivpu_device;
14+struct ivpu_file_priv;
15+
16+struct ivpu_ms_instance {
17+ struct ivpu_bo *bo;
18+ struct list_head ms_instance_node;
19+ u64 mask;
20+ u64 buff_size;
21+ u64 active_buff_vpu_addr;
22+ u64 inactive_buff_vpu_addr;
23+ void *active_buff_ptr;
24+ void *inactive_buff_ptr;
25+ u64 leftover_bytes;
26+ void *leftover_addr;
27+};
28+
29+int ivpu_ms_start_ioctl(struct drm_device *dev, void *data, struct drm_file *file);
30+int ivpu_ms_stop_ioctl(struct drm_device *dev, void *data, struct drm_file *file);
31+int ivpu_ms_get_data_ioctl(struct drm_device *dev, void *data, struct drm_file *file);
32+int ivpu_ms_get_info_ioctl(struct drm_device *dev, void *data, struct drm_file *file);
33+void ivpu_ms_cleanup(struct ivpu_file_priv *file_priv);
34+void ivpu_ms_cleanup_all(struct ivpu_device *vdev);
35+
36+#endif /* __IVPU_MS_H__ */
drivers/accel/ivpu/ivpu_pm.c+82−29
@@ -18,6 +18,7 @@ · 17 unmodified lines
1818 #include "ivpu_job.h"
1919 #include "ivpu_jsm_msg.h"
2020 #include "ivpu_mmu.h"
21+#include "ivpu_ms.h"
2122 #include "ivpu_pm.h"
2223
2324 static bool ivpu_disable_recovery;
@@ -131,6 +132,7 @@ static void ivpu_pm_recovery_work(struct work_struct *work) · 107 unmodified lines
131132 ivpu_suspend(vdev);
132133 ivpu_pm_prepare_cold_boot(vdev);
133134 ivpu_jobs_abort_all(vdev);
135+ ivpu_ms_cleanup_all(vdev);
134136
135137 ret = ivpu_resume(vdev);
136138 if (ret)
@@ -235,41 +237,37 @@ int ivpu_pm_runtime_suspend_cb(struct device *dev) · 98 unmodified lines
235237 {
236238 struct drm_device *drm = dev_get_drvdata(dev);
237239 struct ivpu_device *vdev = to_ivpu_device(drm);
238− bool hw_is_idle = true;
239− int ret;
240+ int ret, ret_d0i3;
241+ bool is_idle;
240242
241243 drm_WARN_ON(&vdev->drm, !xa_empty(&vdev->submitted_jobs_xa));
242244 drm_WARN_ON(&vdev->drm, work_pending(&vdev->pm->recovery_work));
243245
244246 ivpu_dbg(vdev, PM, "Runtime suspend..\n");
245247
246− if (!ivpu_hw_is_idle(vdev) && vdev->pm->suspend_reschedule_counter) {
247− ivpu_dbg(vdev, PM, "Failed to enter idle, rescheduling suspend, retries left %d\n",
248− vdev->pm->suspend_reschedule_counter);
249− pm_schedule_suspend(dev, vdev->timeout.reschedule_suspend);
250− vdev->pm->suspend_reschedule_counter--;
251− return -EAGAIN;
252− }
248+ ivpu_mmu_disable(vdev);
249+
250+ is_idle = ivpu_hw_is_idle(vdev) || vdev->pm->dct_active_percent;
251+ if (!is_idle)
252+ ivpu_err(vdev, "NPU is not idle before autosuspend\n");
253253
254− if (!vdev->pm->suspend_reschedule_counter)
255− hw_is_idle = false;
256− else if (ivpu_jsm_pwr_d0i3_enter(vdev))
257− hw_is_idle = false;
254+ ret_d0i3 = ivpu_jsm_pwr_d0i3_enter(vdev);
255+ if (ret_d0i3)
256+ ivpu_err(vdev, "Failed to prepare for d0i3: %d\n", ret_d0i3);
258257
259258 ret = ivpu_suspend(vdev);
260259 if (ret)
261260 ivpu_err(vdev, "Failed to suspend NPU: %d\n", ret);
262261
263− if (!hw_is_idle) {
264− ivpu_err(vdev, "NPU failed to enter idle, force suspended.\n");
262+ if (!is_idle || ret_d0i3) {
263+ ivpu_err(vdev, "Forcing cold boot due to previous errors\n");
264+ atomic_inc(&vdev->pm->reset_counter);
265265 ivpu_fw_log_dump(vdev);
266266 ivpu_pm_prepare_cold_boot(vdev);
267267 } else {
268268 ivpu_pm_prepare_warm_boot(vdev);
269269 }
270270
271− vdev->pm->suspend_reschedule_counter = PM_RESCHEDULE_LIMIT;
272−
273271 ivpu_dbg(vdev, PM, "Runtime suspend done.\n");
274272
275273 return 0;
@@ -297,17 +295,6 @@ int ivpu_rpm_get(struct ivpu_device *vdev) · 21 unmodified lines
297295 int ret;
298296
299297 ret = pm_runtime_resume_and_get(vdev->drm.dev);
300− if (!drm_WARN_ON(&vdev->drm, ret < 0))
301− vdev->pm->suspend_reschedule_counter = PM_RESCHEDULE_LIMIT;
302−
303− return ret;
304−}
305−
306−int ivpu_rpm_get_if_active(struct ivpu_device *vdev)
307−{
308− int ret;
309−
310− ret = pm_runtime_get_if_in_use(vdev->drm.dev);
311298 drm_WARN_ON(&vdev->drm, ret < 0);
312299
313300 return ret;
@@ -333,6 +320,8 @@ void ivpu_pm_reset_prepare_cb(struct pci_dev *pdev) · 19 unmodified lines
333320 ivpu_hw_reset(vdev);
334321 ivpu_pm_prepare_cold_boot(vdev);
335322 ivpu_jobs_abort_all(vdev);
323+ ivpu_ms_cleanup_all(vdev);
324+
336325 ivpu_dbg(vdev, PM, "Pre-reset done.\n");
337326 }
338327
@@ -360,7 +349,6 @@ void ivpu_pm_init(struct ivpu_device *vdev) · 21 unmodified lines
360349 int delay;
361350
362351 pm->vdev = vdev;
363− pm->suspend_reschedule_counter = PM_RESCHEDULE_LIMIT;
364352
365353 init_rwsem(&pm->reset_lock);
366354 atomic_set(&pm->reset_pending, 0);
@@ -401,3 +389,68 @@ void ivpu_pm_disable(struct ivpu_device *vdev) · 34 unmodified lines
401389 pm_runtime_get_noresume(vdev->drm.dev);
402390 pm_runtime_forbid(vdev->drm.dev);
403391 }
392+
393+int ivpu_pm_dct_init(struct ivpu_device *vdev)
394+{
395+ if (vdev->pm->dct_active_percent)
396+ return ivpu_pm_dct_enable(vdev, vdev->pm->dct_active_percent);
397+
398+ return 0;
399+}
400+
401+int ivpu_pm_dct_enable(struct ivpu_device *vdev, u8 active_percent)
402+{
403+ u32 active_us, inactive_us;
404+ int ret;
405+
406+ if (active_percent == 0 || active_percent > 100)
407+ return -EINVAL;
408+
409+ active_us = (DCT_PERIOD_US * active_percent) / 100;
410+ inactive_us = DCT_PERIOD_US - active_us;
411+
412+ ret = ivpu_jsm_dct_enable(vdev, active_us, inactive_us);
413+ if (ret) {
414+ ivpu_err_ratelimited(vdev, "Filed to enable DCT: %d\n", ret);
415+ return ret;
416+ }
417+
418+ vdev->pm->dct_active_percent = active_percent;
419+
420+ ivpu_dbg(vdev, PM, "DCT set to %u%% (D0: %uus, D0i2: %uus)\n",
421+ active_percent, active_us, inactive_us);
422+ return 0;
423+}
424+
425+int ivpu_pm_dct_disable(struct ivpu_device *vdev)
426+{
427+ int ret;
428+
429+ ret = ivpu_jsm_dct_disable(vdev);
430+ if (ret) {
431+ ivpu_err_ratelimited(vdev, "Filed to disable DCT: %d\n", ret);
432+ return ret;
433+ }
434+
435+ vdev->pm->dct_active_percent = 0;
436+
437+ ivpu_dbg(vdev, PM, "DCT disabled\n");
438+ return 0;
439+}
440+
441+void ivpu_pm_dct_irq_thread_handler(struct ivpu_device *vdev)
442+{
443+ bool enable;
444+ int ret;
445+
446+ if (ivpu_hw_btrs_dct_get_request(vdev, &enable))
447+ return;
448+
449+ if (vdev->pm->dct_active_percent)
450+ ret = ivpu_pm_dct_enable(vdev, DCT_DEFAULT_ACTIVE_PERCENT);
451+ else
452+ ret = ivpu_pm_dct_disable(vdev);
453+
454+ if (!ret)
455+ ivpu_hw_btrs_dct_set_status(vdev, enable, vdev->pm->dct_active_percent);
456+}
drivers/accel/ivpu/ivpu_pm.h+7−3
@@ -1,6 +1,6 @@
11 /* SPDX-License-Identifier: GPL-2.0-only */
22 /*
3− * Copyright (C) 2020-2023 Intel Corporation
3+ * Copyright (C) 2020-2024 Intel Corporation
44 */
55
66 #ifndef __IVPU_PM_H__
@@ -19,7 +19,7 @@ struct ivpu_pm_info { · 12 unmodified lines
1919 atomic_t reset_counter;
2020 atomic_t reset_pending;
2121 bool is_warmboot;
22− u32 suspend_reschedule_counter;
22+ u8 dct_active_percent;
2323 };
2424
2525 void ivpu_pm_init(struct ivpu_device *vdev);
@@ -36,11 +36,15 @@ void ivpu_pm_reset_prepare_cb(struct pci_dev *pdev); · 10 unmodified lines
3636 void ivpu_pm_reset_done_cb(struct pci_dev *pdev);
3737
3838 int __must_check ivpu_rpm_get(struct ivpu_device *vdev);
39−int __must_check ivpu_rpm_get_if_active(struct ivpu_device *vdev);
4039 void ivpu_rpm_put(struct ivpu_device *vdev);
4140
4241 void ivpu_pm_trigger_recovery(struct ivpu_device *vdev, const char *reason);
4342 void ivpu_start_job_timeout_detection(struct ivpu_device *vdev);
4443 void ivpu_stop_job_timeout_detection(struct ivpu_device *vdev);
4544
45+int ivpu_pm_dct_init(struct ivpu_device *vdev);
46+int ivpu_pm_dct_enable(struct ivpu_device *vdev, u8 active_percent);
47+int ivpu_pm_dct_disable(struct ivpu_device *vdev);
48+void ivpu_pm_dct_irq_thread_handler(struct ivpu_device *vdev);
49+
4650 #endif /* __IVPU_PM_H__ */
drivers/accel/ivpu/ivpu_sysfs.c+58−0
@@ -0,0 +1,58 @@
1+// SPDX-License-Identifier: GPL-2.0-only
2+/*
3+ * Copyright (C) 2024 Intel Corporation
4+ */
5+
6+#include <linux/device.h>
7+#include <linux/err.h>
8+
9+#include "ivpu_hw.h"
10+#include "ivpu_sysfs.h"
11+
12+/*
13+ * npu_busy_time_us is the time that the device spent executing jobs.
14+ * The time is counted when and only when there are jobs submitted to firmware.
15+ *
16+ * This time can be used to measure the utilization of NPU, either by calculating
17+ * npu_busy_time_us difference between two timepoints (i.e. measuring the time
18+ * that the NPU was active during some workload) or monitoring utilization percentage
19+ * by reading npu_busy_time_us periodically.
20+ *
21+ * When reading the value periodically, it shouldn't be read too often as it may have
22+ * an impact on job submission performance. Recommended period is 1 second.
23+ */
24+static ssize_t
25+npu_busy_time_us_show(struct device *dev, struct device_attribute *attr, char *buf)
26+{
27+ struct drm_device *drm = dev_get_drvdata(dev);
28+ struct ivpu_device *vdev = to_ivpu_device(drm);
29+ ktime_t total, now = 0;
30+
31+ xa_lock(&vdev->submitted_jobs_xa);
32+ total = vdev->busy_time;
33+ if (!xa_empty(&vdev->submitted_jobs_xa))
34+ now = ktime_sub(ktime_get(), vdev->busy_start_ts);
35+ xa_unlock(&vdev->submitted_jobs_xa);
36+
37+ return sysfs_emit(buf, "%lld\n", ktime_to_us(ktime_add(total, now)));
38+}
39+
40+static DEVICE_ATTR_RO(npu_busy_time_us);
41+
42+static struct attribute *ivpu_dev_attrs[] = {
43+ &dev_attr_npu_busy_time_us.attr,
44+ NULL,
45+};
46+
47+static struct attribute_group ivpu_dev_attr_group = {
48+ .attrs = ivpu_dev_attrs,
49+};
50+
51+void ivpu_sysfs_init(struct ivpu_device *vdev)
52+{
53+ int ret;
54+
55+ ret = devm_device_add_group(vdev->drm.dev, &ivpu_dev_attr_group);
56+ if (ret)
57+ ivpu_warn(vdev, "Failed to add group to device, ret %d", ret);
58+}
drivers/accel/ivpu/ivpu_sysfs.h+13−0
@@ -0,0 +1,13 @@
1+/* SPDX-License-Identifier: GPL-2.0-only */
2+/*
3+ * Copyright (C) 2024 Intel Corporation
4+ */
5+
6+#ifndef __IVPU_SYSFS_H__
7+#define __IVPU_SYSFS_H__
8+
9+#include "ivpu_drv.h"
10+
11+void ivpu_sysfs_init(struct ivpu_device *vdev);
12+
13+#endif /* __IVPU_SYSFS_H__ */
drivers/accel/ivpu/vpu_boot_api.h+14−2
@@ -27,7 +27,7 @@ · 26 unmodified lines
2727 * Minor version changes when API backward compatibility is preserved.
2828 * Resets to 0 if Major version is incremented.
2929 */
30−#define VPU_BOOT_API_VER_MINOR 22
30+#define VPU_BOOT_API_VER_MINOR 24
3131
3232 /*
3333 * API header changed (field names, documentation, formatting) but API itself has not been changed
@@ -80,6 +80,11 @@ struct vpu_firmware_header { · 46 unmodified lines
8080 u32 preemption_buffer_2_size;
8181 /* Space reserved for future preemption-related fields. */
8282 u32 preemption_reserved[6];
83+ /* FW image read only section start address, 4KB aligned */
84+ u64 ro_section_start_address;
85+ /* FW image read only section size, 4KB aligned */
86+ u32 ro_section_size;
87+ u32 reserved;
8388 };
8489
8590 /*
@@ -333,7 +338,14 @@ struct vpu_boot_params { · 247 unmodified lines
333338 * The KMD is required to update this value on every VPU reset.
334339 */
335340 u64 system_time_us;
336− u32 pad4[18];
341+ u32 pad4[2];
342+ /*
343+ * The delta between device monotonic time and the current value of the
344+ * HW timestamp register, in ticks. Written by the firmware during boot.
345+ * Can be used by the KMD to calculate device time.
346+ */
347+ u64 device_time_delta_ticks;
348+ u32 pad7[14];
337349 /* Warm boot information: 0x400 - 0x43F */
338350 u32 warm_boot_sections_count;
339351 u32 warm_boot_start_address_reference;
drivers/accel/ivpu/vpu_jsm_api.h+11−3
@@ -1,6 +1,6 @@
11 /* SPDX-License-Identifier: MIT */
22 /*
3− * Copyright (c) 2020-2023, Intel Corporation.
3+ * Copyright (c) 2020-2024, Intel Corporation.
44 */
55
66 /**
@@ -22,12 +22,12 @@ · 15 unmodified lines
2222 /*
2323 * Minor version changes when API backward compatibility is preserved.
2424 */
25−#define VPU_JSM_API_VER_MINOR 15
25+#define VPU_JSM_API_VER_MINOR 16
2626
2727 /*
2828 * API header changed (field names, documentation, formatting) but API itself has not been changed
2929 */
30−#define VPU_JSM_API_VER_PATCH 6
30+#define VPU_JSM_API_VER_PATCH 0
3131
3232 /*
3333 * Index in the API version table
@@ -868,6 +868,14 @@ struct vpu_ipc_msg_payload_hws_set_scheduling_log { · 834 unmodified lines
868868 * is generated when an event log is written to this index.
869869 */
870870 u64 notify_index;
871+ /*
872+ * Enable extra events to be output to log for debug of scheduling algorithm.
873+ * Interpreted by VPU as a boolean to enable or disable, expected values are
874+ * 0 and 1.
875+ */
876+ u32 enable_extra_events;
877+ /* Zero Padding */
878+ u32 reserved_0;
871879 };
872880
873881 /*
drivers/char/agp/amd64-agp.c+1−0
@@ -802,4 +802,5 @@ module_exit(agp_amd64_cleanup); · 801 unmodified lines
802802
803803 MODULE_AUTHOR("Dave Jones, Andi Kleen");
804804 module_param(agp_try_unsupported, bool, 0);
805+MODULE_DESCRIPTION("GART driver for the AMD Opteron/Athlon64 on-CPU northbridge");
805806 MODULE_LICENSE("GPL");
drivers/char/agp/intel-agp.c+2−1
@@ -12,7 +12,7 @@ · 11 unmodified lines
1212 #include <asm/smp.h>
1313 #include "agp.h"
1414 #include "intel-agp.h"
15−#include <drm/intel-gtt.h>
15+#include <drm/intel/intel-gtt.h>
1616
1717 static int intel_fetch_size(void)
1818 {
@@ -920,4 +920,5 @@ module_init(agp_intel_init); · 901 unmodified lines
920920 module_exit(agp_intel_cleanup);
921921
922922 MODULE_AUTHOR("Dave Jones, Various @Intel");
923+MODULE_DESCRIPTION("Intel AGPGART routines");
923924 MODULE_LICENSE("GPL and additional rights");
drivers/char/agp/intel-gtt.c+2−1
@@ -25,7 +25,7 @@ · 24 unmodified lines
2525 #include <asm/smp.h>
2626 #include "agp.h"
2727 #include "intel-agp.h"
28−#include <drm/intel-gtt.h>
28+#include <drm/intel/intel-gtt.h>
2929 #include <asm/set_memory.h>
3030
3131 /*
@@ -1461,4 +1461,5 @@ void intel_gmch_remove(void) · 1429 unmodified lines
14611461 EXPORT_SYMBOL(intel_gmch_remove);
14621462
14631463 MODULE_AUTHOR("Dave Jones, Various @Intel");
1464+MODULE_DESCRIPTION("Intel GTT (Graphics Translation Table) routines");
14641465 MODULE_LICENSE("GPL and additional rights");
drivers/char/agp/sis-agp.c+1−0
@@ -433,4 +433,5 @@ module_param(agp_sis_force_delay, bool, 0); · 432 unmodified lines
433433 MODULE_PARM_DESC(agp_sis_force_delay,"forces sis delay hack");
434434 module_param(agp_sis_agp_spec, int, 0);
435435 MODULE_PARM_DESC(agp_sis_agp_spec,"0=force sis init, 1=force generic agp3 init, default: autodetect");
436+MODULE_DESCRIPTION("SiS AGPGART routines");
436437 MODULE_LICENSE("GPL and additional rights");
drivers/char/agp/via-agp.c+1−0
@@ -575,5 +575,6 @@ static void __exit agp_via_cleanup(void) · 574 unmodified lines
575575 module_init(agp_via_init);
576576 module_exit(agp_via_cleanup);
577577
578+MODULE_DESCRIPTION("VIA AGPGART routines");
578579 MODULE_LICENSE("GPL");
579580 MODULE_AUTHOR("Dave Jones");
drivers/dma-buf/dma-fence-array.c+4−6
@@ -70,7 +70,7 @@ static void dma_fence_array_cb_func(struct dma_fence *f, · 69 unmodified lines
7070 static bool dma_fence_array_enable_signaling(struct dma_fence *fence)
7171 {
7272 struct dma_fence_array *array = to_dma_fence_array(fence);
73− struct dma_fence_array_cb *cb = (void *)(&array[1]);
73+ struct dma_fence_array_cb *cb = array->callbacks;
7474 unsigned i;
7575
7676 for (i = 0; i < array->num_fences; ++i) {
@@ -168,22 +168,20 @@ struct dma_fence_array *dma_fence_array_create(int num_fences, · 91 unmodified lines
168168 bool signal_on_any)
169169 {
170170 struct dma_fence_array *array;
171− size_t size = sizeof(*array);
172171
173172 WARN_ON(!num_fences || !fences);
174173
175− /* Allocate the callback structures behind the array. */
176− size += num_fences * sizeof(struct dma_fence_array_cb);
177− array = kzalloc(size, GFP_KERNEL);
174+ array = kzalloc(struct_size(array, callbacks, num_fences), GFP_KERNEL);
178175 if (!array)
179176 return NULL;
180177
178+ array->num_fences = num_fences;
179+
181180 spin_lock_init(&array->lock);
182181 dma_fence_init(&array->base, &dma_fence_array_ops, &array->lock,
183182 context, seqno);
184183 init_irq_work(&array->work, irq_dma_fence_array_work);
185184
186− array->num_fences = num_fences;
187185 atomic_set(&array->num_pending, signal_on_any ? 1 : num_fences);
188186 array->fences = fences;
189187
drivers/dma-buf/dma-heap.c+2−2
@@ -50,8 +50,8 @@ static struct class *dma_heap_class; · 49 unmodified lines
5050 static DEFINE_XARRAY_ALLOC(dma_heap_minors);
5151
5252 static int dma_heap_buffer_alloc(struct dma_heap *heap, size_t len,
53− unsigned int fd_flags,
54− unsigned int heap_flags)
53+ u32 fd_flags,
54+ u64 heap_flags)
5555 {
5656 struct dma_buf *dmabuf;
5757 int fd;
drivers/dma-buf/dma-resv.c+7−0
@@ -186,6 +186,13 @@ int dma_resv_reserve_fences(struct dma_resv *obj, unsigned int num_fences) · 185 unmodified lines
186186
187187 dma_resv_assert_held(obj);
188188
189+ /* Driver and component code should never call this function with
190+ * num_fences=0. If they do it usually points to bugs when calculating
191+ * the number of needed fences dynamically.
192+ */
193+ if (WARN_ON(!num_fences))
194+ return -EINVAL;
195+
189196 old = dma_resv_fences_list(obj);
190197 if (old && old->max_fences) {
191198 if ((old->num_fences + num_fences) <= old->max_fences)
drivers/dma-buf/heaps/cma_heap.c+2−2
@@ -274,8 +274,8 @@ static const struct dma_buf_ops cma_heap_buf_ops = { · 273 unmodified lines
274274
275275 static struct dma_buf *cma_heap_allocate(struct dma_heap *heap,
276276 unsigned long len,
277− unsigned long fd_flags,
278− unsigned long heap_flags)
277+ u32 fd_flags,
278+ u64 heap_flags)
279279 {
280280 struct cma_heap *cma_heap = dma_heap_get_drvdata(heap);
281281 struct cma_heap_buffer *buffer;
drivers/dma-buf/heaps/system_heap.c+2−2
@@ -333,8 +333,8 @@ static struct page *alloc_largest_available(unsigned long size, · 332 unmodified lines
333333
334334 static struct dma_buf *system_heap_allocate(struct dma_heap *heap,
335335 unsigned long len,
336− unsigned long fd_flags,
337− unsigned long heap_flags)
336+ u32 fd_flags,
337+ u64 heap_flags)
338338 {
339339 struct system_heap_buffer *buffer;
340340 DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
drivers/gpu/drm/Kconfig+15−1
@@ -79,6 +79,7 @@ config DRM_KUNIT_TEST · 78 unmodified lines
7979 depends on DRM && KUNIT && MMU
8080 select DRM_BUDDY
8181 select DRM_DISPLAY_DP_HELPER
82+ select DRM_DISPLAY_HDMI_STATE_HELPER
8283 select DRM_DISPLAY_HELPER
8384 select DRM_EXEC
8485 select DRM_EXPORT_FOR_TESTS if m
@@ -106,7 +107,7 @@ config DRM_KMS_HELPER · 21 unmodified lines
106107
107108 config DRM_PANIC
108109 bool "Display a user-friendly message when a kernel panic occurs"
109− depends on DRM && !FRAMEBUFFER_CONSOLE
110+ depends on DRM && !(FRAMEBUFFER_CONSOLE && VT_CONSOLE)
110111 select DRM_KMS_HELPER
111112 select FONT_SUPPORT
112113 help
@@ -136,6 +137,19 @@ config DRM_PANIC_DEBUG · 23 unmodified lines
136137 This is unsafe and should not be enabled on a production build.
137138 If in doubt, say "N".
138139
140+config DRM_PANIC_SCREEN
141+ string "Panic screen formater"
142+ default "user"
143+ depends on DRM_PANIC
144+ help
145+ This option enable to choose what will be displayed when a kernel
146+ panic occurs. You can choose between "user", a short message telling
147+ the user to reboot the system, or "kmsg" which will display the last
148+ lines of kmsg.
149+ This can also be overridden by drm.panic_screen=xxxx kernel parameter
150+ or by writing to /sys/module/drm/parameters/panic_screen sysfs entry
151+ Default is "user"
152+
139153 config DRM_DEBUG_DP_MST_TOPOLOGY_REFS
140154 bool "Enable refcount backtrace history in the DP MST helpers"
141155 depends on STACKTRACE_SUPPORT
drivers/gpu/drm/Makefile+3−3
@@ -108,6 +108,7 @@ drm_dma_helper-$(CONFIG_DRM_KMS_HELPER) += drm_fb_dma_helper.o · 107 unmodified lines
108108 obj-$(CONFIG_DRM_GEM_DMA_HELPER) += drm_dma_helper.o
109109
110110 drm_shmem_helper-y := drm_gem_shmem_helper.o
111+drm_shmem_helper-$(CONFIG_DRM_FBDEV_EMULATION) += drm_fbdev_shmem.o
111112 obj-$(CONFIG_DRM_GEM_SHMEM_HELPER) += drm_shmem_helper.o
112113
113114 drm_suballoc_helper-y := drm_suballoc.o
@@ -117,6 +118,7 @@ drm_vram_helper-y := drm_gem_vram_helper.o · 3 unmodified lines
117118 obj-$(CONFIG_DRM_VRAM_HELPER) += drm_vram_helper.o
118119
119120 drm_ttm_helper-y := drm_gem_ttm_helper.o
121+drm_ttm_helper-$(CONFIG_DRM_FBDEV_EMULATION) += drm_fbdev_ttm.o
120122 obj-$(CONFIG_DRM_TTM_HELPER) += drm_ttm_helper.o
121123
122124 #
@@ -142,9 +144,7 @@ drm_kms_helper-y := \ · 19 unmodified lines
142144 drm_self_refresh_helper.o \
143145 drm_simple_kms_helper.o
144146 drm_kms_helper-$(CONFIG_DRM_PANEL_BRIDGE) += bridge/panel.o
145−drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += \
146− drm_fbdev_generic.o \
147− drm_fb_helper.o
147+drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += drm_fb_helper.o
148148 obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o
149149
150150 #
drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c+0−16
@@ -246,22 +246,6 @@ amdgpu_connector_find_encoder(struct drm_connector *connector, · 245 unmodified lines
246246 return NULL;
247247 }
248248
249−struct edid *amdgpu_connector_edid(struct drm_connector *connector)
250−{
251− struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
252− struct drm_property_blob *edid_blob = connector->edid_blob_ptr;
253−
254− if (amdgpu_connector->edid) {
255− return amdgpu_connector->edid;
256− } else if (edid_blob) {
257− struct edid *edid = kmemdup(edid_blob->data, edid_blob->length, GFP_KERNEL);
258−
259− if (edid)
260− amdgpu_connector->edid = edid;
261− }
262− return amdgpu_connector->edid;
263−}
264−
265249 static struct edid *
266250 amdgpu_connector_get_hardcoded_edid(struct amdgpu_device *adev)
267251 {
drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.h+0−1
@@ -24,7 +24,6 @@ · 23 unmodified lines
2424 #ifndef __AMDGPU_CONNECTORS_H__
2525 #define __AMDGPU_CONNECTORS_H__
2626
27−struct edid *amdgpu_connector_edid(struct drm_connector *connector);
2827 void amdgpu_connector_hotplug(struct drm_connector *connector);
2928 int amdgpu_connector_get_monitor_bpc(struct drm_connector *connector);
3029 u16 amdgpu_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *connector);
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c+3−3
@@ -24,7 +24,7 @@ · 23 unmodified lines
2424
2525 #include <drm/amdgpu_drm.h>
2626 #include <drm/drm_drv.h>
27−#include <drm/drm_fbdev_generic.h>
27+#include <drm/drm_fbdev_ttm.h>
2828 #include <drm/drm_gem.h>
2929 #include <drm/drm_managed.h>
3030 #include <drm/drm_pciids.h>
@@ -2346,9 +2346,9 @@ retry_init: · 2315 unmodified lines
23462346 !list_empty(&adev_to_drm(adev)->mode_config.connector_list)) {
23472347 /* select 8 bpp console on low vram cards */
23482348 if (adev->gmc.real_vram_size <= (32*1024*1024))
2349− drm_fbdev_generic_setup(adev_to_drm(adev), 8);
2349+ drm_fbdev_ttm_setup(adev_to_drm(adev), 8);
23502350 else
2351− drm_fbdev_generic_setup(adev_to_drm(adev), 32);
2351+ drm_fbdev_ttm_setup(adev_to_drm(adev), 32);
23522352 }
23532353
23542354 ret = amdgpu_debugfs_init(adev);
drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c+2−6
@@ -65,9 +65,7 @@ static enum hrtimer_restart amdgpu_vkms_vblank_simulate(struct hrtimer *timer) · 64 unmodified lines
6565
6666 static int amdgpu_vkms_enable_vblank(struct drm_crtc *crtc)
6767 {
68− struct drm_device *dev = crtc->dev;
69− unsigned int pipe = drm_crtc_index(crtc);
70− struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
68+ struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
7169 struct amdgpu_vkms_output *out = drm_crtc_to_amdgpu_vkms_output(crtc);
7270 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
7371
@@ -91,10 +89,8 @@ static bool amdgpu_vkms_get_vblank_timestamp(struct drm_crtc *crtc, · 17 unmodified lines
9189 ktime_t *vblank_time,
9290 bool in_vblank_irq)
9391 {
94− struct drm_device *dev = crtc->dev;
95− unsigned int pipe = crtc->index;
9692 struct amdgpu_vkms_output *output = drm_crtc_to_amdgpu_vkms_output(crtc);
97− struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
93+ struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
9894 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
9995
10096 if (!READ_ONCE(vblank->enabled)) {
drivers/gpu/drm/amd/amdgpu/dce_v10_0.c+2−2
@@ -1299,7 +1299,7 @@ static void dce_v10_0_audio_write_speaker_allocation(struct drm_encoder *encoder · 1298 unmodified lines
12991299 return;
13001300 }
13011301
1302− sad_count = drm_edid_to_speaker_allocation(amdgpu_connector_edid(connector), &sadb);
1302+ sad_count = drm_edid_to_speaker_allocation(amdgpu_connector->edid, &sadb);
13031303 if (sad_count < 0) {
13041304 DRM_ERROR("Couldn't read Speaker Allocation Data Block: %d\n", sad_count);
13051305 sad_count = 0;
@@ -1369,7 +1369,7 @@ static void dce_v10_0_audio_write_sad_regs(struct drm_encoder *encoder) · 63 unmodified lines
13691369 return;
13701370 }
13711371
1372− sad_count = drm_edid_to_sad(amdgpu_connector_edid(connector), &sads);
1372+ sad_count = drm_edid_to_sad(amdgpu_connector->edid, &sads);
13731373 if (sad_count < 0)
13741374 DRM_ERROR("Couldn't read SADs: %d\n", sad_count);
13751375 if (sad_count <= 0)
drivers/gpu/drm/amd/amdgpu/dce_v11_0.c+2−2
@@ -1331,7 +1331,7 @@ static void dce_v11_0_audio_write_speaker_allocation(struct drm_encoder *encoder · 1330 unmodified lines
13311331 return;
13321332 }
13331333
1334− sad_count = drm_edid_to_speaker_allocation(amdgpu_connector_edid(connector), &sadb);
1334+ sad_count = drm_edid_to_speaker_allocation(amdgpu_connector->edid, &sadb);
13351335 if (sad_count < 0) {
13361336 DRM_ERROR("Couldn't read Speaker Allocation Data Block: %d\n", sad_count);
13371337 sad_count = 0;
@@ -1401,7 +1401,7 @@ static void dce_v11_0_audio_write_sad_regs(struct drm_encoder *encoder) · 63 unmodified lines
14011401 return;
14021402 }
14031403
1404− sad_count = drm_edid_to_sad(amdgpu_connector_edid(connector), &sads);
1404+ sad_count = drm_edid_to_sad(amdgpu_connector->edid, &sads);
14051405 if (sad_count < 0)
14061406 DRM_ERROR("Couldn't read SADs: %d\n", sad_count);
14071407 if (sad_count <= 0)
drivers/gpu/drm/amd/amdgpu/dce_v6_0.c+2−2
@@ -1217,7 +1217,7 @@ static void dce_v6_0_audio_write_speaker_allocation(struct drm_encoder *encoder) · 1216 unmodified lines
12171217 return;
12181218 }
12191219
1220− sad_count = drm_edid_to_speaker_allocation(amdgpu_connector_edid(connector), &sadb);
1220+ sad_count = drm_edid_to_speaker_allocation(amdgpu_connector->edid, &sadb);
12211221 if (sad_count < 0) {
12221222 DRM_ERROR("Couldn't read Speaker Allocation Data Block: %d\n", sad_count);
12231223 sad_count = 0;
@@ -1292,7 +1292,7 @@ static void dce_v6_0_audio_write_sad_regs(struct drm_encoder *encoder) · 68 unmodified lines
12921292 return;
12931293 }
12941294
1295− sad_count = drm_edid_to_sad(amdgpu_connector_edid(connector), &sads);
1295+ sad_count = drm_edid_to_sad(amdgpu_connector->edid, &sads);
12961296 if (sad_count < 0)
12971297 DRM_ERROR("Couldn't read SADs: %d\n", sad_count);
12981298 if (sad_count <= 0)
drivers/gpu/drm/amd/amdgpu/dce_v8_0.c+2−2
@@ -1272,7 +1272,7 @@ static void dce_v8_0_audio_write_speaker_allocation(struct drm_encoder *encoder) · 1271 unmodified lines
12721272 return;
12731273 }
12741274
1275− sad_count = drm_edid_to_speaker_allocation(amdgpu_connector_edid(connector), &sadb);
1275+ sad_count = drm_edid_to_speaker_allocation(amdgpu_connector->edid, &sadb);
12761276 if (sad_count < 0) {
12771277 DRM_ERROR("Couldn't read Speaker Allocation Data Block: %d\n", sad_count);
12781278 sad_count = 0;
@@ -1340,7 +1340,7 @@ static void dce_v8_0_audio_write_sad_regs(struct drm_encoder *encoder) · 61 unmodified lines
13401340 return;
13411341 }
13421342
1343− sad_count = drm_edid_to_sad(amdgpu_connector_edid(connector), &sads);
1343+ sad_count = drm_edid_to_sad(amdgpu_connector->edid, &sads);
13441344 if (sad_count < 0)
13451345 DRM_ERROR("Couldn't read SADs: %d\n", sad_count);
13461346 if (sad_count <= 0)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c+1−1
@@ -534,7 +534,7 @@ static void dm_vupdate_high_irq(void *interrupt_params) · 533 unmodified lines
534534 if (acrtc) {
535535 vrr_active = amdgpu_dm_crtc_vrr_active_irq(acrtc);
536536 drm_dev = acrtc->base.dev;
537− vblank = &drm_dev->vblank[acrtc->base.index];
537+ vblank = drm_crtc_vblank_crtc(&acrtc->base);
538538 previous_timestamp = atomic64_read(&irq_params->previous_timestamp);
539539 frame_duration_ns = vblank->time - previous_timestamp;
540540
drivers/gpu/drm/arm/display/komeda/komeda_crtc.c+35−14
@@ -5,6 +5,7 @@ · 4 unmodified lines
55 *
66 */
77 #include <linux/clk.h>
8+#include <linux/of.h>
89 #include <linux/pm_runtime.h>
910 #include <linux/spinlock.h>
1011
@@ -294,7 +295,6 @@ komeda_crtc_flush_and_wait_for_flip_done(struct komeda_crtc *kcrtc, · 283 unmodified lines
294295 struct komeda_dev *mdev = kcrtc->master->mdev;
295296 struct completion *flip_done;
296297 struct completion temp;
297− int timeout;
298298
299299 /* if caller doesn't send a flip_done, use a private flip_done */
300300 if (input_flip_done) {
@@ -308,8 +308,7 @@ komeda_crtc_flush_and_wait_for_flip_done(struct komeda_crtc *kcrtc, · 7 unmodified lines
308308 mdev->funcs->flush(mdev, kcrtc->master->id, 0);
309309
310310 /* wait the flip take affect.*/
311− timeout = wait_for_completion_timeout(flip_done, HZ);
312− if (timeout == 0) {
311+ if (wait_for_completion_timeout(flip_done, HZ) == 0) {
313312 DRM_ERROR("wait pipe%d flip done timeout\n", kcrtc->master->id);
314313 if (!input_flip_done) {
315314 unsigned long flags;
@@ -610,12 +609,34 @@ get_crtc_primary(struct komeda_kms_dev *kms, struct komeda_crtc *crtc) · 294 unmodified lines
610609 return NULL;
611610 }
612611
612+static int komeda_attach_bridge(struct device *dev,
613+ struct komeda_pipeline *pipe,
614+ struct drm_encoder *encoder)
615+{
616+ struct drm_bridge *bridge;
617+ int err;
618+
619+ bridge = devm_drm_of_get_bridge(dev, pipe->of_node,
620+ KOMEDA_OF_PORT_OUTPUT, 0);
621+ if (IS_ERR(bridge))
622+ return dev_err_probe(dev, PTR_ERR(bridge), "remote bridge not found for pipe: %s\n",
623+ of_node_full_name(pipe->of_node));
624+
625+ err = drm_bridge_attach(encoder, bridge, NULL, 0);
626+ if (err)
627+ dev_err(dev, "bridge_attach() failed for pipe: %s\n",
628+ of_node_full_name(pipe->of_node));
629+
630+ return err;
631+}
632+
613633 static int komeda_crtc_add(struct komeda_kms_dev *kms,
614634 struct komeda_crtc *kcrtc)
615635 {
616636 struct drm_crtc *crtc = &kcrtc->base;
617637 struct drm_device *base = &kms->base;
618− struct drm_bridge *bridge;
638+ struct komeda_pipeline *pipe = kcrtc->master;
639+ struct drm_encoder *encoder = &kcrtc->encoder;
619640 int err;
620641
621642 err = drm_crtc_init_with_planes(base, crtc,
@@ -626,27 +647,27 @@ static int komeda_crtc_add(struct komeda_kms_dev *kms, · 4 unmodified lines
626647
627648 drm_crtc_helper_add(crtc, &komeda_crtc_helper_funcs);
628649
629− crtc->port = kcrtc->master->of_output_port;
650+ crtc->port = pipe->of_output_port;
630651
631652 /* Construct an encoder for each pipeline and attach it to the remote
632653 * bridge
633654 */
634655 kcrtc->encoder.possible_crtcs = drm_crtc_mask(crtc);
635− err = drm_simple_encoder_init(base, &kcrtc->encoder,
636− DRM_MODE_ENCODER_TMDS);
656+ err = drm_simple_encoder_init(base, encoder, DRM_MODE_ENCODER_TMDS);
637657 if (err)
638658 return err;
639659
640− bridge = devm_drm_of_get_bridge(base->dev, kcrtc->master->of_node,
641− KOMEDA_OF_PORT_OUTPUT, 0);
642− if (IS_ERR(bridge))
643− return PTR_ERR(bridge);
644−
645− err = drm_bridge_attach(&kcrtc->encoder, bridge, NULL, 0);
660+ if (pipe->of_output_links[0]) {
661+ err = komeda_attach_bridge(base->dev, pipe, encoder);
662+ if (err)
663+ return err;
664+ }
646665
647666 drm_crtc_enable_color_mgmt(crtc, 0, true, KOMEDA_COLOR_LUT_SIZE);
648667
649− return err;
668+ komeda_pipeline_dump(pipe);
669+
670+ return 0;
650671 }
651672
652673 int komeda_kms_add_crtcs(struct komeda_kms_dev *kms, struct komeda_dev *mdev)
drivers/gpu/drm/arm/display/komeda/komeda_drv.c+6−2
@@ -9,7 +9,7 @@ · 8 unmodified lines
99 #include <linux/of.h>
1010 #include <linux/platform_device.h>
1111 #include <linux/pm_runtime.h>
12−#include <drm/drm_fbdev_generic.h>
12+#include <drm/drm_fbdev_dma.h>
1313 #include <drm/drm_module.h>
1414 #include <drm/drm_of.h>
1515 #include "komeda_dev.h"
@@ -59,6 +59,10 @@ static int komeda_platform_probe(struct platform_device *pdev) · 43 unmodified lines
5959 struct komeda_drv *mdrv;
6060 int err;
6161
62+ err = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(40));
63+ if (err)
64+ return dev_err_probe(dev, err, "DMA mask error\n");
65+
6266 mdrv = devm_kzalloc(dev, sizeof(*mdrv), GFP_KERNEL);
6367 if (!mdrv)
6468 return -ENOMEM;
@@ -80,7 +84,7 @@ static int komeda_platform_probe(struct platform_device *pdev) · 15 unmodified lines
8084 }
8185
8286 dev_set_drvdata(dev, mdrv);
83− drm_fbdev_generic_setup(&mdrv->kms->base, 32);
87+ drm_fbdev_dma_setup(&mdrv->kms->base, 32);
8488
8589 return 0;
8690
drivers/gpu/drm/arm/display/komeda/komeda_kms.h+1−0
@@ -191,5 +191,6 @@ void komeda_crtc_flush_and_wait_for_flip_done(struct komeda_crtc *kcrtc, · 190 unmodified lines
191191 struct komeda_kms_dev *komeda_kms_attach(struct komeda_dev *mdev);
192192 void komeda_kms_detach(struct komeda_kms_dev *kms);
193193 void komeda_kms_shutdown(struct komeda_kms_dev *kms);
194+void komeda_pipeline_dump(struct komeda_pipeline *pipe);
194195
195196 #endif /*_KOMEDA_KMS_H_*/
drivers/gpu/drm/arm/display/komeda/komeda_pipeline.c+2−2
@@ -10,6 +10,7 @@ · 9 unmodified lines
1010 #include <drm/drm_print.h>
1111
1212 #include "komeda_dev.h"
13+#include "komeda_kms.h"
1314 #include "komeda_pipeline.h"
1415
1516 /** komeda_pipeline_add - Add a pipeline to &komeda_dev */
@@ -247,7 +248,7 @@ static void komeda_component_dump(struct komeda_component *c) · 231 unmodified lines
247248 c->max_active_outputs, c->supported_outputs);
248249 }
249250
250−static void komeda_pipeline_dump(struct komeda_pipeline *pipe)
251+void komeda_pipeline_dump(struct komeda_pipeline *pipe)
251252 {
252253 struct komeda_component *c;
253254 int id;
@@ -351,7 +352,6 @@ int komeda_assemble_pipelines(struct komeda_dev *mdev) · 97 unmodified lines
351352 pipe = mdev->pipelines[i];
352353
353354 komeda_pipeline_assemble(pipe);
354− komeda_pipeline_dump(pipe);
355355 }
356356
357357 return 0;
drivers/gpu/drm/ast/ast_drv.c+2−2
@@ -33,7 +33,7 @@ · 32 unmodified lines
3333 #include <drm/drm_aperture.h>
3434 #include <drm/drm_atomic_helper.h>
3535 #include <drm/drm_drv.h>
36−#include <drm/drm_fbdev_generic.h>
36+#include <drm/drm_fbdev_shmem.h>
3737 #include <drm/drm_gem_shmem_helper.h>
3838 #include <drm/drm_module.h>
3939 #include <drm/drm_probe_helper.h>
@@ -360,7 +360,7 @@ static int ast_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) · 320 unmodified lines
360360 if (ret)
361361 return ret;
362362
363− drm_fbdev_generic_setup(drm, 32);
363+ drm_fbdev_shmem_setup(drm, 32);
364364
365365 return 0;
366366 }
drivers/gpu/drm/atmel-hlcdc/Kconfig+1−1
@@ -1,7 +1,7 @@
11 # SPDX-License-Identifier: GPL-2.0-only
22 config DRM_ATMEL_HLCDC
33 tristate "DRM Support for ATMEL HLCDC Display Controller"
4− depends on DRM && OF && COMMON_CLK && MFD_ATMEL_HLCDC && ARM
4+ depends on DRM && OF && COMMON_CLK && ((MFD_ATMEL_HLCDC && ARM) || COMPILE_TEST)
55 select DRM_GEM_DMA_HELPER
66 select DRM_KMS_HELPER
77 select DRM_PANEL
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c+141−31
@@ -30,10 +30,12 @@ · 29 unmodified lines
3030 *
3131 * @base: base CRTC state
3232 * @output_mode: RGBXXX output mode
33+ * @dpi: output DPI mode
3334 */
3435 struct atmel_hlcdc_crtc_state {
3536 struct drm_crtc_state base;
3637 unsigned int output_mode;
38+ u8 dpi;
3739 };
3840
3941 static inline struct atmel_hlcdc_crtc_state *
@@ -164,18 +166,24 @@ static void atmel_hlcdc_crtc_mode_set_nofb(struct drm_crtc *c) · 124 unmodified lines
164166 state = drm_crtc_state_to_atmel_hlcdc_crtc_state(c->state);
165167 cfg = state->output_mode << 8;
166168
167− if (adj->flags & DRM_MODE_FLAG_NVSYNC)
168− cfg |= ATMEL_HLCDC_VSPOL;
169+ if (!crtc->dc->desc->is_xlcdc) {
170+ if (adj->flags & DRM_MODE_FLAG_NVSYNC)
171+ cfg |= ATMEL_HLCDC_VSPOL;
169172
170− if (adj->flags & DRM_MODE_FLAG_NHSYNC)
171− cfg |= ATMEL_HLCDC_HSPOL;
173+ if (adj->flags & DRM_MODE_FLAG_NHSYNC)
174+ cfg |= ATMEL_HLCDC_HSPOL;
175+ } else {
176+ cfg |= state->dpi << 11;
177+ }
172178
173179 regmap_update_bits(regmap, ATMEL_HLCDC_CFG(5),
174180 ATMEL_HLCDC_HSPOL | ATMEL_HLCDC_VSPOL |
175181 ATMEL_HLCDC_VSPDLYS | ATMEL_HLCDC_VSPDLYE |
176182 ATMEL_HLCDC_DISPPOL | ATMEL_HLCDC_DISPDLY |
177183 ATMEL_HLCDC_VSPSU | ATMEL_HLCDC_VSPHO |
178− ATMEL_HLCDC_GUARDTIME_MASK | ATMEL_HLCDC_MODE_MASK,
184+ ATMEL_HLCDC_GUARDTIME_MASK |
185+ (crtc->dc->desc->is_xlcdc ? ATMEL_XLCDC_MODE_MASK |
186+ ATMEL_XLCDC_DPI : ATMEL_HLCDC_MODE_MASK),
179187 cfg);
180188
181189 clk_disable_unprepare(crtc->dc->hlcdc->sys_clk);
@@ -202,20 +210,37 @@ static void atmel_hlcdc_crtc_atomic_disable(struct drm_crtc *c, · 20 unmodified lines
202210
203211 pm_runtime_get_sync(dev->dev);
204212
213+ if (crtc->dc->desc->is_xlcdc) {
214+ regmap_write(regmap, ATMEL_HLCDC_DIS, ATMEL_XLCDC_CM);
215+ if (regmap_read_poll_timeout(regmap, ATMEL_HLCDC_SR, status,
216+ !(status & ATMEL_XLCDC_CM),
217+ 10, 1000))
218+ dev_warn(dev->dev, "Atmel LCDC status register CMSTS timeout\n");
219+
220+ regmap_write(regmap, ATMEL_HLCDC_DIS, ATMEL_XLCDC_SD);
221+ if (regmap_read_poll_timeout(regmap, ATMEL_HLCDC_SR, status,
222+ status & ATMEL_XLCDC_SD,
223+ 10, 1000))
224+ dev_warn(dev->dev, "Atmel LCDC status register SDSTS timeout\n");
225+ }
226+
205227 regmap_write(regmap, ATMEL_HLCDC_DIS, ATMEL_HLCDC_DISP);
206− while (!regmap_read(regmap, ATMEL_HLCDC_SR, &status) &&
207− (status & ATMEL_HLCDC_DISP))
208− cpu_relax();
228+ if (regmap_read_poll_timeout(regmap, ATMEL_HLCDC_SR, status,
229+ !(status & ATMEL_HLCDC_DISP),
230+ 10, 1000))
231+ dev_warn(dev->dev, "Atmel LCDC status register DISPSTS timeout\n");
209232
210233 regmap_write(regmap, ATMEL_HLCDC_DIS, ATMEL_HLCDC_SYNC);
211− while (!regmap_read(regmap, ATMEL_HLCDC_SR, &status) &&
212− (status & ATMEL_HLCDC_SYNC))
213− cpu_relax();
234+ if (regmap_read_poll_timeout(regmap, ATMEL_HLCDC_SR, status,
235+ !(status & ATMEL_HLCDC_SYNC),
236+ 10, 1000))
237+ dev_warn(dev->dev, "Atmel LCDC status register LCDSTS timeout\n");
214238
215239 regmap_write(regmap, ATMEL_HLCDC_DIS, ATMEL_HLCDC_PIXEL_CLK);
216− while (!regmap_read(regmap, ATMEL_HLCDC_SR, &status) &&
217− (status & ATMEL_HLCDC_PIXEL_CLK))
218− cpu_relax();
240+ if (regmap_read_poll_timeout(regmap, ATMEL_HLCDC_SR, status,
241+ !(status & ATMEL_HLCDC_PIXEL_CLK),
242+ 10, 1000))
243+ dev_warn(dev->dev, "Atmel LCDC status register CLKSTS timeout\n");
219244
220245 clk_disable_unprepare(crtc->dc->hlcdc->sys_clk);
221246 pinctrl_pm_select_sleep_state(dev->dev);
@@ -241,30 +266,95 @@ static void atmel_hlcdc_crtc_atomic_enable(struct drm_crtc *c, · 19 unmodified lines
241266 clk_prepare_enable(crtc->dc->hlcdc->sys_clk);
242267
243268 regmap_write(regmap, ATMEL_HLCDC_EN, ATMEL_HLCDC_PIXEL_CLK);
244− while (!regmap_read(regmap, ATMEL_HLCDC_SR, &status) &&
245− !(status & ATMEL_HLCDC_PIXEL_CLK))
246− cpu_relax();
247−
269+ if (regmap_read_poll_timeout(regmap, ATMEL_HLCDC_SR, status,
270+ status & ATMEL_HLCDC_PIXEL_CLK,
271+ 10, 1000))
272+ dev_warn(dev->dev, "Atmel LCDC status register CLKSTS timeout\n");
248273
249274 regmap_write(regmap, ATMEL_HLCDC_EN, ATMEL_HLCDC_SYNC);
250− while (!regmap_read(regmap, ATMEL_HLCDC_SR, &status) &&
251− !(status & ATMEL_HLCDC_SYNC))
252− cpu_relax();
275+ if (regmap_read_poll_timeout(regmap, ATMEL_HLCDC_SR, status,
276+ status & ATMEL_HLCDC_SYNC,
277+ 10, 1000))
278+ dev_warn(dev->dev, "Atmel LCDC status register LCDSTS timeout\n");
253279
254280 regmap_write(regmap, ATMEL_HLCDC_EN, ATMEL_HLCDC_DISP);
255− while (!regmap_read(regmap, ATMEL_HLCDC_SR, &status) &&
256− !(status & ATMEL_HLCDC_DISP))
257− cpu_relax();
281+ if (regmap_read_poll_timeout(regmap, ATMEL_HLCDC_SR, status,
282+ status & ATMEL_HLCDC_DISP,
283+ 10, 1000))
284+ dev_warn(dev->dev, "Atmel LCDC status register DISPSTS timeout\n");
285+
286+ if (crtc->dc->desc->is_xlcdc) {
287+ regmap_write(regmap, ATMEL_HLCDC_EN, ATMEL_XLCDC_CM);
288+ if (regmap_read_poll_timeout(regmap, ATMEL_HLCDC_SR, status,
289+ status & ATMEL_XLCDC_CM,
290+ 10, 1000))
291+ dev_warn(dev->dev, "Atmel LCDC status register CMSTS timeout\n");
292+
293+ regmap_write(regmap, ATMEL_HLCDC_EN, ATMEL_XLCDC_SD);
294+ if (regmap_read_poll_timeout(regmap, ATMEL_HLCDC_SR, status,
295+ !(status & ATMEL_XLCDC_SD),
296+ 10, 1000))
297+ dev_warn(dev->dev, "Atmel LCDC status register SDSTS timeout\n");
298+ }
258299
259300 pm_runtime_put_sync(dev->dev);
260301
261302 }
262303
263−#define ATMEL_HLCDC_RGB444_OUTPUT BIT(0)
264−#define ATMEL_HLCDC_RGB565_OUTPUT BIT(1)
265−#define ATMEL_HLCDC_RGB666_OUTPUT BIT(2)
266−#define ATMEL_HLCDC_RGB888_OUTPUT BIT(3)
267−#define ATMEL_HLCDC_OUTPUT_MODE_MASK GENMASK(3, 0)
304+#define ATMEL_HLCDC_RGB444_OUTPUT BIT(0)
305+#define ATMEL_HLCDC_RGB565_OUTPUT BIT(1)
306+#define ATMEL_HLCDC_RGB666_OUTPUT BIT(2)
307+#define ATMEL_HLCDC_RGB888_OUTPUT BIT(3)
308+#define ATMEL_HLCDC_DPI_RGB565C1_OUTPUT BIT(4)
309+#define ATMEL_HLCDC_DPI_RGB565C2_OUTPUT BIT(5)
310+#define ATMEL_HLCDC_DPI_RGB565C3_OUTPUT BIT(6)
311+#define ATMEL_HLCDC_DPI_RGB666C1_OUTPUT BIT(7)
312+#define ATMEL_HLCDC_DPI_RGB666C2_OUTPUT BIT(8)
313+#define ATMEL_HLCDC_DPI_RGB888_OUTPUT BIT(9)
314+#define ATMEL_HLCDC_OUTPUT_MODE_MASK GENMASK(3, 0)
315+#define ATMEL_XLCDC_OUTPUT_MODE_MASK GENMASK(9, 0)
316+
317+static int atmel_xlcdc_connector_output_dsi(struct drm_encoder *encoder,
318+ struct drm_display_info *info)
319+{
320+ int j;
321+ unsigned int supported_fmts = 0;
322+
323+ switch (atmel_hlcdc_encoder_get_bus_fmt(encoder)) {
324+ case 0:
325+ break;
326+ case MEDIA_BUS_FMT_RGB565_1X16:
327+ return ATMEL_HLCDC_DPI_RGB565C1_OUTPUT;
328+ case MEDIA_BUS_FMT_RGB666_1X18:
329+ return ATMEL_HLCDC_DPI_RGB666C1_OUTPUT;
330+ case MEDIA_BUS_FMT_RGB666_1X24_CPADHI:
331+ return ATMEL_HLCDC_DPI_RGB666C2_OUTPUT;
332+ case MEDIA_BUS_FMT_RGB888_1X24:
333+ return ATMEL_HLCDC_DPI_RGB888_OUTPUT;
334+ default:
335+ return -EINVAL;
336+ }
337+
338+ for (j = 0; j < info->num_bus_formats; j++) {
339+ switch (info->bus_formats[j]) {
340+ case MEDIA_BUS_FMT_RGB565_1X16:
341+ supported_fmts |= ATMEL_HLCDC_DPI_RGB565C1_OUTPUT;
342+ break;
343+ case MEDIA_BUS_FMT_RGB666_1X18:
344+ supported_fmts |= ATMEL_HLCDC_DPI_RGB666C1_OUTPUT;
345+ break;
346+ case MEDIA_BUS_FMT_RGB666_1X24_CPADHI:
347+ supported_fmts |= ATMEL_HLCDC_DPI_RGB666C2_OUTPUT;
348+ break;
349+ case MEDIA_BUS_FMT_RGB888_1X24:
350+ supported_fmts |= ATMEL_HLCDC_DPI_RGB888_OUTPUT;
351+ break;
352+ default:
353+ break;
354+ }
355+ }
356+ return supported_fmts;
357+}
268358
269359 static int atmel_hlcdc_connector_output_mode(struct drm_connector_state *state)
270360 {
@@ -277,6 +367,13 @@ static int atmel_hlcdc_connector_output_mode(struct drm_connector_state *state) · 6 unmodified lines
277367 encoder = state->best_encoder;
278368 if (!encoder)
279369 encoder = connector->encoder;
370+ /*
371+ * atmel-hlcdc to support DSI formats with DSI video pipeline
372+ * when DRM_MODE_ENCODER_DSI type is set by
373+ * connector driver component.
374+ */
375+ if (encoder->encoder_type == DRM_MODE_ENCODER_DSI)
376+ return atmel_xlcdc_connector_output_dsi(encoder, info);
280377
281378 switch (atmel_hlcdc_encoder_get_bus_fmt(encoder)) {
282379 case 0:
@@ -317,7 +414,7 @@ static int atmel_hlcdc_connector_output_mode(struct drm_connector_state *state) · 34 unmodified lines
317414
318415 static int atmel_hlcdc_crtc_select_output_mode(struct drm_crtc_state *state)
319416 {
320− unsigned int output_fmts = ATMEL_HLCDC_OUTPUT_MODE_MASK;
417+ unsigned int output_fmts;
321418 struct atmel_hlcdc_crtc_state *hstate;
322419 struct drm_connector_state *cstate;
323420 struct drm_connector *connector;
@@ -325,6 +422,8 @@ static int atmel_hlcdc_crtc_select_output_mode(struct drm_crtc_state *state) · 1 unmodified line
325422 int i;
326423
327424 crtc = drm_crtc_to_atmel_hlcdc_crtc(state->crtc);
425+ output_fmts = crtc->dc->desc->is_xlcdc ? ATMEL_XLCDC_OUTPUT_MODE_MASK :
426+ ATMEL_HLCDC_OUTPUT_MODE_MASK;
328427
329428 for_each_new_connector_in_state(state->state, connector, cstate, i) {
330429 unsigned int supported_fmts = 0;
@@ -345,7 +444,15 @@ static int atmel_hlcdc_crtc_select_output_mode(struct drm_crtc_state *state) · 14 unmodified lines
345444
346445 hstate = drm_crtc_state_to_atmel_hlcdc_crtc_state(state);
347446 hstate->output_mode = fls(output_fmts) - 1;
348−
447+ if (crtc->dc->desc->is_xlcdc) {
448+ /* check if MIPI DPI bit needs to be set */
449+ if (fls(output_fmts) > 3) {
450+ hstate->output_mode -= 4;
451+ hstate->dpi = 1;
452+ } else {
453+ hstate->dpi = 0;
454+ }
455+ }
349456 return 0;
350457 }
351458
@@ -449,6 +556,7 @@ static struct drm_crtc_state * · 97 unmodified lines
449556 atmel_hlcdc_crtc_duplicate_state(struct drm_crtc *crtc)
450557 {
451558 struct atmel_hlcdc_crtc_state *state, *cur;
559+ struct atmel_hlcdc_crtc *c = drm_crtc_to_atmel_hlcdc_crtc(crtc);
452560
453561 if (WARN_ON(!crtc->state))
454562 return NULL;
@@ -460,6 +568,8 @@ atmel_hlcdc_crtc_duplicate_state(struct drm_crtc *crtc) · 5 unmodified lines
460568
461569 cur = drm_crtc_state_to_atmel_hlcdc_crtc_state(crtc->state);
462570 state->output_mode = cur->output_mode;
571+ if (c->dc->desc->is_xlcdc)
572+ state->dpi = cur->dpi;
463573
464574 return &state->base;
465575 }
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c+105−0
@@ -58,6 +58,7 @@ static const struct atmel_hlcdc_dc_desc atmel_hlcdc_dc_at91sam9n12 = { · 57 unmodified lines
5858 .conflicting_output_formats = true,
5959 .nlayers = ARRAY_SIZE(atmel_hlcdc_at91sam9n12_layers),
6060 .layers = atmel_hlcdc_at91sam9n12_layers,
61+ .ops = &atmel_hlcdc_ops,
6162 };
6263
6364 static const struct atmel_hlcdc_layer_desc atmel_hlcdc_at91sam9x5_layers[] = {
@@ -151,6 +152,7 @@ static const struct atmel_hlcdc_dc_desc atmel_hlcdc_dc_at91sam9x5 = { · 87 unmodified lines
151152 .conflicting_output_formats = true,
152153 .nlayers = ARRAY_SIZE(atmel_hlcdc_at91sam9x5_layers),
153154 .layers = atmel_hlcdc_at91sam9x5_layers,
155+ .ops = &atmel_hlcdc_ops,
154156 };
155157
156158 static const struct atmel_hlcdc_layer_desc atmel_hlcdc_sama5d3_layers[] = {
@@ -269,6 +271,7 @@ static const struct atmel_hlcdc_dc_desc atmel_hlcdc_dc_sama5d3 = { · 112 unmodified lines
269271 .conflicting_output_formats = true,
270272 .nlayers = ARRAY_SIZE(atmel_hlcdc_sama5d3_layers),
271273 .layers = atmel_hlcdc_sama5d3_layers,
274+ .ops = &atmel_hlcdc_ops,
272275 };
273276
274277 static const struct atmel_hlcdc_layer_desc atmel_hlcdc_sama5d4_layers[] = {
@@ -364,6 +367,7 @@ static const struct atmel_hlcdc_dc_desc atmel_hlcdc_dc_sama5d4 = { · 89 unmodified lines
364367 .max_hpw = 0x3ff,
365368 .nlayers = ARRAY_SIZE(atmel_hlcdc_sama5d4_layers),
366369 .layers = atmel_hlcdc_sama5d4_layers,
370+ .ops = &atmel_hlcdc_ops,
367371 };
368372
369373 static const struct atmel_hlcdc_layer_desc atmel_hlcdc_sam9x60_layers[] = {
@@ -460,6 +464,103 @@ static const struct atmel_hlcdc_dc_desc atmel_hlcdc_dc_sam9x60 = { · 90 unmodified lines
460464 .fixed_clksrc = true,
461465 .nlayers = ARRAY_SIZE(atmel_hlcdc_sam9x60_layers),
462466 .layers = atmel_hlcdc_sam9x60_layers,
467+ .ops = &atmel_hlcdc_ops,
468+};
469+
470+static const struct atmel_hlcdc_layer_desc atmel_xlcdc_sam9x75_layers[] = {
471+ {
472+ .name = "base",
473+ .formats = &atmel_hlcdc_plane_rgb_formats,
474+ .regs_offset = 0x60,
475+ .id = 0,
476+ .type = ATMEL_HLCDC_BASE_LAYER,
477+ .cfgs_offset = 0x1c,
478+ .layout = {
479+ .xstride = { 2 },
480+ .default_color = 3,
481+ .general_config = 4,
482+ .disc_pos = 5,
483+ .disc_size = 6,
484+ },
485+ .clut_offset = 0x700,
486+ },
487+ {
488+ .name = "overlay1",
489+ .formats = &atmel_hlcdc_plane_rgb_formats,
490+ .regs_offset = 0x160,
491+ .id = 1,
492+ .type = ATMEL_HLCDC_OVERLAY_LAYER,
493+ .cfgs_offset = 0x1c,
494+ .layout = {
495+ .pos = 2,
496+ .size = 3,
497+ .xstride = { 4 },
498+ .pstride = { 5 },
499+ .default_color = 6,
500+ .chroma_key = 7,
501+ .chroma_key_mask = 8,
502+ .general_config = 9,
503+ },
504+ .clut_offset = 0xb00,
505+ },
506+ {
507+ .name = "overlay2",
508+ .formats = &atmel_hlcdc_plane_rgb_formats,
509+ .regs_offset = 0x260,
510+ .id = 2,
511+ .type = ATMEL_HLCDC_OVERLAY_LAYER,
512+ .cfgs_offset = 0x1c,
513+ .layout = {
514+ .pos = 2,
515+ .size = 3,
516+ .xstride = { 4 },
517+ .pstride = { 5 },
518+ .default_color = 6,
519+ .chroma_key = 7,
520+ .chroma_key_mask = 8,
521+ .general_config = 9,
522+ },
523+ .clut_offset = 0xf00,
524+ },
525+ {
526+ .name = "high-end-overlay",
527+ .formats = &atmel_hlcdc_plane_rgb_and_yuv_formats,
528+ .regs_offset = 0x360,
529+ .id = 3,
530+ .type = ATMEL_HLCDC_OVERLAY_LAYER,
531+ .cfgs_offset = 0x30,
532+ .layout = {
533+ .pos = 2,
534+ .size = 3,
535+ .memsize = 4,
536+ .xstride = { 5, 7 },
537+ .pstride = { 6, 8 },
538+ .default_color = 9,
539+ .chroma_key = 10,
540+ .chroma_key_mask = 11,
541+ .general_config = 12,
542+ .csc = 16,
543+ .scaler_config = 23,
544+ .vxs_config = 30,
545+ .hxs_config = 31,
546+ },
547+ .clut_offset = 0x1300,
548+ },
549+};
550+
551+static const struct atmel_hlcdc_dc_desc atmel_xlcdc_dc_sam9x75 = {
552+ .min_width = 0,
553+ .min_height = 0,
554+ .max_width = 2048,
555+ .max_height = 2048,
556+ .max_spw = 0x3ff,
557+ .max_vpw = 0x3ff,
558+ .max_hpw = 0x3ff,
559+ .fixed_clksrc = true,
560+ .is_xlcdc = true,
561+ .nlayers = ARRAY_SIZE(atmel_xlcdc_sam9x75_layers),
562+ .layers = atmel_xlcdc_sam9x75_layers,
563+ .ops = &atmel_xlcdc_ops,
463564 };
464565
465566 static const struct of_device_id atmel_hlcdc_of_match[] = {
@@ -487,6 +588,10 @@ static const struct of_device_id atmel_hlcdc_of_match[] = { · 21 unmodified lines
487588 .compatible = "microchip,sam9x60-hlcdc",
488589 .data = &atmel_hlcdc_dc_sam9x60,
489590 },
591+ {
592+ .compatible = "microchip,sam9x75-xlcdc",
593+ .data = &atmel_xlcdc_dc_sam9x75,
594+ },
490595 { /* sentinel */ },
491596 };
492597 MODULE_DEVICE_TABLE(of, atmel_hlcdc_of_match);
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h+108−24
@@ -15,6 +15,7 @@ · 14 unmodified lines
1515
1616 #include <drm/drm_plane.h>
1717
18+/* LCD controller common registers */
1819 #define ATMEL_HLCDC_LAYER_CHER 0x0
1920 #define ATMEL_HLCDC_LAYER_CHDR 0x4
2021 #define ATMEL_HLCDC_LAYER_CHSR 0x8
@@ -128,6 +129,47 @@ · 107 unmodified lines
128129
129130 #define ATMEL_HLCDC_MAX_LAYERS 6
130131
132+/* XLCDC controller specific registers */
133+#define ATMEL_XLCDC_LAYER_ENR 0x10
134+#define ATMEL_XLCDC_LAYER_EN BIT(0)
135+
136+#define ATMEL_XLCDC_LAYER_IER 0x0
137+#define ATMEL_XLCDC_LAYER_IDR 0x4
138+#define ATMEL_XLCDC_LAYER_ISR 0xc
139+#define ATMEL_XLCDC_LAYER_OVR_IRQ(p) BIT(2 + (8 * (p)))
140+
141+#define ATMEL_XLCDC_LAYER_PLANE_ADDR(p) (((p) * 0x4) + 0x18)
142+
143+#define ATMEL_XLCDC_LAYER_DMA_CFG 0
144+
145+#define ATMEL_XLCDC_LAYER_DMA BIT(0)
146+#define ATMEL_XLCDC_LAYER_REP BIT(1)
147+#define ATMEL_XLCDC_LAYER_DISCEN BIT(4)
148+
149+#define ATMEL_XLCDC_LAYER_SFACTC_A0_MULT_AS (4 << 6)
150+#define ATMEL_XLCDC_LAYER_SFACTA_ONE BIT(9)
151+#define ATMEL_XLCDC_LAYER_DFACTC_M_A0_MULT_AS (6 << 11)
152+#define ATMEL_XLCDC_LAYER_DFACTA_ONE BIT(14)
153+
154+#define ATMEL_XLCDC_LAYER_A0_SHIFT 16
155+#define ATMEL_XLCDC_LAYER_A0(x) \
156+ ((x) << ATMEL_XLCDC_LAYER_A0_SHIFT)
157+
158+#define ATMEL_XLCDC_LAYER_VSCALER_LUMA_ENABLE BIT(0)
159+#define ATMEL_XLCDC_LAYER_VSCALER_CHROMA_ENABLE BIT(1)
160+#define ATMEL_XLCDC_LAYER_HSCALER_LUMA_ENABLE BIT(4)
161+#define ATMEL_XLCDC_LAYER_HSCALER_CHROMA_ENABLE BIT(5)
162+
163+#define ATMEL_XLCDC_LAYER_VXSYCFG_ONE BIT(0)
164+#define ATMEL_XLCDC_LAYER_VXSYTAP2_ENABLE BIT(4)
165+#define ATMEL_XLCDC_LAYER_VXSCCFG_ONE BIT(16)
166+#define ATMEL_XLCDC_LAYER_VXSCTAP2_ENABLE BIT(20)
167+
168+#define ATMEL_XLCDC_LAYER_HXSYCFG_ONE BIT(0)
169+#define ATMEL_XLCDC_LAYER_HXSYTAP2_ENABLE BIT(4)
170+#define ATMEL_XLCDC_LAYER_HXSCCFG_ONE BIT(16)
171+#define ATMEL_XLCDC_LAYER_HXSCTAP2_ENABLE BIT(20)
172+
131173 /**
132174 * Atmel HLCDC Layer registers layout structure
133175 *
@@ -156,6 +198,8 @@ · 22 unmodified lines
156198 * @disc_pos: discard area position register
157199 * @disc_size: discard area size register
158200 * @csc: color space conversion register
201+ * @vxs_config: vertical scalar filter taps control register
202+ * @hxs_config: horizontal scalar filter taps control register
159203 */
160204 struct atmel_hlcdc_layer_cfg_layout {
161205 int xstride[ATMEL_HLCDC_LAYER_MAX_PLANES];
@@ -175,6 +219,8 @@ struct atmel_hlcdc_layer_cfg_layout { · 13 unmodified lines
175219 int disc_pos;
176220 int disc_size;
177221 int csc;
222+ int vxs_config;
223+ int hxs_config;
178224 };
179225
180226 /**
@@ -288,6 +334,64 @@ atmel_hlcdc_layer_to_plane(struct atmel_hlcdc_layer *layer) · 107 unmodified lines
288334 return container_of(layer, struct atmel_hlcdc_plane, layer);
289335 }
290336
337+/**
338+ * struct atmel_hlcdc_dc - Atmel HLCDC Display Controller.
339+ * @desc: HLCDC Display Controller description
340+ * @dscrpool: DMA coherent pool used to allocate DMA descriptors
341+ * @hlcdc: pointer to the atmel_hlcdc structure provided by the MFD device
342+ * @crtc: CRTC provided by the display controller
343+ * @layers: active HLCDC layers
344+ * @suspend: used to store the HLCDC state when entering suspend
345+ * @suspend.imr: used to read/write LCDC Interrupt Mask Register
346+ * @suspend.state: Atomic commit structure
347+ */
348+struct atmel_hlcdc_dc {
349+ const struct atmel_hlcdc_dc_desc *desc;
350+ struct dma_pool *dscrpool;
351+ struct atmel_hlcdc *hlcdc;
352+ struct drm_crtc *crtc;
353+ struct atmel_hlcdc_layer *layers[ATMEL_HLCDC_MAX_LAYERS];
354+ struct {
355+ u32 imr;
356+ struct drm_atomic_state *state;
357+ } suspend;
358+};
359+
360+struct atmel_hlcdc_plane_state;
361+
362+/**
363+ * struct atmel_lcdc_dc_ops - describes atmel_lcdc ops group
364+ * to differentiate HLCDC and XLCDC IP code support
365+ * @plane_setup_scaler: update the vertical and horizontal scaling factors
366+ * @update_lcdc_buffers: update the each LCDC layers DMA registers
367+ * @lcdc_atomic_disable: disable LCDC interrupts and layers
368+ * @lcdc_update_general_settings: update each LCDC layers general
369+ * configuration register
370+ * @lcdc_atomic_update: enable the LCDC layers and interrupts
371+ * @lcdc_csc_init: update the color space conversion co-efficient of
372+ * High-end overlay register
373+ * @lcdc_irq_dbg: to raise alert incase of interrupt overrun in any LCDC layer
374+ */
375+struct atmel_lcdc_dc_ops {
376+ void (*plane_setup_scaler)(struct atmel_hlcdc_plane *plane,
377+ struct atmel_hlcdc_plane_state *state);
378+ void (*lcdc_update_buffers)(struct atmel_hlcdc_plane *plane,
379+ struct atmel_hlcdc_plane_state *state,
380+ u32 sr, int i);
381+ void (*lcdc_atomic_disable)(struct atmel_hlcdc_plane *plane);
382+ void (*lcdc_update_general_settings)(struct atmel_hlcdc_plane *plane,
383+ struct atmel_hlcdc_plane_state *state);
384+ void (*lcdc_atomic_update)(struct atmel_hlcdc_plane *plane,
385+ struct atmel_hlcdc_dc *dc);
386+ void (*lcdc_csc_init)(struct atmel_hlcdc_plane *plane,
387+ const struct atmel_hlcdc_layer_desc *desc);
388+ void (*lcdc_irq_dbg)(struct atmel_hlcdc_plane *plane,
389+ const struct atmel_hlcdc_layer_desc *desc);
390+};
391+
392+extern const struct atmel_lcdc_dc_ops atmel_hlcdc_ops;
393+extern const struct atmel_lcdc_dc_ops atmel_xlcdc_ops;
394+
291395 /**
292396 * Atmel HLCDC Display Controller description structure.
293397 *
@@ -304,8 +408,10 @@ atmel_hlcdc_layer_to_plane(struct atmel_hlcdc_layer *layer) · 10 unmodified lines
304408 * @conflicting_output_formats: true if RGBXXX output formats conflict with
305409 * each other.
306410 * @fixed_clksrc: true if clock source is fixed
411+ * @is_xlcdc: true if XLCDC IP is supported
307412 * @layers: a layer description table describing available layers
308413 * @nlayers: layer description table size
414+ * @ops: atmel lcdc dc ops
309415 */
310416 struct atmel_hlcdc_dc_desc {
311417 int min_width;
@@ -317,32 +423,10 @@ struct atmel_hlcdc_dc_desc { · 5 unmodified lines
317423 int max_hpw;
318424 bool conflicting_output_formats;
319425 bool fixed_clksrc;
426+ bool is_xlcdc;
320427 const struct atmel_hlcdc_layer_desc *layers;
321428 int nlayers;
322−};
323−
324−/**
325− * Atmel HLCDC Display Controller.
326− *
327− * @desc: HLCDC Display Controller description
328− * @dscrpool: DMA coherent pool used to allocate DMA descriptors
329− * @hlcdc: pointer to the atmel_hlcdc structure provided by the MFD device
330− * @fbdev: framebuffer device attached to the Display Controller
331− * @crtc: CRTC provided by the display controller
332− * @planes: instantiated planes
333− * @layers: active HLCDC layers
334− * @suspend: used to store the HLCDC state when entering suspend
335− */
336−struct atmel_hlcdc_dc {
337− const struct atmel_hlcdc_dc_desc *desc;
338− struct dma_pool *dscrpool;
339− struct atmel_hlcdc *hlcdc;
340− struct drm_crtc *crtc;
341− struct atmel_hlcdc_layer *layers[ATMEL_HLCDC_MAX_LAYERS];
342− struct {
343− u32 imr;
344− struct drm_atomic_state *state;
345− } suspend;
429+ const struct atmel_lcdc_dc_ops *ops;
346430 };
347431
348432 extern struct atmel_hlcdc_formats atmel_hlcdc_plane_rgb_formats;
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c+309−60
@@ -282,8 +282,9 @@ atmel_hlcdc_plane_scaler_set_phicoeff(struct atmel_hlcdc_plane *plane, · 281 unmodified lines
282282 coeff_tab[i]);
283283 }
284284
285−static void atmel_hlcdc_plane_setup_scaler(struct atmel_hlcdc_plane *plane,
286− struct atmel_hlcdc_plane_state *state)
285+static
286+void atmel_hlcdc_plane_setup_scaler(struct atmel_hlcdc_plane *plane,
287+ struct atmel_hlcdc_plane_state *state)
287288 {
288289 const struct atmel_hlcdc_layer_desc *desc = plane->layer.desc;
289290 u32 xfactor, yfactor;
@@ -330,11 +331,61 @@ static void atmel_hlcdc_plane_setup_scaler(struct atmel_hlcdc_plane *plane, · 40 unmodified lines
330331 yfactor));
331332 }
332333
334+static
335+void atmel_xlcdc_plane_setup_scaler(struct atmel_hlcdc_plane *plane,
336+ struct atmel_hlcdc_plane_state *state)
337+{
338+ const struct atmel_hlcdc_layer_desc *desc = plane->layer.desc;
339+ u32 xfactor, yfactor;
340+
341+ if (!desc->layout.scaler_config)
342+ return;
343+
344+ if (state->crtc_w == state->src_w && state->crtc_h == state->src_h) {
345+ atmel_hlcdc_layer_write_cfg(&plane->layer,
346+ desc->layout.scaler_config, 0);
347+ return;
348+ }
349+
350+ /* xfactor = round[(2^20 * XMEMSIZE)/XSIZE)] */
351+ xfactor = (u32)(((1 << 20) * state->src_w) / state->crtc_w);
352+
353+ /* yfactor = round[(2^20 * YMEMSIZE)/YSIZE)] */
354+ yfactor = (u32)(((1 << 20) * state->src_h) / state->crtc_h);
355+
356+ atmel_hlcdc_layer_write_cfg(&plane->layer, desc->layout.scaler_config,
357+ ATMEL_XLCDC_LAYER_VSCALER_LUMA_ENABLE |
358+ ATMEL_XLCDC_LAYER_VSCALER_CHROMA_ENABLE |
359+ ATMEL_XLCDC_LAYER_HSCALER_LUMA_ENABLE |
360+ ATMEL_XLCDC_LAYER_HSCALER_CHROMA_ENABLE);
361+
362+ atmel_hlcdc_layer_write_cfg(&plane->layer, desc->layout.scaler_config + 1,
363+ yfactor);
364+ atmel_hlcdc_layer_write_cfg(&plane->layer, desc->layout.scaler_config + 3,
365+ xfactor);
366+
367+ /*
368+ * With YCbCr 4:2:2 and YCbYcr 4:2:0 window resampling, configuration
369+ * register LCDC_HEOCFG25.VXSCFACT and LCDC_HEOCFG27.HXSCFACT is half
370+ * the value of yfactor and xfactor.
371+ */
372+ if (state->base.fb->format->format == DRM_FORMAT_YUV420) {
373+ yfactor /= 2;
374+ xfactor /= 2;
375+ }
376+
377+ atmel_hlcdc_layer_write_cfg(&plane->layer, desc->layout.scaler_config + 2,
378+ yfactor);
379+ atmel_hlcdc_layer_write_cfg(&plane->layer, desc->layout.scaler_config + 4,
380+ xfactor);
381+}
382+
333383 static void
334384 atmel_hlcdc_plane_update_pos_and_size(struct atmel_hlcdc_plane *plane,
335385 struct atmel_hlcdc_plane_state *state)
336386 {
337387 const struct atmel_hlcdc_layer_desc *desc = plane->layer.desc;
388+ struct atmel_hlcdc_dc *dc = plane->base.dev->dev_private;
338389
339390 if (desc->layout.size)
340391 atmel_hlcdc_layer_write_cfg(&plane->layer, desc->layout.size,
@@ -352,12 +403,12 @@ atmel_hlcdc_plane_update_pos_and_size(struct atmel_hlcdc_plane *plane, · 11 unmodified lines
352403 ATMEL_HLCDC_LAYER_POS(state->crtc_x,
353404 state->crtc_y));
354405
355− atmel_hlcdc_plane_setup_scaler(plane, state);
406+ dc->desc->ops->plane_setup_scaler(plane, state);
356407 }
357408
358−static void
359−atmel_hlcdc_plane_update_general_settings(struct atmel_hlcdc_plane *plane,
360− struct atmel_hlcdc_plane_state *state)
409+static
410+void atmel_hlcdc_plane_update_general_settings(struct atmel_hlcdc_plane *plane,
411+ struct atmel_hlcdc_plane_state *state)
361412 {
362413 unsigned int cfg = ATMEL_HLCDC_LAYER_DMA_BLEN_INCR16 | state->ahb_id;
363414 const struct atmel_hlcdc_layer_desc *desc = plane->layer.desc;
@@ -393,6 +444,40 @@ atmel_hlcdc_plane_update_general_settings(struct atmel_hlcdc_plane *plane, · 29 unmodified lines
393444 cfg);
394445 }
395446
447+static
448+void atmel_xlcdc_plane_update_general_settings(struct atmel_hlcdc_plane *plane,
449+ struct atmel_hlcdc_plane_state *state)
450+{
451+ const struct atmel_hlcdc_layer_desc *desc = plane->layer.desc;
452+ const struct drm_format_info *format = state->base.fb->format;
453+ unsigned int cfg;
454+
455+ atmel_hlcdc_layer_write_cfg(&plane->layer, ATMEL_XLCDC_LAYER_DMA_CFG,
456+ ATMEL_HLCDC_LAYER_DMA_BLEN_INCR16 | state->ahb_id);
457+
458+ cfg = ATMEL_XLCDC_LAYER_DMA | ATMEL_XLCDC_LAYER_REP;
459+
460+ if (plane->base.type != DRM_PLANE_TYPE_PRIMARY) {
461+ /*
462+ * Alpha Blending bits specific to SAM9X7 SoC
463+ */
464+ cfg |= ATMEL_XLCDC_LAYER_SFACTC_A0_MULT_AS |
465+ ATMEL_XLCDC_LAYER_SFACTA_ONE |
466+ ATMEL_XLCDC_LAYER_DFACTC_M_A0_MULT_AS |
467+ ATMEL_XLCDC_LAYER_DFACTA_ONE;
468+ if (format->has_alpha)
469+ cfg |= ATMEL_XLCDC_LAYER_A0(0xff);
470+ else
471+ cfg |= ATMEL_XLCDC_LAYER_A0(state->base.alpha);
472+ }
473+
474+ if (state->disc_h && state->disc_w)
475+ cfg |= ATMEL_XLCDC_LAYER_DISCEN;
476+
477+ atmel_hlcdc_layer_write_cfg(&plane->layer, desc->layout.general_config,
478+ cfg);
479+}
480+
396481 static void atmel_hlcdc_plane_update_format(struct atmel_hlcdc_plane *plane,
397482 struct atmel_hlcdc_plane_state *state)
398483 {
@@ -437,36 +522,55 @@ static void atmel_hlcdc_plane_update_clut(struct atmel_hlcdc_plane *plane, · 38 unmodified lines
437522 }
438523 }
439524
525+static void atmel_hlcdc_update_buffers(struct atmel_hlcdc_plane *plane,
526+ struct atmel_hlcdc_plane_state *state,
527+ u32 sr, int i)
528+{
529+ atmel_hlcdc_layer_write_reg(&plane->layer,
530+ ATMEL_HLCDC_LAYER_PLANE_HEAD(i),
531+ state->dscrs[i]->self);
532+
533+ if (sr & ATMEL_HLCDC_LAYER_EN)
534+ return;
535+
536+ atmel_hlcdc_layer_write_reg(&plane->layer,
537+ ATMEL_HLCDC_LAYER_PLANE_ADDR(i),
538+ state->dscrs[i]->addr);
539+ atmel_hlcdc_layer_write_reg(&plane->layer,
540+ ATMEL_HLCDC_LAYER_PLANE_CTRL(i),
541+ state->dscrs[i]->ctrl);
542+ atmel_hlcdc_layer_write_reg(&plane->layer,
543+ ATMEL_HLCDC_LAYER_PLANE_NEXT(i),
544+ state->dscrs[i]->self);
545+}
546+
547+static void atmel_xlcdc_update_buffers(struct atmel_hlcdc_plane *plane,
548+ struct atmel_hlcdc_plane_state *state,
549+ u32 sr, int i)
550+{
551+ atmel_hlcdc_layer_write_reg(&plane->layer,
552+ ATMEL_XLCDC_LAYER_PLANE_ADDR(i),
553+ state->dscrs[i]->addr);
554+}
555+
440556 static void atmel_hlcdc_plane_update_buffers(struct atmel_hlcdc_plane *plane,
441− struct atmel_hlcdc_plane_state *state)
557+ struct atmel_hlcdc_plane_state *state)
442558 {
443559 const struct atmel_hlcdc_layer_desc *desc = plane->layer.desc;
560+ struct atmel_hlcdc_dc *dc = plane->base.dev->dev_private;
444561 struct drm_framebuffer *fb = state->base.fb;
445562 u32 sr;
446563 int i;
447564
448− sr = atmel_hlcdc_layer_read_reg(&plane->layer, ATMEL_HLCDC_LAYER_CHSR);
565+ if (!dc->desc->is_xlcdc)
566+ sr = atmel_hlcdc_layer_read_reg(&plane->layer, ATMEL_HLCDC_LAYER_CHSR);
449567
450568 for (i = 0; i < state->nplanes; i++) {
451569 struct drm_gem_dma_object *gem = drm_fb_dma_get_gem_obj(fb, i);
452570
453571 state->dscrs[i]->addr = gem->dma_addr + state->offsets[i];
454572
455− atmel_hlcdc_layer_write_reg(&plane->layer,
456− ATMEL_HLCDC_LAYER_PLANE_HEAD(i),
457− state->dscrs[i]->self);
458−
459− if (!(sr & ATMEL_HLCDC_LAYER_EN)) {
460− atmel_hlcdc_layer_write_reg(&plane->layer,
461− ATMEL_HLCDC_LAYER_PLANE_ADDR(i),
462− state->dscrs[i]->addr);
463− atmel_hlcdc_layer_write_reg(&plane->layer,
464− ATMEL_HLCDC_LAYER_PLANE_CTRL(i),
465− state->dscrs[i]->ctrl);
466− atmel_hlcdc_layer_write_reg(&plane->layer,
467− ATMEL_HLCDC_LAYER_PLANE_NEXT(i),
468− state->dscrs[i]->self);
469− }
573+ dc->desc->ops->lcdc_update_buffers(plane, state, sr, i);
470574
471575 if (desc->layout.xstride[i])
472576 atmel_hlcdc_layer_write_cfg(&plane->layer,
@@ -712,11 +816,8 @@ static int atmel_hlcdc_plane_atomic_check(struct drm_plane *p, · 239 unmodified lines
712816 return 0;
713817 }
714818
715−static void atmel_hlcdc_plane_atomic_disable(struct drm_plane *p,
716− struct drm_atomic_state *state)
819+static void atmel_hlcdc_atomic_disable(struct atmel_hlcdc_plane *plane)
717820 {
718− struct atmel_hlcdc_plane *plane = drm_plane_to_atmel_hlcdc_plane(p);
719−
720821 /* Disable interrupts */
721822 atmel_hlcdc_layer_write_reg(&plane->layer, ATMEL_HLCDC_LAYER_IDR,
722823 0xffffffff);
@@ -731,6 +832,70 @@ static void atmel_hlcdc_plane_atomic_disable(struct drm_plane *p, · 8 unmodified lines
731832 atmel_hlcdc_layer_read_reg(&plane->layer, ATMEL_HLCDC_LAYER_ISR);
732833 }
733834
835+static void atmel_xlcdc_atomic_disable(struct atmel_hlcdc_plane *plane)
836+{
837+ /* Disable interrupts */
838+ atmel_hlcdc_layer_write_reg(&plane->layer, ATMEL_XLCDC_LAYER_IDR,
839+ 0xffffffff);
840+
841+ /* Disable the layer */
842+ atmel_hlcdc_layer_write_reg(&plane->layer,
843+ ATMEL_XLCDC_LAYER_ENR, 0);
844+
845+ /* Clear all pending interrupts */
846+ atmel_hlcdc_layer_read_reg(&plane->layer, ATMEL_XLCDC_LAYER_ISR);
847+}
848+
849+static void atmel_hlcdc_plane_atomic_disable(struct drm_plane *p,
850+ struct drm_atomic_state *state)
851+{
852+ struct atmel_hlcdc_plane *plane = drm_plane_to_atmel_hlcdc_plane(p);
853+ struct atmel_hlcdc_dc *dc = plane->base.dev->dev_private;
854+
855+ dc->desc->ops->lcdc_atomic_disable(plane);
856+}
857+
858+static void atmel_hlcdc_atomic_update(struct atmel_hlcdc_plane *plane,
859+ struct atmel_hlcdc_dc *dc)
860+{
861+ u32 sr;
862+
863+ /* Enable the overrun interrupts. */
864+ atmel_hlcdc_layer_write_reg(&plane->layer, ATMEL_HLCDC_LAYER_IER,
865+ ATMEL_HLCDC_LAYER_OVR_IRQ(0) |
866+ ATMEL_HLCDC_LAYER_OVR_IRQ(1) |
867+ ATMEL_HLCDC_LAYER_OVR_IRQ(2));
868+
869+ /* Apply the new config at the next SOF event. */
870+ sr = atmel_hlcdc_layer_read_reg(&plane->layer, ATMEL_HLCDC_LAYER_CHSR);
871+ atmel_hlcdc_layer_write_reg(&plane->layer, ATMEL_HLCDC_LAYER_CHER,
872+ ATMEL_HLCDC_LAYER_UPDATE |
873+ (sr & ATMEL_HLCDC_LAYER_EN ?
874+ ATMEL_HLCDC_LAYER_A2Q : ATMEL_HLCDC_LAYER_EN));
875+}
876+
877+static void atmel_xlcdc_atomic_update(struct atmel_hlcdc_plane *plane,
878+ struct atmel_hlcdc_dc *dc)
879+{
880+ /* Enable the overrun interrupts. */
881+ atmel_hlcdc_layer_write_reg(&plane->layer, ATMEL_XLCDC_LAYER_IER,
882+ ATMEL_XLCDC_LAYER_OVR_IRQ(0) |
883+ ATMEL_XLCDC_LAYER_OVR_IRQ(1) |
884+ ATMEL_XLCDC_LAYER_OVR_IRQ(2));
885+
886+ atmel_hlcdc_layer_write_reg(&plane->layer, ATMEL_XLCDC_LAYER_ENR,
887+ ATMEL_XLCDC_LAYER_EN);
888+
889+ /*
890+ * Updating XLCDC_xxxCFGx, XLCDC_xxxFBA and XLCDC_xxxEN,
891+ * (where xxx indicates each layer) requires writing one to the
892+ * Update Attribute field for each layer in LCDC_ATTRE register for SAM9X7.
893+ */
894+ regmap_write(dc->hlcdc->regmap, ATMEL_XLCDC_ATTRE, ATMEL_XLCDC_BASE_UPDATE |
895+ ATMEL_XLCDC_OVR1_UPDATE | ATMEL_XLCDC_OVR3_UPDATE |
896+ ATMEL_XLCDC_HEO_UPDATE);
897+}
898+
734899 static void atmel_hlcdc_plane_atomic_update(struct drm_plane *p,
735900 struct drm_atomic_state *state)
736901 {
@@ -739,7 +904,7 @@ static void atmel_hlcdc_plane_atomic_update(struct drm_plane *p, · 2 unmodified lines
739904 struct atmel_hlcdc_plane *plane = drm_plane_to_atmel_hlcdc_plane(p);
740905 struct atmel_hlcdc_plane_state *hstate =
741906 drm_plane_state_to_atmel_hlcdc_plane_state(new_s);
742− u32 sr;
907+ struct atmel_hlcdc_dc *dc = p->dev->dev_private;
743908
744909 if (!new_s->crtc || !new_s->fb)
745910 return;
@@ -750,29 +915,83 @@ static void atmel_hlcdc_plane_atomic_update(struct drm_plane *p, · 4 unmodified lines
750915 }
751916
752917 atmel_hlcdc_plane_update_pos_and_size(plane, hstate);
753− atmel_hlcdc_plane_update_general_settings(plane, hstate);
918+ dc->desc->ops->lcdc_update_general_settings(plane, hstate);
754919 atmel_hlcdc_plane_update_format(plane, hstate);
755920 atmel_hlcdc_plane_update_clut(plane, hstate);
756921 atmel_hlcdc_plane_update_buffers(plane, hstate);
757922 atmel_hlcdc_plane_update_disc_area(plane, hstate);
758923
759− /* Enable the overrun interrupts. */
760− atmel_hlcdc_layer_write_reg(&plane->layer, ATMEL_HLCDC_LAYER_IER,
761− ATMEL_HLCDC_LAYER_OVR_IRQ(0) |
762− ATMEL_HLCDC_LAYER_OVR_IRQ(1) |
763− ATMEL_HLCDC_LAYER_OVR_IRQ(2));
924+ dc->desc->ops->lcdc_atomic_update(plane, dc);
925+}
764926
765− /* Apply the new config at the next SOF event. */
766− sr = atmel_hlcdc_layer_read_reg(&plane->layer, ATMEL_HLCDC_LAYER_CHSR);
767− atmel_hlcdc_layer_write_reg(&plane->layer, ATMEL_HLCDC_LAYER_CHER,
768− ATMEL_HLCDC_LAYER_UPDATE |
769− (sr & ATMEL_HLCDC_LAYER_EN ?
770− ATMEL_HLCDC_LAYER_A2Q : ATMEL_HLCDC_LAYER_EN));
927+static void atmel_hlcdc_csc_init(struct atmel_hlcdc_plane *plane,
928+ const struct atmel_hlcdc_layer_desc *desc)
929+{
930+ /*
931+ * TODO: declare a "yuv-to-rgb-conv-factors" property to let
932+ * userspace modify these factors (using a BLOB property ?).
933+ */
934+ static const u32 hlcdc_csc_coeffs[] = {
935+ 0x4c900091,
936+ 0x7a5f5090,
937+ 0x40040890
938+ };
939+
940+ for (int i = 0; i < ARRAY_SIZE(hlcdc_csc_coeffs); i++) {
941+ atmel_hlcdc_layer_write_cfg(&plane->layer,
942+ desc->layout.csc + i,
943+ hlcdc_csc_coeffs[i]);
944+ }
945+}
946+
947+static void atmel_xlcdc_csc_init(struct atmel_hlcdc_plane *plane,
948+ const struct atmel_hlcdc_layer_desc *desc)
949+{
950+ /*
951+ * yuv-to-rgb-conv-factors are now defined from LCDC_HEOCFG16 to
952+ * LCDC_HEOCFG21 registers in SAM9X7.
953+ */
954+ static const u32 xlcdc_csc_coeffs[] = {
955+ 0x00000488,
956+ 0x00000648,
957+ 0x1EA00480,
958+ 0x00001D28,
959+ 0x08100480,
960+ 0x00000000,
961+ 0x00000007
962+ };
963+
964+ for (int i = 0; i < ARRAY_SIZE(xlcdc_csc_coeffs); i++) {
965+ atmel_hlcdc_layer_write_cfg(&plane->layer,
966+ desc->layout.csc + i,
967+ xlcdc_csc_coeffs[i]);
968+ }
969+
970+ if (desc->layout.vxs_config && desc->layout.hxs_config) {
971+ /*
972+ * Updating vxs.config and hxs.config fixes the
973+ * Green Color Issue in SAM9X7 EGT Video Player App
974+ */
975+ atmel_hlcdc_layer_write_cfg(&plane->layer,
976+ desc->layout.vxs_config,
977+ ATMEL_XLCDC_LAYER_VXSYCFG_ONE |
978+ ATMEL_XLCDC_LAYER_VXSYTAP2_ENABLE |
979+ ATMEL_XLCDC_LAYER_VXSCCFG_ONE |
980+ ATMEL_XLCDC_LAYER_VXSCTAP2_ENABLE);
981+
982+ atmel_hlcdc_layer_write_cfg(&plane->layer,
983+ desc->layout.hxs_config,
984+ ATMEL_XLCDC_LAYER_HXSYCFG_ONE |
985+ ATMEL_XLCDC_LAYER_HXSYTAP2_ENABLE |
986+ ATMEL_XLCDC_LAYER_HXSCCFG_ONE |
987+ ATMEL_XLCDC_LAYER_HXSCTAP2_ENABLE);
988+ }
771989 }
772990
773991 static int atmel_hlcdc_plane_init_properties(struct atmel_hlcdc_plane *plane)
774992 {
775993 const struct atmel_hlcdc_layer_desc *desc = plane->layer.desc;
994+ struct atmel_hlcdc_dc *dc = plane->base.dev->dev_private;
776995
777996 if (desc->type == ATMEL_HLCDC_OVERLAY_LAYER ||
778997 desc->type == ATMEL_HLCDC_CURSOR_LAYER) {
@@ -796,31 +1015,16 @@ static int atmel_hlcdc_plane_init_properties(struct atmel_hlcdc_plane *plane) · 17 unmodified lines
7961015 return ret;
7971016 }
7981017
799− if (desc->layout.csc) {
800− /*
801− * TODO: decare a "yuv-to-rgb-conv-factors" property to let
802− * userspace modify these factors (using a BLOB property ?).
803− */
804− atmel_hlcdc_layer_write_cfg(&plane->layer,
805− desc->layout.csc,
806− 0x4c900091);
807− atmel_hlcdc_layer_write_cfg(&plane->layer,
808− desc->layout.csc + 1,
809− 0x7a5f5090);
810− atmel_hlcdc_layer_write_cfg(&plane->layer,
811− desc->layout.csc + 2,
812− 0x40040890);
813− }
1018+ if (desc->layout.csc)
1019+ dc->desc->ops->lcdc_csc_init(plane, desc);
8141020
8151021 return 0;
8161022 }
8171023
818−void atmel_hlcdc_plane_irq(struct atmel_hlcdc_plane *plane)
1024+static void atmel_hlcdc_irq_dbg(struct atmel_hlcdc_plane *plane,
1025+ const struct atmel_hlcdc_layer_desc *desc)
8191026 {
820− const struct atmel_hlcdc_layer_desc *desc = plane->layer.desc;
821− u32 isr;
822−
823− isr = atmel_hlcdc_layer_read_reg(&plane->layer, ATMEL_HLCDC_LAYER_ISR);
1027+ u32 isr = atmel_hlcdc_layer_read_reg(&plane->layer, ATMEL_HLCDC_LAYER_ISR);
8241028
8251029 /*
8261030 * There's not much we can do in case of overrun except informing
@@ -834,6 +1038,51 @@ void atmel_hlcdc_plane_irq(struct atmel_hlcdc_plane *plane) · 7 unmodified lines
8341038 desc->name);
8351039 }
8361040
1041+static void atmel_xlcdc_irq_dbg(struct atmel_hlcdc_plane *plane,
1042+ const struct atmel_hlcdc_layer_desc *desc)
1043+{
1044+ u32 isr = atmel_hlcdc_layer_read_reg(&plane->layer, ATMEL_XLCDC_LAYER_ISR);
1045+
1046+ /*
1047+ * There's not much we can do in case of overrun except informing
1048+ * the user. However, we are in interrupt context here, hence the
1049+ * use of dev_dbg().
1050+ */
1051+ if (isr &
1052+ (ATMEL_XLCDC_LAYER_OVR_IRQ(0) | ATMEL_XLCDC_LAYER_OVR_IRQ(1) |
1053+ ATMEL_XLCDC_LAYER_OVR_IRQ(2)))
1054+ dev_dbg(plane->base.dev->dev, "overrun on plane %s\n",
1055+ desc->name);
1056+}
1057+
1058+void atmel_hlcdc_plane_irq(struct atmel_hlcdc_plane *plane)
1059+{
1060+ const struct atmel_hlcdc_layer_desc *desc = plane->layer.desc;
1061+ struct atmel_hlcdc_dc *dc = plane->base.dev->dev_private;
1062+
1063+ dc->desc->ops->lcdc_irq_dbg(plane, desc);
1064+}
1065+
1066+const struct atmel_lcdc_dc_ops atmel_hlcdc_ops = {
1067+ .plane_setup_scaler = atmel_hlcdc_plane_setup_scaler,
1068+ .lcdc_update_buffers = atmel_hlcdc_update_buffers,
1069+ .lcdc_atomic_disable = atmel_hlcdc_atomic_disable,
1070+ .lcdc_update_general_settings = atmel_hlcdc_plane_update_general_settings,
1071+ .lcdc_atomic_update = atmel_hlcdc_atomic_update,
1072+ .lcdc_csc_init = atmel_hlcdc_csc_init,
1073+ .lcdc_irq_dbg = atmel_hlcdc_irq_dbg,
1074+};
1075+
1076+const struct atmel_lcdc_dc_ops atmel_xlcdc_ops = {
1077+ .plane_setup_scaler = atmel_xlcdc_plane_setup_scaler,
1078+ .lcdc_update_buffers = atmel_xlcdc_update_buffers,
1079+ .lcdc_atomic_disable = atmel_xlcdc_atomic_disable,
1080+ .lcdc_update_general_settings = atmel_xlcdc_plane_update_general_settings,
1081+ .lcdc_atomic_update = atmel_xlcdc_atomic_update,
1082+ .lcdc_csc_init = atmel_xlcdc_csc_init,
1083+ .lcdc_irq_dbg = atmel_xlcdc_irq_dbg,
1084+};
1085+
8371086 static const struct drm_plane_helper_funcs atmel_hlcdc_layer_plane_helper_funcs = {
8381087 .atomic_check = atmel_hlcdc_plane_atomic_check,
8391088 .atomic_update = atmel_hlcdc_plane_atomic_update,
drivers/gpu/drm/bridge/adv7511/adv7511_drv.c+0−5
@@ -877,11 +877,6 @@ static int adv7511_connector_init(struct adv7511 *adv) · 876 unmodified lines
877877 struct drm_bridge *bridge = &adv->bridge;
878878 int ret;
879879
880− if (!bridge->encoder) {
881− DRM_ERROR("Parent encoder object not found");
882− return -ENODEV;
883− }
884−
885880 if (adv->i2c_main->irq)
886881 adv->connector.polled = DRM_CONNECTOR_POLL_HPD;
887882 else
drivers/gpu/drm/bridge/analogix/analogix-anx6345.c+7−13
@@ -47,7 +47,7 @@ struct anx6345 { · 46 unmodified lines
4747 struct drm_dp_aux aux;
4848 struct drm_bridge bridge;
4949 struct i2c_client *client;
50− struct edid *edid;
50+ const struct drm_edid *drm_edid;
5151 struct drm_connector connector;
5252 struct drm_panel *panel;
5353 struct regulator *dvdd12;
@@ -458,7 +458,7 @@ static int anx6345_get_modes(struct drm_connector *connector) · 404 unmodified lines
458458
459459 mutex_lock(&anx6345->lock);
460460
461− if (!anx6345->edid) {
461+ if (!anx6345->drm_edid) {
462462 if (!anx6345->powered) {
463463 anx6345_poweron(anx6345);
464464 power_off = true;
@@ -470,19 +470,18 @@ static int anx6345_get_modes(struct drm_connector *connector) · 5 unmodified lines
470470 goto unlock;
471471 }
472472
473− anx6345->edid = drm_get_edid(connector, &anx6345->aux.ddc);
474− if (!anx6345->edid)
473+ anx6345->drm_edid = drm_edid_read_ddc(connector, &anx6345->aux.ddc);
474+ if (!anx6345->drm_edid)
475475 DRM_ERROR("Failed to read EDID from panel\n");
476476
477− err = drm_connector_update_edid_property(connector,
478− anx6345->edid);
477+ err = drm_edid_connector_update(connector, anx6345->drm_edid);
479478 if (err) {
480479 DRM_ERROR("Failed to update EDID property: %d\n", err);
481480 goto unlock;
482481 }
483482 }
484483
485− num_modes += drm_add_edid_modes(connector, anx6345->edid);
484+ num_modes += drm_edid_connector_add_modes(connector);
486485
487486 /* Driver currently supports only 6bpc */
488487 connector->display_info.bpc = 6;
@@ -528,11 +527,6 @@ static int anx6345_bridge_attach(struct drm_bridge *bridge, · 39 unmodified lines
528527 return -EINVAL;
529528 }
530529
531− if (!bridge->encoder) {
532− DRM_ERROR("Parent encoder object not found");
533− return -ENODEV;
534− }
535−
536530 /* Register aux channel */
537531 anx6345->aux.name = "DP-AUX";
538532 anx6345->aux.dev = &anx6345->client->dev;
@@ -793,7 +787,7 @@ static void anx6345_i2c_remove(struct i2c_client *client) · 254 unmodified lines
793787
794788 unregister_i2c_dummy_clients(anx6345);
795789
796− kfree(anx6345->edid);
790+ drm_edid_free(anx6345->drm_edid);
797791
798792 mutex_destroy(&anx6345->lock);
799793 }
drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c+12−16
@@ -67,7 +67,7 @@ struct anx78xx { · 66 unmodified lines
6767 struct drm_dp_aux aux;
6868 struct drm_bridge bridge;
6969 struct i2c_client *client;
70− struct edid *edid;
70+ const struct drm_edid *drm_edid;
7171 struct drm_connector connector;
7272 struct anx78xx_platform_data pdata;
7373 struct mutex lock;
@@ -830,8 +830,8 @@ static int anx78xx_get_modes(struct drm_connector *connector) · 756 unmodified lines
830830 if (WARN_ON(!anx78xx->powered))
831831 return 0;
832832
833− if (anx78xx->edid)
834− return drm_add_edid_modes(connector, anx78xx->edid);
833+ if (anx78xx->drm_edid)
834+ return drm_edid_connector_add_modes(connector);
835835
836836 mutex_lock(&anx78xx->lock);
837837
@@ -841,20 +841,21 @@ static int anx78xx_get_modes(struct drm_connector *connector) · 3 unmodified lines
841841 goto unlock;
842842 }
843843
844− anx78xx->edid = drm_get_edid(connector, &anx78xx->aux.ddc);
845− if (!anx78xx->edid) {
844+ anx78xx->drm_edid = drm_edid_read_ddc(connector, &anx78xx->aux.ddc);
845+
846+ err = drm_edid_connector_update(connector, anx78xx->drm_edid);
847+
848+ if (!anx78xx->drm_edid) {
846849 DRM_ERROR("Failed to read EDID\n");
847850 goto unlock;
848851 }
849852
850− err = drm_connector_update_edid_property(connector,
851− anx78xx->edid);
852853 if (err) {
853854 DRM_ERROR("Failed to update EDID property: %d\n", err);
854855 goto unlock;
855856 }
856857
857− num_modes = drm_add_edid_modes(connector, anx78xx->edid);
858+ num_modes = drm_edid_connector_add_modes(connector);
858859
859860 unlock:
860861 mutex_unlock(&anx78xx->lock);
@@ -897,11 +898,6 @@ static int anx78xx_bridge_attach(struct drm_bridge *bridge, · 36 unmodified lines
897898 return -EINVAL;
898899 }
899900
900− if (!bridge->encoder) {
901− DRM_ERROR("Parent encoder object not found");
902− return -ENODEV;
903− }
904−
905901 /* Register aux channel */
906902 anx78xx->aux.name = "DP-AUX";
907903 anx78xx->aux.dev = &anx78xx->client->dev;
@@ -1091,8 +1087,8 @@ static bool anx78xx_handle_common_int_4(struct anx78xx *anx78xx, u8 irq) · 183 unmodified lines
10911087 event = true;
10921088 anx78xx_poweroff(anx78xx);
10931089 /* Free cached EDID */
1094− kfree(anx78xx->edid);
1095− anx78xx->edid = NULL;
1090+ drm_edid_free(anx78xx->drm_edid);
1091+ anx78xx->drm_edid = NULL;
10961092 } else if (irq & SP_HPD_PLUG) {
10971093 DRM_DEBUG_KMS("IRQ: Hot plug detect - cable plug\n");
10981094 event = true;
@@ -1363,7 +1359,7 @@ static void anx78xx_i2c_remove(struct i2c_client *client) · 264 unmodified lines
13631359
13641360 unregister_i2c_dummy_clients(anx78xx);
13651361
1366− kfree(anx78xx->edid);
1362+ drm_edid_free(anx78xx->drm_edid);
13671363 }
13681364
13691365 static const struct of_device_id anx78xx_match_table[] = {
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c+44−128
@@ -234,28 +234,6 @@ static int analogix_dp_training_pattern_dis(struct analogix_dp_device *dp) · 233 unmodified lines
234234 return ret < 0 ? ret : 0;
235235 }
236236
237−static void
238−analogix_dp_set_lane_lane_pre_emphasis(struct analogix_dp_device *dp,
239− int pre_emphasis, int lane)
240−{
241− switch (lane) {
242− case 0:
243− analogix_dp_set_lane0_pre_emphasis(dp, pre_emphasis);
244− break;
245− case 1:
246− analogix_dp_set_lane1_pre_emphasis(dp, pre_emphasis);
247− break;
248−
249− case 2:
250− analogix_dp_set_lane2_pre_emphasis(dp, pre_emphasis);
251− break;
252−
253− case 3:
254− analogix_dp_set_lane3_pre_emphasis(dp, pre_emphasis);
255− break;
256− }
257−}
258−
259237 static int analogix_dp_link_start(struct analogix_dp_device *dp)
260238 {
261239 u8 buf[4];
@@ -286,10 +264,12 @@ static int analogix_dp_link_start(struct analogix_dp_device *dp) · 24 unmodified lines
286264 return retval;
287265 }
288266
289− /* Set TX pre-emphasis to minimum */
267+ /* Set TX voltage-swing and pre-emphasis to minimum */
290268 for (lane = 0; lane < lane_count; lane++)
291− analogix_dp_set_lane_lane_pre_emphasis(dp,
292− PRE_EMPHASIS_LEVEL_0, lane);
269+ dp->link_train.training_lane[lane] =
270+ DP_TRAIN_VOLTAGE_SWING_LEVEL_0 |
271+ DP_TRAIN_PRE_EMPH_LEVEL_0;
272+ analogix_dp_set_lane_link_training(dp);
293273
294274 /* Wait for PLL lock */
295275 pll_tries = 0;
@@ -384,54 +364,6 @@ static unsigned char analogix_dp_get_adjust_request_pre_emphasis( · 88 unmodified lines
384364 return ((link_value >> shift) & 0xc) >> 2;
385365 }
386366
387−static void analogix_dp_set_lane_link_training(struct analogix_dp_device *dp,
388− u8 training_lane_set, int lane)
389−{
390− switch (lane) {
391− case 0:
392− analogix_dp_set_lane0_link_training(dp, training_lane_set);
393− break;
394− case 1:
395− analogix_dp_set_lane1_link_training(dp, training_lane_set);
396− break;
397−
398− case 2:
399− analogix_dp_set_lane2_link_training(dp, training_lane_set);
400− break;
401−
402− case 3:
403− analogix_dp_set_lane3_link_training(dp, training_lane_set);
404− break;
405− }
406−}
407−
408−static unsigned int
409−analogix_dp_get_lane_link_training(struct analogix_dp_device *dp,
410− int lane)
411−{
412− u32 reg;
413−
414− switch (lane) {
415− case 0:
416− reg = analogix_dp_get_lane0_link_training(dp);
417− break;
418− case 1:
419− reg = analogix_dp_get_lane1_link_training(dp);
420− break;
421− case 2:
422− reg = analogix_dp_get_lane2_link_training(dp);
423− break;
424− case 3:
425− reg = analogix_dp_get_lane3_link_training(dp);
426− break;
427− default:
428− WARN_ON(1);
429− return 0;
430− }
431−
432− return reg;
433−}
434−
435367 static void analogix_dp_reduce_link_rate(struct analogix_dp_device *dp)
436368 {
437369 analogix_dp_training_pattern_dis(dp);
@@ -478,11 +410,6 @@ static int analogix_dp_process_clock_recovery(struct analogix_dp_device *dp) · 40 unmodified lines
478410 if (retval < 0)
479411 return retval;
480412
481− retval = drm_dp_dpcd_read(&dp->aux, DP_ADJUST_REQUEST_LANE0_1,
482− adjust_request, 2);
483− if (retval < 0)
484− return retval;
485−
486413 if (analogix_dp_clock_recovery_ok(link_status, lane_count) == 0) {
487414 /* set training pattern 2 for EQ */
488415 analogix_dp_set_training_pattern(dp, TRAINING_PTN2);
@@ -495,38 +422,37 @@ static int analogix_dp_process_clock_recovery(struct analogix_dp_device *dp) · 6 unmodified lines
495422
496423 dev_dbg(dp->dev, "Link Training Clock Recovery success\n");
497424 dp->link_train.lt_state = EQUALIZER_TRAINING;
498− } else {
499− for (lane = 0; lane < lane_count; lane++) {
500− training_lane = analogix_dp_get_lane_link_training(
501− dp, lane);
502− voltage_swing = analogix_dp_get_adjust_request_voltage(
503− adjust_request, lane);
504− pre_emphasis = analogix_dp_get_adjust_request_pre_emphasis(
505− adjust_request, lane);
506−
507− if (DPCD_VOLTAGE_SWING_GET(training_lane) ==
508− voltage_swing &&
509− DPCD_PRE_EMPHASIS_GET(training_lane) ==
510− pre_emphasis)
511− dp->link_train.cr_loop[lane]++;
512−
513− if (dp->link_train.cr_loop[lane] == MAX_CR_LOOP ||
514− voltage_swing == VOLTAGE_LEVEL_3 ||
515− pre_emphasis == PRE_EMPHASIS_LEVEL_3) {
516− dev_err(dp->dev, "CR Max reached (%d,%d,%d)\n",
517− dp->link_train.cr_loop[lane],
518− voltage_swing, pre_emphasis);
519− analogix_dp_reduce_link_rate(dp);
520− return -EIO;
521− }
425+
426+ return 0;
427+ }
428+
429+ retval = drm_dp_dpcd_read(&dp->aux, DP_ADJUST_REQUEST_LANE0_1,
430+ adjust_request, 2);
431+ if (retval < 0)
432+ return retval;
433+
434+ for (lane = 0; lane < lane_count; lane++) {
435+ training_lane = analogix_dp_get_lane_link_training(dp, lane);
436+ voltage_swing = analogix_dp_get_adjust_request_voltage(adjust_request, lane);
437+ pre_emphasis = analogix_dp_get_adjust_request_pre_emphasis(adjust_request, lane);
438+
439+ if (DPCD_VOLTAGE_SWING_GET(training_lane) == voltage_swing &&
440+ DPCD_PRE_EMPHASIS_GET(training_lane) == pre_emphasis)
441+ dp->link_train.cr_loop[lane]++;
442+
443+ if (dp->link_train.cr_loop[lane] == MAX_CR_LOOP ||
444+ voltage_swing == VOLTAGE_LEVEL_3 ||
445+ pre_emphasis == PRE_EMPHASIS_LEVEL_3) {
446+ dev_err(dp->dev, "CR Max reached (%d,%d,%d)\n",
447+ dp->link_train.cr_loop[lane],
448+ voltage_swing, pre_emphasis);
449+ analogix_dp_reduce_link_rate(dp);
450+ return -EIO;
522451 }
523452 }
524453
525454 analogix_dp_get_adjust_training_lane(dp, adjust_request);
526−
527− for (lane = 0; lane < lane_count; lane++)
528− analogix_dp_set_lane_link_training(dp,
529− dp->link_train.training_lane[lane], lane);
455+ analogix_dp_set_lane_link_training(dp);
530456
531457 retval = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET,
532458 dp->link_train.training_lane, lane_count);
@@ -538,7 +464,7 @@ static int analogix_dp_process_clock_recovery(struct analogix_dp_device *dp) · 5 unmodified lines
538464
539465 static int analogix_dp_process_equalizer_training(struct analogix_dp_device *dp)
540466 {
541− int lane, lane_count, retval;
467+ int lane_count, retval;
542468 u32 reg;
543469 u8 link_align, link_status[2], adjust_request[2];
544470
@@ -598,9 +524,7 @@ static int analogix_dp_process_equalizer_training(struct analogix_dp_device *dp) · 53 unmodified lines
598524 return -EIO;
599525 }
600526
601− for (lane = 0; lane < lane_count; lane++)
602− analogix_dp_set_lane_link_training(dp,
603− dp->link_train.training_lane[lane], lane);
527+ analogix_dp_set_lane_link_training(dp);
604528
605529 retval = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET,
606530 dp->link_train.training_lane, lane_count);
@@ -712,7 +636,7 @@ static int analogix_dp_full_link_train(struct analogix_dp_device *dp, · 105 unmodified lines
712636
713637 static int analogix_dp_fast_link_train(struct analogix_dp_device *dp)
714638 {
715− int i, ret;
639+ int ret;
716640 u8 link_align, link_status[2];
717641 enum pll_status status;
718642
@@ -720,11 +644,7 @@ static int analogix_dp_fast_link_train(struct analogix_dp_device *dp) · 1 unmodified line
720644
721645 analogix_dp_set_link_bandwidth(dp, dp->link_train.link_rate);
722646 analogix_dp_set_lane_count(dp, dp->link_train.lane_count);
723−
724− for (i = 0; i < dp->link_train.lane_count; i++) {
725− analogix_dp_set_lane_link_training(dp,
726− dp->link_train.training_lane[i], i);
727− }
647+ analogix_dp_set_lane_link_training(dp);
728648
729649 ret = readx_poll_timeout(analogix_dp_get_pll_lock_status, dp, status,
730650 status != PLL_UNLOCKED, 120,
@@ -1108,7 +1028,7 @@ out: · 377 unmodified lines
11081028 static int analogix_dp_get_modes(struct drm_connector *connector)
11091029 {
11101030 struct analogix_dp_device *dp = to_dp(connector);
1111− struct edid *edid;
1031+ const struct drm_edid *drm_edid;
11121032 int ret, num_modes = 0;
11131033
11141034 if (dp->plat_data->panel) {
@@ -1120,12 +1040,13 @@ static int analogix_dp_get_modes(struct drm_connector *connector) · 5 unmodified lines
11201040 return 0;
11211041 }
11221042
1123− edid = drm_get_edid(connector, &dp->aux.ddc);
1124− if (edid) {
1125− drm_connector_update_edid_property(&dp->connector,
1126− edid);
1127− num_modes += drm_add_edid_modes(&dp->connector, edid);
1128− kfree(edid);
1043+ drm_edid = drm_edid_read_ddc(connector, &dp->aux.ddc);
1044+
1045+ drm_edid_connector_update(&dp->connector, drm_edid);
1046+
1047+ if (drm_edid) {
1048+ num_modes += drm_edid_connector_add_modes(&dp->connector);
1049+ drm_edid_free(drm_edid);
11291050 }
11301051
11311052 ret = analogix_dp_prepare_panel(dp, false, false);
@@ -1228,11 +1149,6 @@ static int analogix_dp_bridge_attach(struct drm_bridge *bridge, · 96 unmodified lines
12281149 return -EINVAL;
12291150 }
12301151
1231− if (!bridge->encoder) {
1232− DRM_ERROR("Parent encoder object not found");
1233− return -ENODEV;
1234− }
1235−
12361152 if (!dp->plat_data->skip_connector) {
12371153 connector = &dp->connector;
12381154 connector->polled = DRM_CONNECTOR_POLL_HPD;
drivers/gpu/drm/bridge/analogix/analogix_dp_core.h+2−20
@@ -213,26 +213,8 @@ void analogix_dp_enable_enhanced_mode(struct analogix_dp_device *dp, · 212 unmodified lines
213213 bool enable);
214214 void analogix_dp_set_training_pattern(struct analogix_dp_device *dp,
215215 enum pattern_set pattern);
216−void analogix_dp_set_lane0_pre_emphasis(struct analogix_dp_device *dp,
217− u32 level);
218−void analogix_dp_set_lane1_pre_emphasis(struct analogix_dp_device *dp,
219− u32 level);
220−void analogix_dp_set_lane2_pre_emphasis(struct analogix_dp_device *dp,
221− u32 level);
222−void analogix_dp_set_lane3_pre_emphasis(struct analogix_dp_device *dp,
223− u32 level);
224−void analogix_dp_set_lane0_link_training(struct analogix_dp_device *dp,
225− u32 training_lane);
226−void analogix_dp_set_lane1_link_training(struct analogix_dp_device *dp,
227− u32 training_lane);
228−void analogix_dp_set_lane2_link_training(struct analogix_dp_device *dp,
229− u32 training_lane);
230−void analogix_dp_set_lane3_link_training(struct analogix_dp_device *dp,
231− u32 training_lane);
232−u32 analogix_dp_get_lane0_link_training(struct analogix_dp_device *dp);
233−u32 analogix_dp_get_lane1_link_training(struct analogix_dp_device *dp);
234−u32 analogix_dp_get_lane2_link_training(struct analogix_dp_device *dp);
235−u32 analogix_dp_get_lane3_link_training(struct analogix_dp_device *dp);
216+void analogix_dp_set_lane_link_training(struct analogix_dp_device *dp);
217+u32 analogix_dp_get_lane_link_training(struct analogix_dp_device *dp, u8 lane);
236218 void analogix_dp_reset_macro(struct analogix_dp_device *dp);
237219 void analogix_dp_init_video(struct analogix_dp_device *dp);
238220
drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c+15−104
@@ -557,6 +557,20 @@ void analogix_dp_get_lane_count(struct analogix_dp_device *dp, u32 *count) · 556 unmodified lines
557557 *count = reg;
558558 }
559559
560+void analogix_dp_set_lane_link_training(struct analogix_dp_device *dp)
561+{
562+ u8 lane;
563+
564+ for (lane = 0; lane < dp->link_train.lane_count; lane++)
565+ writel(dp->link_train.training_lane[lane],
566+ dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL + 4 * lane);
567+}
568+
569+u32 analogix_dp_get_lane_link_training(struct analogix_dp_device *dp, u8 lane)
570+{
571+ return readl(dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL + 4 * lane);
572+}
573+
560574 void analogix_dp_enable_enhanced_mode(struct analogix_dp_device *dp,
561575 bool enable)
562576 {
@@ -606,106 +620,6 @@ void analogix_dp_set_training_pattern(struct analogix_dp_device *dp, · 43 unmodified lines
606620 }
607621 }
608622
609−void analogix_dp_set_lane0_pre_emphasis(struct analogix_dp_device *dp,
610− u32 level)
611−{
612− u32 reg;
613−
614− reg = readl(dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL);
615− reg &= ~PRE_EMPHASIS_SET_MASK;
616− reg |= level << PRE_EMPHASIS_SET_SHIFT;
617− writel(reg, dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL);
618−}
619−
620−void analogix_dp_set_lane1_pre_emphasis(struct analogix_dp_device *dp,
621− u32 level)
622−{
623− u32 reg;
624−
625− reg = readl(dp->reg_base + ANALOGIX_DP_LN1_LINK_TRAINING_CTL);
626− reg &= ~PRE_EMPHASIS_SET_MASK;
627− reg |= level << PRE_EMPHASIS_SET_SHIFT;
628− writel(reg, dp->reg_base + ANALOGIX_DP_LN1_LINK_TRAINING_CTL);
629−}
630−
631−void analogix_dp_set_lane2_pre_emphasis(struct analogix_dp_device *dp,
632− u32 level)
633−{
634− u32 reg;
635−
636− reg = readl(dp->reg_base + ANALOGIX_DP_LN2_LINK_TRAINING_CTL);
637− reg &= ~PRE_EMPHASIS_SET_MASK;
638− reg |= level << PRE_EMPHASIS_SET_SHIFT;
639− writel(reg, dp->reg_base + ANALOGIX_DP_LN2_LINK_TRAINING_CTL);
640−}
641−
642−void analogix_dp_set_lane3_pre_emphasis(struct analogix_dp_device *dp,
643− u32 level)
644−{
645− u32 reg;
646−
647− reg = readl(dp->reg_base + ANALOGIX_DP_LN3_LINK_TRAINING_CTL);
648− reg &= ~PRE_EMPHASIS_SET_MASK;
649− reg |= level << PRE_EMPHASIS_SET_SHIFT;
650− writel(reg, dp->reg_base + ANALOGIX_DP_LN3_LINK_TRAINING_CTL);
651−}
652−
653−void analogix_dp_set_lane0_link_training(struct analogix_dp_device *dp,
654− u32 training_lane)
655−{
656− u32 reg;
657−
658− reg = training_lane;
659− writel(reg, dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL);
660−}
661−
662−void analogix_dp_set_lane1_link_training(struct analogix_dp_device *dp,
663− u32 training_lane)
664−{
665− u32 reg;
666−
667− reg = training_lane;
668− writel(reg, dp->reg_base + ANALOGIX_DP_LN1_LINK_TRAINING_CTL);
669−}
670−
671−void analogix_dp_set_lane2_link_training(struct analogix_dp_device *dp,
672− u32 training_lane)
673−{
674− u32 reg;
675−
676− reg = training_lane;
677− writel(reg, dp->reg_base + ANALOGIX_DP_LN2_LINK_TRAINING_CTL);
678−}
679−
680−void analogix_dp_set_lane3_link_training(struct analogix_dp_device *dp,
681− u32 training_lane)
682−{
683− u32 reg;
684−
685− reg = training_lane;
686− writel(reg, dp->reg_base + ANALOGIX_DP_LN3_LINK_TRAINING_CTL);
687−}
688−
689−u32 analogix_dp_get_lane0_link_training(struct analogix_dp_device *dp)
690−{
691− return readl(dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL);
692−}
693−
694−u32 analogix_dp_get_lane1_link_training(struct analogix_dp_device *dp)
695−{
696− return readl(dp->reg_base + ANALOGIX_DP_LN1_LINK_TRAINING_CTL);
697−}
698−
699−u32 analogix_dp_get_lane2_link_training(struct analogix_dp_device *dp)
700−{
701− return readl(dp->reg_base + ANALOGIX_DP_LN2_LINK_TRAINING_CTL);
702−}
703−
704−u32 analogix_dp_get_lane3_link_training(struct analogix_dp_device *dp)
705−{
706− return readl(dp->reg_base + ANALOGIX_DP_LN3_LINK_TRAINING_CTL);
707−}
708−
709623 void analogix_dp_reset_macro(struct analogix_dp_device *dp)
710624 {
711625 u32 reg;
@@ -1027,7 +941,6 @@ ssize_t analogix_dp_transfer(struct analogix_dp_device *dp, · 315 unmodified lines
1027941 u32 status_reg;
1028942 u8 *buffer = msg->buffer;
1029943 unsigned int i;
1030− int num_transferred = 0;
1031944 int ret;
1032945
1033946 /* Buffer size of AUX CH is 16 bytes */
@@ -1079,7 +992,6 @@ ssize_t analogix_dp_transfer(struct analogix_dp_device *dp, · 45 unmodified lines
1079992 reg = buffer[i];
1080993 writel(reg, dp->reg_base + ANALOGIX_DP_BUF_DATA_0 +
1081994 4 * i);
1082− num_transferred++;
1083995 }
1084996 }
1085997
@@ -1127,7 +1039,6 @@ ssize_t analogix_dp_transfer(struct analogix_dp_device *dp, · 41 unmodified lines
11271039 reg = readl(dp->reg_base + ANALOGIX_DP_BUF_DATA_0 +
11281040 4 * i);
11291041 buffer[i] = (unsigned char)reg;
1130− num_transferred++;
11311042 }
11321043 }
11331044
@@ -1144,7 +1055,7 @@ ssize_t analogix_dp_transfer(struct analogix_dp_device *dp, · 10 unmodified lines
11441055 (msg->request & ~DP_AUX_I2C_MOT) == DP_AUX_NATIVE_READ)
11451056 msg->reply = DP_AUX_NATIVE_REPLY_ACK;
11461057
1147− return num_transferred > 0 ? num_transferred : -EBUSY;
1058+ return msg->size;
11481059
11491060 aux_error:
11501061 /* if aux err happen, reset aux */
drivers/gpu/drm/bridge/analogix/anx7625.c+17−19
@@ -464,9 +464,11 @@ static int anx7625_odfc_config(struct anx7625_data *ctx, · 463 unmodified lines
464464 */
465465 static int anx7625_set_k_value(struct anx7625_data *ctx)
466466 {
467− struct edid *edid = (struct edid *)ctx->slimport_edid_p.edid_raw_data;
467+ struct drm_edid_product_id id;
468468
469− if (edid->mfg_id[0] == IVO_MID0 && edid->mfg_id[1] == IVO_MID1)
469+ drm_edid_get_product_id(ctx->cached_drm_edid, &id);
470+
471+ if (be16_to_cpu(id.manufacturer_name) == IVO_MID)
470472 return anx7625_reg_write(ctx, ctx->i2c.rx_p1_client,
471473 MIPI_DIGITAL_ADJ_1, 0x3B);
472474
@@ -1526,7 +1528,8 @@ static int anx7625_wait_hpd_asserted(struct drm_dp_aux *aux, · 1053 unmodified lines
15261528
15271529 static void anx7625_remove_edid(struct anx7625_data *ctx)
15281530 {
1529− ctx->slimport_edid_p.edid_block_num = -1;
1531+ drm_edid_free(ctx->cached_drm_edid);
1532+ ctx->cached_drm_edid = NULL;
15301533 }
15311534
15321535 static void anx7625_dp_adjust_swing(struct anx7625_data *ctx)
@@ -1787,27 +1790,32 @@ static ssize_t anx7625_aux_transfer(struct drm_dp_aux *aux, · 254 unmodified lines
17871790 static const struct drm_edid *anx7625_edid_read(struct anx7625_data *ctx)
17881791 {
17891792 struct device *dev = ctx->dev;
1790− struct s_edid_data *p_edid = &ctx->slimport_edid_p;
1793+ u8 *edid_buf;
17911794 int edid_num;
17921795
1793− if (ctx->slimport_edid_p.edid_block_num > 0)
1796+ if (ctx->cached_drm_edid)
17941797 goto out;
17951798
1799+ edid_buf = kmalloc(FOUR_BLOCK_SIZE, GFP_KERNEL);
1800+ if (!edid_buf)
1801+ return NULL;
1802+
17961803 pm_runtime_get_sync(dev);
17971804 _anx7625_hpd_polling(ctx, 5000 * 100);
1798− edid_num = sp_tx_edid_read(ctx, p_edid->edid_raw_data);
1805+ edid_num = sp_tx_edid_read(ctx, edid_buf);
17991806 pm_runtime_put_sync(dev);
18001807
18011808 if (edid_num < 1) {
18021809 DRM_DEV_ERROR(dev, "Fail to read EDID: %d\n", edid_num);
1810+ kfree(edid_buf);
18031811 return NULL;
18041812 }
18051813
1806− p_edid->edid_block_num = edid_num;
1814+ ctx->cached_drm_edid = drm_edid_alloc(edid_buf, FOUR_BLOCK_SIZE);
1815+ kfree(edid_buf);
18071816
18081817 out:
1809− return drm_edid_alloc(ctx->slimport_edid_p.edid_raw_data,
1810− FOUR_BLOCK_SIZE);
1818+ return drm_edid_dup(ctx->cached_drm_edid);
18111819 }
18121820
18131821 static enum drm_connector_status anx7625_sink_detect(struct anx7625_data *ctx)
@@ -2193,11 +2201,6 @@ static int anx7625_bridge_attach(struct drm_bridge *bridge, · 379 unmodified lines
21932201 if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR))
21942202 return -EINVAL;
21952203
2196− if (!bridge->encoder) {
2197− DRM_DEV_ERROR(dev, "Parent encoder object not found");
2198− return -ENODEV;
2199− }
2200−
22012204 ctx->aux.drm_dev = bridge->dev;
22022205 err = drm_dp_aux_register(&ctx->aux);
22032206 if (err) {
@@ -2435,11 +2438,6 @@ static void anx7625_bridge_atomic_enable(struct drm_bridge *bridge, · 231 unmodified lines
24352438
24362439 dev_dbg(dev, "drm atomic enable\n");
24372440
2438− if (!bridge->encoder) {
2439− dev_err(dev, "Parent encoder object not found");
2440− return;
2441− }
2442−
24432441 connector = drm_atomic_get_new_connector_for_encoder(state->base.state,
24442442 bridge->encoder);
24452443 if (!connector)
drivers/gpu/drm/bridge/analogix/anx7625.h+2−8
@@ -286,8 +286,7 @@ · 285 unmodified lines
286286
287287 #define MIPI_LANE_CTRL_10 0x0F
288288 #define MIPI_DIGITAL_ADJ_1 0x1B
289−#define IVO_MID0 0x26
290−#define IVO_MID1 0xCF
289+#define IVO_MID 0x26CF
291290
292291 #define MIPI_PLL_M_NUM_23_16 0x1E
293292 #define MIPI_PLL_M_NUM_15_8 0x1F
@@ -417,11 +416,6 @@ enum audio_wd_len { · 123 unmodified lines
417416 #define EDID_TRY_CNT 3
418417 #define SUPPORT_PIXEL_CLOCK 300000
419418
420−struct s_edid_data {
421− int edid_block_num;
422− u8 edid_raw_data[FOUR_BLOCK_SIZE];
423−};
424−
425419 /***************** Display End *****************/
426420
427421 #define MAX_LANES_SUPPORT 4
@@ -466,7 +460,7 @@ struct anx7625_data { · 38 unmodified lines
466460 struct anx7625_i2c_client i2c;
467461 struct i2c_client *last_client;
468462 struct timer_list hdcp_timer;
469− struct s_edid_data slimport_edid_p;
463+ const struct drm_edid *cached_drm_edid;
470464 struct device *codec_dev;
471465 hdmi_codec_plugged_cb plugged_cb;
472466 struct work_struct work;
drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c+0−5
@@ -1697,11 +1697,6 @@ static int cdns_mhdp_connector_init(struct cdns_mhdp_device *mhdp) · 1696 unmodified lines
16971697 struct drm_bridge *bridge = &mhdp->bridge;
16981698 int ret;
16991699
1700− if (!bridge->encoder) {
1701− dev_err(mhdp->dev, "Parent encoder object not found");
1702− return -ENODEV;
1703− }
1704−
17051700 conn->polled = DRM_CONNECTOR_POLL_HPD;
17061701
17071702 ret = drm_connector_init(bridge->dev, conn, &cdns_mhdp_conn_funcs,
drivers/gpu/drm/bridge/imx/imx-ldb-helper.c+0−5
@@ -116,11 +116,6 @@ int ldb_bridge_attach_helper(struct drm_bridge *bridge, · 115 unmodified lines
116116 return -EINVAL;
117117 }
118118
119− if (!bridge->encoder) {
120− DRM_DEV_ERROR(ldb->dev, "missing encoder\n");
121− return -ENODEV;
122− }
123−
124119 return drm_bridge_attach(bridge->encoder,
125120 ldb_ch->next_bridge, bridge,
126121 DRM_BRIDGE_ATTACH_NO_CONNECTOR);
drivers/gpu/drm/bridge/imx/imx8qxp-pixel-combiner.c+0−5
@@ -119,11 +119,6 @@ static int imx8qxp_pc_bridge_attach(struct drm_bridge *bridge, · 118 unmodified lines
119119 return -EINVAL;
120120 }
121121
122− if (!bridge->encoder) {
123− DRM_DEV_ERROR(pc->dev, "missing encoder\n");
124− return -ENODEV;
125− }
126−
127122 return drm_bridge_attach(bridge->encoder,
128123 ch->next_bridge, bridge,
129124 DRM_BRIDGE_ATTACH_NO_CONNECTOR);
drivers/gpu/drm/bridge/imx/imx8qxp-pixel-link.c+0−5
@@ -138,11 +138,6 @@ static int imx8qxp_pixel_link_bridge_attach(struct drm_bridge *bridge, · 137 unmodified lines
138138 return -EINVAL;
139139 }
140140
141− if (!bridge->encoder) {
142− DRM_DEV_ERROR(pl->dev, "missing encoder\n");
143− return -ENODEV;
144− }
145−
146141 return drm_bridge_attach(bridge->encoder,
147142 pl->next_bridge, bridge,
148143 DRM_BRIDGE_ATTACH_NO_CONNECTOR);
drivers/gpu/drm/bridge/imx/imx8qxp-pxl2dpi.c+0−5
@@ -58,11 +58,6 @@ static int imx8qxp_pxl2dpi_bridge_attach(struct drm_bridge *bridge, · 57 unmodified lines
5858 return -EINVAL;
5959 }
6060
61− if (!bridge->encoder) {
62− DRM_DEV_ERROR(p2d->dev, "missing encoder\n");
63− return -ENODEV;
64− }
65−
6661 return drm_bridge_attach(bridge->encoder,
6762 p2d->next_bridge, bridge,
6863 DRM_BRIDGE_ATTACH_NO_CONNECTOR);
drivers/gpu/drm/bridge/ite-it6505.c+50−30
@@ -1307,9 +1307,15 @@ static void it6505_video_reset(struct it6505 *it6505) · 1306 unmodified lines
13071307 it6505_link_reset_step_train(it6505);
13081308 it6505_set_bits(it6505, REG_DATA_MUTE_CTRL, EN_VID_MUTE, EN_VID_MUTE);
13091309 it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_VID_CTRL_PKT, 0x00);
1310− it6505_set_bits(it6505, REG_RESET_CTRL, VIDEO_RESET, VIDEO_RESET);
1310+
1311+ it6505_set_bits(it6505, REG_VID_BUS_CTRL1, TX_FIFO_RESET, TX_FIFO_RESET);
1312+ it6505_set_bits(it6505, REG_VID_BUS_CTRL1, TX_FIFO_RESET, 0x00);
1313+
13111314 it6505_set_bits(it6505, REG_501_FIFO_CTRL, RST_501_FIFO, RST_501_FIFO);
13121315 it6505_set_bits(it6505, REG_501_FIFO_CTRL, RST_501_FIFO, 0x00);
1316+
1317+ it6505_set_bits(it6505, REG_RESET_CTRL, VIDEO_RESET, VIDEO_RESET);
1318+ usleep_range(1000, 2000);
13131319 it6505_set_bits(it6505, REG_RESET_CTRL, VIDEO_RESET, 0x00);
13141320 }
13151321
@@ -2245,12 +2251,11 @@ static void it6505_link_training_work(struct work_struct *work) · 929 unmodified lines
22452251 if (ret) {
22462252 it6505->auto_train_retry = AUTO_TRAIN_RETRY;
22472253 it6505_link_train_ok(it6505);
2248− return;
22492254 } else {
22502255 it6505->auto_train_retry--;
2256+ it6505_dump(it6505);
22512257 }
22522258
2253− it6505_dump(it6505);
22542259 }
22552260
22562261 static void it6505_plugged_status_to_codec(struct it6505 *it6505)
@@ -2471,31 +2476,53 @@ static void it6505_irq_link_train_fail(struct it6505 *it6505) · 214 unmodified lines
24712476 schedule_work(&it6505->link_works);
24722477 }
24732478
2474−static void it6505_irq_video_fifo_error(struct it6505 *it6505)
2479+static bool it6505_test_bit(unsigned int bit, const unsigned int *addr)
24752480 {
2476− struct device *dev = it6505->dev;
2477−
2478− DRM_DEV_DEBUG_DRIVER(dev, "video fifo overflow interrupt");
2479− it6505->auto_train_retry = AUTO_TRAIN_RETRY;
2480− flush_work(&it6505->link_works);
2481− it6505_stop_hdcp(it6505);
2482− it6505_video_reset(it6505);
2481+ return 1 & (addr[bit / BITS_PER_BYTE] >> (bit % BITS_PER_BYTE));
24832482 }
24842483
2485−static void it6505_irq_io_latch_fifo_overflow(struct it6505 *it6505)
2484+static void it6505_irq_video_handler(struct it6505 *it6505, const int *int_status)
24862485 {
24872486 struct device *dev = it6505->dev;
2487+ int reg_0d, reg_int03;
24882488
2489− DRM_DEV_DEBUG_DRIVER(dev, "IO latch fifo overflow interrupt");
2490− it6505->auto_train_retry = AUTO_TRAIN_RETRY;
2491− flush_work(&it6505->link_works);
2492− it6505_stop_hdcp(it6505);
2493− it6505_video_reset(it6505);
2494−}
2489+ /*
2490+ * When video SCDT change with video not stable,
2491+ * Or video FIFO error, need video reset
2492+ */
24952493
2496−static bool it6505_test_bit(unsigned int bit, const unsigned int *addr)
2497−{
2498− return 1 & (addr[bit / BITS_PER_BYTE] >> (bit % BITS_PER_BYTE));
2494+ if ((!it6505_get_video_status(it6505) &&
2495+ (it6505_test_bit(INT_SCDT_CHANGE, (unsigned int *)int_status))) ||
2496+ (it6505_test_bit(BIT_INT_IO_FIFO_OVERFLOW,
2497+ (unsigned int *)int_status)) ||
2498+ (it6505_test_bit(BIT_INT_VID_FIFO_ERROR,
2499+ (unsigned int *)int_status))) {
2500+ it6505->auto_train_retry = AUTO_TRAIN_RETRY;
2501+ flush_work(&it6505->link_works);
2502+ it6505_stop_hdcp(it6505);
2503+ it6505_video_reset(it6505);
2504+
2505+ usleep_range(10000, 11000);
2506+
2507+ /*
2508+ * Clear FIFO error IRQ to prevent fifo error -> reset loop
2509+ * HW will trigger SCDT change IRQ again when video stable
2510+ */
2511+
2512+ reg_int03 = it6505_read(it6505, INT_STATUS_03);
2513+ reg_0d = it6505_read(it6505, REG_SYSTEM_STS);
2514+
2515+ reg_int03 &= (BIT(INT_VID_FIFO_ERROR) | BIT(INT_IO_LATCH_FIFO_OVERFLOW));
2516+ it6505_write(it6505, INT_STATUS_03, reg_int03);
2517+
2518+ DRM_DEV_DEBUG_DRIVER(dev, "reg08 = 0x%02x", reg_int03);
2519+ DRM_DEV_DEBUG_DRIVER(dev, "reg0D = 0x%02x", reg_0d);
2520+
2521+ return;
2522+ }
2523+
2524+ if (it6505_test_bit(INT_SCDT_CHANGE, (unsigned int *)int_status))
2525+ it6505_irq_scdt(it6505);
24992526 }
25002527
25012528 static irqreturn_t it6505_int_threaded_handler(int unused, void *data)
@@ -2508,15 +2535,12 @@ static irqreturn_t it6505_int_threaded_handler(int unused, void *data) · 6 unmodified lines
25082535 } irq_vec[] = {
25092536 { BIT_INT_HPD, it6505_irq_hpd },
25102537 { BIT_INT_HPD_IRQ, it6505_irq_hpd_irq },
2511− { BIT_INT_SCDT, it6505_irq_scdt },
25122538 { BIT_INT_HDCP_FAIL, it6505_irq_hdcp_fail },
25132539 { BIT_INT_HDCP_DONE, it6505_irq_hdcp_done },
25142540 { BIT_INT_AUX_CMD_FAIL, it6505_irq_aux_cmd_fail },
25152541 { BIT_INT_HDCP_KSV_CHECK, it6505_irq_hdcp_ksv_check },
25162542 { BIT_INT_AUDIO_FIFO_ERROR, it6505_irq_audio_fifo_error },
25172543 { BIT_INT_LINK_TRAIN_FAIL, it6505_irq_link_train_fail },
2518− { BIT_INT_VID_FIFO_ERROR, it6505_irq_video_fifo_error },
2519− { BIT_INT_IO_FIFO_OVERFLOW, it6505_irq_io_latch_fifo_overflow },
25202544 };
25212545 int int_status[3], i;
25222546
@@ -2546,6 +2570,7 @@ static irqreturn_t it6505_int_threaded_handler(int unused, void *data) · 23 unmodified lines
25462570 if (it6505_test_bit(irq_vec[i].bit, (unsigned int *)int_status))
25472571 irq_vec[i].handler(it6505);
25482572 }
2573+ it6505_irq_video_handler(it6505, (unsigned int *)int_status);
25492574 }
25502575
25512576 pm_runtime_put_sync(dev);
@@ -2590,7 +2615,7 @@ static int it6505_poweron(struct it6505 *it6505) · 38 unmodified lines
25902615 gpiod_set_value_cansleep(pdata->gpiod_reset, 0);
25912616 usleep_range(1000, 2000);
25922617 gpiod_set_value_cansleep(pdata->gpiod_reset, 1);
2593− usleep_range(10000, 20000);
2618+ usleep_range(25000, 35000);
25942619 }
25952620
25962621 it6505->powered = true;
@@ -2882,11 +2907,6 @@ static int it6505_bridge_attach(struct drm_bridge *bridge, · 285 unmodified lines
28822907 return -EINVAL;
28832908 }
28842909
2885− if (!bridge->encoder) {
2886− dev_err(dev, "Parent encoder object not found");
2887− return -ENODEV;
2888− }
2889−
28902910 /* Register aux channel */
28912911 it6505->aux.drm_dev = bridge->dev;
28922912
drivers/gpu/drm/bridge/lontium-lt9611.c+1−0
@@ -1195,4 +1195,5 @@ static struct i2c_driver lt9611_driver = { · 1194 unmodified lines
11951195 };
11961196 module_i2c_driver(lt9611_driver);
11971197
1198+MODULE_DESCRIPTION("Lontium LT9611 DSI/HDMI bridge driver");
11981199 MODULE_LICENSE("GPL v2");
drivers/gpu/drm/bridge/lontium-lt9611uxc.c+1−5
@@ -337,11 +337,6 @@ static int lt9611uxc_connector_init(struct drm_bridge *bridge, struct lt9611uxc · 336 unmodified lines
337337 {
338338 int ret;
339339
340− if (!bridge->encoder) {
341− DRM_ERROR("Parent encoder object not found");
342− return -ENODEV;
343− }
344−
345340 lt9611uxc->connector.polled = DRM_CONNECTOR_POLL_HPD;
346341
347342 drm_connector_helper_add(&lt9611uxc->connector,
@@ -1021,6 +1016,7 @@ static struct i2c_driver lt9611uxc_driver = { · 673 unmodified lines
10211016 module_i2c_driver(lt9611uxc_driver);
10221017
10231018 MODULE_AUTHOR("Dmitry Baryshkov <dmitry.baryshkov@linaro.org>");
1019+MODULE_DESCRIPTION("Lontium LT9611UXC DSI/HDMI bridge driver");
10241020 MODULE_LICENSE("GPL v2");
10251021
10261022 MODULE_FIRMWARE(FW_FILE);
drivers/gpu/drm/bridge/megachips-stdpxxxx-ge-b850v3-fw.c+0−5
@@ -165,11 +165,6 @@ static int ge_b850v3_lvds_create_connector(struct drm_bridge *bridge) · 164 unmodified lines
165165 struct drm_connector *connector = &ge_b850v3_lvds_ptr->connector;
166166 int ret;
167167
168− if (!bridge->encoder) {
169− DRM_ERROR("Parent encoder object not found");
170− return -ENODEV;
171− }
172−
173168 connector->polled = DRM_CONNECTOR_POLL_HPD;
174169
175170 drm_connector_helper_add(connector,
drivers/gpu/drm/bridge/nxp-ptn3460.c+0−5
@@ -229,11 +229,6 @@ static int ptn3460_bridge_attach(struct drm_bridge *bridge, · 228 unmodified lines
229229 if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)
230230 return 0;
231231
232− if (!bridge->encoder) {
233− DRM_ERROR("Parent encoder object not found");
234− return -ENODEV;
235− }
236−
237232 ptn_bridge->connector.polled = DRM_CONNECTOR_POLL_HPD;
238233 ret = drm_connector_init(bridge->dev, &ptn_bridge->connector,
239234 &ptn3460_connector_funcs, DRM_MODE_CONNECTOR_LVDS);
drivers/gpu/drm/bridge/panel.c+0−5
@@ -67,11 +67,6 @@ static int panel_bridge_attach(struct drm_bridge *bridge, · 66 unmodified lines
6767 if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)
6868 return 0;
6969
70− if (!bridge->encoder) {
71− DRM_ERROR("Missing encoder\n");
72− return -ENODEV;
73− }
74−
7570 drm_connector_helper_add(connector,
7671 &panel_bridge_connector_helper_funcs);
7772
drivers/gpu/drm/bridge/samsung-dsim.c+23−2
@@ -574,8 +574,8 @@ static unsigned long samsung_dsim_pll_find_pms(struct samsung_dsim *dsi, · 573 unmodified lines
574574 u16 _m, best_m;
575575 u8 _s, best_s;
576576
577− p_min = DIV_ROUND_UP(fin, (12 * MHZ));
578− p_max = fin / (6 * MHZ);
577+ p_min = DIV_ROUND_UP(fin, (driver_data->pll_fin_max * MHZ));
578+ p_max = fin / (driver_data->pll_fin_min * MHZ);
579579
580580 for (_p = p_min; _p <= p_max; ++_p) {
581581 for (_s = 0; _s <= 5; ++_s) {
@@ -1606,6 +1606,27 @@ static int samsung_dsim_atomic_check(struct drm_bridge *bridge, · 1024 unmodified lines
16061606 adjusted_mode->flags |= (DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC);
16071607 }
16081608
1609+ /*
1610+ * When using video sync pulses, the HFP, HBP, and HSA are divided between
1611+ * the available lanes if there is more than one lane. For certain
1612+ * timings and lane configurations, the HFP may not be evenly divisible.
1613+ * If the HFP is rounded down, it ends up being too small which can cause
1614+ * some monitors to not sync properly. In these instances, adjust htotal
1615+ * and hsync to round the HFP up, and recalculate the htotal. Through trial
1616+ * and error, it appears that the HBP and HSA do not appearto need the same
1617+ * correction that HFP does.
1618+ */
1619+ if (dsi->lanes > 1) {
1620+ int hfp = adjusted_mode->hsync_start - adjusted_mode->hdisplay;
1621+ int remainder = hfp % dsi->lanes;
1622+
1623+ if (remainder) {
1624+ adjusted_mode->hsync_start += remainder;
1625+ adjusted_mode->hsync_end += remainder;
1626+ adjusted_mode->htotal += remainder;
1627+ }
1628+ }
1629+
16091630 return 0;
16101631 }
16111632
drivers/gpu/drm/bridge/sii902x.c+33−13
@@ -163,6 +163,14 @@ · 162 unmodified lines
163163
164164 #define SII902X_AUDIO_PORT_INDEX 3
165165
166+/*
167+ * The maximum resolution supported by the HDMI bridge is 1080p@60Hz
168+ * and 1920x1200 requiring a pixel clock of 165MHz and the minimum
169+ * resolution supported is 480p@60Hz requiring a pixel clock of 25MHz
170+ */
171+#define SII902X_MIN_PIXEL_CLOCK_KHZ 25000
172+#define SII902X_MAX_PIXEL_CLOCK_KHZ 165000
173+
166174 struct sii902x {
167175 struct i2c_client *i2c;
168176 struct regmap *regmap;
@@ -310,20 +318,12 @@ static int sii902x_get_modes(struct drm_connector *connector) · 141 unmodified lines
310318 return num;
311319 }
312320
313−static enum drm_mode_status sii902x_mode_valid(struct drm_connector *connector,
314− struct drm_display_mode *mode)
315−{
316− /* TODO: check mode */
317−
318− return MODE_OK;
319−}
320−
321321 static const struct drm_connector_helper_funcs sii902x_connector_helper_funcs = {
322322 .get_modes = sii902x_get_modes,
323− .mode_valid = sii902x_mode_valid,
324323 };
325324
326−static void sii902x_bridge_disable(struct drm_bridge *bridge)
325+static void sii902x_bridge_atomic_disable(struct drm_bridge *bridge,
326+ struct drm_bridge_state *old_bridge_state)
327327 {
328328 struct sii902x *sii902x = bridge_to_sii902x(bridge);
329329
@@ -336,7 +336,8 @@ static void sii902x_bridge_disable(struct drm_bridge *bridge) · 6 unmodified lines
336336 mutex_unlock(&sii902x->mutex);
337337 }
338338
339−static void sii902x_bridge_enable(struct drm_bridge *bridge)
339+static void sii902x_bridge_atomic_enable(struct drm_bridge *bridge,
340+ struct drm_bridge_state *old_bridge_state)
340341 {
341342 struct sii902x *sii902x = bridge_to_sii902x(bridge);
342343
@@ -495,6 +496,10 @@ static int sii902x_bridge_atomic_check(struct drm_bridge *bridge, · 152 unmodified lines
495496 struct drm_crtc_state *crtc_state,
496497 struct drm_connector_state *conn_state)
497498 {
499+ if (crtc_state->mode.clock < SII902X_MIN_PIXEL_CLOCK_KHZ ||
500+ crtc_state->mode.clock > SII902X_MAX_PIXEL_CLOCK_KHZ)
501+ return -EINVAL;
502+
498503 /*
499504 * There might be flags negotiation supported in future but
500505 * set the bus flags in atomic_check statically for now.
@@ -504,11 +509,25 @@ static int sii902x_bridge_atomic_check(struct drm_bridge *bridge, · 3 unmodified lines
504509 return 0;
505510 }
506511
512+static enum drm_mode_status
513+sii902x_bridge_mode_valid(struct drm_bridge *bridge,
514+ const struct drm_display_info *info,
515+ const struct drm_display_mode *mode)
516+{
517+ if (mode->clock < SII902X_MIN_PIXEL_CLOCK_KHZ)
518+ return MODE_CLOCK_LOW;
519+
520+ if (mode->clock > SII902X_MAX_PIXEL_CLOCK_KHZ)
521+ return MODE_CLOCK_HIGH;
522+
523+ return MODE_OK;
524+}
525+
507526 static const struct drm_bridge_funcs sii902x_bridge_funcs = {
508527 .attach = sii902x_bridge_attach,
509528 .mode_set = sii902x_bridge_mode_set,
510− .disable = sii902x_bridge_disable,
511− .enable = sii902x_bridge_enable,
529+ .atomic_disable = sii902x_bridge_atomic_disable,
530+ .atomic_enable = sii902x_bridge_atomic_enable,
512531 .detect = sii902x_bridge_detect,
513532 .edid_read = sii902x_bridge_edid_read,
514533 .atomic_reset = drm_atomic_helper_bridge_reset,
@@ -516,6 +535,7 @@ static const struct drm_bridge_funcs sii902x_bridge_funcs = { · 1 unmodified line
516535 .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
517536 .atomic_get_input_bus_fmts = sii902x_bridge_atomic_get_input_bus_fmts,
518537 .atomic_check = sii902x_bridge_atomic_check,
538+ .mode_valid = sii902x_bridge_mode_valid,
519539 };
520540
521541 static int sii902x_mute(struct sii902x *sii902x, bool mute)
drivers/gpu/drm/bridge/sii9234.c+1−0
@@ -961,4 +961,5 @@ static struct i2c_driver sii9234_driver = { · 960 unmodified lines
961961 };
962962
963963 module_i2c_driver(sii9234_driver);
964+MODULE_DESCRIPTION("Silicon Image SII9234 HDMI/MHL bridge driver");
964965 MODULE_LICENSE("GPL");
drivers/gpu/drm/bridge/sil-sii8620.c+1−0
@@ -2384,4 +2384,5 @@ static struct i2c_driver sii8620_driver = { · 2383 unmodified lines
23842384 };
23852385
23862386 module_i2c_driver(sii8620_driver);
2387+MODULE_DESCRIPTION("Silicon Image SiI8620 HDMI/MHL bridge driver");
23872388 MODULE_LICENSE("GPL v2");
drivers/gpu/drm/bridge/simple-bridge.c+1−17
@@ -116,11 +116,6 @@ static int simple_bridge_attach(struct drm_bridge *bridge, · 115 unmodified lines
116116 if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)
117117 return 0;
118118
119− if (!bridge->encoder) {
120− DRM_ERROR("Missing encoder\n");
121− return -ENODEV;
122− }
123−
124119 drm_connector_helper_add(&sbridge->connector,
125120 &simple_bridge_con_helper_funcs);
126121 ret = drm_connector_init_with_ddc(bridge->dev, &sbridge->connector,
@@ -175,7 +170,6 @@ static int simple_bridge_probe(struct platform_device *pdev) · 48 unmodified lines
175170 sbridge = devm_kzalloc(&pdev->dev, sizeof(*sbridge), GFP_KERNEL);
176171 if (!sbridge)
177172 return -ENOMEM;
178− platform_set_drvdata(pdev, sbridge);
179173
180174 sbridge->info = of_device_get_match_data(&pdev->dev);
181175
@@ -213,16 +207,7 @@ static int simple_bridge_probe(struct platform_device *pdev) · 31 unmodified lines
213207 sbridge->bridge.of_node = pdev->dev.of_node;
214208 sbridge->bridge.timings = sbridge->info->timings;
215209
216− drm_bridge_add(&sbridge->bridge);
217−
218− return 0;
219−}
220−
221−static void simple_bridge_remove(struct platform_device *pdev)
222−{
223− struct simple_bridge *sbridge = platform_get_drvdata(pdev);
224−
225− drm_bridge_remove(&sbridge->bridge);
210+ return devm_drm_bridge_add(&pdev->dev, &sbridge->bridge);
226211 }
227212
228213 /*
@@ -299,7 +284,6 @@ MODULE_DEVICE_TABLE(of, simple_bridge_match); · 70 unmodified lines
299284
300285 static struct platform_driver simple_bridge_driver = {
301286 .probe = simple_bridge_probe,
302− .remove_new = simple_bridge_remove,
303287 .driver = {
304288 .name = "simple-bridge",
305289 .of_match_table = simple_bridge_match,
drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c+0−5
@@ -1071,11 +1071,6 @@ static int dw_mipi_dsi_bridge_attach(struct drm_bridge *bridge, · 1070 unmodified lines
10711071 {
10721072 struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge);
10731073
1074− if (!bridge->encoder) {
1075− DRM_ERROR("Parent encoder object not found\n");
1076− return -ENODEV;
1077− }
1078−
10791074 /* Set the encoder type as caller does not know it */
10801075 bridge->encoder->encoder_type = DRM_MODE_ENCODER_DSI;
10811076
drivers/gpu/drm/bridge/tc358767.c+22−5
@@ -382,6 +382,9 @@ struct tc_data { · 381 unmodified lines
382382
383383 /* HPD pin number (0 or 1) or -ENODEV */
384384 int hpd_pin;
385+
386+ /* Number of pixels to subtract from a line due to pixel clock delta */
387+ u32 line_pixel_subtract;
385388 };
386389
387390 static inline struct tc_data *aux_to_tc(struct drm_dp_aux *a)
@@ -577,6 +580,11 @@ static int tc_pllupdate(struct tc_data *tc, unsigned int pllctrl) · 189 unmodified lines
577580 return 0;
578581 }
579582
583+static u32 div64_round_up(u64 v, u32 d)
584+{
585+ return div_u64(v + d - 1, d);
586+}
587+
580588 static int tc_pxl_pll_en(struct tc_data *tc, u32 refclk, u32 pixelclock)
581589 {
582590 int ret;
@@ -658,8 +666,11 @@ static int tc_pxl_pll_en(struct tc_data *tc, u32 refclk, u32 pixelclock) · 75 unmodified lines
658666 return -EINVAL;
659667 }
660668
661− dev_dbg(tc->dev, "PLL: got %d, delta %d\n", best_pixelclock,
662− best_delta);
669+ tc->line_pixel_subtract = tc->mode.htotal -
670+ div64_round_up(tc->mode.htotal * (u64)best_pixelclock, pixelclock);
671+
672+ dev_dbg(tc->dev, "PLL: got %d, delta %d (subtract %d px)\n", best_pixelclock,
673+ best_delta, tc->line_pixel_subtract);
663674 dev_dbg(tc->dev, "PLL: %d / %d / %d * %d / %d\n", refclk,
664675 ext_div[best_pre], best_div, best_mul, ext_div[best_post]);
665676
@@ -885,6 +896,12 @@ static int tc_set_common_video_mode(struct tc_data *tc, · 219 unmodified lines
885896 upper_margin, lower_margin, vsync_len);
886897 dev_dbg(tc->dev, "total: %dx%d\n", mode->htotal, mode->vtotal);
887898
899+ if (right_margin > tc->line_pixel_subtract) {
900+ right_margin -= tc->line_pixel_subtract;
901+ } else {
902+ dev_err(tc->dev, "Bridge pixel clock too slow for mode\n");
903+ right_margin = 0;
904+ }
888905
889906 /*
890907 * LCD Ctl Frame Size
@@ -894,7 +911,7 @@ static int tc_set_common_video_mode(struct tc_data *tc, · 3 unmodified lines
894911 */
895912 ret = regmap_write(tc->regmap, VPCTRL0,
896913 FIELD_PREP(VSDELAY, right_margin + 10) |
897− OPXLFMT_RGB888 | FRMSYNC_DISABLED | MSF_DISABLED);
914+ OPXLFMT_RGB888 | FRMSYNC_ENABLED | MSF_DISABLED);
898915 if (ret)
899916 return ret;
900917
@@ -1629,7 +1646,7 @@ tc_edp_mode_valid(struct drm_bridge *bridge, · 728 unmodified lines
16291646 u32 req, avail;
16301647 u32 bits_per_pixel = 24;
16311648
1632− /* DPI interface clock limitation: upto 154 MHz */
1649+ /* DPI->(e)DP interface clock limitation: up to 154 MHz */
16331650 if (mode->clock > 154000)
16341651 return MODE_CLOCK_HIGH;
16351652
@@ -2135,7 +2152,7 @@ static irqreturn_t tc_irq_handler(int irq, void *arg) · 499 unmodified lines
21352152 dev_err(tc->dev, "syserr %x\n", stat);
21362153 }
21372154
2138− if (tc->hpd_pin >= 0 && tc->bridge.dev) {
2155+ if (tc->hpd_pin >= 0 && tc->bridge.dev && tc->aux.drm_dev) {
21392156 /*
21402157 * H is triggered when the GPIO goes high.
21412158 *
drivers/gpu/drm/bridge/ti-tfp410.c+0−5
@@ -133,11 +133,6 @@ static int tfp410_attach(struct drm_bridge *bridge, · 132 unmodified lines
133133 if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)
134134 return 0;
135135
136− if (!bridge->encoder) {
137− dev_err(dvi->dev, "Missing encoder\n");
138− return -ENODEV;
139− }
140−
141136 if (dvi->next_bridge->ops & DRM_BRIDGE_OP_DETECT)
142137 dvi->connector.polled = DRM_CONNECTOR_POLL_HPD;
143138 else
drivers/gpu/drm/ci/build-igt.sh+40−1
@@ -3,6 +3,30 @@ · 2 unmodified lines
33
44 set -ex
55
6+function generate_testlist {
7+ set +x
8+ while read -r line; do
9+ if [ "$line" = "TESTLIST" ] || [ "$line" = "END TESTLIST" ]; then
10+ continue
11+ fi
12+
13+ tests=$(echo "$line" | tr ' ' '\n')
14+
15+ for test in $tests; do
16+ output=$(/igt/libexec/igt-gpu-tools/"$test" --list-subtests || true)
17+
18+ if [ -z "$output" ]; then
19+ echo "$test"
20+ else
21+ echo "$output" | while read -r subtest; do
22+ echo "$test@$subtest"
23+ done
24+ fi
25+ done
26+ done < /igt/libexec/igt-gpu-tools/test-list.txt > /igt/libexec/igt-gpu-tools/ci-testlist.txt
27+ set -x
28+}
29+
630 git clone https://gitlab.freedesktop.org/drm/igt-gpu-tools.git --single-branch --no-checkout
731 cd igt-gpu-tools
832 git checkout $IGT_VERSION
@@ -21,15 +45,30 @@ MESON_OPTIONS="-Doverlay=disabled \ · 12 unmodified lines
2145 -Dlibunwind=enabled \
2246 -Dprefix=/igt"
2347
48+if [[ "$KERNEL_ARCH" = "arm64" ]] || [[ "$KERNEL_ARCH" = "arm" ]]; then
49+ MESON_OPTIONS="$MESON_OPTIONS -Dxe_driver=disabled"
50+fi
51+
2452 mkdir -p /igt
2553 meson build $MESON_OPTIONS $EXTRA_MESON_ARGS
2654 ninja -C build -j${FDO_CI_CONCURRENT:-4} || ninja -C build -j 1
2755 ninja -C build install
2856
57+if [[ "$KERNEL_ARCH" = "arm64" ]]; then
58+ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/igt/lib/aarch64-linux-gnu
59+elif [[ "$KERNEL_ARCH" = "arm" ]]; then
60+ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/igt/lib
61+else
62+ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/igt/lib64
63+fi
64+
65+echo "Generating ci-testlist.txt"
66+generate_testlist
67+
2968 mkdir -p artifacts/
3069 tar -cf artifacts/igt.tar /igt
3170
3271 # Pass needed files to the test stage
3372 S3_ARTIFACT_NAME="igt.tar.gz"
3473 gzip -c artifacts/igt.tar > ${S3_ARTIFACT_NAME}
35−ci-fairy s3cp --token-file "${CI_JOB_JWT_FILE}" ${S3_ARTIFACT_NAME} https://${PIPELINE_ARTIFACTS_BASE}/${KERNEL_ARCH}/${S3_ARTIFACT_NAME}
74+ci-fairy s3cp --token-file "${S3_JWT_FILE}" ${S3_ARTIFACT_NAME} https://${PIPELINE_ARTIFACTS_BASE}/${KERNEL_ARCH}/${S3_ARTIFACT_NAME}
drivers/gpu/drm/ci/build.sh+7−3
@@ -12,6 +12,9 @@ rm -rf .git/rebase-apply · 11 unmodified lines
1212 apt-get update
1313 apt-get install -y libssl-dev
1414
15+# for msm header validation
16+apt-get install -y python3-lxml
17+
1518 if [[ "$KERNEL_ARCH" = "arm64" ]]; then
1619 GCC_ARCH="aarch64-linux-gnu"
1720 DEBIAN_ARCH="arm64"
@@ -128,6 +131,7 @@ fi · 110 unmodified lines
128131 # Pass needed files to the test stage
129132 mkdir -p install
130133 cp -rfv .gitlab-ci/* install/.
134+cp -rfv ci/* install/.
131135 cp -rfv install/common install/ci-common
132136 cp -rfv drivers/gpu/drm/ci/* install/.
133137
@@ -141,21 +145,21 @@ if [[ "$UPLOAD_TO_MINIO" = "1" ]]; then · 7 unmodified lines
141145 FILES_TO_UPLOAD="$FILES_TO_UPLOAD $(basename -a $DEVICE_TREES)"
142146 fi
143147
148+ ls -l "${S3_JWT_FILE}"
144149 for f in $FILES_TO_UPLOAD; do
145− ci-fairy s3cp --token-file "${CI_JOB_JWT_FILE}" /lava-files/$f \
150+ ci-fairy s3cp --token-file "${S3_JWT_FILE}" /lava-files/$f \
146151 https://${PIPELINE_ARTIFACTS_BASE}/${DEBIAN_ARCH}/$f
147152 done
148153
149154 S3_ARTIFACT_NAME="kernel-files.tar.zst"
150155 tar --zstd -cf $S3_ARTIFACT_NAME install
151− ci-fairy s3cp --token-file "${CI_JOB_JWT_FILE}" ${S3_ARTIFACT_NAME} https://${PIPELINE_ARTIFACTS_BASE}/${DEBIAN_ARCH}/${S3_ARTIFACT_NAME}
156+ ci-fairy s3cp --token-file "${S3_JWT_FILE}" ${S3_ARTIFACT_NAME} https://${PIPELINE_ARTIFACTS_BASE}/${DEBIAN_ARCH}/${S3_ARTIFACT_NAME}
152157
153158 echo "Download vmlinux.xz from https://${PIPELINE_ARTIFACTS_BASE}/${DEBIAN_ARCH}/vmlinux.xz"
154159 fi
155160
156161 mkdir -p artifacts/install/lib
157162 mv install/* artifacts/install/.
158−rm -rf artifacts/install/modules
159163 ln -s common artifacts/install/ci-common
160164 cp .config artifacts/${CI_JOB_NAME}_config
161165
drivers/gpu/drm/ci/build.yml+1−0
@@ -106,6 +106,7 @@ build-nodebugfs:arm64: · 105 unmodified lines
106106 extends: .build:arm64
107107 variables:
108108 DISABLE_KCONFIGS: "DEBUG_FS"
109+ ENABLE_KCONFIGS: "EXPERT DRM_MSM_VALIDATE_XML"
109110
110111 build:x86_64:
111112 extends: .build:x86_64
drivers/gpu/drm/ci/container.yml+4−8
@@ -36,15 +36,15 @@ debian/android_build: · 35 unmodified lines
3636 rules:
3737 - when: never
3838
39−debian/x86_64_test-android:
39+.debian/x86_64_test-android:
4040 rules:
4141 - when: never
4242
43−windows_build_vs2019:
43+windows_build_msvc:
4444 rules:
4545 - when: never
4646
47−windows_test_vs2019:
47+windows_test_msvc:
4848 rules:
4949 - when: never
5050
@@ -56,10 +56,6 @@ rustfmt: · 5 unmodified lines
5656 rules:
5757 - when: never
5858
59−windows_vs2019:
60− rules:
61− - when: never
62−
63−clang-format:
59+windows_msvc:
6460 rules:
6561 - when: never
drivers/gpu/drm/ci/gitlab-ci.yml+32−15
@@ -1,11 +1,11 @@
11 variables:
22 DRM_CI_PROJECT_PATH: &drm-ci-project-path mesa/mesa
3− DRM_CI_COMMIT_SHA: &drm-ci-commit-sha 9d162de9a05155e1c4041857a5848842749164cf
3+ DRM_CI_COMMIT_SHA: &drm-ci-commit-sha e2b9c5a9e3e4f9b532067af8022eaef8d6fc6c00
44
55 UPSTREAM_REPO: git://anongit.freedesktop.org/drm/drm
66 TARGET_BRANCH: drm-next
77
8− IGT_VERSION: d2af13d9f5be5ce23d996e4afd3e45990f5ab977
8+ IGT_VERSION: 0df7b9b97f9da0e364f5ee30fe331004b8c86b56
99
1010 DEQP_RUNNER_GIT_URL: https://gitlab.freedesktop.org/anholt/deqp-runner.git
1111 DEQP_RUNNER_GIT_TAG: v0.15.0
@@ -19,33 +19,47 @@ variables: · 7 unmodified lines
1919 bash download-git-cache.sh
2020 rm download-git-cache.sh
2121 set +o xtrace
22+ S3_JWT_FILE: /s3_jwt
2223 S3_HOST: s3.freedesktop.org
24+ # This bucket is used to fetch the kernel image
25+ S3_KERNEL_BUCKET: mesa-rootfs
26+ # Bucket for git cache
27+ S3_GITCACHE_BUCKET: git-cache
28+ # Bucket for the pipeline artifacts pushed to S3
29+ S3_ARTIFACTS_BUCKET: artifacts
2330 # per-pipeline artifact storage on MinIO
24− PIPELINE_ARTIFACTS_BASE: ${S3_HOST}/artifacts/${CI_PROJECT_PATH}/${CI_PIPELINE_ID}
31+ PIPELINE_ARTIFACTS_BASE: ${S3_HOST}/${S3_ARTIFACTS_BUCKET}/${CI_PROJECT_PATH}/${CI_PIPELINE_ID}
2532 # per-job artifact storage on MinIO
2633 JOB_ARTIFACTS_BASE: ${PIPELINE_ARTIFACTS_BASE}/${CI_JOB_ID}
2734 # default kernel for rootfs before injecting the current kernel tree
2835 KERNEL_REPO: "gfx-ci/linux"
29− KERNEL_TAG: "v6.6.4-for-mesa-ci-e4f4c500f7fb"
30− KERNEL_IMAGE_BASE: https://${S3_HOST}/mesa-lava/${KERNEL_REPO}/${KERNEL_TAG}
36+ KERNEL_TAG: "v6.6.21-mesa-f8ea"
37+ KERNEL_IMAGE_BASE: https://${S3_HOST}/${S3_KERNEL_BUCKET}/${KERNEL_REPO}/${KERNEL_TAG}
38+ PKG_REPO_REV: "3cc12a2a"
3139 LAVA_TAGS: subset-1-gfx
3240 LAVA_JOB_PRIORITY: 30
41+ ARTIFACTS_BASE_URL: https://${CI_PROJECT_ROOT_NAMESPACE}.${CI_PAGES_DOMAIN}/-/${CI_PROJECT_NAME}/-/jobs/${CI_JOB_ID}/artifacts
42+ # Python scripts for structured logger
43+ PYTHONPATH: "$PYTHONPATH:$CI_PROJECT_DIR/install"
3344
3445 default:
46+ id_tokens:
47+ S3_JWT:
48+ aud: https://s3.freedesktop.org
3549 before_script:
3650 - export SCRIPTS_DIR=$(mktemp -d)
3751 - curl -L -s --retry 4 -f --retry-all-errors --retry-delay 60 -O --output-dir "${SCRIPTS_DIR}" "${DRM_CI_PROJECT_URL}/-/raw/${DRM_CI_COMMIT_SHA}/.gitlab-ci/setup-test-env.sh"
3852 - source ${SCRIPTS_DIR}/setup-test-env.sh
3953 - echo -e "\e[0Ksection_start:$(date +%s):unset_env_vars_section[collapsed=true]\r\e[0KUnsetting vulnerable environment variables"
40− - export CI_JOB_JWT_FILE="${CI_JOB_JWT_FILE:-$(mktemp)}"
41− - echo -n "${CI_JOB_JWT}" > "${CI_JOB_JWT_FILE}"
42− - unset CI_JOB_JWT
54+ - echo -n "${S3_JWT}" > "${S3_JWT_FILE}"
55+ - unset CI_JOB_JWT S3_JWT
4356 - echo -e "\e[0Ksection_end:$(date +%s):unset_env_vars_section\r\e[0K"
4457
4558 - echo -e "\e[0Ksection_start:$(date +%s):drm_ci_download_section[collapsed=true]\r\e[0KDownloading mesa from $DRM_CI_PROJECT_URL/-/archive/$DRM_CI_COMMIT_SHA/mesa-$DRM_CI_COMMIT_SHA.tar.gz"
4659 - cd $CI_PROJECT_DIR
4760 - curl --output - $DRM_CI_PROJECT_URL/-/archive/$DRM_CI_COMMIT_SHA/mesa-$DRM_CI_COMMIT_SHA.tar.gz | tar -xz
4861 - mv mesa-$DRM_CI_COMMIT_SHA/.gitlab-ci* .
62+ - mv mesa-$DRM_CI_COMMIT_SHA/bin/ci .
4963 - rm -rf mesa-$DRM_CI_COMMIT_SHA/
5064 - echo -e "\e[0Ksection_end:$(date +%s):drm_ci_download_section\r\e[0K"
5165
@@ -53,9 +67,9 @@ default: · 1 unmodified line
5367 - >
5468 set +x
5569
56− test -e "${CI_JOB_JWT_FILE}" &&
57− export CI_JOB_JWT="$(<${CI_JOB_JWT_FILE})" &&
58− rm "${CI_JOB_JWT_FILE}"
70+ test -e "${S3_JWT_FILE}" &&
71+ export S3_JWT="$(<${S3_JWT_FILE})" &&
72+ rm "${S3_JWT_FILE}"
5973
6074 include:
6175 - project: 'freedesktop/ci-templates'
@@ -87,6 +101,7 @@ include: · 25 unmodified lines
87101 - '/src/intel/ci/gitlab-ci-inc.yml'
88102 - '/src/freedreno/ci/gitlab-ci-inc.yml'
89103 - '/src/amd/ci/gitlab-ci-inc.yml'
104+ - '/src/virtio/ci/gitlab-ci-inc.yml'
90105 - drivers/gpu/drm/ci/image-tags.yml
91106 - drivers/gpu/drm/ci/container.yml
92107 - drivers/gpu/drm/ci/static-checks.yml
@@ -98,6 +113,7 @@ include: · 5 unmodified lines
98113 stages:
99114 - sanity
100115 - container
116+ - code-validation
101117 - git-archive
102118 - build
103119 - amdgpu
@@ -107,7 +123,7 @@ stages: · 3 unmodified lines
107123 - msm
108124 - rockchip
109125 - virtio-gpu
110− - lint
126+ - software-driver
111127
112128 # YAML anchors for rule conditions
113129 # --------------------------------
@@ -218,14 +234,15 @@ make git archive: · 104 unmodified lines
218234 script:
219235 # Remove drm-ci files we just added
220236 - rm -rf .gitlab-ci.*
237+ - rm -rf ci
221238
222239 # Compactify the .git directory
223240 - git gc --aggressive
224241 # compress the current folder
225242 - tar -cvzf ../$CI_PROJECT_NAME.tar.gz .
226243
227− # login with the JWT token file
228− - ci-fairy s3cp --token-file "${CI_JOB_JWT_FILE}" ../$CI_PROJECT_NAME.tar.gz https://$S3_HOST/git-cache/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME/$CI_PROJECT_NAME.tar.gz
244+ # Use id_tokens for JWT auth
245+ - ci-fairy s3cp --token-file "${S3_JWT_FILE}" ../$CI_PROJECT_NAME.tar.gz https://$S3_HOST/${S3_GITCACHE_BUCKET}/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME/$CI_PROJECT_NAME.tar.gz
229246
230247
231248 # Sanity checks of MR settings and commit logs
@@ -262,4 +279,4 @@ sanity: · 30 unmodified lines
262279
263280 # Jobs that need to pass before spending hardware resources on further testing
264281 .required-for-hardware-jobs:
265− needs: []
282+ needs: []
drivers/gpu/drm/ci/igt_runner.sh+8−7
@@ -30,10 +30,10 @@ case "$DRIVER_NAME" in · 29 unmodified lines
3030 export IGT_FORCE_DRIVER="panfrost"
3131 fi
3232 ;;
33− amdgpu)
33+ amdgpu|vkms)
3434 # Cannot use HWCI_KERNEL_MODULES as at that point we don't have the module in /lib
35− mv /install/modules/lib/modules/* /lib/modules/.
36− modprobe amdgpu
35+ mv /install/modules/lib/modules/* /lib/modules/. || true
36+ modprobe --first-time $DRIVER_NAME
3737 ;;
3838 esac
3939
@@ -59,25 +59,26 @@ fi · 19 unmodified lines
5959
6060 curl -L --retry 4 -f --retry-all-errors --retry-delay 60 -s ${FDO_HTTP_CACHE_URI:-}$PIPELINE_ARTIFACTS_BASE/$ARCH/igt.tar.gz | tar --zstd -v -x -C /
6161
62+TESTLIST="/igt/libexec/igt-gpu-tools/ci-testlist.txt"
6263
6364 # If the job is parallel at the gitab job level, take the corresponding fraction
6465 # of the caselist.
6566 if [ -n "$CI_NODE_INDEX" ]; then
66− sed -ni $CI_NODE_INDEX~$CI_NODE_TOTAL"p" /install/testlist.txt
67+ sed -ni $CI_NODE_INDEX~$CI_NODE_TOTAL"p" $TESTLIST
6768 fi
6869
6970 # core_getversion checks if the driver is loaded and probed correctly
7071 # so run it in all shards
71−if ! grep -q "core_getversion" /install/testlist.txt; then
72+if ! grep -q "core_getversion" $TESTLIST; then
7273 # Add the line to the file
73− echo "core_getversion" >> /install/testlist.txt
74+ echo "core_getversion" >> $TESTLIST
7475 fi
7576
7677 set +e
7778 igt-runner \
7879 run \
7980 --igt-folder /igt/libexec/igt-gpu-tools \
80− --caselist /install/testlist.txt \
81+ --caselist $TESTLIST \
8182 --output /results \
8283 $IGT_SKIPS \
8384 $IGT_FLAKES \
drivers/gpu/drm/ci/image-tags.yml+2−2
@@ -1,10 +1,10 @@
11 variables:
2− CONTAINER_TAG: "2023-10-11-mesa-uprev"
2+ CONTAINER_TAG: "2024-05-09-mesa-uprev"
33 DEBIAN_X86_64_BUILD_BASE_IMAGE: "debian/x86_64_build-base"
44 DEBIAN_BASE_TAG: "${CONTAINER_TAG}"
55
66 DEBIAN_X86_64_BUILD_IMAGE_PATH: "debian/x86_64_build"
7− DEBIAN_BUILD_TAG: "2023-10-08-config"
7+ DEBIAN_BUILD_TAG: "2024-06-10-vkms"
88
99 KERNEL_ROOTFS_TAG: "2023-10-06-amd"
1010
drivers/gpu/drm/ci/lava-submit.sh+2−2
@@ -27,7 +27,7 @@ KERNEL_IMAGE_BASE="https://${BASE_SYSTEM_HOST_PATH}" \ · 26 unmodified lines
2727 section_end variables
2828
2929 tar zcf job-rootfs-overlay.tar.gz -C results/job-rootfs-overlay/ .
30−ci-fairy s3cp --token-file "${CI_JOB_JWT_FILE}" job-rootfs-overlay.tar.gz "https://${JOB_ROOTFS_OVERLAY_PATH}"
30+ci-fairy s3cp --token-file "${S3_JWT_FILE}" job-rootfs-overlay.tar.gz "https://${JOB_ROOTFS_OVERLAY_PATH}"
3131
3232 touch results/lava.log
3333 tail -f results/lava.log &
@@ -45,7 +45,7 @@ PYTHONPATH=artifacts/ artifacts/lava/lava_job_submitter.py \ · 11 unmodified lines
4545 --ci-project-dir "${CI_PROJECT_DIR}" \
4646 --device-type "${DEVICE_TYPE}" \
4747 --dtb-filename "${DTB}" \
48− --jwt-file "${CI_JOB_JWT_FILE}" \
48+ --jwt-file "${S3_JWT_FILE}" \
4949 --kernel-image-name "${KERNEL_IMAGE_NAME}" \
5050 --kernel-image-type "${KERNEL_IMAGE_TYPE}" \
5151 --boot-method "${BOOT_METHOD}" \
drivers/gpu/drm/ci/test.yml+33−8
@@ -24,6 +24,7 @@ · 23 unmodified lines
2424 variables:
2525 HWCI_TEST_SCRIPT: "/install/igt_runner.sh"
2626 DEBIAN_ARCH: "armhf"
27+ FARM: collabora
2728 dependencies:
2829 - testing:arm32
2930 needs:
@@ -39,6 +40,7 @@ · 9 unmodified lines
3940 variables:
4041 HWCI_TEST_SCRIPT: "/install/igt_runner.sh"
4142 DEBIAN_ARCH: "arm64"
43+ FARM: collabora
4244 dependencies:
4345 - testing:arm64
4446 needs:
@@ -54,6 +56,7 @@ · 9 unmodified lines
5456 variables:
5557 HWCI_TEST_SCRIPT: "/install/igt_runner.sh"
5658 DEBIAN_ARCH: "amd64"
59+ FARM: collabora
5760 dependencies:
5861 - testing:x86_64
5962 needs:
@@ -74,6 +77,7 @@ · 14 unmodified lines
7477 S3_ARTIFACT_NAME: "arm64/kernel-files"
7578 BM_KERNEL: https://${PIPELINE_ARTIFACTS_BASE}/arm64/Image.gz
7679 BM_CMDLINE: "ip=dhcp console=ttyMSM0,115200n8 $BM_KERNEL_EXTRA_ARGS root=/dev/nfs rw nfsrootdebug nfsroot=,tcp,nfsvers=4.2 init=/init $BM_KERNELARGS"
80+ FARM: google
7781 needs:
7882 - debian/arm64_test
7983 - job: testing:arm64
@@ -116,8 +120,9 @@ msm:apq8016: · 36 unmodified lines
116120 - .baremetal-igt-arm64
117121 stage: msm
118122 variables:
123+ DEVICE_TYPE: apq8016-sbc-usb-host
119124 DRIVER_NAME: msm
120− BM_DTB: https://${PIPELINE_ARTIFACTS_BASE}/arm64/apq8016-sbc-usb-host.dtb
125+ BM_DTB: https://${PIPELINE_ARTIFACTS_BASE}/arm64/${DEVICE_TYPE}.dtb
121126 GPU_VERSION: apq8016
122127 # disabling unused clocks congests with the MDSS runtime PM trying to
123128 # disable those clocks and causes boot to fail.
@@ -132,9 +137,10 @@ msm:apq8096: · 8 unmodified lines
132137 - .baremetal-igt-arm64
133138 stage: msm
134139 variables:
140+ DEVICE_TYPE: apq8096-db820c
135141 DRIVER_NAME: msm
136142 BM_KERNEL_EXTRA_ARGS: maxcpus=2
137− BM_DTB: https://${PIPELINE_ARTIFACTS_BASE}/arm64/apq8096-db820c.dtb
143+ BM_DTB: https://${PIPELINE_ARTIFACTS_BASE}/arm64/${DEVICE_TYPE}.dtb
138144 GPU_VERSION: apq8096
139145 RUNNER_TAG: google-freedreno-db820c
140146 script:
@@ -146,6 +152,7 @@ msm:sdm845: · 5 unmodified lines
146152 stage: msm
147153 parallel: 6
148154 variables:
155+ DEVICE_TYPE: sdm845-cheza-r3
149156 DRIVER_NAME: msm
150157 BM_KERNEL: https://${PIPELINE_ARTIFACTS_BASE}/arm64/cheza-kernel
151158 GPU_VERSION: sdm845
@@ -184,6 +191,7 @@ rockchip:rk3399: · 32 unmodified lines
184191 extends:
185192 - .lava-igt:x86_64
186193 stage: i915
194+ timeout: "1h30m"
187195 variables:
188196 DRIVER_NAME: i915
189197 DTB: ""
@@ -194,7 +202,6 @@ i915:apl: · 4 unmodified lines
194202 extends:
195203 - .i915
196204 parallel: 3
197− timeout: "1h30m"
198205 variables:
199206 DEVICE_TYPE: asus-C523NA-A20057-coral
200207 GPU_VERSION: apl
@@ -204,7 +211,6 @@ i915:glk: · 3 unmodified lines
204211 extends:
205212 - .i915
206213 parallel: 2
207− timeout: "1h30m"
208214 variables:
209215 DEVICE_TYPE: hp-x360-12b-ca0010nr-n4020-octopus
210216 GPU_VERSION: glk
@@ -214,7 +220,6 @@ i915:amly: · 3 unmodified lines
214220 extends:
215221 - .i915
216222 parallel: 2
217− timeout: "1h30m"
218223 variables:
219224 DEVICE_TYPE: asus-C433TA-AJ0005-rammus
220225 GPU_VERSION: amly
@@ -233,7 +238,6 @@ i915:whl: · 12 unmodified lines
233238 extends:
234239 - .i915
235240 parallel: 2
236− timeout: "1h30m"
237241 variables:
238242 DEVICE_TYPE: dell-latitude-5400-8665U-sarien
239243 GPU_VERSION: whl
@@ -243,7 +247,6 @@ i915:cml: · 3 unmodified lines
243247 extends:
244248 - .i915
245249 parallel: 2
246− timeout: "1h30m"
247250 variables:
248251 DEVICE_TYPE: asus-C436FA-Flip-hatch
249252 GPU_VERSION: cml
@@ -335,7 +338,7 @@ meson:g12b: · 85 unmodified lines
335338 RUNNER_TAG: mesa-ci-x86-64-lava-meson-g12b-a311d-khadas-vim3
336339
337340 virtio_gpu:none:
338− stage: virtio-gpu
341+ stage: software-driver
339342 variables:
340343 CROSVM_GALLIUM_DRIVER: llvmpipe
341344 DRIVER_NAME: virtio_gpu
@@ -355,3 +358,25 @@ virtio_gpu:none: · 13 unmodified lines
355358 - debian/x86_64_test-gl
356359 - testing:x86_64
357360 - igt:x86_64
361+
362+vkms:none:
363+ stage: software-driver
364+ variables:
365+ DRIVER_NAME: vkms
366+ GPU_VERSION: none
367+ extends:
368+ - .test-gl
369+ - .test-rules
370+ tags:
371+ - kvm
372+ script:
373+ - ln -sf $CI_PROJECT_DIR/install /install
374+ - mv install/bzImage /lava-files/bzImage
375+ - mkdir -p /lib/modules
376+ - mkdir -p $CI_PROJECT_DIR/results
377+ - ln -sf $CI_PROJECT_DIR/results /results
378+ - ./install/crosvm-runner.sh ./install/igt_runner.sh
379+ needs:
380+ - debian/x86_64_test-gl
381+ - testing:x86_64
382+ - igt:x86_64
drivers/gpu/drm/ci/testlist.txt+0−2761
@@ -1,2761 +0,0 @@
1−core_auth@getclient-simple
2−core_auth@getclient-master-drop
3−core_auth@basic-auth
4−core_auth@many-magics
5−core_getclient
6−core_getstats
7−core_getversion
8−core_setmaster_vs_auth
9−drm_read@invalid-buffer
10−drm_read@fault-buffer
11−drm_read@empty-block
12−drm_read@empty-nonblock
13−drm_read@short-buffer-block
14−drm_read@short-buffer-nonblock
15−drm_read@short-buffer-wakeup
16−gem_eio@throttle
17−gem_eio@create
18−gem_eio@create-ext
19−gem_eio@context-create
20−gem_eio@execbuf
21−gem_eio@banned
22−gem_eio@suspend
23−gem_eio@hibernate
24−gem_eio@in-flight-external
25−gem_eio@in-flight-suspend
26−gem_eio@reset-stress
27−gem_eio@unwedge-stress
28−gem_eio@wait-immediate
29−gem_eio@wait-wedge-immediate
30−gem_eio@in-flight-immediate
31−gem_eio@in-flight-contexts-immediate
32−gem_eio@in-flight-internal-immediate
33−gem_eio@wait-1us
34−gem_eio@wait-wedge-1us
35−gem_eio@in-flight-1us
36−gem_eio@in-flight-contexts-1us
37−gem_eio@in-flight-internal-1us
38−gem_eio@wait-10ms
39−gem_eio@wait-wedge-10ms
40−gem_eio@in-flight-10ms
41−gem_eio@in-flight-contexts-10ms
42−gem_eio@in-flight-internal-10ms
43−gem_eio@kms
44−kms_3d
45−kms_addfb_basic@unused-handle
46−kms_addfb_basic@unused-pitches
47−kms_addfb_basic@unused-offsets
48−kms_addfb_basic@unused-modifier
49−kms_addfb_basic@clobberred-modifier
50−kms_addfb_basic@invalid-smem-bo-on-discrete
51−kms_addfb_basic@legacy-format
52−kms_addfb_basic@no-handle
53−kms_addfb_basic@basic
54−kms_addfb_basic@bad-pitch-0
55−kms_addfb_basic@bad-pitch-32
56−kms_addfb_basic@bad-pitch-63
57−kms_addfb_basic@bad-pitch-128
58−kms_addfb_basic@bad-pitch-256
59−kms_addfb_basic@bad-pitch-1024
60−kms_addfb_basic@bad-pitch-999
61−kms_addfb_basic@bad-pitch-65536
62−kms_addfb_basic@invalid-get-prop-any
63−kms_addfb_basic@invalid-get-prop
64−kms_addfb_basic@invalid-set-prop-any
65−kms_addfb_basic@invalid-set-prop
66−kms_addfb_basic@master-rmfb
67−kms_addfb_basic@addfb25-modifier-no-flag
68−kms_addfb_basic@addfb25-bad-modifier
69−kms_addfb_basic@addfb25-x-tiled-mismatch-legacy
70−kms_addfb_basic@addfb25-x-tiled-legacy
71−kms_addfb_basic@addfb25-framebuffer-vs-set-tiling
72−kms_addfb_basic@basic-x-tiled-legacy
73−kms_addfb_basic@framebuffer-vs-set-tiling
74−kms_addfb_basic@tile-pitch-mismatch
75−kms_addfb_basic@basic-y-tiled-legacy
76−kms_addfb_basic@size-max
77−kms_addfb_basic@too-wide
78−kms_addfb_basic@too-high
79−kms_addfb_basic@bo-too-small
80−kms_addfb_basic@small-bo
81−kms_addfb_basic@bo-too-small-due-to-tiling
82−kms_addfb_basic@addfb25-y-tiled-legacy
83−kms_addfb_basic@addfb25-yf-tiled-legacy
84−kms_addfb_basic@addfb25-y-tiled-small-legacy
85−kms_addfb_basic@addfb25-4-tiled
86−kms_async_flips@async-flip-with-page-flip-events
87−kms_async_flips@alternate-sync-async-flip
88−kms_async_flips@test-time-stamp
89−kms_async_flips@test-cursor
90−kms_async_flips@invalid-async-flip
91−kms_async_flips@crc
92−kms_atomic@plane-overlay-legacy
93−kms_atomic@plane-primary-legacy
94−kms_atomic@plane-primary-overlay-mutable-zpos
95−kms_atomic@plane-immutable-zpos
96−kms_atomic@test-only
97−kms_atomic@plane-cursor-legacy
98−kms_atomic@plane-invalid-params
99−kms_atomic@plane-invalid-params-fence
100−kms_atomic@crtc-invalid-params
101−kms_atomic@crtc-invalid-params-fence
102−kms_atomic@atomic-invalid-params
103−kms_atomic@atomic-plane-damage
104−kms_atomic_interruptible@legacy-setmode
105−kms_atomic_interruptible@atomic-setmode
106−kms_atomic_interruptible@legacy-dpms
107−kms_atomic_interruptible@legacy-pageflip
108−kms_atomic_interruptible@legacy-cursor
109−kms_atomic_interruptible@universal-setplane-primary
110−kms_atomic_interruptible@universal-setplane-cursor
111−kms_atomic_transition@plane-primary-toggle-with-vblank-wait
112−kms_atomic_transition@plane-all-transition
113−kms_atomic_transition@plane-all-transition-fencing
114−kms_atomic_transition@plane-all-transition-nonblocking
115−kms_atomic_transition@plane-all-transition-nonblocking-fencing
116−kms_atomic_transition@plane-use-after-nonblocking-unbind
117−kms_atomic_transition@plane-use-after-nonblocking-unbind-fencing
118−kms_atomic_transition@plane-all-modeset-transition
119−kms_atomic_transition@plane-all-modeset-transition-fencing
120−kms_atomic_transition@plane-all-modeset-transition-internal-panels
121−kms_atomic_transition@plane-all-modeset-transition-fencing-internal-panels
122−kms_atomic_transition@plane-toggle-modeset-transition
123−kms_atomic_transition@modeset-transition
124−kms_atomic_transition@modeset-transition-fencing
125−kms_atomic_transition@modeset-transition-nonblocking
126−kms_atomic_transition@modeset-transition-nonblocking-fencing
127−kms_big_fb@x-tiled-addfb-size-overflow
128−kms_big_fb@y-tiled-addfb-size-overflow
129−kms_big_fb@yf-tiled-addfb-size-overflow
130−kms_big_fb@4-tiled-addfb-size-overflow
131−kms_big_fb@x-tiled-addfb-size-offset-overflow
132−kms_big_fb@y-tiled-addfb-size-offset-overflow
133−kms_big_fb@yf-tiled-addfb-size-offset-overflow
134−kms_big_fb@4-tiled-addfb-size-offset-overflow
135−kms_big_fb@linear-addfb
136−kms_big_fb@x-tiled-addfb
137−kms_big_fb@y-tiled-addfb
138−kms_big_fb@yf-tiled-addfb
139−kms_big_fb@4-tiled-addfb
140−kms_big_fb@linear-8bpp-rotate-0
141−kms_big_fb@linear-8bpp-rotate-90
142−kms_big_fb@linear-8bpp-rotate-180
143−kms_big_fb@linear-8bpp-rotate-270
144−kms_big_fb@linear-16bpp-rotate-0
145−kms_big_fb@linear-16bpp-rotate-90
146−kms_big_fb@linear-16bpp-rotate-180
147−kms_big_fb@linear-16bpp-rotate-270
148−kms_big_fb@linear-32bpp-rotate-0
149−kms_big_fb@linear-32bpp-rotate-90
150−kms_big_fb@linear-32bpp-rotate-180
151−kms_big_fb@linear-32bpp-rotate-270
152−kms_big_fb@linear-64bpp-rotate-0
153−kms_big_fb@linear-64bpp-rotate-90
154−kms_big_fb@linear-64bpp-rotate-180
155−kms_big_fb@linear-64bpp-rotate-270
156−kms_big_fb@x-tiled-8bpp-rotate-0
157−kms_big_fb@x-tiled-8bpp-rotate-90
158−kms_big_fb@x-tiled-8bpp-rotate-180
159−kms_big_fb@x-tiled-8bpp-rotate-270
160−kms_big_fb@x-tiled-16bpp-rotate-0
161−kms_big_fb@x-tiled-16bpp-rotate-90
162−kms_big_fb@x-tiled-16bpp-rotate-180
163−kms_big_fb@x-tiled-16bpp-rotate-270
164−kms_big_fb@x-tiled-32bpp-rotate-0
165−kms_big_fb@x-tiled-32bpp-rotate-90
166−kms_big_fb@x-tiled-32bpp-rotate-180
167−kms_big_fb@x-tiled-32bpp-rotate-270
168−kms_big_fb@x-tiled-64bpp-rotate-0
169−kms_big_fb@x-tiled-64bpp-rotate-90
170−kms_big_fb@x-tiled-64bpp-rotate-180
171−kms_big_fb@x-tiled-64bpp-rotate-270
172−kms_big_fb@y-tiled-8bpp-rotate-0
173−kms_big_fb@y-tiled-8bpp-rotate-90
174−kms_big_fb@y-tiled-8bpp-rotate-180
175−kms_big_fb@y-tiled-8bpp-rotate-270
176−kms_big_fb@y-tiled-16bpp-rotate-0
177−kms_big_fb@y-tiled-16bpp-rotate-90
178−kms_big_fb@y-tiled-16bpp-rotate-180
179−kms_big_fb@y-tiled-16bpp-rotate-270
180−kms_big_fb@y-tiled-32bpp-rotate-0
181−kms_big_fb@y-tiled-32bpp-rotate-90
182−kms_big_fb@y-tiled-32bpp-rotate-180
183−kms_big_fb@y-tiled-32bpp-rotate-270
184−kms_big_fb@y-tiled-64bpp-rotate-0
185−kms_big_fb@y-tiled-64bpp-rotate-90
186−kms_big_fb@y-tiled-64bpp-rotate-180
187−kms_big_fb@y-tiled-64bpp-rotate-270
188−kms_big_fb@yf-tiled-8bpp-rotate-0
189−kms_big_fb@yf-tiled-8bpp-rotate-90
190−kms_big_fb@yf-tiled-8bpp-rotate-180
191−kms_big_fb@yf-tiled-8bpp-rotate-270
192−kms_big_fb@yf-tiled-16bpp-rotate-0
193−kms_big_fb@yf-tiled-16bpp-rotate-90
194−kms_big_fb@yf-tiled-16bpp-rotate-180
195−kms_big_fb@yf-tiled-16bpp-rotate-270
196−kms_big_fb@yf-tiled-32bpp-rotate-0
197−kms_big_fb@yf-tiled-32bpp-rotate-90
198−kms_big_fb@yf-tiled-32bpp-rotate-180
199−kms_big_fb@yf-tiled-32bpp-rotate-270
200−kms_big_fb@yf-tiled-64bpp-rotate-0
201−kms_big_fb@yf-tiled-64bpp-rotate-90
202−kms_big_fb@yf-tiled-64bpp-rotate-180
203−kms_big_fb@yf-tiled-64bpp-rotate-270
204−kms_big_fb@4-tiled-8bpp-rotate-0
205−kms_big_fb@4-tiled-8bpp-rotate-90
206−kms_big_fb@4-tiled-8bpp-rotate-180
207−kms_big_fb@4-tiled-8bpp-rotate-270
208−kms_big_fb@4-tiled-16bpp-rotate-0
209−kms_big_fb@4-tiled-16bpp-rotate-90
210−kms_big_fb@4-tiled-16bpp-rotate-180
211−kms_big_fb@4-tiled-16bpp-rotate-270
212−kms_big_fb@4-tiled-32bpp-rotate-0
213−kms_big_fb@4-tiled-32bpp-rotate-90
214−kms_big_fb@4-tiled-32bpp-rotate-180
215−kms_big_fb@4-tiled-32bpp-rotate-270
216−kms_big_fb@4-tiled-64bpp-rotate-0
217−kms_big_fb@4-tiled-64bpp-rotate-90
218−kms_big_fb@4-tiled-64bpp-rotate-180
219−kms_big_fb@4-tiled-64bpp-rotate-270
220−kms_big_fb@linear-max-hw-stride-32bpp-rotate-0
221−kms_big_fb@linear-max-hw-stride-32bpp-rotate-180
222−kms_big_fb@linear-max-hw-stride-64bpp-rotate-0
223−kms_big_fb@linear-max-hw-stride-64bpp-rotate-180
224−kms_big_fb@x-tiled-max-hw-stride-32bpp-rotate-0
225−kms_big_fb@x-tiled-max-hw-stride-32bpp-rotate-0-async-flip
226−kms_big_fb@x-tiled-max-hw-stride-32bpp-rotate-180
227−kms_big_fb@x-tiled-max-hw-stride-32bpp-rotate-180-async-flip
228−kms_big_fb@x-tiled-max-hw-stride-64bpp-rotate-0
229−kms_big_fb@x-tiled-max-hw-stride-64bpp-rotate-0-async-flip
230−kms_big_fb@x-tiled-max-hw-stride-64bpp-rotate-180
231−kms_big_fb@x-tiled-max-hw-stride-64bpp-rotate-180-async-flip
232−kms_big_fb@x-tiled-max-hw-stride-32bpp-rotate-0-hflip
233−kms_big_fb@x-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip
234−kms_big_fb@x-tiled-max-hw-stride-32bpp-rotate-180-hflip
235−kms_big_fb@x-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip
236−kms_big_fb@x-tiled-max-hw-stride-64bpp-rotate-0-hflip
237−kms_big_fb@x-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip
238−kms_big_fb@x-tiled-max-hw-stride-64bpp-rotate-180-hflip
239−kms_big_fb@x-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip
240−kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0
241−kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0-async-flip
242−kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-180
243−kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-180-async-flip
244−kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0
245−kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-async-flip
246−kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-180
247−kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-180-async-flip
248−kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0-hflip
249−kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip
250−kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-180-hflip
251−kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip
252−kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-hflip
253−kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip
254−kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-180-hflip
255−kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip
256−kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0
257−kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0-async-flip
258−kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-180
259−kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-180-async-flip
260−kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-0
261−kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-0-async-flip
262−kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180
263−kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180-async-flip
264−kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0-hflip
265−kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip
266−kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-180-hflip
267−kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip
268−kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-0-hflip
269−kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip
270−kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180-hflip
271−kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip
272−kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-0
273−kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-0-async-flip
274−kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-180
275−kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-180-async-flip
276−kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-0
277−kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-0-async-flip
278−kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180
279−kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-async-flip
280−kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-0-hflip
281−kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip
282−kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-180-hflip
283−kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip
284−kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-0-hflip
285−kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip
286−kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-hflip
287−kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip
288−kms_big_joiner@basic
289−kms_big_joiner@invalid-modeset
290−kms_big_joiner@2x-modeset
291−kms_busy@basic
292−kms_busy@basic-hang
293−kms_busy@extended-pageflip-modeset-hang-oldfb
294−kms_busy@extended-pageflip-hang-oldfb
295−kms_busy@extended-pageflip-hang-newfb
296−kms_busy@extended-modeset-hang-oldfb
297−kms_busy@extended-modeset-hang-newfb
298−kms_busy@extended-modeset-hang-oldfb-with-reset
299−kms_busy@extended-modeset-hang-newfb-with-reset
300−kms_bw@linear-tiling-1-displays-1920x1080p
301−kms_bw@linear-tiling-1-displays-2560x1440p
302−kms_bw@linear-tiling-1-displays-3840x2160p
303−kms_bw@linear-tiling-2-displays-1920x1080p
304−kms_bw@linear-tiling-2-displays-2560x1440p
305−kms_bw@linear-tiling-2-displays-3840x2160p
306−kms_bw@linear-tiling-3-displays-1920x1080p
307−kms_bw@linear-tiling-3-displays-2560x1440p
308−kms_bw@linear-tiling-3-displays-3840x2160p
309−kms_bw@linear-tiling-4-displays-1920x1080p
310−kms_bw@linear-tiling-4-displays-2560x1440p
311−kms_bw@linear-tiling-4-displays-3840x2160p
312−kms_bw@linear-tiling-5-displays-1920x1080p
313−kms_bw@linear-tiling-5-displays-2560x1440p
314−kms_bw@linear-tiling-5-displays-3840x2160p
315−kms_bw@linear-tiling-6-displays-1920x1080p
316−kms_bw@linear-tiling-6-displays-2560x1440p
317−kms_bw@linear-tiling-6-displays-3840x2160p
318−kms_bw@linear-tiling-7-displays-1920x1080p
319−kms_bw@linear-tiling-7-displays-2560x1440p
320−kms_bw@linear-tiling-7-displays-3840x2160p
321−kms_bw@linear-tiling-8-displays-1920x1080p
322−kms_bw@linear-tiling-8-displays-2560x1440p
323−kms_bw@linear-tiling-8-displays-3840x2160p
324−kms_ccs@pipe-A-bad-pixel-format-y-tiled-ccs
325−kms_ccs@pipe-A-bad-pixel-format-yf-tiled-ccs
326−kms_ccs@pipe-A-bad-pixel-format-y-tiled-gen12-rc-ccs
327−kms_ccs@pipe-A-bad-pixel-format-y-tiled-gen12-rc-ccs-cc
328−kms_ccs@pipe-A-bad-pixel-format-y-tiled-gen12-mc-ccs
329−kms_ccs@pipe-A-bad-pixel-format-4-tiled-dg2-rc-ccs
330−kms_ccs@pipe-A-bad-pixel-format-4-tiled-dg2-mc-ccs
331−kms_ccs@pipe-A-bad-pixel-format-4-tiled-dg2-rc-ccs-cc
332−kms_ccs@pipe-A-bad-pixel-format-4-tiled-mtl-rc-ccs
333−kms_ccs@pipe-A-bad-pixel-format-4-tiled-mtl-mc-ccs
334−kms_ccs@pipe-A-bad-pixel-format-4-tiled-mtl-rc-ccs-cc
335−kms_ccs@pipe-A-bad-rotation-90-y-tiled-ccs
336−kms_ccs@pipe-A-bad-rotation-90-yf-tiled-ccs
337−kms_ccs@pipe-A-bad-rotation-90-y-tiled-gen12-rc-ccs
338−kms_ccs@pipe-A-bad-rotation-90-y-tiled-gen12-rc-ccs-cc
339−kms_ccs@pipe-A-bad-rotation-90-y-tiled-gen12-mc-ccs
340−kms_ccs@pipe-A-bad-rotation-90-4-tiled-dg2-rc-ccs
341−kms_ccs@pipe-A-bad-rotation-90-4-tiled-dg2-mc-ccs
342−kms_ccs@pipe-A-bad-rotation-90-4-tiled-dg2-rc-ccs-cc
343−kms_ccs@pipe-A-bad-rotation-90-4-tiled-mtl-rc-ccs
344−kms_ccs@pipe-A-bad-rotation-90-4-tiled-mtl-mc-ccs
345−kms_ccs@pipe-A-bad-rotation-90-4-tiled-mtl-rc-ccs-cc
346−kms_ccs@pipe-A-crc-primary-basic-y-tiled-ccs
347−kms_ccs@pipe-A-crc-primary-basic-yf-tiled-ccs
348−kms_ccs@pipe-A-crc-primary-basic-y-tiled-gen12-rc-ccs
349−kms_ccs@pipe-A-crc-primary-basic-y-tiled-gen12-rc-ccs-cc
350−kms_ccs@pipe-A-crc-primary-basic-y-tiled-gen12-mc-ccs
351−kms_ccs@pipe-A-crc-primary-basic-4-tiled-dg2-rc-ccs
352−kms_ccs@pipe-A-crc-primary-basic-4-tiled-dg2-mc-ccs
353−kms_ccs@pipe-A-crc-primary-basic-4-tiled-dg2-rc-ccs-cc
354−kms_ccs@pipe-A-crc-primary-basic-4-tiled-mtl-rc-ccs
355−kms_ccs@pipe-A-crc-primary-basic-4-tiled-mtl-mc-ccs
356−kms_ccs@pipe-A-crc-primary-basic-4-tiled-mtl-rc-ccs-cc
357−kms_ccs@pipe-A-crc-primary-rotation-180-y-tiled-ccs
358−kms_ccs@pipe-A-crc-primary-rotation-180-yf-tiled-ccs
359−kms_ccs@pipe-A-crc-primary-rotation-180-y-tiled-gen12-rc-ccs
360−kms_ccs@pipe-A-crc-primary-rotation-180-y-tiled-gen12-rc-ccs-cc
361−kms_ccs@pipe-A-crc-primary-rotation-180-y-tiled-gen12-mc-ccs
362−kms_ccs@pipe-A-crc-primary-rotation-180-4-tiled-dg2-rc-ccs
363−kms_ccs@pipe-A-crc-primary-rotation-180-4-tiled-dg2-mc-ccs
364−kms_ccs@pipe-A-crc-primary-rotation-180-4-tiled-dg2-rc-ccs-cc
365−kms_ccs@pipe-A-crc-primary-rotation-180-4-tiled-mtl-rc-ccs
366−kms_ccs@pipe-A-crc-primary-rotation-180-4-tiled-mtl-mc-ccs
367−kms_ccs@pipe-A-crc-primary-rotation-180-4-tiled-mtl-rc-ccs-cc
368−kms_ccs@pipe-A-random-ccs-data-y-tiled-ccs
369−kms_ccs@pipe-A-random-ccs-data-yf-tiled-ccs
370−kms_ccs@pipe-A-random-ccs-data-y-tiled-gen12-rc-ccs
371−kms_ccs@pipe-A-random-ccs-data-y-tiled-gen12-rc-ccs-cc
372−kms_ccs@pipe-A-random-ccs-data-y-tiled-gen12-mc-ccs
373−kms_ccs@pipe-A-random-ccs-data-4-tiled-dg2-rc-ccs
374−kms_ccs@pipe-A-random-ccs-data-4-tiled-dg2-mc-ccs
375−kms_ccs@pipe-A-random-ccs-data-4-tiled-dg2-rc-ccs-cc
376−kms_ccs@pipe-A-random-ccs-data-4-tiled-mtl-rc-ccs
377−kms_ccs@pipe-A-random-ccs-data-4-tiled-mtl-mc-ccs
378−kms_ccs@pipe-A-random-ccs-data-4-tiled-mtl-rc-ccs-cc
379−kms_ccs@pipe-A-missing-ccs-buffer-y-tiled-ccs
380−kms_ccs@pipe-A-missing-ccs-buffer-yf-tiled-ccs
381−kms_ccs@pipe-A-missing-ccs-buffer-y-tiled-gen12-rc-ccs
382−kms_ccs@pipe-A-missing-ccs-buffer-y-tiled-gen12-rc-ccs-cc
383−kms_ccs@pipe-A-missing-ccs-buffer-y-tiled-gen12-mc-ccs
384−kms_ccs@pipe-A-missing-ccs-buffer-4-tiled-mtl-rc-ccs
385−kms_ccs@pipe-A-missing-ccs-buffer-4-tiled-mtl-mc-ccs
386−kms_ccs@pipe-A-missing-ccs-buffer-4-tiled-mtl-rc-ccs-cc
387−kms_ccs@pipe-A-ccs-on-another-bo-y-tiled-ccs
388−kms_ccs@pipe-A-ccs-on-another-bo-yf-tiled-ccs
389−kms_ccs@pipe-A-ccs-on-another-bo-y-tiled-gen12-rc-ccs
390−kms_ccs@pipe-A-ccs-on-another-bo-y-tiled-gen12-rc-ccs-cc
391−kms_ccs@pipe-A-ccs-on-another-bo-y-tiled-gen12-mc-ccs
392−kms_ccs@pipe-A-ccs-on-another-bo-4-tiled-mtl-rc-ccs
393−kms_ccs@pipe-A-ccs-on-another-bo-4-tiled-mtl-mc-ccs
394−kms_ccs@pipe-A-ccs-on-another-bo-4-tiled-mtl-rc-ccs-cc
395−kms_ccs@pipe-A-bad-aux-stride-y-tiled-ccs
396−kms_ccs@pipe-A-bad-aux-stride-yf-tiled-ccs
397−kms_ccs@pipe-A-bad-aux-stride-y-tiled-gen12-rc-ccs
398−kms_ccs@pipe-A-bad-aux-stride-y-tiled-gen12-rc-ccs-cc
399−kms_ccs@pipe-A-bad-aux-stride-y-tiled-gen12-mc-ccs
400−kms_ccs@pipe-A-bad-aux-stride-4-tiled-mtl-rc-ccs
401−kms_ccs@pipe-A-bad-aux-stride-4-tiled-mtl-mc-ccs
402−kms_ccs@pipe-A-bad-aux-stride-4-tiled-mtl-rc-ccs-cc
403−kms_ccs@pipe-A-crc-sprite-planes-basic-y-tiled-ccs
404−kms_ccs@pipe-A-crc-sprite-planes-basic-yf-tiled-ccs
405−kms_ccs@pipe-A-crc-sprite-planes-basic-y-tiled-gen12-rc-ccs
406−kms_ccs@pipe-A-crc-sprite-planes-basic-y-tiled-gen12-rc-ccs-cc
407−kms_ccs@pipe-A-crc-sprite-planes-basic-y-tiled-gen12-mc-ccs
408−kms_ccs@pipe-A-crc-sprite-planes-basic-4-tiled-dg2-rc-ccs
409−kms_ccs@pipe-A-crc-sprite-planes-basic-4-tiled-dg2-mc-ccs
410−kms_ccs@pipe-A-crc-sprite-planes-basic-4-tiled-dg2-rc-ccs-cc
411−kms_ccs@pipe-A-crc-sprite-planes-basic-4-tiled-mtl-rc-ccs
412−kms_ccs@pipe-A-crc-sprite-planes-basic-4-tiled-mtl-mc-ccs
413−kms_ccs@pipe-A-crc-sprite-planes-basic-4-tiled-mtl-rc-ccs-cc
414−kms_ccs@pipe-B-bad-pixel-format-y-tiled-ccs
415−kms_ccs@pipe-B-bad-pixel-format-yf-tiled-ccs
416−kms_ccs@pipe-B-bad-pixel-format-y-tiled-gen12-rc-ccs
417−kms_ccs@pipe-B-bad-pixel-format-y-tiled-gen12-rc-ccs-cc
418−kms_ccs@pipe-B-bad-pixel-format-y-tiled-gen12-mc-ccs
419−kms_ccs@pipe-B-bad-pixel-format-4-tiled-dg2-rc-ccs
420−kms_ccs@pipe-B-bad-pixel-format-4-tiled-dg2-mc-ccs
421−kms_ccs@pipe-B-bad-pixel-format-4-tiled-dg2-rc-ccs-cc
422−kms_ccs@pipe-B-bad-pixel-format-4-tiled-mtl-rc-ccs
423−kms_ccs@pipe-B-bad-pixel-format-4-tiled-mtl-mc-ccs
424−kms_ccs@pipe-B-bad-pixel-format-4-tiled-mtl-rc-ccs-cc
425−kms_ccs@pipe-B-bad-rotation-90-y-tiled-ccs
426−kms_ccs@pipe-B-bad-rotation-90-yf-tiled-ccs
427−kms_ccs@pipe-B-bad-rotation-90-y-tiled-gen12-rc-ccs
428−kms_ccs@pipe-B-bad-rotation-90-y-tiled-gen12-rc-ccs-cc
429−kms_ccs@pipe-B-bad-rotation-90-y-tiled-gen12-mc-ccs
430−kms_ccs@pipe-B-bad-rotation-90-4-tiled-dg2-rc-ccs
431−kms_ccs@pipe-B-bad-rotation-90-4-tiled-dg2-mc-ccs
432−kms_ccs@pipe-B-bad-rotation-90-4-tiled-dg2-rc-ccs-cc
433−kms_ccs@pipe-B-bad-rotation-90-4-tiled-mtl-rc-ccs
434−kms_ccs@pipe-B-bad-rotation-90-4-tiled-mtl-mc-ccs
435−kms_ccs@pipe-B-bad-rotation-90-4-tiled-mtl-rc-ccs-cc
436−kms_ccs@pipe-B-crc-primary-basic-y-tiled-ccs
437−kms_ccs@pipe-B-crc-primary-basic-yf-tiled-ccs
438−kms_ccs@pipe-B-crc-primary-basic-y-tiled-gen12-rc-ccs
439−kms_ccs@pipe-B-crc-primary-basic-y-tiled-gen12-rc-ccs-cc
440−kms_ccs@pipe-B-crc-primary-basic-y-tiled-gen12-mc-ccs
441−kms_ccs@pipe-B-crc-primary-basic-4-tiled-dg2-rc-ccs
442−kms_ccs@pipe-B-crc-primary-basic-4-tiled-dg2-mc-ccs
443−kms_ccs@pipe-B-crc-primary-basic-4-tiled-dg2-rc-ccs-cc
444−kms_ccs@pipe-B-crc-primary-basic-4-tiled-mtl-rc-ccs
445−kms_ccs@pipe-B-crc-primary-basic-4-tiled-mtl-mc-ccs
446−kms_ccs@pipe-B-crc-primary-basic-4-tiled-mtl-rc-ccs-cc
447−kms_ccs@pipe-B-crc-primary-rotation-180-y-tiled-ccs
448−kms_ccs@pipe-B-crc-primary-rotation-180-yf-tiled-ccs
449−kms_ccs@pipe-B-crc-primary-rotation-180-y-tiled-gen12-rc-ccs
450−kms_ccs@pipe-B-crc-primary-rotation-180-y-tiled-gen12-rc-ccs-cc
451−kms_ccs@pipe-B-crc-primary-rotation-180-y-tiled-gen12-mc-ccs
452−kms_ccs@pipe-B-crc-primary-rotation-180-4-tiled-dg2-rc-ccs
453−kms_ccs@pipe-B-crc-primary-rotation-180-4-tiled-dg2-mc-ccs
454−kms_ccs@pipe-B-crc-primary-rotation-180-4-tiled-dg2-rc-ccs-cc
455−kms_ccs@pipe-B-crc-primary-rotation-180-4-tiled-mtl-rc-ccs
456−kms_ccs@pipe-B-crc-primary-rotation-180-4-tiled-mtl-mc-ccs
457−kms_ccs@pipe-B-crc-primary-rotation-180-4-tiled-mtl-rc-ccs-cc
458−kms_ccs@pipe-B-random-ccs-data-y-tiled-ccs
459−kms_ccs@pipe-B-random-ccs-data-yf-tiled-ccs
460−kms_ccs@pipe-B-random-ccs-data-y-tiled-gen12-rc-ccs
461−kms_ccs@pipe-B-random-ccs-data-y-tiled-gen12-rc-ccs-cc
462−kms_ccs@pipe-B-random-ccs-data-y-tiled-gen12-mc-ccs
463−kms_ccs@pipe-B-random-ccs-data-4-tiled-dg2-rc-ccs
464−kms_ccs@pipe-B-random-ccs-data-4-tiled-dg2-mc-ccs
465−kms_ccs@pipe-B-random-ccs-data-4-tiled-dg2-rc-ccs-cc
466−kms_ccs@pipe-B-random-ccs-data-4-tiled-mtl-rc-ccs
467−kms_ccs@pipe-B-random-ccs-data-4-tiled-mtl-mc-ccs
468−kms_ccs@pipe-B-random-ccs-data-4-tiled-mtl-rc-ccs-cc
469−kms_ccs@pipe-B-missing-ccs-buffer-y-tiled-ccs
470−kms_ccs@pipe-B-missing-ccs-buffer-yf-tiled-ccs
471−kms_ccs@pipe-B-missing-ccs-buffer-y-tiled-gen12-rc-ccs
472−kms_ccs@pipe-B-missing-ccs-buffer-y-tiled-gen12-rc-ccs-cc
473−kms_ccs@pipe-B-missing-ccs-buffer-y-tiled-gen12-mc-ccs
474−kms_ccs@pipe-B-missing-ccs-buffer-4-tiled-mtl-rc-ccs
475−kms_ccs@pipe-B-missing-ccs-buffer-4-tiled-mtl-mc-ccs
476−kms_ccs@pipe-B-missing-ccs-buffer-4-tiled-mtl-rc-ccs-cc
477−kms_ccs@pipe-B-ccs-on-another-bo-y-tiled-ccs
478−kms_ccs@pipe-B-ccs-on-another-bo-yf-tiled-ccs
479−kms_ccs@pipe-B-ccs-on-another-bo-y-tiled-gen12-rc-ccs
480−kms_ccs@pipe-B-ccs-on-another-bo-y-tiled-gen12-rc-ccs-cc
481−kms_ccs@pipe-B-ccs-on-another-bo-y-tiled-gen12-mc-ccs
482−kms_ccs@pipe-B-ccs-on-another-bo-4-tiled-mtl-rc-ccs
483−kms_ccs@pipe-B-ccs-on-another-bo-4-tiled-mtl-mc-ccs
484−kms_ccs@pipe-B-ccs-on-another-bo-4-tiled-mtl-rc-ccs-cc
485−kms_ccs@pipe-B-bad-aux-stride-y-tiled-ccs
486−kms_ccs@pipe-B-bad-aux-stride-yf-tiled-ccs
487−kms_ccs@pipe-B-bad-aux-stride-y-tiled-gen12-rc-ccs
488−kms_ccs@pipe-B-bad-aux-stride-y-tiled-gen12-rc-ccs-cc
489−kms_ccs@pipe-B-bad-aux-stride-y-tiled-gen12-mc-ccs
490−kms_ccs@pipe-B-bad-aux-stride-4-tiled-mtl-rc-ccs
491−kms_ccs@pipe-B-bad-aux-stride-4-tiled-mtl-mc-ccs
492−kms_ccs@pipe-B-bad-aux-stride-4-tiled-mtl-rc-ccs-cc
493−kms_ccs@pipe-B-crc-sprite-planes-basic-y-tiled-ccs
494−kms_ccs@pipe-B-crc-sprite-planes-basic-yf-tiled-ccs
495−kms_ccs@pipe-B-crc-sprite-planes-basic-y-tiled-gen12-rc-ccs
496−kms_ccs@pipe-B-crc-sprite-planes-basic-y-tiled-gen12-rc-ccs-cc
497−kms_ccs@pipe-B-crc-sprite-planes-basic-y-tiled-gen12-mc-ccs
498−kms_ccs@pipe-B-crc-sprite-planes-basic-4-tiled-dg2-rc-ccs
499−kms_ccs@pipe-B-crc-sprite-planes-basic-4-tiled-dg2-mc-ccs
500−kms_ccs@pipe-B-crc-sprite-planes-basic-4-tiled-dg2-rc-ccs-cc
501−kms_ccs@pipe-B-crc-sprite-planes-basic-4-tiled-mtl-rc-ccs
502−kms_ccs@pipe-B-crc-sprite-planes-basic-4-tiled-mtl-mc-ccs
503−kms_ccs@pipe-B-crc-sprite-planes-basic-4-tiled-mtl-rc-ccs-cc
504−kms_ccs@pipe-C-bad-pixel-format-y-tiled-ccs
505−kms_ccs@pipe-C-bad-pixel-format-yf-tiled-ccs
506−kms_ccs@pipe-C-bad-pixel-format-y-tiled-gen12-rc-ccs
507−kms_ccs@pipe-C-bad-pixel-format-y-tiled-gen12-rc-ccs-cc
508−kms_ccs@pipe-C-bad-pixel-format-y-tiled-gen12-mc-ccs
509−kms_ccs@pipe-C-bad-pixel-format-4-tiled-dg2-rc-ccs
510−kms_ccs@pipe-C-bad-pixel-format-4-tiled-dg2-mc-ccs
511−kms_ccs@pipe-C-bad-pixel-format-4-tiled-dg2-rc-ccs-cc
512−kms_ccs@pipe-C-bad-pixel-format-4-tiled-mtl-rc-ccs
513−kms_ccs@pipe-C-bad-pixel-format-4-tiled-mtl-mc-ccs
514−kms_ccs@pipe-C-bad-pixel-format-4-tiled-mtl-rc-ccs-cc
515−kms_ccs@pipe-C-bad-rotation-90-y-tiled-ccs
516−kms_ccs@pipe-C-bad-rotation-90-yf-tiled-ccs
517−kms_ccs@pipe-C-bad-rotation-90-y-tiled-gen12-rc-ccs
518−kms_ccs@pipe-C-bad-rotation-90-y-tiled-gen12-rc-ccs-cc
519−kms_ccs@pipe-C-bad-rotation-90-y-tiled-gen12-mc-ccs
520−kms_ccs@pipe-C-bad-rotation-90-4-tiled-dg2-rc-ccs
521−kms_ccs@pipe-C-bad-rotation-90-4-tiled-dg2-mc-ccs
522−kms_ccs@pipe-C-bad-rotation-90-4-tiled-dg2-rc-ccs-cc
523−kms_ccs@pipe-C-bad-rotation-90-4-tiled-mtl-rc-ccs
524−kms_ccs@pipe-C-bad-rotation-90-4-tiled-mtl-mc-ccs
525−kms_ccs@pipe-C-bad-rotation-90-4-tiled-mtl-rc-ccs-cc
526−kms_ccs@pipe-C-crc-primary-basic-y-tiled-ccs
527−kms_ccs@pipe-C-crc-primary-basic-yf-tiled-ccs
528−kms_ccs@pipe-C-crc-primary-basic-y-tiled-gen12-rc-ccs
529−kms_ccs@pipe-C-crc-primary-basic-y-tiled-gen12-rc-ccs-cc
530−kms_ccs@pipe-C-crc-primary-basic-y-tiled-gen12-mc-ccs
531−kms_ccs@pipe-C-crc-primary-basic-4-tiled-dg2-rc-ccs
532−kms_ccs@pipe-C-crc-primary-basic-4-tiled-dg2-mc-ccs
533−kms_ccs@pipe-C-crc-primary-basic-4-tiled-dg2-rc-ccs-cc
534−kms_ccs@pipe-C-crc-primary-basic-4-tiled-mtl-rc-ccs
535−kms_ccs@pipe-C-crc-primary-basic-4-tiled-mtl-mc-ccs
536−kms_ccs@pipe-C-crc-primary-basic-4-tiled-mtl-rc-ccs-cc
537−kms_ccs@pipe-C-crc-primary-rotation-180-y-tiled-ccs
538−kms_ccs@pipe-C-crc-primary-rotation-180-yf-tiled-ccs
539−kms_ccs@pipe-C-crc-primary-rotation-180-y-tiled-gen12-rc-ccs
540−kms_ccs@pipe-C-crc-primary-rotation-180-y-tiled-gen12-rc-ccs-cc
541−kms_ccs@pipe-C-crc-primary-rotation-180-y-tiled-gen12-mc-ccs
542−kms_ccs@pipe-C-crc-primary-rotation-180-4-tiled-dg2-rc-ccs
543−kms_ccs@pipe-C-crc-primary-rotation-180-4-tiled-dg2-mc-ccs
544−kms_ccs@pipe-C-crc-primary-rotation-180-4-tiled-dg2-rc-ccs-cc
545−kms_ccs@pipe-C-crc-primary-rotation-180-4-tiled-mtl-rc-ccs
546−kms_ccs@pipe-C-crc-primary-rotation-180-4-tiled-mtl-mc-ccs
547−kms_ccs@pipe-C-crc-primary-rotation-180-4-tiled-mtl-rc-ccs-cc
548−kms_ccs@pipe-C-random-ccs-data-y-tiled-ccs
549−kms_ccs@pipe-C-random-ccs-data-yf-tiled-ccs
550−kms_ccs@pipe-C-random-ccs-data-y-tiled-gen12-rc-ccs
551−kms_ccs@pipe-C-random-ccs-data-y-tiled-gen12-rc-ccs-cc
552−kms_ccs@pipe-C-random-ccs-data-y-tiled-gen12-mc-ccs
553−kms_ccs@pipe-C-random-ccs-data-4-tiled-dg2-rc-ccs
554−kms_ccs@pipe-C-random-ccs-data-4-tiled-dg2-mc-ccs
555−kms_ccs@pipe-C-random-ccs-data-4-tiled-dg2-rc-ccs-cc
556−kms_ccs@pipe-C-random-ccs-data-4-tiled-mtl-rc-ccs
557−kms_ccs@pipe-C-random-ccs-data-4-tiled-mtl-mc-ccs
558−kms_ccs@pipe-C-random-ccs-data-4-tiled-mtl-rc-ccs-cc
559−kms_ccs@pipe-C-missing-ccs-buffer-y-tiled-ccs
560−kms_ccs@pipe-C-missing-ccs-buffer-yf-tiled-ccs
561−kms_ccs@pipe-C-missing-ccs-buffer-y-tiled-gen12-rc-ccs
562−kms_ccs@pipe-C-missing-ccs-buffer-y-tiled-gen12-rc-ccs-cc
563−kms_ccs@pipe-C-missing-ccs-buffer-y-tiled-gen12-mc-ccs
564−kms_ccs@pipe-C-missing-ccs-buffer-4-tiled-mtl-rc-ccs
565−kms_ccs@pipe-C-missing-ccs-buffer-4-tiled-mtl-mc-ccs
566−kms_ccs@pipe-C-missing-ccs-buffer-4-tiled-mtl-rc-ccs-cc
567−kms_ccs@pipe-C-ccs-on-another-bo-y-tiled-ccs
568−kms_ccs@pipe-C-ccs-on-another-bo-yf-tiled-ccs
569−kms_ccs@pipe-C-ccs-on-another-bo-y-tiled-gen12-rc-ccs
570−kms_ccs@pipe-C-ccs-on-another-bo-y-tiled-gen12-rc-ccs-cc
571−kms_ccs@pipe-C-ccs-on-another-bo-y-tiled-gen12-mc-ccs
572−kms_ccs@pipe-C-ccs-on-another-bo-4-tiled-mtl-rc-ccs
573−kms_ccs@pipe-C-ccs-on-another-bo-4-tiled-mtl-mc-ccs
574−kms_ccs@pipe-C-ccs-on-another-bo-4-tiled-mtl-rc-ccs-cc
575−kms_ccs@pipe-C-bad-aux-stride-y-tiled-ccs
576−kms_ccs@pipe-C-bad-aux-stride-yf-tiled-ccs
577−kms_ccs@pipe-C-bad-aux-stride-y-tiled-gen12-rc-ccs
578−kms_ccs@pipe-C-bad-aux-stride-y-tiled-gen12-rc-ccs-cc
579−kms_ccs@pipe-C-bad-aux-stride-y-tiled-gen12-mc-ccs
580−kms_ccs@pipe-C-bad-aux-stride-4-tiled-mtl-rc-ccs
581−kms_ccs@pipe-C-bad-aux-stride-4-tiled-mtl-mc-ccs
582−kms_ccs@pipe-C-bad-aux-stride-4-tiled-mtl-rc-ccs-cc
583−kms_ccs@pipe-C-crc-sprite-planes-basic-y-tiled-ccs
584−kms_ccs@pipe-C-crc-sprite-planes-basic-yf-tiled-ccs
585−kms_ccs@pipe-C-crc-sprite-planes-basic-y-tiled-gen12-rc-ccs
586−kms_ccs@pipe-C-crc-sprite-planes-basic-y-tiled-gen12-rc-ccs-cc
587−kms_ccs@pipe-C-crc-sprite-planes-basic-y-tiled-gen12-mc-ccs
588−kms_ccs@pipe-C-crc-sprite-planes-basic-4-tiled-dg2-rc-ccs
589−kms_ccs@pipe-C-crc-sprite-planes-basic-4-tiled-dg2-mc-ccs
590−kms_ccs@pipe-C-crc-sprite-planes-basic-4-tiled-dg2-rc-ccs-cc
591−kms_ccs@pipe-C-crc-sprite-planes-basic-4-tiled-mtl-rc-ccs
592−kms_ccs@pipe-C-crc-sprite-planes-basic-4-tiled-mtl-mc-ccs
593−kms_ccs@pipe-C-crc-sprite-planes-basic-4-tiled-mtl-rc-ccs-cc
594−kms_ccs@pipe-D-bad-pixel-format-y-tiled-ccs
595−kms_ccs@pipe-D-bad-pixel-format-yf-tiled-ccs
596−kms_ccs@pipe-D-bad-pixel-format-y-tiled-gen12-rc-ccs
597−kms_ccs@pipe-D-bad-pixel-format-y-tiled-gen12-rc-ccs-cc
598−kms_ccs@pipe-D-bad-pixel-format-y-tiled-gen12-mc-ccs
599−kms_ccs@pipe-D-bad-pixel-format-4-tiled-dg2-rc-ccs
600−kms_ccs@pipe-D-bad-pixel-format-4-tiled-dg2-mc-ccs
601−kms_ccs@pipe-D-bad-pixel-format-4-tiled-dg2-rc-ccs-cc
602−kms_ccs@pipe-D-bad-pixel-format-4-tiled-mtl-rc-ccs
603−kms_ccs@pipe-D-bad-pixel-format-4-tiled-mtl-mc-ccs
604−kms_ccs@pipe-D-bad-pixel-format-4-tiled-mtl-rc-ccs-cc
605−kms_ccs@pipe-D-bad-rotation-90-y-tiled-ccs
606−kms_ccs@pipe-D-bad-rotation-90-yf-tiled-ccs
607−kms_ccs@pipe-D-bad-rotation-90-y-tiled-gen12-rc-ccs
608−kms_ccs@pipe-D-bad-rotation-90-y-tiled-gen12-rc-ccs-cc
609−kms_ccs@pipe-D-bad-rotation-90-y-tiled-gen12-mc-ccs
610−kms_ccs@pipe-D-bad-rotation-90-4-tiled-dg2-rc-ccs
611−kms_ccs@pipe-D-bad-rotation-90-4-tiled-dg2-mc-ccs
612−kms_ccs@pipe-D-bad-rotation-90-4-tiled-dg2-rc-ccs-cc
613−kms_ccs@pipe-D-bad-rotation-90-4-tiled-mtl-rc-ccs
614−kms_ccs@pipe-D-bad-rotation-90-4-tiled-mtl-mc-ccs
615−kms_ccs@pipe-D-bad-rotation-90-4-tiled-mtl-rc-ccs-cc
616−kms_ccs@pipe-D-crc-primary-basic-y-tiled-ccs
617−kms_ccs@pipe-D-crc-primary-basic-yf-tiled-ccs
618−kms_ccs@pipe-D-crc-primary-basic-y-tiled-gen12-rc-ccs
619−kms_ccs@pipe-D-crc-primary-basic-y-tiled-gen12-rc-ccs-cc
620−kms_ccs@pipe-D-crc-primary-basic-y-tiled-gen12-mc-ccs
621−kms_ccs@pipe-D-crc-primary-basic-4-tiled-dg2-rc-ccs
622−kms_ccs@pipe-D-crc-primary-basic-4-tiled-dg2-mc-ccs
623−kms_ccs@pipe-D-crc-primary-basic-4-tiled-dg2-rc-ccs-cc
624−kms_ccs@pipe-D-crc-primary-basic-4-tiled-mtl-rc-ccs
625−kms_ccs@pipe-D-crc-primary-basic-4-tiled-mtl-mc-ccs
626−kms_ccs@pipe-D-crc-primary-basic-4-tiled-mtl-rc-ccs-cc
627−kms_ccs@pipe-D-crc-primary-rotation-180-y-tiled-ccs
628−kms_ccs@pipe-D-crc-primary-rotation-180-yf-tiled-ccs
629−kms_ccs@pipe-D-crc-primary-rotation-180-y-tiled-gen12-rc-ccs
630−kms_ccs@pipe-D-crc-primary-rotation-180-y-tiled-gen12-rc-ccs-cc
631−kms_ccs@pipe-D-crc-primary-rotation-180-y-tiled-gen12-mc-ccs
632−kms_ccs@pipe-D-crc-primary-rotation-180-4-tiled-dg2-rc-ccs
633−kms_ccs@pipe-D-crc-primary-rotation-180-4-tiled-dg2-mc-ccs
634−kms_ccs@pipe-D-crc-primary-rotation-180-4-tiled-dg2-rc-ccs-cc
635−kms_ccs@pipe-D-crc-primary-rotation-180-4-tiled-mtl-rc-ccs
636−kms_ccs@pipe-D-crc-primary-rotation-180-4-tiled-mtl-mc-ccs
637−kms_ccs@pipe-D-crc-primary-rotation-180-4-tiled-mtl-rc-ccs-cc
638−kms_ccs@pipe-D-random-ccs-data-y-tiled-ccs
639−kms_ccs@pipe-D-random-ccs-data-yf-tiled-ccs
640−kms_ccs@pipe-D-random-ccs-data-y-tiled-gen12-rc-ccs
641−kms_ccs@pipe-D-random-ccs-data-y-tiled-gen12-rc-ccs-cc
642−kms_ccs@pipe-D-random-ccs-data-y-tiled-gen12-mc-ccs
643−kms_ccs@pipe-D-random-ccs-data-4-tiled-dg2-rc-ccs
644−kms_ccs@pipe-D-random-ccs-data-4-tiled-dg2-mc-ccs
645−kms_ccs@pipe-D-random-ccs-data-4-tiled-dg2-rc-ccs-cc
646−kms_ccs@pipe-D-random-ccs-data-4-tiled-mtl-rc-ccs
647−kms_ccs@pipe-D-random-ccs-data-4-tiled-mtl-mc-ccs
648−kms_ccs@pipe-D-random-ccs-data-4-tiled-mtl-rc-ccs-cc
649−kms_ccs@pipe-D-missing-ccs-buffer-y-tiled-ccs
650−kms_ccs@pipe-D-missing-ccs-buffer-yf-tiled-ccs
651−kms_ccs@pipe-D-missing-ccs-buffer-y-tiled-gen12-rc-ccs
652−kms_ccs@pipe-D-missing-ccs-buffer-y-tiled-gen12-rc-ccs-cc
653−kms_ccs@pipe-D-missing-ccs-buffer-y-tiled-gen12-mc-ccs
654−kms_ccs@pipe-D-missing-ccs-buffer-4-tiled-mtl-rc-ccs
655−kms_ccs@pipe-D-missing-ccs-buffer-4-tiled-mtl-mc-ccs
656−kms_ccs@pipe-D-missing-ccs-buffer-4-tiled-mtl-rc-ccs-cc
657−kms_ccs@pipe-D-ccs-on-another-bo-y-tiled-ccs
658−kms_ccs@pipe-D-ccs-on-another-bo-yf-tiled-ccs
659−kms_ccs@pipe-D-ccs-on-another-bo-y-tiled-gen12-rc-ccs
660−kms_ccs@pipe-D-ccs-on-another-bo-y-tiled-gen12-rc-ccs-cc
661−kms_ccs@pipe-D-ccs-on-another-bo-y-tiled-gen12-mc-ccs
662−kms_ccs@pipe-D-ccs-on-another-bo-4-tiled-mtl-rc-ccs
663−kms_ccs@pipe-D-ccs-on-another-bo-4-tiled-mtl-mc-ccs
664−kms_ccs@pipe-D-ccs-on-another-bo-4-tiled-mtl-rc-ccs-cc
665−kms_ccs@pipe-D-bad-aux-stride-y-tiled-ccs
666−kms_ccs@pipe-D-bad-aux-stride-yf-tiled-ccs
667−kms_ccs@pipe-D-bad-aux-stride-y-tiled-gen12-rc-ccs
668−kms_ccs@pipe-D-bad-aux-stride-y-tiled-gen12-rc-ccs-cc
669−kms_ccs@pipe-D-bad-aux-stride-y-tiled-gen12-mc-ccs
670−kms_ccs@pipe-D-bad-aux-stride-4-tiled-mtl-rc-ccs
671−kms_ccs@pipe-D-bad-aux-stride-4-tiled-mtl-mc-ccs
672−kms_ccs@pipe-D-bad-aux-stride-4-tiled-mtl-rc-ccs-cc
673−kms_ccs@pipe-D-crc-sprite-planes-basic-y-tiled-ccs
674−kms_ccs@pipe-D-crc-sprite-planes-basic-yf-tiled-ccs
675−kms_ccs@pipe-D-crc-sprite-planes-basic-y-tiled-gen12-rc-ccs
676−kms_ccs@pipe-D-crc-sprite-planes-basic-y-tiled-gen12-rc-ccs-cc
677−kms_ccs@pipe-D-crc-sprite-planes-basic-y-tiled-gen12-mc-ccs
678−kms_ccs@pipe-D-crc-sprite-planes-basic-4-tiled-dg2-rc-ccs
679−kms_ccs@pipe-D-crc-sprite-planes-basic-4-tiled-dg2-mc-ccs
680−kms_ccs@pipe-D-crc-sprite-planes-basic-4-tiled-dg2-rc-ccs-cc
681−kms_ccs@pipe-D-crc-sprite-planes-basic-4-tiled-mtl-rc-ccs
682−kms_ccs@pipe-D-crc-sprite-planes-basic-4-tiled-mtl-mc-ccs
683−kms_ccs@pipe-D-crc-sprite-planes-basic-4-tiled-mtl-rc-ccs-cc
684−kms_ccs@pipe-E-bad-pixel-format-y-tiled-ccs
685−kms_ccs@pipe-E-bad-pixel-format-yf-tiled-ccs
686−kms_ccs@pipe-E-bad-pixel-format-y-tiled-gen12-rc-ccs
687−kms_ccs@pipe-E-bad-pixel-format-y-tiled-gen12-rc-ccs-cc
688−kms_ccs@pipe-E-bad-pixel-format-y-tiled-gen12-mc-ccs
689−kms_ccs@pipe-E-bad-pixel-format-4-tiled-dg2-rc-ccs
690−kms_ccs@pipe-E-bad-pixel-format-4-tiled-dg2-mc-ccs
691−kms_ccs@pipe-E-bad-pixel-format-4-tiled-dg2-rc-ccs-cc
692−kms_ccs@pipe-E-bad-pixel-format-4-tiled-mtl-rc-ccs
693−kms_ccs@pipe-E-bad-pixel-format-4-tiled-mtl-mc-ccs
694−kms_ccs@pipe-E-bad-pixel-format-4-tiled-mtl-rc-ccs-cc
695−kms_ccs@pipe-E-bad-rotation-90-y-tiled-ccs
696−kms_ccs@pipe-E-bad-rotation-90-yf-tiled-ccs
697−kms_ccs@pipe-E-bad-rotation-90-y-tiled-gen12-rc-ccs
698−kms_ccs@pipe-E-bad-rotation-90-y-tiled-gen12-rc-ccs-cc
699−kms_ccs@pipe-E-bad-rotation-90-y-tiled-gen12-mc-ccs
700−kms_ccs@pipe-E-bad-rotation-90-4-tiled-dg2-rc-ccs
701−kms_ccs@pipe-E-bad-rotation-90-4-tiled-dg2-mc-ccs
702−kms_ccs@pipe-E-bad-rotation-90-4-tiled-dg2-rc-ccs-cc
703−kms_ccs@pipe-E-bad-rotation-90-4-tiled-mtl-rc-ccs
704−kms_ccs@pipe-E-bad-rotation-90-4-tiled-mtl-mc-ccs
705−kms_ccs@pipe-E-bad-rotation-90-4-tiled-mtl-rc-ccs-cc
706−kms_ccs@pipe-E-crc-primary-basic-y-tiled-ccs
707−kms_ccs@pipe-E-crc-primary-basic-yf-tiled-ccs
708−kms_ccs@pipe-E-crc-primary-basic-y-tiled-gen12-rc-ccs
709−kms_ccs@pipe-E-crc-primary-basic-y-tiled-gen12-rc-ccs-cc
710−kms_ccs@pipe-E-crc-primary-basic-y-tiled-gen12-mc-ccs
711−kms_ccs@pipe-E-crc-primary-basic-4-tiled-dg2-rc-ccs
712−kms_ccs@pipe-E-crc-primary-basic-4-tiled-dg2-mc-ccs
713−kms_ccs@pipe-E-crc-primary-basic-4-tiled-dg2-rc-ccs-cc
714−kms_ccs@pipe-E-crc-primary-basic-4-tiled-mtl-rc-ccs
715−kms_ccs@pipe-E-crc-primary-basic-4-tiled-mtl-mc-ccs
716−kms_ccs@pipe-E-crc-primary-basic-4-tiled-mtl-rc-ccs-cc
717−kms_ccs@pipe-E-crc-primary-rotation-180-y-tiled-ccs
718−kms_ccs@pipe-E-crc-primary-rotation-180-yf-tiled-ccs
719−kms_ccs@pipe-E-crc-primary-rotation-180-y-tiled-gen12-rc-ccs
720−kms_ccs@pipe-E-crc-primary-rotation-180-y-tiled-gen12-rc-ccs-cc
721−kms_ccs@pipe-E-crc-primary-rotation-180-y-tiled-gen12-mc-ccs
722−kms_ccs@pipe-E-crc-primary-rotation-180-4-tiled-dg2-rc-ccs
723−kms_ccs@pipe-E-crc-primary-rotation-180-4-tiled-dg2-mc-ccs
724−kms_ccs@pipe-E-crc-primary-rotation-180-4-tiled-dg2-rc-ccs-cc
725−kms_ccs@pipe-E-crc-primary-rotation-180-4-tiled-mtl-rc-ccs
726−kms_ccs@pipe-E-crc-primary-rotation-180-4-tiled-mtl-mc-ccs
727−kms_ccs@pipe-E-crc-primary-rotation-180-4-tiled-mtl-rc-ccs-cc
728−kms_ccs@pipe-E-random-ccs-data-y-tiled-ccs
729−kms_ccs@pipe-E-random-ccs-data-yf-tiled-ccs
730−kms_ccs@pipe-E-random-ccs-data-y-tiled-gen12-rc-ccs
731−kms_ccs@pipe-E-random-ccs-data-y-tiled-gen12-rc-ccs-cc
732−kms_ccs@pipe-E-random-ccs-data-y-tiled-gen12-mc-ccs
733−kms_ccs@pipe-E-random-ccs-data-4-tiled-dg2-rc-ccs
734−kms_ccs@pipe-E-random-ccs-data-4-tiled-dg2-mc-ccs
735−kms_ccs@pipe-E-random-ccs-data-4-tiled-dg2-rc-ccs-cc
736−kms_ccs@pipe-E-random-ccs-data-4-tiled-mtl-rc-ccs
737−kms_ccs@pipe-E-random-ccs-data-4-tiled-mtl-mc-ccs
738−kms_ccs@pipe-E-random-ccs-data-4-tiled-mtl-rc-ccs-cc
739−kms_ccs@pipe-E-missing-ccs-buffer-y-tiled-ccs
740−kms_ccs@pipe-E-missing-ccs-buffer-yf-tiled-ccs
741−kms_ccs@pipe-E-missing-ccs-buffer-y-tiled-gen12-rc-ccs
742−kms_ccs@pipe-E-missing-ccs-buffer-y-tiled-gen12-rc-ccs-cc
743−kms_ccs@pipe-E-missing-ccs-buffer-y-tiled-gen12-mc-ccs
744−kms_ccs@pipe-E-missing-ccs-buffer-4-tiled-mtl-rc-ccs
745−kms_ccs@pipe-E-missing-ccs-buffer-4-tiled-mtl-mc-ccs
746−kms_ccs@pipe-E-missing-ccs-buffer-4-tiled-mtl-rc-ccs-cc
747−kms_ccs@pipe-E-ccs-on-another-bo-y-tiled-ccs
748−kms_ccs@pipe-E-ccs-on-another-bo-yf-tiled-ccs
749−kms_ccs@pipe-E-ccs-on-another-bo-y-tiled-gen12-rc-ccs
750−kms_ccs@pipe-E-ccs-on-another-bo-y-tiled-gen12-rc-ccs-cc
751−kms_ccs@pipe-E-ccs-on-another-bo-y-tiled-gen12-mc-ccs
752−kms_ccs@pipe-E-ccs-on-another-bo-4-tiled-mtl-rc-ccs
753−kms_ccs@pipe-E-ccs-on-another-bo-4-tiled-mtl-mc-ccs
754−kms_ccs@pipe-E-ccs-on-another-bo-4-tiled-mtl-rc-ccs-cc
755−kms_ccs@pipe-E-bad-aux-stride-y-tiled-ccs
756−kms_ccs@pipe-E-bad-aux-stride-yf-tiled-ccs
757−kms_ccs@pipe-E-bad-aux-stride-y-tiled-gen12-rc-ccs
758−kms_ccs@pipe-E-bad-aux-stride-y-tiled-gen12-rc-ccs-cc
759−kms_ccs@pipe-E-bad-aux-stride-y-tiled-gen12-mc-ccs
760−kms_ccs@pipe-E-bad-aux-stride-4-tiled-mtl-rc-ccs
761−kms_ccs@pipe-E-bad-aux-stride-4-tiled-mtl-mc-ccs
762−kms_ccs@pipe-E-bad-aux-stride-4-tiled-mtl-rc-ccs-cc
763−kms_ccs@pipe-E-crc-sprite-planes-basic-y-tiled-ccs
764−kms_ccs@pipe-E-crc-sprite-planes-basic-yf-tiled-ccs
765−kms_ccs@pipe-E-crc-sprite-planes-basic-y-tiled-gen12-rc-ccs
766−kms_ccs@pipe-E-crc-sprite-planes-basic-y-tiled-gen12-rc-ccs-cc
767−kms_ccs@pipe-E-crc-sprite-planes-basic-y-tiled-gen12-mc-ccs
768−kms_ccs@pipe-E-crc-sprite-planes-basic-4-tiled-dg2-rc-ccs
769−kms_ccs@pipe-E-crc-sprite-planes-basic-4-tiled-dg2-mc-ccs
770−kms_ccs@pipe-E-crc-sprite-planes-basic-4-tiled-dg2-rc-ccs-cc
771−kms_ccs@pipe-E-crc-sprite-planes-basic-4-tiled-mtl-rc-ccs
772−kms_ccs@pipe-E-crc-sprite-planes-basic-4-tiled-mtl-mc-ccs
773−kms_ccs@pipe-E-crc-sprite-planes-basic-4-tiled-mtl-rc-ccs-cc
774−kms_ccs@pipe-F-bad-pixel-format-y-tiled-ccs
775−kms_ccs@pipe-F-bad-pixel-format-yf-tiled-ccs
776−kms_ccs@pipe-F-bad-pixel-format-y-tiled-gen12-rc-ccs
777−kms_ccs@pipe-F-bad-pixel-format-y-tiled-gen12-rc-ccs-cc
778−kms_ccs@pipe-F-bad-pixel-format-y-tiled-gen12-mc-ccs
779−kms_ccs@pipe-F-bad-pixel-format-4-tiled-dg2-rc-ccs
780−kms_ccs@pipe-F-bad-pixel-format-4-tiled-dg2-mc-ccs
781−kms_ccs@pipe-F-bad-pixel-format-4-tiled-dg2-rc-ccs-cc
782−kms_ccs@pipe-F-bad-pixel-format-4-tiled-mtl-rc-ccs
783−kms_ccs@pipe-F-bad-pixel-format-4-tiled-mtl-mc-ccs
784−kms_ccs@pipe-F-bad-pixel-format-4-tiled-mtl-rc-ccs-cc
785−kms_ccs@pipe-F-bad-rotation-90-y-tiled-ccs
786−kms_ccs@pipe-F-bad-rotation-90-yf-tiled-ccs
787−kms_ccs@pipe-F-bad-rotation-90-y-tiled-gen12-rc-ccs
788−kms_ccs@pipe-F-bad-rotation-90-y-tiled-gen12-rc-ccs-cc
789−kms_ccs@pipe-F-bad-rotation-90-y-tiled-gen12-mc-ccs
790−kms_ccs@pipe-F-bad-rotation-90-4-tiled-dg2-rc-ccs
791−kms_ccs@pipe-F-bad-rotation-90-4-tiled-dg2-mc-ccs
792−kms_ccs@pipe-F-bad-rotation-90-4-tiled-dg2-rc-ccs-cc
793−kms_ccs@pipe-F-bad-rotation-90-4-tiled-mtl-rc-ccs
794−kms_ccs@pipe-F-bad-rotation-90-4-tiled-mtl-mc-ccs
795−kms_ccs@pipe-F-bad-rotation-90-4-tiled-mtl-rc-ccs-cc
796−kms_ccs@pipe-F-crc-primary-basic-y-tiled-ccs
797−kms_ccs@pipe-F-crc-primary-basic-yf-tiled-ccs
798−kms_ccs@pipe-F-crc-primary-basic-y-tiled-gen12-rc-ccs
799−kms_ccs@pipe-F-crc-primary-basic-y-tiled-gen12-rc-ccs-cc
800−kms_ccs@pipe-F-crc-primary-basic-y-tiled-gen12-mc-ccs
801−kms_ccs@pipe-F-crc-primary-basic-4-tiled-dg2-rc-ccs
802−kms_ccs@pipe-F-crc-primary-basic-4-tiled-dg2-mc-ccs
803−kms_ccs@pipe-F-crc-primary-basic-4-tiled-dg2-rc-ccs-cc
804−kms_ccs@pipe-F-crc-primary-basic-4-tiled-mtl-rc-ccs
805−kms_ccs@pipe-F-crc-primary-basic-4-tiled-mtl-mc-ccs
806−kms_ccs@pipe-F-crc-primary-basic-4-tiled-mtl-rc-ccs-cc
807−kms_ccs@pipe-F-crc-primary-rotation-180-y-tiled-ccs
808−kms_ccs@pipe-F-crc-primary-rotation-180-yf-tiled-ccs
809−kms_ccs@pipe-F-crc-primary-rotation-180-y-tiled-gen12-rc-ccs
810−kms_ccs@pipe-F-crc-primary-rotation-180-y-tiled-gen12-rc-ccs-cc
811−kms_ccs@pipe-F-crc-primary-rotation-180-y-tiled-gen12-mc-ccs
812−kms_ccs@pipe-F-crc-primary-rotation-180-4-tiled-dg2-rc-ccs
813−kms_ccs@pipe-F-crc-primary-rotation-180-4-tiled-dg2-mc-ccs
814−kms_ccs@pipe-F-crc-primary-rotation-180-4-tiled-dg2-rc-ccs-cc
815−kms_ccs@pipe-F-crc-primary-rotation-180-4-tiled-mtl-rc-ccs
816−kms_ccs@pipe-F-crc-primary-rotation-180-4-tiled-mtl-mc-ccs
817−kms_ccs@pipe-F-crc-primary-rotation-180-4-tiled-mtl-rc-ccs-cc
818−kms_ccs@pipe-F-random-ccs-data-y-tiled-ccs
819−kms_ccs@pipe-F-random-ccs-data-yf-tiled-ccs
820−kms_ccs@pipe-F-random-ccs-data-y-tiled-gen12-rc-ccs
821−kms_ccs@pipe-F-random-ccs-data-y-tiled-gen12-rc-ccs-cc
822−kms_ccs@pipe-F-random-ccs-data-y-tiled-gen12-mc-ccs
823−kms_ccs@pipe-F-random-ccs-data-4-tiled-dg2-rc-ccs
824−kms_ccs@pipe-F-random-ccs-data-4-tiled-dg2-mc-ccs
825−kms_ccs@pipe-F-random-ccs-data-4-tiled-dg2-rc-ccs-cc
826−kms_ccs@pipe-F-random-ccs-data-4-tiled-mtl-rc-ccs
827−kms_ccs@pipe-F-random-ccs-data-4-tiled-mtl-mc-ccs
828−kms_ccs@pipe-F-random-ccs-data-4-tiled-mtl-rc-ccs-cc
829−kms_ccs@pipe-F-missing-ccs-buffer-y-tiled-ccs
830−kms_ccs@pipe-F-missing-ccs-buffer-yf-tiled-ccs
831−kms_ccs@pipe-F-missing-ccs-buffer-y-tiled-gen12-rc-ccs
832−kms_ccs@pipe-F-missing-ccs-buffer-y-tiled-gen12-rc-ccs-cc
833−kms_ccs@pipe-F-missing-ccs-buffer-y-tiled-gen12-mc-ccs
834−kms_ccs@pipe-F-missing-ccs-buffer-4-tiled-mtl-rc-ccs
835−kms_ccs@pipe-F-missing-ccs-buffer-4-tiled-mtl-mc-ccs
836−kms_ccs@pipe-F-missing-ccs-buffer-4-tiled-mtl-rc-ccs-cc
837−kms_ccs@pipe-F-ccs-on-another-bo-y-tiled-ccs
838−kms_ccs@pipe-F-ccs-on-another-bo-yf-tiled-ccs
839−kms_ccs@pipe-F-ccs-on-another-bo-y-tiled-gen12-rc-ccs
840−kms_ccs@pipe-F-ccs-on-another-bo-y-tiled-gen12-rc-ccs-cc
841−kms_ccs@pipe-F-ccs-on-another-bo-y-tiled-gen12-mc-ccs
842−kms_ccs@pipe-F-ccs-on-another-bo-4-tiled-mtl-rc-ccs
843−kms_ccs@pipe-F-ccs-on-another-bo-4-tiled-mtl-mc-ccs
844−kms_ccs@pipe-F-ccs-on-another-bo-4-tiled-mtl-rc-ccs-cc
845−kms_ccs@pipe-F-bad-aux-stride-y-tiled-ccs
846−kms_ccs@pipe-F-bad-aux-stride-yf-tiled-ccs
847−kms_ccs@pipe-F-bad-aux-stride-y-tiled-gen12-rc-ccs
848−kms_ccs@pipe-F-bad-aux-stride-y-tiled-gen12-rc-ccs-cc
849−kms_ccs@pipe-F-bad-aux-stride-y-tiled-gen12-mc-ccs
850−kms_ccs@pipe-F-bad-aux-stride-4-tiled-mtl-rc-ccs
851−kms_ccs@pipe-F-bad-aux-stride-4-tiled-mtl-mc-ccs
852−kms_ccs@pipe-F-bad-aux-stride-4-tiled-mtl-rc-ccs-cc
853−kms_ccs@pipe-F-crc-sprite-planes-basic-y-tiled-ccs
854−kms_ccs@pipe-F-crc-sprite-planes-basic-yf-tiled-ccs
855−kms_ccs@pipe-F-crc-sprite-planes-basic-y-tiled-gen12-rc-ccs
856−kms_ccs@pipe-F-crc-sprite-planes-basic-y-tiled-gen12-rc-ccs-cc
857−kms_ccs@pipe-F-crc-sprite-planes-basic-y-tiled-gen12-mc-ccs
858−kms_ccs@pipe-F-crc-sprite-planes-basic-4-tiled-dg2-rc-ccs
859−kms_ccs@pipe-F-crc-sprite-planes-basic-4-tiled-dg2-mc-ccs
860−kms_ccs@pipe-F-crc-sprite-planes-basic-4-tiled-dg2-rc-ccs-cc
861−kms_ccs@pipe-F-crc-sprite-planes-basic-4-tiled-mtl-rc-ccs
862−kms_ccs@pipe-F-crc-sprite-planes-basic-4-tiled-mtl-mc-ccs
863−kms_ccs@pipe-F-crc-sprite-planes-basic-4-tiled-mtl-rc-ccs-cc
864−kms_ccs@pipe-G-bad-pixel-format-y-tiled-ccs
865−kms_ccs@pipe-G-bad-pixel-format-yf-tiled-ccs
866−kms_ccs@pipe-G-bad-pixel-format-y-tiled-gen12-rc-ccs
867−kms_ccs@pipe-G-bad-pixel-format-y-tiled-gen12-rc-ccs-cc
868−kms_ccs@pipe-G-bad-pixel-format-y-tiled-gen12-mc-ccs
869−kms_ccs@pipe-G-bad-pixel-format-4-tiled-dg2-rc-ccs
870−kms_ccs@pipe-G-bad-pixel-format-4-tiled-dg2-mc-ccs
871−kms_ccs@pipe-G-bad-pixel-format-4-tiled-dg2-rc-ccs-cc
872−kms_ccs@pipe-G-bad-pixel-format-4-tiled-mtl-rc-ccs
873−kms_ccs@pipe-G-bad-pixel-format-4-tiled-mtl-mc-ccs
874−kms_ccs@pipe-G-bad-pixel-format-4-tiled-mtl-rc-ccs-cc
875−kms_ccs@pipe-G-bad-rotation-90-y-tiled-ccs
876−kms_ccs@pipe-G-bad-rotation-90-yf-tiled-ccs
877−kms_ccs@pipe-G-bad-rotation-90-y-tiled-gen12-rc-ccs
878−kms_ccs@pipe-G-bad-rotation-90-y-tiled-gen12-rc-ccs-cc
879−kms_ccs@pipe-G-bad-rotation-90-y-tiled-gen12-mc-ccs
880−kms_ccs@pipe-G-bad-rotation-90-4-tiled-dg2-rc-ccs
881−kms_ccs@pipe-G-bad-rotation-90-4-tiled-dg2-mc-ccs
882−kms_ccs@pipe-G-bad-rotation-90-4-tiled-dg2-rc-ccs-cc
883−kms_ccs@pipe-G-bad-rotation-90-4-tiled-mtl-rc-ccs
884−kms_ccs@pipe-G-bad-rotation-90-4-tiled-mtl-mc-ccs
885−kms_ccs@pipe-G-bad-rotation-90-4-tiled-mtl-rc-ccs-cc
886−kms_ccs@pipe-G-crc-primary-basic-y-tiled-ccs
887−kms_ccs@pipe-G-crc-primary-basic-yf-tiled-ccs
888−kms_ccs@pipe-G-crc-primary-basic-y-tiled-gen12-rc-ccs
889−kms_ccs@pipe-G-crc-primary-basic-y-tiled-gen12-rc-ccs-cc
890−kms_ccs@pipe-G-crc-primary-basic-y-tiled-gen12-mc-ccs
891−kms_ccs@pipe-G-crc-primary-basic-4-tiled-dg2-rc-ccs
892−kms_ccs@pipe-G-crc-primary-basic-4-tiled-dg2-mc-ccs
893−kms_ccs@pipe-G-crc-primary-basic-4-tiled-dg2-rc-ccs-cc
894−kms_ccs@pipe-G-crc-primary-basic-4-tiled-mtl-rc-ccs
895−kms_ccs@pipe-G-crc-primary-basic-4-tiled-mtl-mc-ccs
896−kms_ccs@pipe-G-crc-primary-basic-4-tiled-mtl-rc-ccs-cc
897−kms_ccs@pipe-G-crc-primary-rotation-180-y-tiled-ccs
898−kms_ccs@pipe-G-crc-primary-rotation-180-yf-tiled-ccs
899−kms_ccs@pipe-G-crc-primary-rotation-180-y-tiled-gen12-rc-ccs
900−kms_ccs@pipe-G-crc-primary-rotation-180-y-tiled-gen12-rc-ccs-cc
901−kms_ccs@pipe-G-crc-primary-rotation-180-y-tiled-gen12-mc-ccs
902−kms_ccs@pipe-G-crc-primary-rotation-180-4-tiled-dg2-rc-ccs
903−kms_ccs@pipe-G-crc-primary-rotation-180-4-tiled-dg2-mc-ccs
904−kms_ccs@pipe-G-crc-primary-rotation-180-4-tiled-dg2-rc-ccs-cc
905−kms_ccs@pipe-G-crc-primary-rotation-180-4-tiled-mtl-rc-ccs
906−kms_ccs@pipe-G-crc-primary-rotation-180-4-tiled-mtl-mc-ccs
907−kms_ccs@pipe-G-crc-primary-rotation-180-4-tiled-mtl-rc-ccs-cc
908−kms_ccs@pipe-G-random-ccs-data-y-tiled-ccs
909−kms_ccs@pipe-G-random-ccs-data-yf-tiled-ccs
910−kms_ccs@pipe-G-random-ccs-data-y-tiled-gen12-rc-ccs
911−kms_ccs@pipe-G-random-ccs-data-y-tiled-gen12-rc-ccs-cc
912−kms_ccs@pipe-G-random-ccs-data-y-tiled-gen12-mc-ccs
913−kms_ccs@pipe-G-random-ccs-data-4-tiled-dg2-rc-ccs
914−kms_ccs@pipe-G-random-ccs-data-4-tiled-dg2-mc-ccs
915−kms_ccs@pipe-G-random-ccs-data-4-tiled-dg2-rc-ccs-cc
916−kms_ccs@pipe-G-random-ccs-data-4-tiled-mtl-rc-ccs
917−kms_ccs@pipe-G-random-ccs-data-4-tiled-mtl-mc-ccs
918−kms_ccs@pipe-G-random-ccs-data-4-tiled-mtl-rc-ccs-cc
919−kms_ccs@pipe-G-missing-ccs-buffer-y-tiled-ccs
920−kms_ccs@pipe-G-missing-ccs-buffer-yf-tiled-ccs
921−kms_ccs@pipe-G-missing-ccs-buffer-y-tiled-gen12-rc-ccs
922−kms_ccs@pipe-G-missing-ccs-buffer-y-tiled-gen12-rc-ccs-cc
923−kms_ccs@pipe-G-missing-ccs-buffer-y-tiled-gen12-mc-ccs
924−kms_ccs@pipe-G-missing-ccs-buffer-4-tiled-mtl-rc-ccs
925−kms_ccs@pipe-G-missing-ccs-buffer-4-tiled-mtl-mc-ccs
926−kms_ccs@pipe-G-missing-ccs-buffer-4-tiled-mtl-rc-ccs-cc
927−kms_ccs@pipe-G-ccs-on-another-bo-y-tiled-ccs
928−kms_ccs@pipe-G-ccs-on-another-bo-yf-tiled-ccs
929−kms_ccs@pipe-G-ccs-on-another-bo-y-tiled-gen12-rc-ccs
930−kms_ccs@pipe-G-ccs-on-another-bo-y-tiled-gen12-rc-ccs-cc
931−kms_ccs@pipe-G-ccs-on-another-bo-y-tiled-gen12-mc-ccs
932−kms_ccs@pipe-G-ccs-on-another-bo-4-tiled-mtl-rc-ccs
933−kms_ccs@pipe-G-ccs-on-another-bo-4-tiled-mtl-mc-ccs
934−kms_ccs@pipe-G-ccs-on-another-bo-4-tiled-mtl-rc-ccs-cc
935−kms_ccs@pipe-G-bad-aux-stride-y-tiled-ccs
936−kms_ccs@pipe-G-bad-aux-stride-yf-tiled-ccs
937−kms_ccs@pipe-G-bad-aux-stride-y-tiled-gen12-rc-ccs
938−kms_ccs@pipe-G-bad-aux-stride-y-tiled-gen12-rc-ccs-cc
939−kms_ccs@pipe-G-bad-aux-stride-y-tiled-gen12-mc-ccs
940−kms_ccs@pipe-G-bad-aux-stride-4-tiled-mtl-rc-ccs
941−kms_ccs@pipe-G-bad-aux-stride-4-tiled-mtl-mc-ccs
942−kms_ccs@pipe-G-bad-aux-stride-4-tiled-mtl-rc-ccs-cc
943−kms_ccs@pipe-G-crc-sprite-planes-basic-y-tiled-ccs
944−kms_ccs@pipe-G-crc-sprite-planes-basic-yf-tiled-ccs
945−kms_ccs@pipe-G-crc-sprite-planes-basic-y-tiled-gen12-rc-ccs
946−kms_ccs@pipe-G-crc-sprite-planes-basic-y-tiled-gen12-rc-ccs-cc
947−kms_ccs@pipe-G-crc-sprite-planes-basic-y-tiled-gen12-mc-ccs
948−kms_ccs@pipe-G-crc-sprite-planes-basic-4-tiled-dg2-rc-ccs
949−kms_ccs@pipe-G-crc-sprite-planes-basic-4-tiled-dg2-mc-ccs
950−kms_ccs@pipe-G-crc-sprite-planes-basic-4-tiled-dg2-rc-ccs-cc
951−kms_ccs@pipe-G-crc-sprite-planes-basic-4-tiled-mtl-rc-ccs
952−kms_ccs@pipe-G-crc-sprite-planes-basic-4-tiled-mtl-mc-ccs
953−kms_ccs@pipe-G-crc-sprite-planes-basic-4-tiled-mtl-rc-ccs-cc
954−kms_ccs@pipe-H-bad-pixel-format-y-tiled-ccs
955−kms_ccs@pipe-H-bad-pixel-format-yf-tiled-ccs
956−kms_ccs@pipe-H-bad-pixel-format-y-tiled-gen12-rc-ccs
957−kms_ccs@pipe-H-bad-pixel-format-y-tiled-gen12-rc-ccs-cc
958−kms_ccs@pipe-H-bad-pixel-format-y-tiled-gen12-mc-ccs
959−kms_ccs@pipe-H-bad-pixel-format-4-tiled-dg2-rc-ccs
960−kms_ccs@pipe-H-bad-pixel-format-4-tiled-dg2-mc-ccs
961−kms_ccs@pipe-H-bad-pixel-format-4-tiled-dg2-rc-ccs-cc
962−kms_ccs@pipe-H-bad-pixel-format-4-tiled-mtl-rc-ccs
963−kms_ccs@pipe-H-bad-pixel-format-4-tiled-mtl-mc-ccs
964−kms_ccs@pipe-H-bad-pixel-format-4-tiled-mtl-rc-ccs-cc
965−kms_ccs@pipe-H-bad-rotation-90-y-tiled-ccs
966−kms_ccs@pipe-H-bad-rotation-90-yf-tiled-ccs
967−kms_ccs@pipe-H-bad-rotation-90-y-tiled-gen12-rc-ccs
968−kms_ccs@pipe-H-bad-rotation-90-y-tiled-gen12-rc-ccs-cc
969−kms_ccs@pipe-H-bad-rotation-90-y-tiled-gen12-mc-ccs
970−kms_ccs@pipe-H-bad-rotation-90-4-tiled-dg2-rc-ccs
971−kms_ccs@pipe-H-bad-rotation-90-4-tiled-dg2-mc-ccs
972−kms_ccs@pipe-H-bad-rotation-90-4-tiled-dg2-rc-ccs-cc
973−kms_ccs@pipe-H-bad-rotation-90-4-tiled-mtl-rc-ccs
974−kms_ccs@pipe-H-bad-rotation-90-4-tiled-mtl-mc-ccs
975−kms_ccs@pipe-H-bad-rotation-90-4-tiled-mtl-rc-ccs-cc
976−kms_ccs@pipe-H-crc-primary-basic-y-tiled-ccs
977−kms_ccs@pipe-H-crc-primary-basic-yf-tiled-ccs
978−kms_ccs@pipe-H-crc-primary-basic-y-tiled-gen12-rc-ccs
979−kms_ccs@pipe-H-crc-primary-basic-y-tiled-gen12-rc-ccs-cc
980−kms_ccs@pipe-H-crc-primary-basic-y-tiled-gen12-mc-ccs
981−kms_ccs@pipe-H-crc-primary-basic-4-tiled-dg2-rc-ccs
982−kms_ccs@pipe-H-crc-primary-basic-4-tiled-dg2-mc-ccs
983−kms_ccs@pipe-H-crc-primary-basic-4-tiled-dg2-rc-ccs-cc
984−kms_ccs@pipe-H-crc-primary-basic-4-tiled-mtl-rc-ccs
985−kms_ccs@pipe-H-crc-primary-basic-4-tiled-mtl-mc-ccs
986−kms_ccs@pipe-H-crc-primary-basic-4-tiled-mtl-rc-ccs-cc
987−kms_ccs@pipe-H-crc-primary-rotation-180-y-tiled-ccs
988−kms_ccs@pipe-H-crc-primary-rotation-180-yf-tiled-ccs
989−kms_ccs@pipe-H-crc-primary-rotation-180-y-tiled-gen12-rc-ccs
990−kms_ccs@pipe-H-crc-primary-rotation-180-y-tiled-gen12-rc-ccs-cc
991−kms_ccs@pipe-H-crc-primary-rotation-180-y-tiled-gen12-mc-ccs
992−kms_ccs@pipe-H-crc-primary-rotation-180-4-tiled-dg2-rc-ccs
993−kms_ccs@pipe-H-crc-primary-rotation-180-4-tiled-dg2-mc-ccs
994−kms_ccs@pipe-H-crc-primary-rotation-180-4-tiled-dg2-rc-ccs-cc
995−kms_ccs@pipe-H-crc-primary-rotation-180-4-tiled-mtl-rc-ccs
996−kms_ccs@pipe-H-crc-primary-rotation-180-4-tiled-mtl-mc-ccs
997−kms_ccs@pipe-H-crc-primary-rotation-180-4-tiled-mtl-rc-ccs-cc
998−kms_ccs@pipe-H-random-ccs-data-y-tiled-ccs
999−kms_ccs@pipe-H-random-ccs-data-yf-tiled-ccs
1000−kms_ccs@pipe-H-random-ccs-data-y-tiled-gen12-rc-ccs
1001−kms_ccs@pipe-H-random-ccs-data-y-tiled-gen12-rc-ccs-cc
1002−kms_ccs@pipe-H-random-ccs-data-y-tiled-gen12-mc-ccs
1003−kms_ccs@pipe-H-random-ccs-data-4-tiled-dg2-rc-ccs
1004−kms_ccs@pipe-H-random-ccs-data-4-tiled-dg2-mc-ccs
1005−kms_ccs@pipe-H-random-ccs-data-4-tiled-dg2-rc-ccs-cc
1006−kms_ccs@pipe-H-random-ccs-data-4-tiled-mtl-rc-ccs
1007−kms_ccs@pipe-H-random-ccs-data-4-tiled-mtl-mc-ccs
1008−kms_ccs@pipe-H-random-ccs-data-4-tiled-mtl-rc-ccs-cc
1009−kms_ccs@pipe-H-missing-ccs-buffer-y-tiled-ccs
1010−kms_ccs@pipe-H-missing-ccs-buffer-yf-tiled-ccs
1011−kms_ccs@pipe-H-missing-ccs-buffer-y-tiled-gen12-rc-ccs
1012−kms_ccs@pipe-H-missing-ccs-buffer-y-tiled-gen12-rc-ccs-cc
1013−kms_ccs@pipe-H-missing-ccs-buffer-y-tiled-gen12-mc-ccs
1014−kms_ccs@pipe-H-missing-ccs-buffer-4-tiled-mtl-rc-ccs
1015−kms_ccs@pipe-H-missing-ccs-buffer-4-tiled-mtl-mc-ccs
1016−kms_ccs@pipe-H-missing-ccs-buffer-4-tiled-mtl-rc-ccs-cc
1017−kms_ccs@pipe-H-ccs-on-another-bo-y-tiled-ccs
1018−kms_ccs@pipe-H-ccs-on-another-bo-yf-tiled-ccs
1019−kms_ccs@pipe-H-ccs-on-another-bo-y-tiled-gen12-rc-ccs
1020−kms_ccs@pipe-H-ccs-on-another-bo-y-tiled-gen12-rc-ccs-cc
1021−kms_ccs@pipe-H-ccs-on-another-bo-y-tiled-gen12-mc-ccs
1022−kms_ccs@pipe-H-ccs-on-another-bo-4-tiled-mtl-rc-ccs
1023−kms_ccs@pipe-H-ccs-on-another-bo-4-tiled-mtl-mc-ccs
1024−kms_ccs@pipe-H-ccs-on-another-bo-4-tiled-mtl-rc-ccs-cc
1025−kms_ccs@pipe-H-bad-aux-stride-y-tiled-ccs
1026−kms_ccs@pipe-H-bad-aux-stride-yf-tiled-ccs
1027−kms_ccs@pipe-H-bad-aux-stride-y-tiled-gen12-rc-ccs
1028−kms_ccs@pipe-H-bad-aux-stride-y-tiled-gen12-rc-ccs-cc
1029−kms_ccs@pipe-H-bad-aux-stride-y-tiled-gen12-mc-ccs
1030−kms_ccs@pipe-H-bad-aux-stride-4-tiled-mtl-rc-ccs
1031−kms_ccs@pipe-H-bad-aux-stride-4-tiled-mtl-mc-ccs
1032−kms_ccs@pipe-H-bad-aux-stride-4-tiled-mtl-rc-ccs-cc
1033−kms_ccs@pipe-H-crc-sprite-planes-basic-y-tiled-ccs
1034−kms_ccs@pipe-H-crc-sprite-planes-basic-yf-tiled-ccs
1035−kms_ccs@pipe-H-crc-sprite-planes-basic-y-tiled-gen12-rc-ccs
1036−kms_ccs@pipe-H-crc-sprite-planes-basic-y-tiled-gen12-rc-ccs-cc
1037−kms_ccs@pipe-H-crc-sprite-planes-basic-y-tiled-gen12-mc-ccs
1038−kms_ccs@pipe-H-crc-sprite-planes-basic-4-tiled-dg2-rc-ccs
1039−kms_ccs@pipe-H-crc-sprite-planes-basic-4-tiled-dg2-mc-ccs
1040−kms_ccs@pipe-H-crc-sprite-planes-basic-4-tiled-dg2-rc-ccs-cc
1041−kms_ccs@pipe-H-crc-sprite-planes-basic-4-tiled-mtl-rc-ccs
1042−kms_ccs@pipe-H-crc-sprite-planes-basic-4-tiled-mtl-mc-ccs
1043−kms_ccs@pipe-H-crc-sprite-planes-basic-4-tiled-mtl-rc-ccs-cc
1044−kms_cdclk@plane-scaling
1045−kms_cdclk@mode-transition
1046−kms_cdclk@mode-transition-all-outputs
1047−kms_color@degamma
1048−kms_color@gamma
1049−kms_color@legacy-gamma
1050−kms_color@legacy-gamma-reset
1051−kms_color@ctm-red-to-blue
1052−kms_color@ctm-green-to-red
1053−kms_color@ctm-blue-to-red
1054−kms_color@ctm-max
1055−kms_color@ctm-negative
1056−kms_color@ctm-0-25
1057−kms_color@ctm-0-50
1058−kms_color@ctm-0-75
1059−kms_color@ctm-signed
1060−kms_color@deep-color
1061−kms_color@invalid-gamma-lut-sizes
1062−kms_color@invalid-degamma-lut-sizes
1063−kms_color@invalid-ctm-matrix-sizes
1064−kms_concurrent@multi-plane-atomic-lowres
1065−kms_content_protection@legacy
1066−kms_content_protection@atomic
1067−kms_content_protection@atomic-dpms
1068−kms_content_protection@lic
1069−kms_content_protection@type1
1070−kms_content_protection@mei-interface
1071−kms_content_protection@content-type-change
1072−kms_content_protection@uevent
1073−kms_content_protection@srm
1074−kms_content_protection@dp-mst-type-0
1075−kms_content_protection@dp-mst-lic-type-0
1076−kms_content_protection@dp-mst-type-1
1077−kms_content_protection@dp-mst-lic-type-1
1078−kms_cursor_crc@cursor-size-change
1079−kms_cursor_crc@cursor-alpha-opaque
1080−kms_cursor_crc@cursor-alpha-transparent
1081−kms_cursor_crc@cursor-dpms
1082−kms_cursor_crc@cursor-suspend
1083−kms_cursor_crc@cursor-onscreen-32x32
1084−kms_cursor_crc@cursor-offscreen-32x32
1085−kms_cursor_crc@cursor-sliding-32x32
1086−kms_cursor_crc@cursor-random-32x32
1087−kms_cursor_crc@cursor-rapid-movement-32x32
1088−kms_cursor_crc@cursor-onscreen-32x10
1089−kms_cursor_crc@cursor-offscreen-32x10
1090−kms_cursor_crc@cursor-sliding-32x10
1091−kms_cursor_crc@cursor-random-32x10
1092−kms_cursor_crc@cursor-rapid-movement-32x10
1093−kms_cursor_crc@cursor-onscreen-64x64
1094−kms_cursor_crc@cursor-offscreen-64x64
1095−kms_cursor_crc@cursor-sliding-64x64
1096−kms_cursor_crc@cursor-random-64x64
1097−kms_cursor_crc@cursor-rapid-movement-64x64
1098−kms_cursor_crc@cursor-onscreen-64x21
1099−kms_cursor_crc@cursor-offscreen-64x21
1100−kms_cursor_crc@cursor-sliding-64x21
1101−kms_cursor_crc@cursor-random-64x21
1102−kms_cursor_crc@cursor-rapid-movement-64x21
1103−kms_cursor_crc@cursor-onscreen-128x128
1104−kms_cursor_crc@cursor-offscreen-128x128
1105−kms_cursor_crc@cursor-sliding-128x128
1106−kms_cursor_crc@cursor-random-128x128
1107−kms_cursor_crc@cursor-rapid-movement-128x128
1108−kms_cursor_crc@cursor-onscreen-128x42
1109−kms_cursor_crc@cursor-offscreen-128x42
1110−kms_cursor_crc@cursor-sliding-128x42
1111−kms_cursor_crc@cursor-random-128x42
1112−kms_cursor_crc@cursor-rapid-movement-128x42
1113−kms_cursor_crc@cursor-onscreen-256x256
1114−kms_cursor_crc@cursor-offscreen-256x256
1115−kms_cursor_crc@cursor-sliding-256x256
1116−kms_cursor_crc@cursor-random-256x256
1117−kms_cursor_crc@cursor-rapid-movement-256x256
1118−kms_cursor_crc@cursor-onscreen-256x85
1119−kms_cursor_crc@cursor-offscreen-256x85
1120−kms_cursor_crc@cursor-sliding-256x85
1121−kms_cursor_crc@cursor-random-256x85
1122−kms_cursor_crc@cursor-rapid-movement-256x85
1123−kms_cursor_crc@cursor-onscreen-512x512
1124−kms_cursor_crc@cursor-offscreen-512x512
1125−kms_cursor_crc@cursor-sliding-512x512
1126−kms_cursor_crc@cursor-random-512x512
1127−kms_cursor_crc@cursor-rapid-movement-512x512
1128−kms_cursor_crc@cursor-onscreen-512x170
1129−kms_cursor_crc@cursor-offscreen-512x170
1130−kms_cursor_crc@cursor-sliding-512x170
1131−kms_cursor_crc@cursor-random-512x170
1132−kms_cursor_crc@cursor-rapid-movement-512x170
1133−kms_cursor_crc@cursor-onscreen-max-size
1134−kms_cursor_crc@cursor-offscreen-max-size
1135−kms_cursor_crc@cursor-sliding-max-size
1136−kms_cursor_crc@cursor-random-max-size
1137−kms_cursor_crc@cursor-rapid-movement-max-size
1138−kms_cursor_legacy@single-bo
1139−kms_cursor_legacy@single-move
1140−kms_cursor_legacy@forked-bo
1141−kms_cursor_legacy@forked-move
1142−kms_cursor_legacy@torture-bo
1143−kms_cursor_legacy@torture-move
1144−kms_cursor_legacy@nonblocking-modeset-vs-cursor-atomic
1145−kms_cursor_legacy@long-nonblocking-modeset-vs-cursor-atomic
1146−kms_cursor_legacy@2x-flip-vs-cursor-legacy
1147−kms_cursor_legacy@2x-flip-vs-cursor-atomic
1148−kms_cursor_legacy@2x-long-flip-vs-cursor-legacy
1149−kms_cursor_legacy@2x-long-flip-vs-cursor-atomic
1150−kms_cursor_legacy@2x-nonblocking-modeset-vs-cursor-atomic
1151−kms_cursor_legacy@2x-long-nonblocking-modeset-vs-cursor-atomic
1152−kms_cursor_legacy@2x-cursor-vs-flip-legacy
1153−kms_cursor_legacy@2x-long-cursor-vs-flip-legacy
1154−kms_cursor_legacy@2x-cursor-vs-flip-atomic
1155−kms_cursor_legacy@2x-long-cursor-vs-flip-atomic
1156−kms_cursor_legacy@flip-vs-cursor-crc-legacy
1157−kms_cursor_legacy@flip-vs-cursor-crc-atomic
1158−kms_cursor_legacy@flip-vs-cursor-busy-crc-legacy
1159−kms_cursor_legacy@flip-vs-cursor-busy-crc-atomic
1160−kms_cursor_legacy@basic-flip-before-cursor-legacy
1161−kms_cursor_legacy@basic-busy-flip-before-cursor-legacy
1162−kms_cursor_legacy@basic-flip-after-cursor-legacy
1163−kms_cursor_legacy@basic-flip-before-cursor-varying-size
1164−kms_cursor_legacy@basic-busy-flip-before-cursor-varying-size
1165−kms_cursor_legacy@basic-flip-after-cursor-varying-size
1166−kms_cursor_legacy@short-flip-before-cursor-toggle
1167−kms_cursor_legacy@short-busy-flip-before-cursor-toggle
1168−kms_cursor_legacy@short-flip-after-cursor-toggle
1169−kms_cursor_legacy@basic-flip-before-cursor-atomic
1170−kms_cursor_legacy@basic-busy-flip-before-cursor-atomic
1171−kms_cursor_legacy@basic-flip-after-cursor-atomic
1172−kms_cursor_legacy@short-flip-before-cursor-atomic-transitions
1173−kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions
1174−kms_cursor_legacy@short-flip-after-cursor-atomic-transitions
1175−kms_cursor_legacy@short-flip-before-cursor-atomic-transitions-varying-size
1176−kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions-varying-size
1177−kms_cursor_legacy@short-flip-after-cursor-atomic-transitions-varying-size
1178−kms_cursor_legacy@cursor-vs-flip-legacy
1179−kms_cursor_legacy@flip-vs-cursor-legacy
1180−kms_cursor_legacy@cursorA-vs-flipA-legacy
1181−kms_cursor_legacy@cursorA-vs-flipB-legacy
1182−kms_cursor_legacy@cursorB-vs-flipA-legacy
1183−kms_cursor_legacy@cursorB-vs-flipB-legacy
1184−kms_cursor_legacy@cursor-vs-flip-varying-size
1185−kms_cursor_legacy@flip-vs-cursor-varying-size
1186−kms_cursor_legacy@cursorA-vs-flipA-varying-size
1187−kms_cursor_legacy@cursorA-vs-flipB-varying-size
1188−kms_cursor_legacy@cursorB-vs-flipA-varying-size
1189−kms_cursor_legacy@cursorB-vs-flipB-varying-size
1190−kms_cursor_legacy@cursor-vs-flip-toggle
1191−kms_cursor_legacy@flip-vs-cursor-toggle
1192−kms_cursor_legacy@cursorA-vs-flipA-toggle
1193−kms_cursor_legacy@cursorA-vs-flipB-toggle
1194−kms_cursor_legacy@cursorB-vs-flipA-toggle
1195−kms_cursor_legacy@cursorB-vs-flipB-toggle
1196−kms_cursor_legacy@cursor-vs-flip-atomic
1197−kms_cursor_legacy@flip-vs-cursor-atomic
1198−kms_cursor_legacy@cursorA-vs-flipA-atomic
1199−kms_cursor_legacy@cursorA-vs-flipB-atomic
1200−kms_cursor_legacy@cursorB-vs-flipA-atomic
1201−kms_cursor_legacy@cursorB-vs-flipB-atomic
1202−kms_cursor_legacy@cursor-vs-flip-atomic-transitions
1203−kms_cursor_legacy@flip-vs-cursor-atomic-transitions
1204−kms_cursor_legacy@cursorA-vs-flipA-atomic-transitions
1205−kms_cursor_legacy@cursorA-vs-flipB-atomic-transitions
1206−kms_cursor_legacy@cursorB-vs-flipA-atomic-transitions
1207−kms_cursor_legacy@cursorB-vs-flipB-atomic-transitions
1208−kms_cursor_legacy@cursor-vs-flip-atomic-transitions-varying-size
1209−kms_cursor_legacy@flip-vs-cursor-atomic-transitions-varying-size
1210−kms_cursor_legacy@cursorA-vs-flipA-atomic-transitions-varying-size
1211−kms_cursor_legacy@cursorA-vs-flipB-atomic-transitions-varying-size
1212−kms_cursor_legacy@cursorB-vs-flipA-atomic-transitions-varying-size
1213−kms_cursor_legacy@cursorB-vs-flipB-atomic-transitions-varying-size
1214−kms_dither@fb-8bpc-vs-panel-6bpc
1215−kms_dither@fb-8bpc-vs-panel-8bpc
1216−kms_dp_aux_dev
1217−kms_tiled_display@basic-test-pattern
1218−kms_tiled_display@basic-test-pattern-with-chamelium
1219−kms_draw_crc@draw-method-mmap-cpu
1220−kms_draw_crc@draw-method-mmap-gtt
1221−kms_draw_crc@draw-method-mmap-wc
1222−kms_draw_crc@draw-method-pwrite
1223−kms_draw_crc@draw-method-blt
1224−kms_draw_crc@draw-method-render
1225−kms_draw_crc@fill-fb
1226−kms_dsc@dsc-basic
1227−kms_dsc@dsc-with-formats
1228−kms_dsc@dsc-with-bpc
1229−kms_dsc@dsc-with-bpc-formats
1230−kms_dsc@dsc-with-output-formats
1231−kms_fbcon_fbt@fbc
1232−kms_fbcon_fbt@psr
1233−kms_fbcon_fbt@fbc-suspend
1234−kms_fbcon_fbt@psr-suspend
1235−kms_fence_pin_leak
1236−kms_flip@nonblocking-read
1237−kms_flip@wf_vblank-ts-check
1238−kms_flip@2x-wf_vblank-ts-check
1239−kms_flip@blocking-wf_vblank
1240−kms_flip@2x-blocking-wf_vblank
1241−kms_flip@absolute-wf_vblank
1242−kms_flip@2x-absolute-wf_vblank
1243−kms_flip@blocking-absolute-wf_vblank
1244−kms_flip@2x-blocking-absolute-wf_vblank
1245−kms_flip@basic-plain-flip
1246−kms_flip@2x-plain-flip
1247−kms_flip@busy-flip
1248−kms_flip@2x-busy-flip
1249−kms_flip@flip-vs-fences
1250−kms_flip@2x-flip-vs-fences
1251−kms_flip@plain-flip-ts-check
1252−kms_flip@2x-plain-flip-ts-check
1253−kms_flip@plain-flip-fb-recreate
1254−kms_flip@2x-plain-flip-fb-recreate
1255−kms_flip@flip-vs-rmfb
1256−kms_flip@2x-flip-vs-rmfb
1257−kms_flip@basic-flip-vs-dpms
1258−kms_flip@2x-flip-vs-dpms
1259−kms_flip@flip-vs-panning
1260−kms_flip@2x-flip-vs-panning
1261−kms_flip@basic-flip-vs-modeset
1262−kms_flip@2x-flip-vs-modeset
1263−kms_flip@flip-vs-expired-vblank
1264−kms_flip@2x-flip-vs-expired-vblank
1265−kms_flip@flip-vs-absolute-wf_vblank
1266−kms_flip@2x-flip-vs-absolute-wf_vblank
1267−kms_flip@basic-flip-vs-wf_vblank
1268−kms_flip@2x-flip-vs-wf_vblank
1269−kms_flip@flip-vs-blocking-wf-vblank
1270−kms_flip@2x-flip-vs-blocking-wf-vblank
1271−kms_flip@flip-vs-modeset-vs-hang
1272−kms_flip@2x-flip-vs-modeset-vs-hang
1273−kms_flip@flip-vs-panning-vs-hang
1274−kms_flip@2x-flip-vs-panning-vs-hang
1275−kms_flip@flip-vs-dpms-off-vs-modeset
1276−kms_flip@2x-flip-vs-dpms-off-vs-modeset
1277−kms_flip@single-buffer-flip-vs-dpms-off-vs-modeset
1278−kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset
1279−kms_flip@dpms-off-confusion
1280−kms_flip@nonexisting-fb
1281−kms_flip@2x-nonexisting-fb
1282−kms_flip@dpms-vs-vblank-race
1283−kms_flip@2x-dpms-vs-vblank-race
1284−kms_flip@modeset-vs-vblank-race
1285−kms_flip@2x-modeset-vs-vblank-race
1286−kms_flip@bo-too-big
1287−kms_flip@flip-vs-suspend
1288−kms_flip@2x-flip-vs-suspend
1289−kms_flip@wf_vblank-ts-check-interruptible
1290−kms_flip@2x-wf_vblank-ts-check-interruptible
1291−kms_flip@absolute-wf_vblank-interruptible
1292−kms_flip@2x-absolute-wf_vblank-interruptible
1293−kms_flip@blocking-absolute-wf_vblank-interruptible
1294−kms_flip@2x-blocking-absolute-wf_vblank-interruptible
1295−kms_flip@plain-flip-interruptible
1296−kms_flip@2x-plain-flip-interruptible
1297−kms_flip@flip-vs-fences-interruptible
1298−kms_flip@2x-flip-vs-fences-interruptible
1299−kms_flip@plain-flip-ts-check-interruptible
1300−kms_flip@2x-plain-flip-ts-check-interruptible
1301−kms_flip@plain-flip-fb-recreate-interruptible
1302−kms_flip@2x-plain-flip-fb-recreate-interruptible
1303−kms_flip@flip-vs-rmfb-interruptible
1304−kms_flip@2x-flip-vs-rmfb-interruptible
1305−kms_flip@flip-vs-panning-interruptible
1306−kms_flip@2x-flip-vs-panning-interruptible
1307−kms_flip@flip-vs-expired-vblank-interruptible
1308−kms_flip@2x-flip-vs-expired-vblank-interruptible
1309−kms_flip@flip-vs-absolute-wf_vblank-interruptible
1310−kms_flip@2x-flip-vs-absolute-wf_vblank-interruptible
1311−kms_flip@flip-vs-wf_vblank-interruptible
1312−kms_flip@2x-flip-vs-wf_vblank-interruptible
1313−kms_flip@flip-vs-dpms-off-vs-modeset-interruptible
1314−kms_flip@2x-flip-vs-dpms-off-vs-modeset-interruptible
1315−kms_flip@single-buffer-flip-vs-dpms-off-vs-modeset-interruptible
1316−kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset-interruptible
1317−kms_flip@dpms-off-confusion-interruptible
1318−kms_flip@nonexisting-fb-interruptible
1319−kms_flip@2x-nonexisting-fb-interruptible
1320−kms_flip@dpms-vs-vblank-race-interruptible
1321−kms_flip@2x-dpms-vs-vblank-race-interruptible
1322−kms_flip@modeset-vs-vblank-race-interruptible
1323−kms_flip@2x-modeset-vs-vblank-race-interruptible
1324−kms_flip@bo-too-big-interruptible
1325−kms_flip@flip-vs-suspend-interruptible
1326−kms_flip@2x-flip-vs-suspend-interruptible
1327−kms_flip_event_leak@basic
1328−kms_flip_scaled_crc@flip-32bpp-ytile-to-64bpp-ytile-downscaling
1329−kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-downscaling
1330−kms_flip_scaled_crc@flip-32bpp-xtile-to-64bpp-xtile-downscaling
1331−kms_flip_scaled_crc@flip-32bpp-4tile-to-64bpp-4tile-downscaling
1332−kms_flip_scaled_crc@flip-32bpp-linear-to-64bpp-linear-downscaling
1333−kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-downscaling
1334−kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-downscaling
1335−kms_flip_scaled_crc@flip-64bpp-xtile-to-32bpp-xtile-downscaling
1336−kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tile-downscaling
1337−kms_flip_scaled_crc@flip-64bpp-linear-to-32bpp-linear-downscaling
1338−kms_flip_scaled_crc@flip-64bpp-ytile-to-16bpp-ytile-downscaling
1339−kms_flip_scaled_crc@flip-64bpp-yftile-to-16bpp-yftile-downscaling
1340−kms_flip_scaled_crc@flip-64bpp-xtile-to-16bpp-xtile-downscaling
1341−kms_flip_scaled_crc@flip-64bpp-4tile-to-16bpp-4tile-downscaling
1342−kms_flip_scaled_crc@flip-64bpp-linear-to-16bpp-linear-downscaling
1343−kms_flip_scaled_crc@flip-32bpp-ytileccs-to-64bpp-ytile-downscaling
1344−kms_flip_scaled_crc@flip-32bpp-yftileccs-to-64bpp-yftile-downscaling
1345−kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-downscaling
1346−kms_flip_scaled_crc@flip-32bpp-4tile-to-32bpp-4tiledg2rcccs-downscaling
1347−kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-downscaling
1348−kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-downscaling
1349−kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilercccs-downscaling
1350−kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-downscaling
1351−kms_flip_scaled_crc@flip-32bpp-ytile-to-64bpp-ytile-upscaling
1352−kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-upscaling
1353−kms_flip_scaled_crc@flip-32bpp-xtile-to-64bpp-xtile-upscaling
1354−kms_flip_scaled_crc@flip-32bpp-4tile-to-64bpp-4tile-upscaling
1355−kms_flip_scaled_crc@flip-32bpp-linear-to-64bpp-linear-upscaling
1356−kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-upscaling
1357−kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-upscaling
1358−kms_flip_scaled_crc@flip-64bpp-xtile-to-32bpp-xtile-upscaling
1359−kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tile-upscaling
1360−kms_flip_scaled_crc@flip-64bpp-linear-to-32bpp-linear-upscaling
1361−kms_flip_scaled_crc@flip-64bpp-ytile-to-16bpp-ytile-upscaling
1362−kms_flip_scaled_crc@flip-64bpp-yftile-to-16bpp-yftile-upscaling
1363−kms_flip_scaled_crc@flip-64bpp-xtile-to-16bpp-xtile-upscaling
1364−kms_flip_scaled_crc@flip-64bpp-4tile-to-16bpp-4tile-upscaling
1365−kms_flip_scaled_crc@flip-64bpp-linear-to-16bpp-linear-upscaling
1366−kms_flip_scaled_crc@flip-32bpp-ytileccs-to-64bpp-ytile-upscaling
1367−kms_flip_scaled_crc@flip-32bpp-yftileccs-to-64bpp-yftile-upscaling
1368−kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling
1369−kms_flip_scaled_crc@flip-32bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling
1370−kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling
1371−kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-upscaling
1372−kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling
1373−kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling
1374−kms_force_connector_basic@force-load-detect
1375−kms_force_connector_basic@force-connector-state
1376−kms_force_connector_basic@force-edid
1377−kms_force_connector_basic@prune-stale-modes
1378−kms_frontbuffer_tracking@fbc-1p-rte
1379−kms_frontbuffer_tracking@fbc-2p-rte
1380−kms_frontbuffer_tracking@psr-1p-rte
1381−kms_frontbuffer_tracking@psr-2p-rte
1382−kms_frontbuffer_tracking@fbcpsr-1p-rte
1383−kms_frontbuffer_tracking@fbcpsr-2p-rte
1384−kms_frontbuffer_tracking@drrs-1p-rte
1385−kms_frontbuffer_tracking@drrs-2p-rte
1386−kms_frontbuffer_tracking@fbcdrrs-1p-rte
1387−kms_frontbuffer_tracking@fbcdrrs-2p-rte
1388−kms_frontbuffer_tracking@psrdrrs-1p-rte
1389−kms_frontbuffer_tracking@psrdrrs-2p-rte
1390−kms_frontbuffer_tracking@fbcpsrdrrs-1p-rte
1391−kms_frontbuffer_tracking@fbcpsrdrrs-2p-rte
1392−kms_frontbuffer_tracking@fbc-1p-primscrn-pri-indfb-draw-mmap-cpu
1393−kms_frontbuffer_tracking@fbc-1p-primscrn-pri-indfb-draw-mmap-gtt
1394−kms_frontbuffer_tracking@fbc-1p-primscrn-pri-indfb-draw-mmap-wc
1395−kms_frontbuffer_tracking@fbc-1p-primscrn-pri-indfb-draw-pwrite
1396−kms_frontbuffer_tracking@fbc-1p-primscrn-pri-indfb-draw-blt
1397−kms_frontbuffer_tracking@fbc-1p-primscrn-pri-indfb-draw-render
1398−kms_frontbuffer_tracking@fbc-1p-primscrn-pri-shrfb-draw-mmap-cpu
1399−kms_frontbuffer_tracking@fbc-1p-primscrn-pri-shrfb-draw-mmap-gtt
1400−kms_frontbuffer_tracking@fbc-1p-primscrn-pri-shrfb-draw-mmap-wc
1401−kms_frontbuffer_tracking@fbc-1p-primscrn-pri-shrfb-draw-pwrite
1402−kms_frontbuffer_tracking@fbc-1p-primscrn-pri-shrfb-draw-blt
1403−kms_frontbuffer_tracking@fbc-1p-primscrn-pri-shrfb-draw-render
1404−kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-mmap-cpu
1405−kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-mmap-gtt
1406−kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-mmap-wc
1407−kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-pwrite
1408−kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-blt
1409−kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-render
1410−kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-mmap-cpu
1411−kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-mmap-gtt
1412−kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-mmap-wc
1413−kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-pwrite
1414−kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-blt
1415−kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-render
1416−kms_frontbuffer_tracking@fbc-1p-offscren-pri-indfb-draw-mmap-cpu
1417−kms_frontbuffer_tracking@fbc-1p-offscren-pri-indfb-draw-mmap-gtt
1418−kms_frontbuffer_tracking@fbc-1p-offscren-pri-indfb-draw-mmap-wc
1419−kms_frontbuffer_tracking@fbc-1p-offscren-pri-indfb-draw-pwrite
1420−kms_frontbuffer_tracking@fbc-1p-offscren-pri-indfb-draw-blt
1421−kms_frontbuffer_tracking@fbc-1p-offscren-pri-indfb-draw-render
1422−kms_frontbuffer_tracking@fbc-1p-offscren-pri-shrfb-draw-mmap-cpu
1423−kms_frontbuffer_tracking@fbc-1p-offscren-pri-shrfb-draw-mmap-gtt
1424−kms_frontbuffer_tracking@fbc-1p-offscren-pri-shrfb-draw-mmap-wc
1425−kms_frontbuffer_tracking@fbc-1p-offscren-pri-shrfb-draw-pwrite
1426−kms_frontbuffer_tracking@fbc-1p-offscren-pri-shrfb-draw-blt
1427−kms_frontbuffer_tracking@fbc-1p-offscren-pri-shrfb-draw-render
1428−kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-cpu
1429−kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-gtt
1430−kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-wc
1431−kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-pwrite
1432−kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-blt
1433−kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-render
1434−kms_frontbuffer_tracking@fbc-2p-primscrn-pri-shrfb-draw-mmap-cpu
1435−kms_frontbuffer_tracking@fbc-2p-primscrn-pri-shrfb-draw-mmap-gtt
1436−kms_frontbuffer_tracking@fbc-2p-primscrn-pri-shrfb-draw-mmap-wc
1437−kms_frontbuffer_tracking@fbc-2p-primscrn-pri-shrfb-draw-pwrite
1438−kms_frontbuffer_tracking@fbc-2p-primscrn-pri-shrfb-draw-blt
1439−kms_frontbuffer_tracking@fbc-2p-primscrn-pri-shrfb-draw-render
1440−kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-mmap-cpu
1441−kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-mmap-gtt
1442−kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-mmap-wc
1443−kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-pwrite
1444−kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-blt
1445−kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-render
1446−kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-mmap-cpu
1447−kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-mmap-gtt
1448−kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-mmap-wc
1449−kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-pwrite
1450−kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-blt
1451−kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-render
1452−kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-indfb-draw-mmap-cpu
1453−kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-indfb-draw-mmap-gtt
1454−kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-indfb-draw-mmap-wc
1455−kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-indfb-draw-pwrite
1456−kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-indfb-draw-blt
1457−kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-indfb-draw-render
1458−kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-shrfb-draw-mmap-cpu
1459−kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-shrfb-draw-mmap-gtt
1460−kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-shrfb-draw-mmap-wc
1461−kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-shrfb-draw-pwrite
1462−kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-shrfb-draw-blt
1463−kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-shrfb-draw-render
1464−kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-draw-mmap-cpu
1465−kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-draw-mmap-gtt
1466−kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-draw-mmap-wc
1467−kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-draw-pwrite
1468−kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-draw-blt
1469−kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-draw-render
1470−kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-mmap-cpu
1471−kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-mmap-gtt
1472−kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-mmap-wc
1473−kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-pwrite
1474−kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-blt
1475−kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-render
1476−kms_frontbuffer_tracking@psr-1p-primscrn-pri-indfb-draw-mmap-cpu
1477−kms_frontbuffer_tracking@psr-1p-primscrn-pri-indfb-draw-mmap-gtt
1478−kms_frontbuffer_tracking@psr-1p-primscrn-pri-indfb-draw-mmap-wc
1479−kms_frontbuffer_tracking@psr-1p-primscrn-pri-indfb-draw-pwrite
1480−kms_frontbuffer_tracking@psr-1p-primscrn-pri-indfb-draw-blt
1481−kms_frontbuffer_tracking@psr-1p-primscrn-pri-indfb-draw-render
1482−kms_frontbuffer_tracking@psr-1p-primscrn-pri-shrfb-draw-mmap-cpu
1483−kms_frontbuffer_tracking@psr-1p-primscrn-pri-shrfb-draw-mmap-gtt
1484−kms_frontbuffer_tracking@psr-1p-primscrn-pri-shrfb-draw-mmap-wc
1485−kms_frontbuffer_tracking@psr-1p-primscrn-pri-shrfb-draw-pwrite
1486−kms_frontbuffer_tracking@psr-1p-primscrn-pri-shrfb-draw-blt
1487−kms_frontbuffer_tracking@psr-1p-primscrn-pri-shrfb-draw-render
1488−kms_frontbuffer_tracking@psr-1p-primscrn-cur-indfb-draw-mmap-cpu
1489−kms_frontbuffer_tracking@psr-1p-primscrn-cur-indfb-draw-mmap-gtt
1490−kms_frontbuffer_tracking@psr-1p-primscrn-cur-indfb-draw-mmap-wc
1491−kms_frontbuffer_tracking@psr-1p-primscrn-cur-indfb-draw-pwrite
1492−kms_frontbuffer_tracking@psr-1p-primscrn-cur-indfb-draw-blt
1493−kms_frontbuffer_tracking@psr-1p-primscrn-cur-indfb-draw-render
1494−kms_frontbuffer_tracking@psr-1p-primscrn-spr-indfb-draw-mmap-cpu
1495−kms_frontbuffer_tracking@psr-1p-primscrn-spr-indfb-draw-mmap-gtt
1496−kms_frontbuffer_tracking@psr-1p-primscrn-spr-indfb-draw-mmap-wc
1497−kms_frontbuffer_tracking@psr-1p-primscrn-spr-indfb-draw-pwrite
1498−kms_frontbuffer_tracking@psr-1p-primscrn-spr-indfb-draw-blt
1499−kms_frontbuffer_tracking@psr-1p-primscrn-spr-indfb-draw-render
1500−kms_frontbuffer_tracking@psr-1p-offscren-pri-indfb-draw-mmap-cpu
1501−kms_frontbuffer_tracking@psr-1p-offscren-pri-indfb-draw-mmap-gtt
1502−kms_frontbuffer_tracking@psr-1p-offscren-pri-indfb-draw-mmap-wc
1503−kms_frontbuffer_tracking@psr-1p-offscren-pri-indfb-draw-pwrite
1504−kms_frontbuffer_tracking@psr-1p-offscren-pri-indfb-draw-blt
1505−kms_frontbuffer_tracking@psr-1p-offscren-pri-indfb-draw-render
1506−kms_frontbuffer_tracking@psr-1p-offscren-pri-shrfb-draw-mmap-cpu
1507−kms_frontbuffer_tracking@psr-1p-offscren-pri-shrfb-draw-mmap-gtt
1508−kms_frontbuffer_tracking@psr-1p-offscren-pri-shrfb-draw-mmap-wc
1509−kms_frontbuffer_tracking@psr-1p-offscren-pri-shrfb-draw-pwrite
1510−kms_frontbuffer_tracking@psr-1p-offscren-pri-shrfb-draw-blt
1511−kms_frontbuffer_tracking@psr-1p-offscren-pri-shrfb-draw-render
1512−kms_frontbuffer_tracking@psr-2p-primscrn-pri-indfb-draw-mmap-cpu
1513−kms_frontbuffer_tracking@psr-2p-primscrn-pri-indfb-draw-mmap-gtt
1514−kms_frontbuffer_tracking@psr-2p-primscrn-pri-indfb-draw-mmap-wc
1515−kms_frontbuffer_tracking@psr-2p-primscrn-pri-indfb-draw-pwrite
1516−kms_frontbuffer_tracking@psr-2p-primscrn-pri-indfb-draw-blt
1517−kms_frontbuffer_tracking@psr-2p-primscrn-pri-indfb-draw-render
1518−kms_frontbuffer_tracking@psr-2p-primscrn-pri-shrfb-draw-mmap-cpu
1519−kms_frontbuffer_tracking@psr-2p-primscrn-pri-shrfb-draw-mmap-gtt
1520−kms_frontbuffer_tracking@psr-2p-primscrn-pri-shrfb-draw-mmap-wc
1521−kms_frontbuffer_tracking@psr-2p-primscrn-pri-shrfb-draw-pwrite
1522−kms_frontbuffer_tracking@psr-2p-primscrn-pri-shrfb-draw-blt
1523−kms_frontbuffer_tracking@psr-2p-primscrn-pri-shrfb-draw-render
1524−kms_frontbuffer_tracking@psr-2p-primscrn-cur-indfb-draw-mmap-cpu
1525−kms_frontbuffer_tracking@psr-2p-primscrn-cur-indfb-draw-mmap-gtt
1526−kms_frontbuffer_tracking@psr-2p-primscrn-cur-indfb-draw-mmap-wc
1527−kms_frontbuffer_tracking@psr-2p-primscrn-cur-indfb-draw-pwrite
1528−kms_frontbuffer_tracking@psr-2p-primscrn-cur-indfb-draw-blt
1529−kms_frontbuffer_tracking@psr-2p-primscrn-cur-indfb-draw-render
1530−kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-draw-mmap-cpu
1531−kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-draw-mmap-gtt
1532−kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-draw-mmap-wc
1533−kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-draw-pwrite
1534−kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-draw-blt
1535−kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-draw-render
1536−kms_frontbuffer_tracking@psr-2p-scndscrn-pri-indfb-draw-mmap-cpu
1537−kms_frontbuffer_tracking@psr-2p-scndscrn-pri-indfb-draw-mmap-gtt
1538−kms_frontbuffer_tracking@psr-2p-scndscrn-pri-indfb-draw-mmap-wc
1539−kms_frontbuffer_tracking@psr-2p-scndscrn-pri-indfb-draw-pwrite
1540−kms_frontbuffer_tracking@psr-2p-scndscrn-pri-indfb-draw-blt
1541−kms_frontbuffer_tracking@psr-2p-scndscrn-pri-indfb-draw-render
1542−kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-mmap-cpu
1543−kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-mmap-gtt
1544−kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-mmap-wc
1545−kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-pwrite
1546−kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-blt
1547−kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-render
1548−kms_frontbuffer_tracking@psr-2p-scndscrn-cur-indfb-draw-mmap-cpu
1549−kms_frontbuffer_tracking@psr-2p-scndscrn-cur-indfb-draw-mmap-gtt
1550−kms_frontbuffer_tracking@psr-2p-scndscrn-cur-indfb-draw-mmap-wc
1551−kms_frontbuffer_tracking@psr-2p-scndscrn-cur-indfb-draw-pwrite
1552−kms_frontbuffer_tracking@psr-2p-scndscrn-cur-indfb-draw-blt
1553−kms_frontbuffer_tracking@psr-2p-scndscrn-cur-indfb-draw-render
1554−kms_frontbuffer_tracking@psr-2p-scndscrn-spr-indfb-draw-mmap-cpu
1555−kms_frontbuffer_tracking@psr-2p-scndscrn-spr-indfb-draw-mmap-gtt
1556−kms_frontbuffer_tracking@psr-2p-scndscrn-spr-indfb-draw-mmap-wc
1557−kms_frontbuffer_tracking@psr-2p-scndscrn-spr-indfb-draw-pwrite
1558−kms_frontbuffer_tracking@psr-2p-scndscrn-spr-indfb-draw-blt
1559−kms_frontbuffer_tracking@psr-2p-scndscrn-spr-indfb-draw-render
1560−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-mmap-cpu
1561−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-mmap-gtt
1562−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-mmap-wc
1563−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-pwrite
1564−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-blt
1565−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-render
1566−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-shrfb-draw-mmap-cpu
1567−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-shrfb-draw-mmap-gtt
1568−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-shrfb-draw-mmap-wc
1569−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-shrfb-draw-pwrite
1570−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-shrfb-draw-blt
1571−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-shrfb-draw-render
1572−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-cur-indfb-draw-mmap-cpu
1573−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-cur-indfb-draw-mmap-gtt
1574−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-cur-indfb-draw-mmap-wc
1575−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-cur-indfb-draw-pwrite
1576−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-cur-indfb-draw-blt
1577−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-cur-indfb-draw-render
1578−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-mmap-cpu
1579−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-mmap-gtt
1580−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-mmap-wc
1581−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-pwrite
1582−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-blt
1583−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-render
1584−kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-indfb-draw-mmap-cpu
1585−kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-indfb-draw-mmap-gtt
1586−kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-indfb-draw-mmap-wc
1587−kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-indfb-draw-pwrite
1588−kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-indfb-draw-blt
1589−kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-indfb-draw-render
1590−kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-shrfb-draw-mmap-cpu
1591−kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-shrfb-draw-mmap-gtt
1592−kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-shrfb-draw-mmap-wc
1593−kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-shrfb-draw-pwrite
1594−kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-shrfb-draw-blt
1595−kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-shrfb-draw-render
1596−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-mmap-cpu
1597−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-mmap-gtt
1598−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-mmap-wc
1599−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-pwrite
1600−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-blt
1601−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-render
1602−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-shrfb-draw-mmap-cpu
1603−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-shrfb-draw-mmap-gtt
1604−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-shrfb-draw-mmap-wc
1605−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-shrfb-draw-pwrite
1606−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-shrfb-draw-blt
1607−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-shrfb-draw-render
1608−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-cur-indfb-draw-mmap-cpu
1609−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-cur-indfb-draw-mmap-gtt
1610−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-cur-indfb-draw-mmap-wc
1611−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-cur-indfb-draw-pwrite
1612−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-cur-indfb-draw-blt
1613−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-cur-indfb-draw-render
1614−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-draw-mmap-cpu
1615−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-draw-mmap-gtt
1616−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-draw-mmap-wc
1617−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-draw-pwrite
1618−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-draw-blt
1619−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-draw-render
1620−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-indfb-draw-mmap-cpu
1621−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-indfb-draw-mmap-gtt
1622−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-indfb-draw-mmap-wc
1623−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-indfb-draw-pwrite
1624−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-indfb-draw-blt
1625−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-indfb-draw-render
1626−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-shrfb-draw-mmap-cpu
1627−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-shrfb-draw-mmap-gtt
1628−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-shrfb-draw-mmap-wc
1629−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-shrfb-draw-pwrite
1630−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-shrfb-draw-blt
1631−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-shrfb-draw-render
1632−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-mmap-cpu
1633−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-mmap-gtt
1634−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-mmap-wc
1635−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-pwrite
1636−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-blt
1637−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-render
1638−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-spr-indfb-draw-mmap-cpu
1639−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-spr-indfb-draw-mmap-gtt
1640−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-spr-indfb-draw-mmap-wc
1641−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-spr-indfb-draw-pwrite
1642−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-spr-indfb-draw-blt
1643−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-spr-indfb-draw-render
1644−kms_frontbuffer_tracking@drrs-1p-primscrn-pri-indfb-draw-mmap-cpu
1645−kms_frontbuffer_tracking@drrs-1p-primscrn-pri-indfb-draw-mmap-gtt
1646−kms_frontbuffer_tracking@drrs-1p-primscrn-pri-indfb-draw-mmap-wc
1647−kms_frontbuffer_tracking@drrs-1p-primscrn-pri-indfb-draw-pwrite
1648−kms_frontbuffer_tracking@drrs-1p-primscrn-pri-indfb-draw-blt
1649−kms_frontbuffer_tracking@drrs-1p-primscrn-pri-indfb-draw-render
1650−kms_frontbuffer_tracking@drrs-1p-primscrn-pri-shrfb-draw-mmap-cpu
1651−kms_frontbuffer_tracking@drrs-1p-primscrn-pri-shrfb-draw-mmap-gtt
1652−kms_frontbuffer_tracking@drrs-1p-primscrn-pri-shrfb-draw-mmap-wc
1653−kms_frontbuffer_tracking@drrs-1p-primscrn-pri-shrfb-draw-pwrite
1654−kms_frontbuffer_tracking@drrs-1p-primscrn-pri-shrfb-draw-blt
1655−kms_frontbuffer_tracking@drrs-1p-primscrn-pri-shrfb-draw-render
1656−kms_frontbuffer_tracking@drrs-1p-primscrn-cur-indfb-draw-mmap-cpu
1657−kms_frontbuffer_tracking@drrs-1p-primscrn-cur-indfb-draw-mmap-gtt
1658−kms_frontbuffer_tracking@drrs-1p-primscrn-cur-indfb-draw-mmap-wc
1659−kms_frontbuffer_tracking@drrs-1p-primscrn-cur-indfb-draw-pwrite
1660−kms_frontbuffer_tracking@drrs-1p-primscrn-cur-indfb-draw-blt
1661−kms_frontbuffer_tracking@drrs-1p-primscrn-cur-indfb-draw-render
1662−kms_frontbuffer_tracking@drrs-1p-primscrn-spr-indfb-draw-mmap-cpu
1663−kms_frontbuffer_tracking@drrs-1p-primscrn-spr-indfb-draw-mmap-gtt
1664−kms_frontbuffer_tracking@drrs-1p-primscrn-spr-indfb-draw-mmap-wc
1665−kms_frontbuffer_tracking@drrs-1p-primscrn-spr-indfb-draw-pwrite
1666−kms_frontbuffer_tracking@drrs-1p-primscrn-spr-indfb-draw-blt
1667−kms_frontbuffer_tracking@drrs-1p-primscrn-spr-indfb-draw-render
1668−kms_frontbuffer_tracking@drrs-1p-offscren-pri-indfb-draw-mmap-cpu
1669−kms_frontbuffer_tracking@drrs-1p-offscren-pri-indfb-draw-mmap-gtt
1670−kms_frontbuffer_tracking@drrs-1p-offscren-pri-indfb-draw-mmap-wc
1671−kms_frontbuffer_tracking@drrs-1p-offscren-pri-indfb-draw-pwrite
1672−kms_frontbuffer_tracking@drrs-1p-offscren-pri-indfb-draw-blt
1673−kms_frontbuffer_tracking@drrs-1p-offscren-pri-indfb-draw-render
1674−kms_frontbuffer_tracking@drrs-1p-offscren-pri-shrfb-draw-mmap-cpu
1675−kms_frontbuffer_tracking@drrs-1p-offscren-pri-shrfb-draw-mmap-gtt
1676−kms_frontbuffer_tracking@drrs-1p-offscren-pri-shrfb-draw-mmap-wc
1677−kms_frontbuffer_tracking@drrs-1p-offscren-pri-shrfb-draw-pwrite
1678−kms_frontbuffer_tracking@drrs-1p-offscren-pri-shrfb-draw-blt
1679−kms_frontbuffer_tracking@drrs-1p-offscren-pri-shrfb-draw-render
1680−kms_frontbuffer_tracking@drrs-2p-primscrn-pri-indfb-draw-mmap-cpu
1681−kms_frontbuffer_tracking@drrs-2p-primscrn-pri-indfb-draw-mmap-gtt
1682−kms_frontbuffer_tracking@drrs-2p-primscrn-pri-indfb-draw-mmap-wc
1683−kms_frontbuffer_tracking@drrs-2p-primscrn-pri-indfb-draw-pwrite
1684−kms_frontbuffer_tracking@drrs-2p-primscrn-pri-indfb-draw-blt
1685−kms_frontbuffer_tracking@drrs-2p-primscrn-pri-indfb-draw-render
1686−kms_frontbuffer_tracking@drrs-2p-primscrn-pri-shrfb-draw-mmap-cpu
1687−kms_frontbuffer_tracking@drrs-2p-primscrn-pri-shrfb-draw-mmap-gtt
1688−kms_frontbuffer_tracking@drrs-2p-primscrn-pri-shrfb-draw-mmap-wc
1689−kms_frontbuffer_tracking@drrs-2p-primscrn-pri-shrfb-draw-pwrite
1690−kms_frontbuffer_tracking@drrs-2p-primscrn-pri-shrfb-draw-blt
1691−kms_frontbuffer_tracking@drrs-2p-primscrn-pri-shrfb-draw-render
1692−kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-draw-mmap-cpu
1693−kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-draw-mmap-gtt
1694−kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-draw-mmap-wc
1695−kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-draw-pwrite
1696−kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-draw-blt
1697−kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-draw-render
1698−kms_frontbuffer_tracking@drrs-2p-primscrn-spr-indfb-draw-mmap-cpu
1699−kms_frontbuffer_tracking@drrs-2p-primscrn-spr-indfb-draw-mmap-gtt
1700−kms_frontbuffer_tracking@drrs-2p-primscrn-spr-indfb-draw-mmap-wc
1701−kms_frontbuffer_tracking@drrs-2p-primscrn-spr-indfb-draw-pwrite
1702−kms_frontbuffer_tracking@drrs-2p-primscrn-spr-indfb-draw-blt
1703−kms_frontbuffer_tracking@drrs-2p-primscrn-spr-indfb-draw-render
1704−kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-indfb-draw-mmap-cpu
1705−kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-indfb-draw-mmap-gtt
1706−kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-indfb-draw-mmap-wc
1707−kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-indfb-draw-pwrite
1708−kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-indfb-draw-blt
1709−kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-indfb-draw-render
1710−kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-shrfb-draw-mmap-cpu
1711−kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-shrfb-draw-mmap-gtt
1712−kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-shrfb-draw-mmap-wc
1713−kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-shrfb-draw-pwrite
1714−kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-shrfb-draw-blt
1715−kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-shrfb-draw-render
1716−kms_frontbuffer_tracking@drrs-2p-scndscrn-cur-indfb-draw-mmap-cpu
1717−kms_frontbuffer_tracking@drrs-2p-scndscrn-cur-indfb-draw-mmap-gtt
1718−kms_frontbuffer_tracking@drrs-2p-scndscrn-cur-indfb-draw-mmap-wc
1719−kms_frontbuffer_tracking@drrs-2p-scndscrn-cur-indfb-draw-pwrite
1720−kms_frontbuffer_tracking@drrs-2p-scndscrn-cur-indfb-draw-blt
1721−kms_frontbuffer_tracking@drrs-2p-scndscrn-cur-indfb-draw-render
1722−kms_frontbuffer_tracking@drrs-2p-scndscrn-spr-indfb-draw-mmap-cpu
1723−kms_frontbuffer_tracking@drrs-2p-scndscrn-spr-indfb-draw-mmap-gtt
1724−kms_frontbuffer_tracking@drrs-2p-scndscrn-spr-indfb-draw-mmap-wc
1725−kms_frontbuffer_tracking@drrs-2p-scndscrn-spr-indfb-draw-pwrite
1726−kms_frontbuffer_tracking@drrs-2p-scndscrn-spr-indfb-draw-blt
1727−kms_frontbuffer_tracking@drrs-2p-scndscrn-spr-indfb-draw-render
1728−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-pri-indfb-draw-mmap-cpu
1729−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-pri-indfb-draw-mmap-gtt
1730−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-pri-indfb-draw-mmap-wc
1731−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-pri-indfb-draw-pwrite
1732−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-pri-indfb-draw-blt
1733−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-pri-indfb-draw-render
1734−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-pri-shrfb-draw-mmap-cpu
1735−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-pri-shrfb-draw-mmap-gtt
1736−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-pri-shrfb-draw-mmap-wc
1737−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-pri-shrfb-draw-pwrite
1738−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-pri-shrfb-draw-blt
1739−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-pri-shrfb-draw-render
1740−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-cur-indfb-draw-mmap-cpu
1741−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-cur-indfb-draw-mmap-gtt
1742−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-cur-indfb-draw-mmap-wc
1743−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-cur-indfb-draw-pwrite
1744−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-cur-indfb-draw-blt
1745−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-cur-indfb-draw-render
1746−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-spr-indfb-draw-mmap-cpu
1747−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-spr-indfb-draw-mmap-gtt
1748−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-spr-indfb-draw-mmap-wc
1749−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-spr-indfb-draw-pwrite
1750−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-spr-indfb-draw-blt
1751−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-spr-indfb-draw-render
1752−kms_frontbuffer_tracking@fbcdrrs-1p-offscren-pri-indfb-draw-mmap-cpu
1753−kms_frontbuffer_tracking@fbcdrrs-1p-offscren-pri-indfb-draw-mmap-gtt
1754−kms_frontbuffer_tracking@fbcdrrs-1p-offscren-pri-indfb-draw-mmap-wc
1755−kms_frontbuffer_tracking@fbcdrrs-1p-offscren-pri-indfb-draw-pwrite
1756−kms_frontbuffer_tracking@fbcdrrs-1p-offscren-pri-indfb-draw-blt
1757−kms_frontbuffer_tracking@fbcdrrs-1p-offscren-pri-indfb-draw-render
1758−kms_frontbuffer_tracking@fbcdrrs-1p-offscren-pri-shrfb-draw-mmap-cpu
1759−kms_frontbuffer_tracking@fbcdrrs-1p-offscren-pri-shrfb-draw-mmap-gtt
1760−kms_frontbuffer_tracking@fbcdrrs-1p-offscren-pri-shrfb-draw-mmap-wc
1761−kms_frontbuffer_tracking@fbcdrrs-1p-offscren-pri-shrfb-draw-pwrite
1762−kms_frontbuffer_tracking@fbcdrrs-1p-offscren-pri-shrfb-draw-blt
1763−kms_frontbuffer_tracking@fbcdrrs-1p-offscren-pri-shrfb-draw-render
1764−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-pri-indfb-draw-mmap-cpu
1765−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-pri-indfb-draw-mmap-gtt
1766−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-pri-indfb-draw-mmap-wc
1767−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-pri-indfb-draw-pwrite
1768−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-pri-indfb-draw-blt
1769−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-pri-indfb-draw-render
1770−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-pri-shrfb-draw-mmap-cpu
1771−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-pri-shrfb-draw-mmap-gtt
1772−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-pri-shrfb-draw-mmap-wc
1773−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-pri-shrfb-draw-pwrite
1774−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-pri-shrfb-draw-blt
1775−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-pri-shrfb-draw-render
1776−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-cur-indfb-draw-mmap-cpu
1777−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-cur-indfb-draw-mmap-gtt
1778−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-cur-indfb-draw-mmap-wc
1779−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-cur-indfb-draw-pwrite
1780−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-cur-indfb-draw-blt
1781−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-cur-indfb-draw-render
1782−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-spr-indfb-draw-mmap-cpu
1783−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-spr-indfb-draw-mmap-gtt
1784−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-spr-indfb-draw-mmap-wc
1785−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-spr-indfb-draw-pwrite
1786−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-spr-indfb-draw-blt
1787−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-spr-indfb-draw-render
1788−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-pri-indfb-draw-mmap-cpu
1789−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-pri-indfb-draw-mmap-gtt
1790−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-pri-indfb-draw-mmap-wc
1791−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-pri-indfb-draw-pwrite
1792−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-pri-indfb-draw-blt
1793−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-pri-indfb-draw-render
1794−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-pri-shrfb-draw-mmap-cpu
1795−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-pri-shrfb-draw-mmap-gtt
1796−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-pri-shrfb-draw-mmap-wc
1797−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-pri-shrfb-draw-pwrite
1798−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-pri-shrfb-draw-blt
1799−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-pri-shrfb-draw-render
1800−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-mmap-cpu
1801−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-mmap-gtt
1802−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-mmap-wc
1803−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-pwrite
1804−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-blt
1805−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-render
1806−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-spr-indfb-draw-mmap-cpu
1807−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-spr-indfb-draw-mmap-gtt
1808−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-spr-indfb-draw-mmap-wc
1809−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-spr-indfb-draw-pwrite
1810−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-spr-indfb-draw-blt
1811−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-spr-indfb-draw-render
1812−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-pri-indfb-draw-mmap-cpu
1813−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-pri-indfb-draw-mmap-gtt
1814−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-pri-indfb-draw-mmap-wc
1815−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-pri-indfb-draw-pwrite
1816−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-pri-indfb-draw-blt
1817−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-pri-indfb-draw-render
1818−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-pri-shrfb-draw-mmap-cpu
1819−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-pri-shrfb-draw-mmap-gtt
1820−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-pri-shrfb-draw-mmap-wc
1821−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-pri-shrfb-draw-pwrite
1822−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-pri-shrfb-draw-blt
1823−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-pri-shrfb-draw-render
1824−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-cur-indfb-draw-mmap-cpu
1825−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-cur-indfb-draw-mmap-gtt
1826−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-cur-indfb-draw-mmap-wc
1827−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-cur-indfb-draw-pwrite
1828−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-cur-indfb-draw-blt
1829−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-cur-indfb-draw-render
1830−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-spr-indfb-draw-mmap-cpu
1831−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-spr-indfb-draw-mmap-gtt
1832−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-spr-indfb-draw-mmap-wc
1833−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-spr-indfb-draw-pwrite
1834−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-spr-indfb-draw-blt
1835−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-spr-indfb-draw-render
1836−kms_frontbuffer_tracking@psrdrrs-1p-offscren-pri-indfb-draw-mmap-cpu
1837−kms_frontbuffer_tracking@psrdrrs-1p-offscren-pri-indfb-draw-mmap-gtt
1838−kms_frontbuffer_tracking@psrdrrs-1p-offscren-pri-indfb-draw-mmap-wc
1839−kms_frontbuffer_tracking@psrdrrs-1p-offscren-pri-indfb-draw-pwrite
1840−kms_frontbuffer_tracking@psrdrrs-1p-offscren-pri-indfb-draw-blt
1841−kms_frontbuffer_tracking@psrdrrs-1p-offscren-pri-indfb-draw-render
1842−kms_frontbuffer_tracking@psrdrrs-1p-offscren-pri-shrfb-draw-mmap-cpu
1843−kms_frontbuffer_tracking@psrdrrs-1p-offscren-pri-shrfb-draw-mmap-gtt
1844−kms_frontbuffer_tracking@psrdrrs-1p-offscren-pri-shrfb-draw-mmap-wc
1845−kms_frontbuffer_tracking@psrdrrs-1p-offscren-pri-shrfb-draw-pwrite
1846−kms_frontbuffer_tracking@psrdrrs-1p-offscren-pri-shrfb-draw-blt
1847−kms_frontbuffer_tracking@psrdrrs-1p-offscren-pri-shrfb-draw-render
1848−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-pri-indfb-draw-mmap-cpu
1849−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-pri-indfb-draw-mmap-gtt
1850−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-pri-indfb-draw-mmap-wc
1851−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-pri-indfb-draw-pwrite
1852−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-pri-indfb-draw-blt
1853−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-pri-indfb-draw-render
1854−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-pri-shrfb-draw-mmap-cpu
1855−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-pri-shrfb-draw-mmap-gtt
1856−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-pri-shrfb-draw-mmap-wc
1857−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-pri-shrfb-draw-pwrite
1858−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-pri-shrfb-draw-blt
1859−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-pri-shrfb-draw-render
1860−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-cur-indfb-draw-mmap-cpu
1861−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-cur-indfb-draw-mmap-gtt
1862−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-cur-indfb-draw-mmap-wc
1863−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-cur-indfb-draw-pwrite
1864−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-cur-indfb-draw-blt
1865−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-cur-indfb-draw-render
1866−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-spr-indfb-draw-mmap-cpu
1867−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-spr-indfb-draw-mmap-gtt
1868−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-spr-indfb-draw-mmap-wc
1869−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-spr-indfb-draw-pwrite
1870−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-spr-indfb-draw-blt
1871−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-spr-indfb-draw-render
1872−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-pri-indfb-draw-mmap-cpu
1873−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-pri-indfb-draw-mmap-gtt
1874−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-pri-indfb-draw-mmap-wc
1875−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-pri-indfb-draw-pwrite
1876−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-pri-indfb-draw-blt
1877−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-pri-indfb-draw-render
1878−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-pri-shrfb-draw-mmap-cpu
1879−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-pri-shrfb-draw-mmap-gtt
1880−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-pri-shrfb-draw-mmap-wc
1881−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-pri-shrfb-draw-pwrite
1882−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-pri-shrfb-draw-blt
1883−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-pri-shrfb-draw-render
1884−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-cur-indfb-draw-mmap-cpu
1885−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-cur-indfb-draw-mmap-gtt
1886−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-cur-indfb-draw-mmap-wc
1887−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-cur-indfb-draw-pwrite
1888−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-cur-indfb-draw-blt
1889−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-cur-indfb-draw-render
1890−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-spr-indfb-draw-mmap-cpu
1891−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-spr-indfb-draw-mmap-gtt
1892−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-spr-indfb-draw-mmap-wc
1893−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-spr-indfb-draw-pwrite
1894−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-spr-indfb-draw-blt
1895−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-spr-indfb-draw-render
1896−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-pri-indfb-draw-mmap-cpu
1897−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-pri-indfb-draw-mmap-gtt
1898−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-pri-indfb-draw-mmap-wc
1899−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-pri-indfb-draw-pwrite
1900−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-pri-indfb-draw-blt
1901−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-pri-indfb-draw-render
1902−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-pri-shrfb-draw-mmap-cpu
1903−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-pri-shrfb-draw-mmap-gtt
1904−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-pri-shrfb-draw-mmap-wc
1905−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-pri-shrfb-draw-pwrite
1906−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-pri-shrfb-draw-blt
1907−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-pri-shrfb-draw-render
1908−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-cur-indfb-draw-mmap-cpu
1909−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-cur-indfb-draw-mmap-gtt
1910−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-cur-indfb-draw-mmap-wc
1911−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-cur-indfb-draw-pwrite
1912−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-cur-indfb-draw-blt
1913−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-cur-indfb-draw-render
1914−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-spr-indfb-draw-mmap-cpu
1915−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-spr-indfb-draw-mmap-gtt
1916−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-spr-indfb-draw-mmap-wc
1917−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-spr-indfb-draw-pwrite
1918−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-spr-indfb-draw-blt
1919−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-spr-indfb-draw-render
1920−kms_frontbuffer_tracking@fbcpsrdrrs-1p-offscren-pri-indfb-draw-mmap-cpu
1921−kms_frontbuffer_tracking@fbcpsrdrrs-1p-offscren-pri-indfb-draw-mmap-gtt
1922−kms_frontbuffer_tracking@fbcpsrdrrs-1p-offscren-pri-indfb-draw-mmap-wc
1923−kms_frontbuffer_tracking@fbcpsrdrrs-1p-offscren-pri-indfb-draw-pwrite
1924−kms_frontbuffer_tracking@fbcpsrdrrs-1p-offscren-pri-indfb-draw-blt
1925−kms_frontbuffer_tracking@fbcpsrdrrs-1p-offscren-pri-indfb-draw-render
1926−kms_frontbuffer_tracking@fbcpsrdrrs-1p-offscren-pri-shrfb-draw-mmap-cpu
1927−kms_frontbuffer_tracking@fbcpsrdrrs-1p-offscren-pri-shrfb-draw-mmap-gtt
1928−kms_frontbuffer_tracking@fbcpsrdrrs-1p-offscren-pri-shrfb-draw-mmap-wc
1929−kms_frontbuffer_tracking@fbcpsrdrrs-1p-offscren-pri-shrfb-draw-pwrite
1930−kms_frontbuffer_tracking@fbcpsrdrrs-1p-offscren-pri-shrfb-draw-blt
1931−kms_frontbuffer_tracking@fbcpsrdrrs-1p-offscren-pri-shrfb-draw-render
1932−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-pri-indfb-draw-mmap-cpu
1933−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-pri-indfb-draw-mmap-gtt
1934−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-pri-indfb-draw-mmap-wc
1935−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-pri-indfb-draw-pwrite
1936−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-pri-indfb-draw-blt
1937−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-pri-indfb-draw-render
1938−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-pri-shrfb-draw-mmap-cpu
1939−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-pri-shrfb-draw-mmap-gtt
1940−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-pri-shrfb-draw-mmap-wc
1941−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-pri-shrfb-draw-pwrite
1942−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-pri-shrfb-draw-blt
1943−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-pri-shrfb-draw-render
1944−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-cur-indfb-draw-mmap-cpu
1945−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-cur-indfb-draw-mmap-gtt
1946−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-cur-indfb-draw-mmap-wc
1947−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-cur-indfb-draw-pwrite
1948−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-cur-indfb-draw-blt
1949−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-cur-indfb-draw-render
1950−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-spr-indfb-draw-mmap-cpu
1951−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-spr-indfb-draw-mmap-gtt
1952−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-spr-indfb-draw-mmap-wc
1953−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-spr-indfb-draw-pwrite
1954−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-spr-indfb-draw-blt
1955−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-spr-indfb-draw-render
1956−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-pri-indfb-draw-mmap-cpu
1957−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-pri-indfb-draw-mmap-gtt
1958−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-pri-indfb-draw-mmap-wc
1959−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-pri-indfb-draw-pwrite
1960−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-pri-indfb-draw-blt
1961−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-pri-indfb-draw-render
1962−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-pri-shrfb-draw-mmap-cpu
1963−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-pri-shrfb-draw-mmap-gtt
1964−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-pri-shrfb-draw-mmap-wc
1965−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-pri-shrfb-draw-pwrite
1966−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-pri-shrfb-draw-blt
1967−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-pri-shrfb-draw-render
1968−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-cur-indfb-draw-mmap-cpu
1969−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-cur-indfb-draw-mmap-gtt
1970−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-cur-indfb-draw-mmap-wc
1971−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-cur-indfb-draw-pwrite
1972−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-cur-indfb-draw-blt
1973−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-cur-indfb-draw-render
1974−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-spr-indfb-draw-mmap-cpu
1975−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-spr-indfb-draw-mmap-gtt
1976−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-spr-indfb-draw-mmap-wc
1977−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-spr-indfb-draw-pwrite
1978−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-spr-indfb-draw-blt
1979−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-spr-indfb-draw-render
1980−kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-pgflip-blt
1981−kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-msflip-blt
1982−kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-plflip-blt
1983−kms_frontbuffer_tracking@fbc-1p-primscrn-shrfb-pgflip-blt
1984−kms_frontbuffer_tracking@fbc-1p-primscrn-shrfb-msflip-blt
1985−kms_frontbuffer_tracking@fbc-1p-primscrn-shrfb-plflip-blt
1986−kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-pgflip-blt
1987−kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-msflip-blt
1988−kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-plflip-blt
1989−kms_frontbuffer_tracking@fbc-2p-primscrn-shrfb-pgflip-blt
1990−kms_frontbuffer_tracking@fbc-2p-primscrn-shrfb-msflip-blt
1991−kms_frontbuffer_tracking@fbc-2p-primscrn-shrfb-plflip-blt
1992−kms_frontbuffer_tracking@fbc-2p-scndscrn-indfb-pgflip-blt
1993−kms_frontbuffer_tracking@fbc-2p-scndscrn-indfb-msflip-blt
1994−kms_frontbuffer_tracking@fbc-2p-scndscrn-indfb-plflip-blt
1995−kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-pgflip-blt
1996−kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-msflip-blt
1997−kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-plflip-blt
1998−kms_frontbuffer_tracking@psr-1p-primscrn-indfb-pgflip-blt
1999−kms_frontbuffer_tracking@psr-1p-primscrn-indfb-msflip-blt
2000−kms_frontbuffer_tracking@psr-1p-primscrn-indfb-plflip-blt
2001−kms_frontbuffer_tracking@psr-1p-primscrn-shrfb-pgflip-blt
2002−kms_frontbuffer_tracking@psr-1p-primscrn-shrfb-msflip-blt
2003−kms_frontbuffer_tracking@psr-1p-primscrn-shrfb-plflip-blt
2004−kms_frontbuffer_tracking@psr-2p-primscrn-indfb-pgflip-blt
2005−kms_frontbuffer_tracking@psr-2p-primscrn-indfb-msflip-blt
2006−kms_frontbuffer_tracking@psr-2p-primscrn-indfb-plflip-blt
2007−kms_frontbuffer_tracking@psr-2p-primscrn-shrfb-pgflip-blt
2008−kms_frontbuffer_tracking@psr-2p-primscrn-shrfb-msflip-blt
2009−kms_frontbuffer_tracking@psr-2p-primscrn-shrfb-plflip-blt
2010−kms_frontbuffer_tracking@psr-2p-scndscrn-indfb-pgflip-blt
2011−kms_frontbuffer_tracking@psr-2p-scndscrn-indfb-msflip-blt
2012−kms_frontbuffer_tracking@psr-2p-scndscrn-indfb-plflip-blt
2013−kms_frontbuffer_tracking@psr-2p-scndscrn-shrfb-pgflip-blt
2014−kms_frontbuffer_tracking@psr-2p-scndscrn-shrfb-msflip-blt
2015−kms_frontbuffer_tracking@psr-2p-scndscrn-shrfb-plflip-blt
2016−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-indfb-pgflip-blt
2017−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-indfb-msflip-blt
2018−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-indfb-plflip-blt
2019−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-shrfb-pgflip-blt
2020−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-shrfb-msflip-blt
2021−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-shrfb-plflip-blt
2022−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-indfb-pgflip-blt
2023−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-indfb-msflip-blt
2024−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-indfb-plflip-blt
2025−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-shrfb-pgflip-blt
2026−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-shrfb-msflip-blt
2027−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-shrfb-plflip-blt
2028−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-indfb-pgflip-blt
2029−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-indfb-msflip-blt
2030−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-indfb-plflip-blt
2031−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-shrfb-pgflip-blt
2032−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-shrfb-msflip-blt
2033−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-shrfb-plflip-blt
2034−kms_frontbuffer_tracking@drrs-1p-primscrn-indfb-pgflip-blt
2035−kms_frontbuffer_tracking@drrs-1p-primscrn-indfb-msflip-blt
2036−kms_frontbuffer_tracking@drrs-1p-primscrn-indfb-plflip-blt
2037−kms_frontbuffer_tracking@drrs-1p-primscrn-shrfb-pgflip-blt
2038−kms_frontbuffer_tracking@drrs-1p-primscrn-shrfb-msflip-blt
2039−kms_frontbuffer_tracking@drrs-1p-primscrn-shrfb-plflip-blt
2040−kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-pgflip-blt
2041−kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-msflip-blt
2042−kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-plflip-blt
2043−kms_frontbuffer_tracking@drrs-2p-primscrn-shrfb-pgflip-blt
2044−kms_frontbuffer_tracking@drrs-2p-primscrn-shrfb-msflip-blt
2045−kms_frontbuffer_tracking@drrs-2p-primscrn-shrfb-plflip-blt
2046−kms_frontbuffer_tracking@drrs-2p-scndscrn-indfb-pgflip-blt
2047−kms_frontbuffer_tracking@drrs-2p-scndscrn-indfb-msflip-blt
2048−kms_frontbuffer_tracking@drrs-2p-scndscrn-indfb-plflip-blt
2049−kms_frontbuffer_tracking@drrs-2p-scndscrn-shrfb-pgflip-blt
2050−kms_frontbuffer_tracking@drrs-2p-scndscrn-shrfb-msflip-blt
2051−kms_frontbuffer_tracking@drrs-2p-scndscrn-shrfb-plflip-blt
2052−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-indfb-pgflip-blt
2053−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-indfb-msflip-blt
2054−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-indfb-plflip-blt
2055−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-shrfb-pgflip-blt
2056−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-shrfb-msflip-blt
2057−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-shrfb-plflip-blt
2058−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-indfb-pgflip-blt
2059−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-indfb-msflip-blt
2060−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-indfb-plflip-blt
2061−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-shrfb-pgflip-blt
2062−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-shrfb-msflip-blt
2063−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-shrfb-plflip-blt
2064−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-indfb-pgflip-blt
2065−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-indfb-msflip-blt
2066−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-indfb-plflip-blt
2067−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-shrfb-pgflip-blt
2068−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-shrfb-msflip-blt
2069−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-shrfb-plflip-blt
2070−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-indfb-pgflip-blt
2071−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-indfb-msflip-blt
2072−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-indfb-plflip-blt
2073−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-shrfb-pgflip-blt
2074−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-shrfb-msflip-blt
2075−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-shrfb-plflip-blt
2076−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-indfb-pgflip-blt
2077−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-indfb-msflip-blt
2078−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-indfb-plflip-blt
2079−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-shrfb-pgflip-blt
2080−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-shrfb-msflip-blt
2081−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-shrfb-plflip-blt
2082−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-indfb-pgflip-blt
2083−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-indfb-msflip-blt
2084−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-indfb-plflip-blt
2085−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-shrfb-pgflip-blt
2086−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-shrfb-msflip-blt
2087−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-shrfb-plflip-blt
2088−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-indfb-pgflip-blt
2089−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-indfb-msflip-blt
2090−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-indfb-plflip-blt
2091−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-shrfb-pgflip-blt
2092−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-shrfb-msflip-blt
2093−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-shrfb-plflip-blt
2094−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-indfb-pgflip-blt
2095−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-indfb-msflip-blt
2096−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-indfb-plflip-blt
2097−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-shrfb-pgflip-blt
2098−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-shrfb-msflip-blt
2099−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-shrfb-plflip-blt
2100−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-indfb-pgflip-blt
2101−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-indfb-msflip-blt
2102−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-indfb-plflip-blt
2103−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-shrfb-pgflip-blt
2104−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-shrfb-msflip-blt
2105−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-shrfb-plflip-blt
2106−kms_frontbuffer_tracking@fbc-1p-indfb-fliptrack-mmap-gtt
2107−kms_frontbuffer_tracking@fbc-1p-shrfb-fliptrack-mmap-gtt
2108−kms_frontbuffer_tracking@fbc-2p-indfb-fliptrack-mmap-gtt
2109−kms_frontbuffer_tracking@fbc-2p-shrfb-fliptrack-mmap-gtt
2110−kms_frontbuffer_tracking@fbcpsr-1p-indfb-fliptrack-mmap-gtt
2111−kms_frontbuffer_tracking@fbcpsr-1p-shrfb-fliptrack-mmap-gtt
2112−kms_frontbuffer_tracking@fbcpsr-2p-indfb-fliptrack-mmap-gtt
2113−kms_frontbuffer_tracking@fbcpsr-2p-shrfb-fliptrack-mmap-gtt
2114−kms_frontbuffer_tracking@fbcdrrs-1p-indfb-fliptrack-mmap-gtt
2115−kms_frontbuffer_tracking@fbcdrrs-1p-shrfb-fliptrack-mmap-gtt
2116−kms_frontbuffer_tracking@fbcdrrs-2p-indfb-fliptrack-mmap-gtt
2117−kms_frontbuffer_tracking@fbcdrrs-2p-shrfb-fliptrack-mmap-gtt
2118−kms_frontbuffer_tracking@fbcpsrdrrs-1p-indfb-fliptrack-mmap-gtt
2119−kms_frontbuffer_tracking@fbcpsrdrrs-1p-shrfb-fliptrack-mmap-gtt
2120−kms_frontbuffer_tracking@fbcpsrdrrs-2p-indfb-fliptrack-mmap-gtt
2121−kms_frontbuffer_tracking@fbcpsrdrrs-2p-shrfb-fliptrack-mmap-gtt
2122−kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-move
2123−kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-onoff
2124−kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-move
2125−kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-onoff
2126−kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-move
2127−kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-onoff
2128−kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-move
2129−kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-onoff
2130−kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-move
2131−kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-onoff
2132−kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-move
2133−kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-onoff
2134−kms_frontbuffer_tracking@psr-1p-primscrn-cur-indfb-move
2135−kms_frontbuffer_tracking@psr-1p-primscrn-cur-indfb-onoff
2136−kms_frontbuffer_tracking@psr-1p-primscrn-spr-indfb-move
2137−kms_frontbuffer_tracking@psr-1p-primscrn-spr-indfb-onoff
2138−kms_frontbuffer_tracking@psr-2p-primscrn-cur-indfb-move
2139−kms_frontbuffer_tracking@psr-2p-primscrn-cur-indfb-onoff
2140−kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-move
2141−kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-onoff
2142−kms_frontbuffer_tracking@psr-2p-scndscrn-cur-indfb-move
2143−kms_frontbuffer_tracking@psr-2p-scndscrn-cur-indfb-onoff
2144−kms_frontbuffer_tracking@psr-2p-scndscrn-spr-indfb-move
2145−kms_frontbuffer_tracking@psr-2p-scndscrn-spr-indfb-onoff
2146−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-cur-indfb-move
2147−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-cur-indfb-onoff
2148−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-move
2149−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-onoff
2150−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-cur-indfb-move
2151−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-cur-indfb-onoff
2152−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-move
2153−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-onoff
2154−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-move
2155−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-onoff
2156−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-spr-indfb-move
2157−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-spr-indfb-onoff
2158−kms_frontbuffer_tracking@drrs-1p-primscrn-cur-indfb-move
2159−kms_frontbuffer_tracking@drrs-1p-primscrn-cur-indfb-onoff
2160−kms_frontbuffer_tracking@drrs-1p-primscrn-spr-indfb-move
2161−kms_frontbuffer_tracking@drrs-1p-primscrn-spr-indfb-onoff
2162−kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-move
2163−kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-onoff
2164−kms_frontbuffer_tracking@drrs-2p-primscrn-spr-indfb-move
2165−kms_frontbuffer_tracking@drrs-2p-primscrn-spr-indfb-onoff
2166−kms_frontbuffer_tracking@drrs-2p-scndscrn-cur-indfb-move
2167−kms_frontbuffer_tracking@drrs-2p-scndscrn-cur-indfb-onoff
2168−kms_frontbuffer_tracking@drrs-2p-scndscrn-spr-indfb-move
2169−kms_frontbuffer_tracking@drrs-2p-scndscrn-spr-indfb-onoff
2170−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-cur-indfb-move
2171−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-cur-indfb-onoff
2172−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-spr-indfb-move
2173−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-spr-indfb-onoff
2174−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-cur-indfb-move
2175−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-cur-indfb-onoff
2176−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-spr-indfb-move
2177−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-spr-indfb-onoff
2178−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-move
2179−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-onoff
2180−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-spr-indfb-move
2181−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-spr-indfb-onoff
2182−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-cur-indfb-move
2183−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-cur-indfb-onoff
2184−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-spr-indfb-move
2185−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-spr-indfb-onoff
2186−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-cur-indfb-move
2187−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-cur-indfb-onoff
2188−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-spr-indfb-move
2189−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-spr-indfb-onoff
2190−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-cur-indfb-move
2191−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-cur-indfb-onoff
2192−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-spr-indfb-move
2193−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-spr-indfb-onoff
2194−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-cur-indfb-move
2195−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-cur-indfb-onoff
2196−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-spr-indfb-move
2197−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-spr-indfb-onoff
2198−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-cur-indfb-move
2199−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-cur-indfb-onoff
2200−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-spr-indfb-move
2201−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-spr-indfb-onoff
2202−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-cur-indfb-move
2203−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-cur-indfb-onoff
2204−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-spr-indfb-move
2205−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-spr-indfb-onoff
2206−kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-fullscreen
2207−kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-fullscreen
2208−kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-fullscreen
2209−kms_frontbuffer_tracking@psr-1p-primscrn-spr-indfb-fullscreen
2210−kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-fullscreen
2211−kms_frontbuffer_tracking@psr-2p-scndscrn-spr-indfb-fullscreen
2212−kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-fullscreen
2213−kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-fullscreen
2214−kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-spr-indfb-fullscreen
2215−kms_frontbuffer_tracking@drrs-1p-primscrn-spr-indfb-fullscreen
2216−kms_frontbuffer_tracking@drrs-2p-primscrn-spr-indfb-fullscreen
2217−kms_frontbuffer_tracking@drrs-2p-scndscrn-spr-indfb-fullscreen
2218−kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-spr-indfb-fullscreen
2219−kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-spr-indfb-fullscreen
2220−kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-spr-indfb-fullscreen
2221−kms_frontbuffer_tracking@psrdrrs-1p-primscrn-spr-indfb-fullscreen
2222−kms_frontbuffer_tracking@psrdrrs-2p-primscrn-spr-indfb-fullscreen
2223−kms_frontbuffer_tracking@psrdrrs-2p-scndscrn-spr-indfb-fullscreen
2224−kms_frontbuffer_tracking@fbcpsrdrrs-1p-primscrn-spr-indfb-fullscreen
2225−kms_frontbuffer_tracking@fbcpsrdrrs-2p-primscrn-spr-indfb-fullscreen
2226−kms_frontbuffer_tracking@fbcpsrdrrs-2p-scndscrn-spr-indfb-fullscreen
2227−kms_frontbuffer_tracking@fbc-1p-pri-indfb-multidraw
2228−kms_frontbuffer_tracking@fbc-2p-pri-indfb-multidraw
2229−kms_frontbuffer_tracking@psr-1p-pri-indfb-multidraw
2230−kms_frontbuffer_tracking@psr-2p-pri-indfb-multidraw
2231−kms_frontbuffer_tracking@fbcpsr-1p-pri-indfb-multidraw
2232−kms_frontbuffer_tracking@fbcpsr-2p-pri-indfb-multidraw
2233−kms_frontbuffer_tracking@drrs-1p-pri-indfb-multidraw
2234−kms_frontbuffer_tracking@drrs-2p-pri-indfb-multidraw
2235−kms_frontbuffer_tracking@fbcdrrs-1p-pri-indfb-multidraw
2236−kms_frontbuffer_tracking@fbcdrrs-2p-pri-indfb-multidraw
2237−kms_frontbuffer_tracking@psrdrrs-1p-pri-indfb-multidraw
2238−kms_frontbuffer_tracking@psrdrrs-2p-pri-indfb-multidraw
2239−kms_frontbuffer_tracking@fbcpsrdrrs-1p-pri-indfb-multidraw
2240−kms_frontbuffer_tracking@fbcpsrdrrs-2p-pri-indfb-multidraw
2241−kms_frontbuffer_tracking@fbc-farfromfence-mmap-gtt
2242−kms_frontbuffer_tracking@psr-farfromfence-mmap-gtt
2243−kms_frontbuffer_tracking@fbcpsr-farfromfence-mmap-gtt
2244−kms_frontbuffer_tracking@drrs-farfromfence-mmap-gtt
2245−kms_frontbuffer_tracking@fbcdrrs-farfromfence-mmap-gtt
2246−kms_frontbuffer_tracking@psrdrrs-farfromfence-mmap-gtt
2247−kms_frontbuffer_tracking@fbcpsrdrrs-farfromfence-mmap-gtt
2248−kms_frontbuffer_tracking@fbc-rgb565-draw-mmap-cpu
2249−kms_frontbuffer_tracking@fbc-rgb101010-draw-mmap-cpu
2250−kms_frontbuffer_tracking@fbc-rgb565-draw-mmap-gtt
2251−kms_frontbuffer_tracking@fbc-rgb101010-draw-mmap-gtt
2252−kms_frontbuffer_tracking@fbc-rgb565-draw-mmap-wc
2253−kms_frontbuffer_tracking@fbc-rgb101010-draw-mmap-wc
2254−kms_frontbuffer_tracking@fbc-rgb565-draw-pwrite
2255−kms_frontbuffer_tracking@fbc-rgb101010-draw-pwrite
2256−kms_frontbuffer_tracking@fbc-rgb565-draw-blt
2257−kms_frontbuffer_tracking@fbc-rgb101010-draw-blt
2258−kms_frontbuffer_tracking@fbc-rgb565-draw-render
2259−kms_frontbuffer_tracking@fbc-rgb101010-draw-render
2260−kms_frontbuffer_tracking@psr-rgb565-draw-mmap-cpu
2261−kms_frontbuffer_tracking@psr-rgb101010-draw-mmap-cpu
2262−kms_frontbuffer_tracking@psr-rgb565-draw-mmap-gtt
2263−kms_frontbuffer_tracking@psr-rgb101010-draw-mmap-gtt
2264−kms_frontbuffer_tracking@psr-rgb565-draw-mmap-wc
2265−kms_frontbuffer_tracking@psr-rgb101010-draw-mmap-wc
2266−kms_frontbuffer_tracking@psr-rgb565-draw-pwrite
2267−kms_frontbuffer_tracking@psr-rgb101010-draw-pwrite
2268−kms_frontbuffer_tracking@psr-rgb565-draw-blt
2269−kms_frontbuffer_tracking@psr-rgb101010-draw-blt
2270−kms_frontbuffer_tracking@psr-rgb565-draw-render
2271−kms_frontbuffer_tracking@psr-rgb101010-draw-render
2272−kms_frontbuffer_tracking@fbcpsr-rgb565-draw-mmap-cpu
2273−kms_frontbuffer_tracking@fbcpsr-rgb101010-draw-mmap-cpu
2274−kms_frontbuffer_tracking@fbcpsr-rgb565-draw-mmap-gtt
2275−kms_frontbuffer_tracking@fbcpsr-rgb101010-draw-mmap-gtt
2276−kms_frontbuffer_tracking@fbcpsr-rgb565-draw-mmap-wc
2277−kms_frontbuffer_tracking@fbcpsr-rgb101010-draw-mmap-wc
2278−kms_frontbuffer_tracking@fbcpsr-rgb565-draw-pwrite
2279−kms_frontbuffer_tracking@fbcpsr-rgb101010-draw-pwrite
2280−kms_frontbuffer_tracking@fbcpsr-rgb565-draw-blt
2281−kms_frontbuffer_tracking@fbcpsr-rgb101010-draw-blt
2282−kms_frontbuffer_tracking@fbcpsr-rgb565-draw-render
2283−kms_frontbuffer_tracking@fbcpsr-rgb101010-draw-render
2284−kms_frontbuffer_tracking@drrs-rgb565-draw-mmap-cpu
2285−kms_frontbuffer_tracking@drrs-rgb101010-draw-mmap-cpu
2286−kms_frontbuffer_tracking@drrs-rgb565-draw-mmap-gtt
2287−kms_frontbuffer_tracking@drrs-rgb101010-draw-mmap-gtt
2288−kms_frontbuffer_tracking@drrs-rgb565-draw-mmap-wc
2289−kms_frontbuffer_tracking@drrs-rgb101010-draw-mmap-wc
2290−kms_frontbuffer_tracking@drrs-rgb565-draw-pwrite
2291−kms_frontbuffer_tracking@drrs-rgb101010-draw-pwrite
2292−kms_frontbuffer_tracking@drrs-rgb565-draw-blt
2293−kms_frontbuffer_tracking@drrs-rgb101010-draw-blt
2294−kms_frontbuffer_tracking@drrs-rgb565-draw-render
2295−kms_frontbuffer_tracking@drrs-rgb101010-draw-render
2296−kms_frontbuffer_tracking@fbcdrrs-rgb565-draw-mmap-cpu
2297−kms_frontbuffer_tracking@fbcdrrs-rgb101010-draw-mmap-cpu
2298−kms_frontbuffer_tracking@fbcdrrs-rgb565-draw-mmap-gtt
2299−kms_frontbuffer_tracking@fbcdrrs-rgb101010-draw-mmap-gtt
2300−kms_frontbuffer_tracking@fbcdrrs-rgb565-draw-mmap-wc
2301−kms_frontbuffer_tracking@fbcdrrs-rgb101010-draw-mmap-wc
2302−kms_frontbuffer_tracking@fbcdrrs-rgb565-draw-pwrite
2303−kms_frontbuffer_tracking@fbcdrrs-rgb101010-draw-pwrite
2304−kms_frontbuffer_tracking@fbcdrrs-rgb565-draw-blt
2305−kms_frontbuffer_tracking@fbcdrrs-rgb101010-draw-blt
2306−kms_frontbuffer_tracking@fbcdrrs-rgb565-draw-render
2307−kms_frontbuffer_tracking@fbcdrrs-rgb101010-draw-render
2308−kms_frontbuffer_tracking@psrdrrs-rgb565-draw-mmap-cpu
2309−kms_frontbuffer_tracking@psrdrrs-rgb101010-draw-mmap-cpu
2310−kms_frontbuffer_tracking@psrdrrs-rgb565-draw-mmap-gtt
2311−kms_frontbuffer_tracking@psrdrrs-rgb101010-draw-mmap-gtt
2312−kms_frontbuffer_tracking@psrdrrs-rgb565-draw-mmap-wc
2313−kms_frontbuffer_tracking@psrdrrs-rgb101010-draw-mmap-wc
2314−kms_frontbuffer_tracking@psrdrrs-rgb565-draw-pwrite
2315−kms_frontbuffer_tracking@psrdrrs-rgb101010-draw-pwrite
2316−kms_frontbuffer_tracking@psrdrrs-rgb565-draw-blt
2317−kms_frontbuffer_tracking@psrdrrs-rgb101010-draw-blt
2318−kms_frontbuffer_tracking@psrdrrs-rgb565-draw-render
2319−kms_frontbuffer_tracking@psrdrrs-rgb101010-draw-render
2320−kms_frontbuffer_tracking@fbcpsrdrrs-rgb565-draw-mmap-cpu
2321−kms_frontbuffer_tracking@fbcpsrdrrs-rgb101010-draw-mmap-cpu
2322−kms_frontbuffer_tracking@fbcpsrdrrs-rgb565-draw-mmap-gtt
2323−kms_frontbuffer_tracking@fbcpsrdrrs-rgb101010-draw-mmap-gtt
2324−kms_frontbuffer_tracking@fbcpsrdrrs-rgb565-draw-mmap-wc
2325−kms_frontbuffer_tracking@fbcpsrdrrs-rgb101010-draw-mmap-wc
2326−kms_frontbuffer_tracking@fbcpsrdrrs-rgb565-draw-pwrite
2327−kms_frontbuffer_tracking@fbcpsrdrrs-rgb101010-draw-pwrite
2328−kms_frontbuffer_tracking@fbcpsrdrrs-rgb565-draw-blt
2329−kms_frontbuffer_tracking@fbcpsrdrrs-rgb101010-draw-blt
2330−kms_frontbuffer_tracking@fbcpsrdrrs-rgb565-draw-render
2331−kms_frontbuffer_tracking@fbcpsrdrrs-rgb101010-draw-render
2332−kms_frontbuffer_tracking@fbc-indfb-scaledprimary
2333−kms_frontbuffer_tracking@fbc-shrfb-scaledprimary
2334−kms_frontbuffer_tracking@psr-indfb-scaledprimary
2335−kms_frontbuffer_tracking@psr-shrfb-scaledprimary
2336−kms_frontbuffer_tracking@fbcpsr-indfb-scaledprimary
2337−kms_frontbuffer_tracking@fbcpsr-shrfb-scaledprimary
2338−kms_frontbuffer_tracking@drrs-indfb-scaledprimary
2339−kms_frontbuffer_tracking@drrs-shrfb-scaledprimary
2340−kms_frontbuffer_tracking@fbcdrrs-indfb-scaledprimary
2341−kms_frontbuffer_tracking@fbcdrrs-shrfb-scaledprimary
2342−kms_frontbuffer_tracking@psrdrrs-indfb-scaledprimary
2343−kms_frontbuffer_tracking@psrdrrs-shrfb-scaledprimary
2344−kms_frontbuffer_tracking@fbcpsrdrrs-indfb-scaledprimary
2345−kms_frontbuffer_tracking@fbcpsrdrrs-shrfb-scaledprimary
2346−kms_frontbuffer_tracking@fbc-modesetfrombusy
2347−kms_frontbuffer_tracking@fbc-stridechange
2348−kms_frontbuffer_tracking@fbc-tiling-linear
2349−kms_frontbuffer_tracking@fbc-tiling-y
2350−kms_frontbuffer_tracking@fbc-tiling-4
2351−kms_frontbuffer_tracking@fbc-suspend
2352−kms_frontbuffer_tracking@psr-modesetfrombusy
2353−kms_frontbuffer_tracking@psr-slowdraw
2354−kms_frontbuffer_tracking@psr-suspend
2355−kms_frontbuffer_tracking@fbcpsr-modesetfrombusy
2356−kms_frontbuffer_tracking@fbcpsr-stridechange
2357−kms_frontbuffer_tracking@fbcpsr-tiling-linear
2358−kms_frontbuffer_tracking@fbcpsr-tiling-y
2359−kms_frontbuffer_tracking@fbcpsr-tiling-4
2360−kms_frontbuffer_tracking@fbcpsr-slowdraw
2361−kms_frontbuffer_tracking@fbcpsr-suspend
2362−kms_frontbuffer_tracking@drrs-modesetfrombusy
2363−kms_frontbuffer_tracking@drrs-slowdraw
2364−kms_frontbuffer_tracking@drrs-suspend
2365−kms_frontbuffer_tracking@fbcdrrs-modesetfrombusy
2366−kms_frontbuffer_tracking@fbcdrrs-stridechange
2367−kms_frontbuffer_tracking@fbcdrrs-tiling-linear
2368−kms_frontbuffer_tracking@fbcdrrs-tiling-y
2369−kms_frontbuffer_tracking@fbcdrrs-tiling-4
2370−kms_frontbuffer_tracking@fbcdrrs-slowdraw
2371−kms_frontbuffer_tracking@fbcdrrs-suspend
2372−kms_frontbuffer_tracking@psrdrrs-modesetfrombusy
2373−kms_frontbuffer_tracking@psrdrrs-slowdraw
2374−kms_frontbuffer_tracking@psrdrrs-suspend
2375−kms_frontbuffer_tracking@fbcpsrdrrs-modesetfrombusy
2376−kms_frontbuffer_tracking@fbcpsrdrrs-stridechange
2377−kms_frontbuffer_tracking@fbcpsrdrrs-tiling-linear
2378−kms_frontbuffer_tracking@fbcpsrdrrs-tiling-y
2379−kms_frontbuffer_tracking@fbcpsrdrrs-tiling-4
2380−kms_frontbuffer_tracking@fbcpsrdrrs-slowdraw
2381−kms_frontbuffer_tracking@fbcpsrdrrs-suspend
2382−kms_frontbuffer_tracking@basic
2383−kms_getfb@getfb-handle-zero
2384−kms_getfb@getfb-handle-valid
2385−kms_getfb@getfb-handle-closed
2386−kms_getfb@getfb-handle-not-fb
2387−kms_getfb@getfb-addfb-different-handles
2388−kms_getfb@getfb-repeated-different-handles
2389−kms_getfb@getfb-reject-ccs
2390−kms_getfb@getfb2-handle-zero
2391−kms_getfb@getfb2-handle-closed
2392−kms_getfb@getfb2-handle-not-fb
2393−kms_getfb@getfb2-accept-ccs
2394−kms_getfb@getfb2-into-addfb2
2395−kms_getfb@getfb-handle-protection
2396−kms_getfb@getfb2-handle-protection
2397−kms_hdmi_inject@inject-4k
2398−kms_hdmi_inject@inject-audio
2399−kms_hdr@bpc-switch
2400−kms_hdr@bpc-switch-dpms
2401−kms_hdr@bpc-switch-suspend
2402−kms_hdr@static-toggle
2403−kms_hdr@static-toggle-dpms
2404−kms_hdr@static-toggle-suspend
2405−kms_hdr@static-swap
2406−kms_hdr@invalid-metadata-sizes
2407−kms_hdr@invalid-hdr
2408−kms_invalid_mode@clock-too-high
2409−kms_invalid_mode@zero-clock
2410−kms_invalid_mode@int-max-clock
2411−kms_invalid_mode@uint-max-clock
2412−kms_invalid_mode@zero-hdisplay
2413−kms_invalid_mode@zero-vdisplay
2414−kms_invalid_mode@bad-hsync-start
2415−kms_invalid_mode@bad-vsync-start
2416−kms_invalid_mode@bad-hsync-end
2417−kms_invalid_mode@bad-vsync-end
2418−kms_invalid_mode@bad-htotal
2419−kms_invalid_mode@bad-vtotal
2420−kms_legacy_colorkey@basic
2421−kms_legacy_colorkey@invalid-plane
2422−kms_multipipe_modeset@basic-max-pipe-crc-check
2423−kms_panel_fitting@legacy
2424−kms_panel_fitting@atomic-fastset
2425−kms_pipe_b_c_ivb@pipe-B-dpms-off-modeset-pipe-C
2426−kms_pipe_b_c_ivb@pipe-B-double-modeset-then-modeset-pipe-C
2427−kms_pipe_b_c_ivb@disable-pipe-B-enable-pipe-C
2428−kms_pipe_b_c_ivb@from-pipe-C-to-B-with-3-lanes
2429−kms_pipe_b_c_ivb@enable-pipe-C-while-B-has-3-lanes
2430−kms_pipe_crc_basic@bad-source
2431−kms_pipe_crc_basic@read-crc
2432−kms_pipe_crc_basic@read-crc-frame-sequence
2433−kms_pipe_crc_basic@nonblocking-crc
2434−kms_pipe_crc_basic@nonblocking-crc-frame-sequence
2435−kms_pipe_crc_basic@suspend-read-crc
2436−kms_pipe_crc_basic@hang-read-crc
2437−kms_pipe_crc_basic@disable-crc-after-crtc
2438−kms_pipe_crc_basic@compare-crc-sanitycheck-xr24
2439−kms_pipe_crc_basic@compare-crc-sanitycheck-nv12
2440−kms_plane@pixel-format
2441−kms_plane@pixel-format-source-clamping
2442−kms_plane@plane-position-covered
2443−kms_plane@plane-position-hole
2444−kms_plane@plane-position-hole-dpms
2445−kms_plane@plane-panning-top-left
2446−kms_plane@plane-panning-bottom-right
2447−kms_plane@plane-panning-bottom-right-suspend
2448−kms_plane@planar-pixel-format-settings
2449−kms_plane_alpha_blend@alpha-basic
2450−kms_plane_alpha_blend@alpha-7efc
2451−kms_plane_alpha_blend@coverage-7efc
2452−kms_plane_alpha_blend@coverage-vs-premult-vs-constant
2453−kms_plane_alpha_blend@alpha-transparent-fb
2454−kms_plane_alpha_blend@alpha-opaque-fb
2455−kms_plane_alpha_blend@constant-alpha-min
2456−kms_plane_alpha_blend@constant-alpha-mid
2457−kms_plane_alpha_blend@constant-alpha-max
2458−kms_plane_cursor@primary
2459−kms_plane_cursor@overlay
2460−kms_plane_cursor@viewport
2461−kms_plane_lowres@tiling-none
2462−kms_plane_lowres@tiling-x
2463−kms_plane_lowres@tiling-y
2464−kms_plane_lowres@tiling-yf
2465−kms_plane_lowres@tiling-4
2466−kms_plane_multiple@tiling-none
2467−kms_plane_multiple@tiling-x
2468−kms_plane_multiple@tiling-y
2469−kms_plane_multiple@tiling-yf
2470−kms_plane_multiple@tiling-4
2471−kms_plane_scaling@plane-upscale-20x20-with-pixel-format
2472−kms_plane_scaling@plane-upscale-factor-0-25-with-pixel-format
2473−kms_plane_scaling@plane-downscale-factor-0-25-with-pixel-format
2474−kms_plane_scaling@plane-downscale-factor-0-5-with-pixel-format
2475−kms_plane_scaling@plane-downscale-factor-0-75-with-pixel-format
2476−kms_plane_scaling@plane-scaler-unity-scaling-with-pixel-format
2477−kms_plane_scaling@plane-upscale-20x20-with-rotation
2478−kms_plane_scaling@plane-upscale-factor-0-25-with-rotation
2479−kms_plane_scaling@plane-downscale-factor-0-25-with-rotation
2480−kms_plane_scaling@plane-downscale-factor-0-5-with-rotation
2481−kms_plane_scaling@plane-downscale-factor-0-75-with-rotation
2482−kms_plane_scaling@plane-scaler-unity-scaling-with-rotation
2483−kms_plane_scaling@plane-upscale-20x20-with-modifiers
2484−kms_plane_scaling@plane-upscale-factor-0-25-with-modifiers
2485−kms_plane_scaling@plane-downscale-factor-0-25-with-modifiers
2486−kms_plane_scaling@plane-downscale-factor-0-5-with-modifiers
2487−kms_plane_scaling@plane-downscale-factor-0-75-with-modifiers
2488−kms_plane_scaling@plane-scaler-unity-scaling-with-modifiers
2489−kms_plane_scaling@plane-scaler-with-clipping-clamping-pixel-formats
2490−kms_plane_scaling@plane-scaler-with-clipping-clamping-rotation
2491−kms_plane_scaling@plane-scaler-with-clipping-clamping-modifiers
2492−kms_plane_scaling@planes-upscale-20x20
2493−kms_plane_scaling@planes-upscale-factor-0-25
2494−kms_plane_scaling@planes-scaler-unity-scaling
2495−kms_plane_scaling@planes-downscale-factor-0-25
2496−kms_plane_scaling@planes-downscale-factor-0-5
2497−kms_plane_scaling@planes-downscale-factor-0-75
2498−kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-25
2499−kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-5
2500−kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75
2501−kms_plane_scaling@planes-upscale-factor-0-25-downscale-factor-0-25
2502−kms_plane_scaling@planes-upscale-factor-0-25-downscale-factor-0-5
2503−kms_plane_scaling@planes-upscale-factor-0-25-downscale-factor-0-75
2504−kms_plane_scaling@planes-unity-scaling-downscale-factor-0-25
2505−kms_plane_scaling@planes-unity-scaling-downscale-factor-0-5
2506−kms_plane_scaling@planes-unity-scaling-downscale-factor-0-75
2507−kms_plane_scaling@planes-downscale-factor-0-25-upscale-20x20
2508−kms_plane_scaling@planes-downscale-factor-0-25-upscale-factor-0-25
2509−kms_plane_scaling@planes-downscale-factor-0-25-unity-scaling
2510−kms_plane_scaling@planes-downscale-factor-0-5-upscale-20x20
2511−kms_plane_scaling@planes-downscale-factor-0-5-upscale-factor-0-25
2512−kms_plane_scaling@planes-downscale-factor-0-5-unity-scaling
2513−kms_plane_scaling@planes-downscale-factor-0-75-upscale-20x20
2514−kms_plane_scaling@planes-downscale-factor-0-75-upscale-factor-0-25
2515−kms_plane_scaling@planes-downscale-factor-0-75-unity-scaling
2516−kms_plane_scaling@intel-max-src-size
2517−kms_plane_scaling@invalid-num-scalers
2518−kms_plane_scaling@invalid-parameters
2519−kms_plane_scaling@2x-scaler-multi-pipe
2520−kms_prime@basic-crc-hybrid
2521−kms_prime@basic-modeset-hybrid
2522−kms_prime@D3hot
2523−kms_prime@basic-crc-vgem
2524−kms_prop_blob@basic
2525−kms_prop_blob@blob-prop-core
2526−kms_prop_blob@blob-prop-validate
2527−kms_prop_blob@blob-prop-lifetime
2528−kms_prop_blob@blob-multiple
2529−kms_prop_blob@invalid-get-prop-any
2530−kms_prop_blob@invalid-get-prop
2531−kms_prop_blob@invalid-set-prop-any
2532−kms_prop_blob@invalid-set-prop
2533−kms_properties@plane-properties-legacy
2534−kms_properties@plane-properties-atomic
2535−kms_properties@crtc-properties-legacy
2536−kms_properties@crtc-properties-atomic
2537−kms_properties@connector-properties-legacy
2538−kms_properties@connector-properties-atomic
2539−kms_properties@invalid-properties-legacy
2540−kms_properties@invalid-properties-atomic
2541−kms_properties@get_properties-sanity-atomic
2542−kms_properties@get_properties-sanity-non-atomic
2543−kms_psr@pr-basic
2544−kms_psr@pr-no-drrs
2545−kms_psr@pr-primary-page-flip
2546−kms_psr@pr-primary-mmap-gtt
2547−kms_psr@pr-primary-mmap-cpu
2548−kms_psr@pr-primary-blt
2549−kms_psr@pr-primary-render
2550−kms_psr@pr-sprite-mmap-gtt
2551−kms_psr@pr-cursor-mmap-gtt
2552−kms_psr@pr-sprite-mmap-cpu
2553−kms_psr@pr-cursor-mmap-cpu
2554−kms_psr@pr-sprite-blt
2555−kms_psr@pr-cursor-blt
2556−kms_psr@pr-sprite-render
2557−kms_psr@pr-cursor-render
2558−kms_psr@pr-sprite-plane-move
2559−kms_psr@pr-cursor-plane-move
2560−kms_psr@pr-sprite-plane-onoff
2561−kms_psr@pr-cursor-plane-onoff
2562−kms_psr@pr-dpms
2563−kms_psr@pr-suspend
2564−kms_psr@psr-basic
2565−kms_psr@psr-no-drrs
2566−kms_psr@psr-primary-page-flip
2567−kms_psr@psr-primary-mmap-gtt
2568−kms_psr@psr-primary-mmap-cpu
2569−kms_psr@psr-primary-blt
2570−kms_psr@psr-primary-render
2571−kms_psr@psr-sprite-mmap-gtt
2572−kms_psr@psr-cursor-mmap-gtt
2573−kms_psr@psr-sprite-mmap-cpu
2574−kms_psr@psr-cursor-mmap-cpu
2575−kms_psr@psr-sprite-blt
2576−kms_psr@psr-cursor-blt
2577−kms_psr@psr-sprite-render
2578−kms_psr@psr-cursor-render
2579−kms_psr@psr-sprite-plane-move
2580−kms_psr@psr-cursor-plane-move
2581−kms_psr@psr-sprite-plane-onoff
2582−kms_psr@psr-cursor-plane-onoff
2583−kms_psr@psr-dpms
2584−kms_psr@psr-suspend
2585−kms_psr@psr2-basic
2586−kms_psr@psr2-no-drrs
2587−kms_psr@psr2-primary-page-flip
2588−kms_psr@psr2-primary-mmap-gtt
2589−kms_psr@psr2-primary-mmap-cpu
2590−kms_psr@psr2-primary-blt
2591−kms_psr@psr2-primary-render
2592−kms_psr@psr2-sprite-mmap-gtt
2593−kms_psr@psr2-cursor-mmap-gtt
2594−kms_psr@psr2-sprite-mmap-cpu
2595−kms_psr@psr2-cursor-mmap-cpu
2596−kms_psr@psr2-sprite-blt
2597−kms_psr@psr2-cursor-blt
2598−kms_psr@psr2-sprite-render
2599−kms_psr@psr2-cursor-render
2600−kms_psr@psr2-sprite-plane-move
2601−kms_psr@psr2-cursor-plane-move
2602−kms_psr@psr2-sprite-plane-onoff
2603−kms_psr@psr2-cursor-plane-onoff
2604−kms_psr@psr2-dpms
2605−kms_psr@psr2-suspend
2606−kms_psr2_sf@primary-plane-update-sf-dmg-area
2607−kms_psr2_sf@primary-plane-update-sf-dmg-area-big-fb
2608−kms_psr2_sf@overlay-plane-update-sf-dmg-area
2609−kms_psr2_sf@cursor-plane-update-sf
2610−kms_psr2_sf@cursor-plane-move-continuous-sf
2611−kms_psr2_sf@cursor-plane-move-continuous-exceed-sf
2612−kms_psr2_sf@cursor-plane-move-continuous-exceed-fully-sf
2613−kms_psr2_sf@plane-move-sf-dmg-area
2614−kms_psr2_sf@overlay-plane-move-continuous-sf
2615−kms_psr2_sf@overlay-plane-move-continuous-exceed-sf
2616−kms_psr2_sf@overlay-plane-move-continuous-exceed-fully-sf
2617−kms_psr2_sf@overlay-primary-update-sf-dmg-area
2618−kms_psr2_sf@overlay-plane-update-continuous-sf
2619−kms_psr2_su@page_flip-XRGB8888
2620−kms_psr2_su@page_flip-NV12
2621−kms_psr2_su@page_flip-P010
2622−kms_psr2_su@frontbuffer-XRGB8888
2623−kms_pwrite_crc
2624−kms_rmfb@rmfb-ioctl
2625−kms_rmfb@close-fd
2626−kms_rotation_crc@primary-rotation-90
2627−kms_rotation_crc@primary-rotation-180
2628−kms_rotation_crc@primary-rotation-270
2629−kms_rotation_crc@sprite-rotation-90
2630−kms_rotation_crc@sprite-rotation-180
2631−kms_rotation_crc@sprite-rotation-270
2632−kms_rotation_crc@cursor-rotation-180
2633−kms_rotation_crc@sprite-rotation-90-pos-100-0
2634−kms_rotation_crc@bad-pixel-format
2635−kms_rotation_crc@bad-tiling
2636−kms_rotation_crc@primary-x-tiled-reflect-x-0
2637−kms_rotation_crc@primary-x-tiled-reflect-x-180
2638−kms_rotation_crc@primary-y-tiled-reflect-x-0
2639−kms_rotation_crc@primary-y-tiled-reflect-x-90
2640−kms_rotation_crc@primary-y-tiled-reflect-x-180
2641−kms_rotation_crc@primary-y-tiled-reflect-x-270
2642−kms_rotation_crc@primary-yf-tiled-reflect-x-0
2643−kms_rotation_crc@primary-yf-tiled-reflect-x-90
2644−kms_rotation_crc@primary-yf-tiled-reflect-x-180
2645−kms_rotation_crc@primary-yf-tiled-reflect-x-270
2646−kms_rotation_crc@primary-4-tiled-reflect-x-0
2647−kms_rotation_crc@primary-4-tiled-reflect-x-180
2648−kms_rotation_crc@multiplane-rotation
2649−kms_rotation_crc@multiplane-rotation-cropping-top
2650−kms_rotation_crc@multiplane-rotation-cropping-bottom
2651−kms_rotation_crc@exhaust-fences
2652−kms_scaling_modes@scaling-mode-full
2653−kms_scaling_modes@scaling-mode-center
2654−kms_scaling_modes@scaling-mode-full-aspect
2655−kms_scaling_modes@scaling-mode-none
2656−kms_selftest@drm_cmdline_parser
2657−kms_selftest@drm_damage_helper
2658−kms_selftest@drm_dp_mst_helper
2659−kms_selftest@drm_format_helper
2660−kms_selftest@drm_format
2661−kms_selftest@drm_framebuffer
2662−kms_selftest@drm_plane_helper
2663−kms_setmode@basic
2664−kms_setmode@basic-clone-single-crtc
2665−kms_setmode@invalid-clone-single-crtc
2666−kms_setmode@invalid-clone-exclusive-crtc
2667−kms_setmode@clone-exclusive-crtc
2668−kms_setmode@invalid-clone-single-crtc-stealing
2669−kms_sysfs_edid_timing
2670−kms_tv_load_detect@load-detect
2671−kms_universal_plane@universal-plane-functional
2672−kms_universal_plane@universal-plane-sanity
2673−kms_universal_plane@disable-primary-vs-flip
2674−kms_universal_plane@cursor-fb-leak
2675−kms_universal_plane@universal-plane-pageflip-windowed
2676−kms_vblank@invalid
2677−kms_vblank@crtc-id
2678−kms_vblank@accuracy-idle
2679−kms_vblank@query-idle
2680−kms_vblank@query-idle-hang
2681−kms_vblank@query-forked
2682−kms_vblank@query-forked-hang
2683−kms_vblank@query-busy
2684−kms_vblank@query-busy-hang
2685−kms_vblank@query-forked-busy
2686−kms_vblank@query-forked-busy-hang
2687−kms_vblank@wait-idle
2688−kms_vblank@wait-idle-hang
2689−kms_vblank@wait-forked
2690−kms_vblank@wait-forked-hang
2691−kms_vblank@wait-busy
2692−kms_vblank@wait-busy-hang
2693−kms_vblank@wait-forked-busy
2694−kms_vblank@wait-forked-busy-hang
2695−kms_vblank@ts-continuation-idle
2696−kms_vblank@ts-continuation-idle-hang
2697−kms_vblank@ts-continuation-dpms-rpm
2698−kms_vblank@ts-continuation-dpms-suspend
2699−kms_vblank@ts-continuation-suspend
2700−kms_vblank@ts-continuation-modeset
2701−kms_vblank@ts-continuation-modeset-hang
2702−kms_vblank@ts-continuation-modeset-rpm
2703−kms_vrr@flip-basic
2704−kms_vrr@flip-dpms
2705−kms_vrr@flip-suspend
2706−kms_vrr@flipline
2707−kms_vrr@negative-basic
2708−kms_writeback@writeback-pixel-formats
2709−kms_writeback@writeback-invalid-parameters
2710−kms_writeback@writeback-fb-id
2711−kms_writeback@writeback-check-output
2712−prime_mmap_kms@buffer-sharing
2713−msm_shrink@copy-gpu-sanitycheck-8
2714−msm_shrink@copy-gpu-sanitycheck-32
2715−msm_shrink@copy-gpu-8
2716−msm_shrink@copy-gpu-32
2717−msm_shrink@copy-gpu-madvise-8
2718−msm_shrink@copy-gpu-madvise-32
2719−msm_shrink@copy-gpu-oom-8
2720−msm_shrink@copy-gpu-oom-32
2721−msm_shrink@copy-mmap-sanitycheck-8
2722−msm_shrink@copy-mmap-sanitycheck-32
2723−msm_shrink@copy-mmap-8
2724−msm_shrink@copy-mmap-32
2725−msm_shrink@copy-mmap-madvise-8
2726−msm_shrink@copy-mmap-madvise-32
2727−msm_shrink@copy-mmap-oom-8
2728−msm_shrink@copy-mmap-oom-32
2729−msm_shrink@copy-mmap-dmabuf-sanitycheck-8
2730−msm_shrink@copy-mmap-dmabuf-sanitycheck-32
2731−msm_shrink@copy-mmap-dmabuf-8
2732−msm_shrink@copy-mmap-dmabuf-32
2733−msm_shrink@copy-mmap-dmabuf-madvise-8
2734−msm_shrink@copy-mmap-dmabuf-madvise-32
2735−msm_shrink@copy-mmap-dmabuf-oom-8
2736−msm_shrink@copy-mmap-dmabuf-oom-32
2737−msm_mapping@ring
2738−msm_mapping@sqefw
2739−msm_mapping@shadow
2740−msm_submitoverhead@submitbench-10-bos
2741−msm_submitoverhead@submitbench-10-bos-no-implicit-sync
2742−msm_submitoverhead@submitbench-100-bos
2743−msm_submitoverhead@submitbench-100-bos-no-implicit-sync
2744−msm_submitoverhead@submitbench-250-bos
2745−msm_submitoverhead@submitbench-250-bos-no-implicit-sync
2746−msm_submitoverhead@submitbench-500-bos
2747−msm_submitoverhead@submitbench-500-bos-no-implicit-sync
2748−msm_submitoverhead@submitbench-1000-bos
2749−msm_submitoverhead@submitbench-1000-bos-no-implicit-sync
2750−msm_recovery@hangcheck
2751−msm_recovery@gpu-fault
2752−msm_recovery@gpu-fault-parallel
2753−msm_recovery@iova-fault
2754−msm_submit@empty-submit
2755−msm_submit@invalid-queue-submit
2756−msm_submit@invalid-flags-submit
2757−msm_submit@invalid-in-fence-submit
2758−msm_submit@invalid-duplicate-bo-submit
2759−msm_submit@invalid-cmd-idx-submit
2760−msm_submit@invalid-cmd-type-submit
2761−msm_submit@valid-submit
drivers/gpu/drm/ci/x86_64.config+1−0
@@ -24,6 +24,7 @@ CONFIG_DRM=y · 23 unmodified lines
2424 CONFIG_DRM_PANEL_SIMPLE=y
2525 CONFIG_PWM_CROS_EC=y
2626 CONFIG_BACKLIGHT_PWM=y
27+CONFIG_DRM_VKMS=m
2728
2829 # Strip out some stuff we don't need for graphics testing, to reduce
2930 # the build.
drivers/gpu/drm/ci/xfails/amdgpu-stoney-fails.txt+27−14
@@ -1,27 +1,40 @@
1+amdgpu/amd_abm@abm_enabled,Fail
2+amdgpu/amd_abm@abm_gradual,Fail
3+amdgpu/amd_abm@backlight_monotonic_abm,Fail
4+amdgpu/amd_abm@backlight_monotonic_basic,Fail
5+amdgpu/amd_assr@assr-links,Fail
6+amdgpu/amd_assr@assr-links-dpms,Fail
7+amdgpu/amd_mall@static-screen,Crash
8+amdgpu/amd_mode_switch@mode-switch-first-last-pipe-2,Crash
9+amdgpu/amd_plane@mpo-pan-nv12,Fail
10+amdgpu/amd_plane@mpo-pan-p010,Fail
11+amdgpu/amd_plane@mpo-pan-rgb,Crash
12+amdgpu/amd_plane@mpo-scale-nv12,Fail
13+amdgpu/amd_plane@mpo-scale-p010,Fail
14+amdgpu/amd_plane@mpo-scale-rgb,Crash
15+amdgpu/amd_plane@mpo-swizzle-toggle,Fail
16+amdgpu/amd_uvd_dec@amdgpu_uvd_decode,Fail
17+dumb_buffer@invalid-bpp,Fail
118 kms_addfb_basic@bad-pitch-65536,Fail
219 kms_addfb_basic@bo-too-small,Fail
320 kms_addfb_basic@too-high,Fail
4−kms_async_flips@async-flip-with-page-flip-events,Fail
5−kms_async_flips@crc,Fail
6−kms_async_flips@invalid-async-flip,Fail
721 kms_atomic_transition@plane-all-modeset-transition-internal-panels,Fail
822 kms_atomic_transition@plane-all-transition,Fail
923 kms_atomic_transition@plane-all-transition-nonblocking,Fail
1024 kms_atomic_transition@plane-toggle-modeset-transition,Fail
1125 kms_atomic_transition@plane-use-after-nonblocking-unbind,Fail
12−kms_bw@linear-tiling-1-displays-2560x1440p,Fail
13−kms_bw@linear-tiling-1-displays-3840x2160p,Fail
14−kms_bw@linear-tiling-2-displays-3840x2160p,Fail
15−kms_bw@linear-tiling-3-displays-1920x1080p,Fail
16−kms_color@degamma,Fail
26+kms_cursor_crc@cursor-onscreen-64x21,Fail
27+kms_cursor_crc@cursor-onscreen-64x64,Fail
28+kms_cursor_crc@cursor-random-64x21,Fail
29+kms_cursor_crc@cursor-random-64x64,Fail
1730 kms_cursor_crc@cursor-size-change,Fail
18−kms_cursor_crc@pipe-A-cursor-size-change,Fail
19−kms_cursor_crc@pipe-B-cursor-size-change,Fail
31+kms_cursor_crc@cursor-sliding-64x21,Fail
32+kms_cursor_crc@cursor-sliding-64x64,Fail
2033 kms_flip@flip-vs-modeset-vs-hang,Fail
2134 kms_flip@flip-vs-panning-vs-hang,Fail
22−kms_hdr@bpc-switch,Fail
23−kms_hdr@bpc-switch-dpms,Fail
35+kms_lease@lease-uevent,Fail
2436 kms_plane@pixel-format,Fail
25−kms_plane_multiple@atomic-pipe-A-tiling-none,Fail
26−kms_rmfb@close-fd,Fail
37+kms_plane_cursor@primary,Fail
2738 kms_rotation_crc@primary-rotation-180,Fail
39+perf@i915-ref-count,Fail
40+tools_test@tools_test,Fail
drivers/gpu/drm/ci/xfails/amdgpu-stoney-flakes.txt+7−0
@@ -1 +1,8 @@
1+# Board Name: hp-11A-G6-EE-grunt
2+# Bug Report: https://lore.kernel.org/amd-gfx/3542730f-b8d7-404d-a947-b7a5e95d661c@collabora.com/T/#u
3+# IGT Version: 1.28-g0df7b9b97
4+# Linux Version: 6.9.0-rc7
5+# Failure Rate: 50
16 kms_async_flips@async-flip-with-page-flip-events
7+kms_async_flips@crc
8+kms_plane@pixel-format-source-clamping
drivers/gpu/drm/ci/xfails/amdgpu-stoney-skips.txt+32−1
@@ -1,2 +1,33 @@
11 # Suspend to RAM seems to be broken on this machine
2−.*suspend.*
2+.*suspend.*
3+
4+# Skip driver specific tests
5+msm_.*
6+nouveau_.*
7+panfrost_.*
8+^v3d.*
9+^vc4.*
10+^vmwgfx*
11+
12+# Skip intel specific tests
13+gem_.*
14+i915_.*
15+xe_.*
16+
17+# Currently fails and causes coverage loss for other tests
18+# since core_getversion also fails.
19+amdgpu/amd_module_load@reload
20+core_hotunplug.*
21+
22+# GPU reset seen and it hangs the machine
23+amdgpu/amd_deadlock@amdgpu-deadlock-sdma
24+amdgpu/amd_deadlock@amdgpu-gfx-illegal-reg-access
25+amdgpu/amd_dispatch@amdgpu-reset-test-gfx-with-IP-GFX-and-COMPUTE
26+
27+# Hangs the machine and timeout occurs
28+amdgpu/amd_pci_unplug@amdgpu_hotunplug_simple
29+amdgpu/amd_pci_unplug@amdgpu_hotunplug_with_cs
30+amdgpu/amd_pci_unplug@amdgpu_hotunplug_with_exported_bo
31+amdgpu/amd_pci_unplug@amdgpu_hotunplug_with_exported_fence
32+amdgpu/amd_vrr_range@freesync-parsing
33+device_reset.*
drivers/gpu/drm/ci/xfails/i915-amly-fails.txt+31−0
@@ -1,3 +1,16 @@
1+core_setmaster@master-drop-set-user,Fail
2+core_setmaster_vs_auth,Fail
3+i915_module_load@load,Fail
4+i915_module_load@reload,Fail
5+i915_module_load@reload-no-display,Fail
6+i915_module_load@resize-bar,Fail
7+i915_pm_rpm@gem-execbuf-stress,Timeout
8+i915_pm_rpm@module-reload,Fail
9+kms_async_flips@invalid-async-flip,Timeout
10+kms_atomic_transition@modeset-transition-fencing,Timeout
11+kms_ccs@crc-primary-rotation-180-yf-tiled-ccs,Timeout
12+kms_fb_coherency@memset-crc,Crash
13+kms_flip@flip-vs-dpms-off-vs-modeset,Timeout
114 kms_flip_scaled_crc@flip-32bpp-linear-to-64bpp-linear-downscaling,Fail
215 kms_flip_scaled_crc@flip-32bpp-linear-to-64bpp-linear-upscaling,Fail
316 kms_flip_scaled_crc@flip-32bpp-xtile-to-64bpp-xtile-downscaling,Fail
@@ -20,7 +33,25 @@ kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-downscaling,Fail · 16 unmodified lines
2033 kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-upscaling,Fail
2134 kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling,Fail
2235 kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilercccs-downscaling,Fail
36+kms_lease@lease-uevent,Fail
2337 kms_plane_alpha_blend@alpha-basic,Fail
2438 kms_plane_alpha_blend@alpha-opaque-fb,Fail
2539 kms_plane_alpha_blend@alpha-transparent-fb,Fail
2640 kms_plane_alpha_blend@constant-alpha-max,Fail
41+kms_plane_scaling@plane-scaler-with-clipping-clamping-rotation,Timeout
42+kms_pm_rpm@modeset-lpsp-stress,Timeout
43+kms_pm_rpm@modeset-stress-extra-wait,Timeout
44+kms_pm_rpm@universal-planes,Timeout
45+kms_pm_rpm@universal-planes-dpms,Timeout
46+perf@i915-ref-count,Fail
47+perf_pmu@module-unload,Fail
48+perf_pmu@rc6,Crash
49+sysfs_heartbeat_interval@long,Timeout
50+sysfs_heartbeat_interval@off,Timeout
51+sysfs_preempt_timeout@off,Timeout
52+sysfs_timeslice_duration@off,Timeout
53+xe_module_load@force-load,Fail
54+xe_module_load@load,Fail
55+xe_module_load@many-reload,Fail
56+xe_module_load@reload,Fail
57+xe_module_load@reload-no-display,Fail
drivers/gpu/drm/ci/xfails/i915-amly-flakes.txt+9−0
@@ -0,0 +1,9 @@
1+# Board Name: asus-C433TA-AJ0005-rammus
2+# Bug Report: https://lore.kernel.org/intel-gfx/af4ca4df-a3ef-4943-bdbf-4c3af2c333af@collabora.com/T/#u
3+# IGT Version: 1.28-g0df7b9b97
4+# Linux Version: 6.9.0-rc7
5+# Failure Rate: 50
6+i915_hangman@engine-engine-error
7+i915_hangman@gt-engine-hang
8+kms_async_flips@crc
9+kms_universal_plane@cursor-fb-leak
drivers/gpu/drm/ci/xfails/i915-amly-skips.txt+21−1
@@ -1,4 +1,24 @@
11 # Suspend to RAM seems to be broken on this machine
22 .*suspend.*
33 # This is generating kernel oops with divide error
4−kms_plane_scaling@invalid-parameters
4+kms_plane_scaling@invalid-parameters
5+
6+# Skip driver specific tests
7+^amdgpu.*
8+msm_.*
9+nouveau_.*
10+panfrost_.*
11+^v3d.*
12+^vc4.*
13+^vmwgfx*
14+
15+# GEM tests takes ~1000 hours, so skip it
16+gem_.*
17+
18+# Hangs the machine and timeout occurs
19+i915_pm_rc6_residency.*
20+i915_suspend.*
21+kms_scaling_modes.*
22+
23+# Kernel panic
24+drm_fdinfo.*
drivers/gpu/drm/ci/xfails/i915-apl-fails.txt+26−20
@@ -1,13 +1,7 @@
1−kms_3d,Timeout
2−kms_bw@linear-tiling-2-displays-1920x1080p,Fail
3−kms_bw@linear-tiling-2-displays-2560x1440p,Fail
4−kms_bw@linear-tiling-2-displays-3840x2160p,Fail
5−kms_bw@linear-tiling-3-displays-1920x1080p,Fail
6−kms_bw@linear-tiling-3-displays-2560x1440p,Fail
7−kms_bw@linear-tiling-3-displays-3840x2160p,Fail
8−kms_bw@linear-tiling-4-displays-1920x1080p,Fail
9−kms_bw@linear-tiling-4-displays-2560x1440p,Fail
10−kms_bw@linear-tiling-4-displays-3840x2160p,Fail
1+i915_module_load@load,Fail
2+i915_module_load@reload,Fail
3+i915_module_load@reload-no-display,Fail
4+i915_module_load@resize-bar,Fail
115 kms_flip_scaled_crc@flip-32bpp-linear-to-64bpp-linear-downscaling,Fail
126 kms_flip_scaled_crc@flip-32bpp-linear-to-64bpp-linear-upscaling,Fail
137 kms_flip_scaled_crc@flip-32bpp-xtile-to-64bpp-xtile-downscaling,Fail
@@ -30,18 +24,30 @@ kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-downscaling,Fail · 16 unmodified lines
3024 kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-upscaling,Fail
3125 kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling,Fail
3226 kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilercccs-downscaling,Fail
33−kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilercccs-upscaling,Fail
27+kms_lease@lease-uevent,Fail
3428 kms_plane_alpha_blend@alpha-basic,Fail
3529 kms_plane_alpha_blend@alpha-opaque-fb,Fail
3630 kms_plane_alpha_blend@alpha-transparent-fb,Fail
3731 kms_plane_alpha_blend@constant-alpha-max,Fail
38−kms_plane_alpha_blend@pipe-A-alpha-opaque-fb,Fail
39−kms_plane_alpha_blend@pipe-A-alpha-transparent-fb,Fail
40−kms_plane_alpha_blend@pipe-A-constant-alpha-max,Fail
41−kms_plane_alpha_blend@pipe-B-alpha-opaque-fb,Fail
42−kms_plane_alpha_blend@pipe-B-alpha-transparent-fb,Fail
43−kms_plane_alpha_blend@pipe-B-constant-alpha-max,Fail
44−kms_plane_alpha_blend@pipe-C-alpha-opaque-fb,Fail
45−kms_plane_alpha_blend@pipe-C-alpha-transparent-fb,Fail
46−kms_plane_alpha_blend@pipe-C-constant-alpha-max,Fail
32+kms_pm_backlight@basic-brightness,Fail
33+kms_pm_backlight@fade,Fail
34+kms_pm_backlight@fade-with-dpms,Fail
35+kms_pm_rpm@legacy-planes,Timeout
36+kms_pm_rpm@legacy-planes-dpms,Timeout
37+kms_pm_rpm@modeset-stress-extra-wait,Timeout
38+kms_pm_rpm@universal-planes,Timeout
39+kms_pm_rpm@universal-planes-dpms,Timeout
4740 kms_sysfs_edid_timing,Fail
41+perf@i915-ref-count,Fail
42+perf@non-zero-reason,Timeout
43+perf_pmu@module-unload,Fail
44+perf_pmu@rc6,Crash
45+sysfs_heartbeat_interval@long,Timeout
46+sysfs_heartbeat_interval@off,Timeout
47+sysfs_preempt_timeout@off,Timeout
48+sysfs_timeslice_duration@off,Timeout
49+xe_module_load@force-load,Fail
50+xe_module_load@load,Fail
51+xe_module_load@many-reload,Fail
52+xe_module_load@reload,Fail
53+xe_module_load@reload-no-display,Fail
drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt+6−0
@@ -0,0 +1,6 @@
1+# Board Name: asus-C523NA-A20057-coral
2+# Bug Report: https://lore.kernel.org/intel-gfx/af4ca4df-a3ef-4943-bdbf-4c3af2c333af@collabora.com/T/#u
3+# IGT Version: 1.28-g0df7b9b97
4+# Linux Version: 6.9.0-rc7
5+# Failure Rate: 50
6+kms_fb_coherency@memset-crc
drivers/gpu/drm/ci/xfails/i915-apl-skips.txt+25−1
@@ -3,4 +3,28 @@ · 2 unmodified lines
33 # This is generating kernel oops with divide error
44 kms_plane_scaling@invalid-parameters
55 # This is cascading issues
6−kms_3d
6+kms_3d
7+
8+# Skip driver specific tests
9+^amdgpu.*
10+msm_.*
11+nouveau_.*
12+panfrost_.*
13+^v3d.*
14+^vc4.*
15+^vmwgfx*
16+
17+# GEM tests takes ~1000 hours, so skip it
18+gem_.*
19+
20+# Hangs the machine and timeout occurs
21+i915_pm_rc6_residency.*
22+i915_suspend.*
23+i915_pm_rpm.*
24+device_reset.*
25+api_intel_allocator.*
26+kms_frontbuffer_tracking.*
27+kms_ccs.*
28+
29+# Kernel panic
30+drm_fdinfo.*
drivers/gpu/drm/ci/xfails/i915-cml-fails.txt+38−0
@@ -1,3 +1,19 @@
1+core_setmaster@master-drop-set-user,Fail
2+core_setmaster_vs_auth,Fail
3+i915_module_load@load,Fail
4+i915_module_load@reload,Fail
5+i915_module_load@reload-no-display,Fail
6+i915_module_load@resize-bar,Fail
7+i915_pipe_stress@stress-xrgb8888-untiled,Fail
8+i915_pipe_stress@stress-xrgb8888-ytiled,Fail
9+i915_pm_rpm@gem-execbuf-stress,Timeout
10+i915_pm_rpm@module-reload,Fail
11+i915_pm_rpm@system-suspend-execbuf,Timeout
12+kms_async_flips@invalid-async-flip,Timeout
13+kms_atomic_transition@modeset-transition-fencing,Timeout
14+kms_ccs@crc-primary-rotation-180-yf-tiled-ccs,Timeout
15+kms_fb_coherency@memset-crc,Crash
16+kms_flip@flip-vs-dpms-off-vs-modeset,Timeout
117 kms_flip_scaled_crc@flip-32bpp-linear-to-64bpp-linear-downscaling,Fail
218 kms_flip_scaled_crc@flip-32bpp-linear-to-64bpp-linear-upscaling,Fail
319 kms_flip_scaled_crc@flip-32bpp-xtile-to-64bpp-xtile-downscaling,Fail
@@ -20,11 +36,33 @@ kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-downscaling,Fail · 16 unmodified lines
2036 kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-upscaling,Fail
2137 kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling,Fail
2238 kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilercccs-downscaling,Fail
39+kms_lease@lease-uevent,Fail
2340 kms_plane_alpha_blend@alpha-basic,Fail
2441 kms_plane_alpha_blend@alpha-opaque-fb,Fail
2542 kms_plane_alpha_blend@alpha-transparent-fb,Fail
2643 kms_plane_alpha_blend@constant-alpha-max,Fail
2744 kms_plane_alpha_blend@constant-alpha-min,Fail
45+kms_plane_scaling@plane-scaler-with-clipping-clamping-rotation,Timeout
46+kms_pm_rpm@modeset-stress-extra-wait,Timeout
47+kms_pm_rpm@universal-planes,Timeout
48+kms_pm_rpm@universal-planes-dpms,Timeout
49+kms_psr2_sf@fbc-plane-move-sf-dmg-area,Timeout
50+kms_psr2_sf@overlay-plane-update-continuous-sf,Fail
51+kms_psr2_sf@overlay-plane-update-sf-dmg-area,Fail
52+kms_psr2_sf@primary-plane-update-sf-dmg-area,Fail
53+kms_psr2_sf@primary-plane-update-sf-dmg-area-big-fb,Fail
2854 kms_psr2_su@page_flip-NV12,Fail
2955 kms_psr2_su@page_flip-P010,Fail
56+kms_psr@psr-sprite-render,Timeout
3057 kms_setmode@basic,Fail
58+perf@i915-ref-count,Fail
59+perf_pmu@module-unload,Fail
60+perf_pmu@rc6,Crash
61+perf_pmu@rc6-suspend,Crash
62+sysfs_heartbeat_interval@long,Timeout
63+sysfs_heartbeat_interval@off,Timeout
64+sysfs_preempt_timeout@off,Timeout
65+sysfs_timeslice_duration@off,Timeout
66+xe_module_load@force-load,Fail
67+xe_module_load@load,Fail
68+xe_module_load@many-reload,Fail
drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt+6−0
@@ -0,0 +1,6 @@
1+# Board Name: asus-C436FA-Flip-hatch
2+# Bug Report: https://lore.kernel.org/intel-gfx/af4ca4df-a3ef-4943-bdbf-4c3af2c333af@collabora.com/T/#u
3+# IGT Version: 1.28-g0df7b9b97
4+# Linux Version: 6.9.0-rc7
5+# Failure Rate: 50
6+kms_plane_alpha_blend@constant-alpha-min
drivers/gpu/drm/ci/xfails/i915-cml-skips.txt+23−0
@@ -1,2 +1,25 @@
11 # This is generating kernel oops with divide error
22 kms_plane_scaling@invalid-parameters
3+
4+# Skip driver specific tests
5+^amdgpu.*
6+msm_.*
7+nouveau_.*
8+panfrost_.*
9+^v3d.*
10+^vc4.*
11+^vmwgfx*
12+
13+# GEM tests takes ~1000 hours, so skip it
14+gem_.*
15+
16+# Hangs the machine and timeout occurs
17+i915_pm_rc6_residency.*
18+i915_suspend.*
19+xe_module_load.*
20+api_intel_allocator.*
21+kms_cursor_legacy.*
22+
23+# Kernel panic
24+drm_fdinfo.*
25+kms_frontbuffer_tracking.*
drivers/gpu/drm/ci/xfails/i915-glk-fails.txt+34−7
@@ -1,5 +1,20 @@
1−kms_fbcon_fbt@fbc,Fail
2−kms_flip@blocking-wf_vblank,Fail
1+core_setmaster@master-drop-set-user,Fail
2+i915_module_load@load,Fail
3+i915_module_load@reload,Fail
4+i915_module_load@reload-no-display,Fail
5+i915_module_load@resize-bar,Fail
6+kms_async_flips@invalid-async-flip,Timeout
7+kms_atomic_transition@modeset-transition-fencing,Timeout
8+kms_big_fb@linear-16bpp-rotate-0,Fail
9+kms_big_fb@linear-16bpp-rotate-180,Fail
10+kms_big_fb@linear-32bpp-rotate-0,Fail
11+kms_big_fb@linear-32bpp-rotate-180,Fail
12+kms_big_fb@linear-8bpp-rotate-0,Fail
13+kms_big_fb@linear-8bpp-rotate-180,Fail
14+kms_big_fb@linear-max-hw-stride-32bpp-rotate-0,Fail
15+kms_dirtyfb@default-dirtyfb-ioctl,Fail
16+kms_draw_crc@draw-method-render,Fail
17+kms_flip@flip-vs-dpms-off-vs-modeset,Timeout
318 kms_flip@wf_vblank-ts-check,Fail
419 kms_flip@wf_vblank-ts-check-interruptible,Fail
520 kms_flip_scaled_crc@flip-32bpp-linear-to-64bpp-linear-downscaling,Fail
@@ -11,7 +26,6 @@ kms_flip_scaled_crc@flip-32bpp-ytile-to-64bpp-ytile-upscaling,Fail · 5 unmodified lines
1126 kms_flip_scaled_crc@flip-32bpp-ytileccs-to-64bpp-ytile-downscaling,Fail
1227 kms_flip_scaled_crc@flip-32bpp-ytileccs-to-64bpp-ytile-upscaling,Fail
1328 kms_flip_scaled_crc@flip-64bpp-linear-to-16bpp-linear-downscaling,Fail
14−kms_flip_scaled_crc@flip-64bpp-linear-to-16bpp-linear-upscaling,Fail
1529 kms_flip_scaled_crc@flip-64bpp-linear-to-32bpp-linear-downscaling,Fail
1630 kms_flip_scaled_crc@flip-64bpp-linear-to-32bpp-linear-upscaling,Fail
1731 kms_flip_scaled_crc@flip-64bpp-xtile-to-16bpp-xtile-downscaling,Fail
@@ -26,11 +40,24 @@ kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling,Fail · 8 unmodified lines
2640 kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilercccs-downscaling,Fail
2741 kms_frontbuffer_tracking@fbc-tiling-linear,Fail
2842 kms_frontbuffer_tracking@fbcdrrs-tiling-linear,Fail
29−kms_plane_alpha_blend@alpha-basic,Fail
43+kms_lease@lease-uevent,Fail
3044 kms_plane_alpha_blend@alpha-opaque-fb,Fail
31−kms_plane_alpha_blend@alpha-transparent-fb,Fail
32−kms_plane_alpha_blend@constant-alpha-max,Fail
45+kms_plane_scaling@plane-scaler-with-clipping-clamping-rotation,Timeout
46+kms_pm_rpm@legacy-planes,Timeout
47+kms_pm_rpm@legacy-planes-dpms,Timeout
48+kms_pm_rpm@modeset-stress-extra-wait,Timeout
49+kms_pm_rpm@universal-planes,Timeout
50+kms_pm_rpm@universal-planes-dpms,Timeout
3351 kms_rotation_crc@multiplane-rotation,Fail
3452 kms_rotation_crc@multiplane-rotation-cropping-bottom,Fail
3553 kms_rotation_crc@multiplane-rotation-cropping-top,Fail
36−kms_setmode@basic,Fail
54+perf@non-zero-reason,Timeout
55+sysfs_heartbeat_interval@long,Timeout
56+sysfs_heartbeat_interval@off,Timeout
57+sysfs_preempt_timeout@off,Timeout
58+sysfs_timeslice_duration@off,Timeout
59+xe_module_load@force-load,Fail
60+xe_module_load@load,Fail
61+xe_module_load@many-reload,Fail
62+xe_module_load@reload,Fail
63+xe_module_load@reload-no-display,Fail
drivers/gpu/drm/ci/xfails/i915-glk-flakes.txt+7−0
@@ -0,0 +1,7 @@
1+# Board Name: hp-x360-12b-ca0010nr-n4020-octopus
2+# Bug Report: https://lore.kernel.org/intel-gfx/af4ca4df-a3ef-4943-bdbf-4c3af2c333af@collabora.com/T/#u
3+# IGT Version: 1.28-g0df7b9b97
4+# Linux Version: 6.9.0-rc7
5+# Failure Rate: 50
6+core_hotunplug@unplug-rescan
7+kms_fb_coherency@memset-crc
drivers/gpu/drm/ci/xfails/i915-glk-skips.txt+25−1
@@ -2,4 +2,28 @@ · 1 unmodified line
22 .*suspend.*
33
44 # This is generating kernel oops with divide error
5−kms_plane_scaling@invalid-parameters
5+kms_plane_scaling@invalid-parameters
6+
7+# Skip driver specific tests
8+^amdgpu.*
9+msm_.*
10+nouveau_.*
11+panfrost_.*
12+^v3d.*
13+^vc4.*
14+^vmwgfx*
15+
16+# GEM tests takes ~1000 hours, so skip it
17+gem_.*
18+
19+# Hangs the machine and timeout occurs
20+i915_pm_rc6_residency.*
21+i915_suspend.*
22+i915_pm_rpm.*
23+kms_ccs.*
24+kms_plane_multiple.*
25+perf.*
26+
27+# Kernel panic
28+drm_fdinfo.*
29+kms_plane_alpha_blend.*
drivers/gpu/drm/ci/xfails/i915-kbl-fails.txt+19−23
@@ -1,32 +1,28 @@
1−kms_bw@linear-tiling-2-displays-2560x1440p,Fail
2−kms_bw@linear-tiling-4-displays-2560x1440p,Fail
3−kms_flip_scaled_crc@flip-32bpp-linear-to-64bpp-linear-downscaling,Fail
4−kms_flip_scaled_crc@flip-32bpp-linear-to-64bpp-linear-upscaling,Fail
1+i915_module_load@load,Fail
2+i915_module_load@reload,Fail
3+i915_module_load@reload-no-display,Fail
4+i915_module_load@resize-bar,Fail
5+i915_pm_rpm@gem-execbuf-stress,Timeout
56 kms_flip_scaled_crc@flip-32bpp-xtile-to-64bpp-xtile-downscaling,Fail
6−kms_flip_scaled_crc@flip-32bpp-xtile-to-64bpp-xtile-upscaling,Fail
7−kms_flip_scaled_crc@flip-32bpp-ytile-to-64bpp-ytile-downscaling,Fail
87 kms_flip_scaled_crc@flip-32bpp-ytile-to-64bpp-ytile-upscaling,Fail
9−kms_flip_scaled_crc@flip-32bpp-ytileccs-to-64bpp-ytile-downscaling,Fail
108 kms_flip_scaled_crc@flip-32bpp-ytileccs-to-64bpp-ytile-upscaling,Fail
119 kms_flip_scaled_crc@flip-64bpp-linear-to-16bpp-linear-downscaling,Fail
12−kms_flip_scaled_crc@flip-64bpp-linear-to-16bpp-linear-upscaling,Fail
13−kms_flip_scaled_crc@flip-64bpp-linear-to-32bpp-linear-downscaling,Fail
1410 kms_flip_scaled_crc@flip-64bpp-linear-to-32bpp-linear-upscaling,Fail
15−kms_flip_scaled_crc@flip-64bpp-xtile-to-16bpp-xtile-downscaling,Fail
1611 kms_flip_scaled_crc@flip-64bpp-xtile-to-16bpp-xtile-upscaling,Fail
17−kms_flip_scaled_crc@flip-64bpp-xtile-to-32bpp-xtile-downscaling,Fail
18−kms_flip_scaled_crc@flip-64bpp-xtile-to-32bpp-xtile-upscaling,Fail
19−kms_flip_scaled_crc@flip-64bpp-ytile-to-16bpp-ytile-downscaling,Fail
20−kms_flip_scaled_crc@flip-64bpp-ytile-to-16bpp-ytile-upscaling,Fail
2112 kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-downscaling,Fail
22−kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-upscaling,Fail
2313 kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling,Fail
24−kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilercccs-downscaling,Fail
25−kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilercccs-upscaling,Fail
26−kms_plane_alpha_blend@alpha-basic,Fail
27−kms_plane_alpha_blend@alpha-opaque-fb,Fail
14+kms_lease@lease-uevent,Fail
2815 kms_plane_alpha_blend@alpha-transparent-fb,Fail
29−kms_plane_alpha_blend@constant-alpha-max,Fail
30−kms_plane_alpha_blend@pipe-A-constant-alpha-max,Fail
31−kms_plane_alpha_blend@pipe-B-alpha-opaque-fb,Fail
32−kms_plane_alpha_blend@pipe-C-constant-alpha-max,Fail
16+perf@i915-ref-count,Fail
17+perf_pmu@busy-accuracy-50,Fail
18+perf_pmu@module-unload,Fail
19+perf_pmu@rc6,Crash
20+sysfs_heartbeat_interval@long,Timeout
21+sysfs_heartbeat_interval@off,Timeout
22+sysfs_preempt_timeout@off,Timeout
23+sysfs_timeslice_duration@off,Timeout
24+xe_module_load@force-load,Fail
25+xe_module_load@load,Fail
26+xe_module_load@many-reload,Fail
27+xe_module_load@reload,Fail
28+xe_module_load@reload-no-display,Fail
drivers/gpu/drm/ci/xfails/i915-kbl-flakes.txt+6−1
@@ -1 +1,6 @@
1−kms_async_flips@crc
1+# Board Name: hp-x360-14-G1-sona
2+# Bug Report: https://lore.kernel.org/intel-gfx/af4ca4df-a3ef-4943-bdbf-4c3af2c333af@collabora.com/T/#u
3+# IGT Version: 1.28-g0df7b9b97
4+# Linux Version: 6.9.0-rc7
5+# Failure Rate: 50
6+prime_busy@hang
drivers/gpu/drm/ci/xfails/i915-kbl-skips.txt+35−1
@@ -2,4 +2,38 @@ · 1 unmodified line
22 .*suspend.*
33
44 # This is generating kernel oops with divide error
5−kms_plane_scaling@invalid-parameters
5+kms_plane_scaling@invalid-parameters
6+
7+# Skip driver specific tests
8+^amdgpu.*
9+msm_.*
10+nouveau_.*
11+panfrost_.*
12+^v3d.*
13+^vc4.*
14+^vmwgfx*
15+
16+# GEM tests takes ~1000 hours, so skip it
17+gem_.*
18+
19+# Hangs the machine and timeout occurs
20+i915_.*
21+api_intel_bb.*
22+
23+# Kernel panic
24+drm_fdinfo.*
25+kms_.*
26+prime_mmap_coherency.*
27+perf.*
28+drm_read.*
29+api_intel_allocator.*
30+sysfs_preempt_timeout.*
31+dumb_buffer.*
32+gen9_exec_parse.*
33+debugfs_test.*
34+core_hotunplug.*
35+tools_test.*
36+
37+# GPU hang
38+sysfs_timeslice_.*
39+sysfs_heartbeat_.*
drivers/gpu/drm/ci/xfails/i915-tgl-fails.txt+42−35
@@ -1,36 +1,43 @@
1−kms_bw@linear-tiling-2-displays-3840x2160p,Fail
2−kms_bw@linear-tiling-3-displays-1920x1080p,Fail
3−kms_bw@linear-tiling-3-displays-2560x1440p,Fail
4−kms_bw@linear-tiling-3-displays-3840x2160p,Fail
5−kms_bw@linear-tiling-4-displays-1920x1080p,Fail
6−kms_bw@linear-tiling-4-displays-2560x1440p,Fail
7−kms_bw@linear-tiling-4-displays-3840x2160p,Fail
8−kms_bw@linear-tiling-5-displays-1920x1080p,Fail
9−kms_bw@linear-tiling-5-displays-2560x1440p,Fail
10−kms_bw@linear-tiling-5-displays-3840x2160p,Fail
11−kms_flip@flip-vs-panning-vs-hang,Timeout
12−kms_flip_scaled_crc@flip-32bpp-linear-to-64bpp-linear-downscaling,Fail
13−kms_flip_scaled_crc@flip-32bpp-linear-to-64bpp-linear-upscaling,Fail
14−kms_flip_scaled_crc@flip-32bpp-xtile-to-64bpp-xtile-downscaling,Fail
15−kms_flip_scaled_crc@flip-32bpp-xtile-to-64bpp-xtile-upscaling,Fail
16−kms_flip_scaled_crc@flip-32bpp-ytile-to-64bpp-ytile-downscaling,Fail
17−kms_flip_scaled_crc@flip-32bpp-ytile-to-64bpp-ytile-upscaling,Fail
18−kms_flip_scaled_crc@flip-64bpp-linear-to-16bpp-linear-downscaling,Fail
19−kms_flip_scaled_crc@flip-64bpp-linear-to-16bpp-linear-upscaling,Fail
20−kms_flip_scaled_crc@flip-64bpp-linear-to-32bpp-linear-downscaling,Fail
21−kms_flip_scaled_crc@flip-64bpp-linear-to-32bpp-linear-upscaling,Fail
22−kms_flip_scaled_crc@flip-64bpp-xtile-to-16bpp-xtile-downscaling,Fail
23−kms_flip_scaled_crc@flip-64bpp-xtile-to-16bpp-xtile-upscaling,Fail
24−kms_flip_scaled_crc@flip-64bpp-xtile-to-32bpp-xtile-downscaling,Fail
25−kms_flip_scaled_crc@flip-64bpp-xtile-to-32bpp-xtile-upscaling,Fail
26−kms_flip_scaled_crc@flip-64bpp-ytile-to-16bpp-ytile-downscaling,Fail
27−kms_flip_scaled_crc@flip-64bpp-ytile-to-16bpp-ytile-upscaling,Fail
28−kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-downscaling,Fail
29−kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-upscaling,Fail
30−kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling,Fail
31−kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilercccs-downscaling,Fail
32−kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilercccs-upscaling,Fail
33−kms_rotation_crc@bad-pixel-format,Fail
1+api_intel_bb@blit-noreloc-keep-cache,Timeout
2+api_intel_bb@offset-control,Timeout
3+api_intel_bb@render-ccs,Timeout
4+core_getclient,Timeout
5+core_hotunplug@hotreplug-lateclose,Timeout
6+drm_read@short-buffer-block,Timeout
7+drm_read@short-buffer-nonblock,Timeout
8+dumb_buffer@map-uaf,Timeout
9+gen3_render_tiledx_blits,Timeout
10+gen7_exec_parse@basic-allocation,Timeout
11+gen7_exec_parse@batch-without-end,Timeout
12+gen9_exec_parse@batch-invalid-length,Timeout
13+gen9_exec_parse@bb-secure,Timeout
14+i915_module_load@load,Fail
15+i915_module_load@reload,Fail
16+i915_module_load@reload-no-display,Fail
17+i915_module_load@resize-bar,Fail
18+i915_pciid,Timeout
19+i915_query@engine-info,Timeout
20+kms_lease@lease-uevent,Fail
3421 kms_rotation_crc@multiplane-rotation,Fail
35−kms_rotation_crc@multiplane-rotation-cropping-bottom,Fail
36−kms_rotation_crc@multiplane-rotation-cropping-top,Fail
22+perf@i915-ref-count,Fail
23+perf_pmu@busy,Timeout
24+perf_pmu@enable-race,Timeout
25+perf_pmu@event-wait,Timeout
26+perf_pmu@gt-awake,Timeout
27+perf_pmu@module-unload,Fail
28+perf_pmu@rc6,Crash
29+prime_mmap@test_map_unmap,Timeout
30+prime_self_import@basic-with_one_bo,Timeout
31+syncobj_basic@bad-destroy,Timeout
32+syncobj_eventfd@invalid-bad-pad,Timeout
33+syncobj_wait@invalid-multi-wait-unsubmitted-signaled,Timeout
34+syncobj_wait@invalid-signal-illegal-handle,Timeout
35+syncobj_wait@invalid-single-wait-all-unsubmitted,Timeout
36+syncobj_wait@multi-wait-all-submitted,Timeout
37+syncobj_wait@multi-wait-for-submit-submitted-signaled,Timeout
38+syncobj_wait@wait-any-complex,Timeout
39+syncobj_wait@wait-delayed-signal,Timeout
40+xe_module_load@force-load,Fail
41+xe_module_load@load,Fail
42+xe_module_load@reload,Fail
43+xe_module_load@reload-no-display,Fail
drivers/gpu/drm/ci/xfails/i915-tgl-skips.txt+27−1
@@ -8,4 +8,30 @@ gem_eio.* · 7 unmodified lines
88 kms_flip@absolute-wf_vblank@a-edp1
99
1010 # This is generating kernel oops with divide error
11−kms_plane_scaling@invalid-parameters
11+kms_plane_scaling@invalid-parameters
12+
13+# Skip driver specific tests
14+^amdgpu.*
15+msm_.*
16+nouveau_.*
17+panfrost_.*
18+^v3d.*
19+^vc4.*
20+^vmwgfx*
21+
22+# GEM tests takes ~1000 hours, so skip it
23+gem_.*
24+
25+# Kernel panic
26+drm_fdinfo.*
27+
28+# Hangs the machine and timeout occurs
29+i915_pm_rc6_residency.*
30+i915_suspend.*
31+sysfs_heartbeat_interval.*
32+syncobj_timeline.*
33+sysfs_timeslice_duration.*
34+syncobj_wait.*
35+
36+# Kernel panic and test hangs with multiple kms tests
37+kms_.*
drivers/gpu/drm/ci/xfails/i915-whl-fails.txt+40−23
@@ -1,14 +1,25 @@
1−kms_bw@linear-tiling-2-displays-1920x1080p,Fail
2−kms_bw@linear-tiling-2-displays-2560x1440p,Fail
3−kms_bw@linear-tiling-2-displays-3840x2160p,Fail
4−kms_bw@linear-tiling-3-displays-1920x1080p,Fail
5−kms_bw@linear-tiling-3-displays-2560x1440p,Fail
6−kms_bw@linear-tiling-3-displays-3840x2160p,Fail
7−kms_bw@linear-tiling-4-displays-1920x1080p,Fail
8−kms_bw@linear-tiling-4-displays-2560x1440p,Fail
9−kms_bw@linear-tiling-4-displays-3840x2160p,Fail
10−kms_fbcon_fbt@fbc,Fail
11−kms_fbcon_fbt@fbc-suspend,Fail
1+core_setmaster@master-drop-set-user,Fail
2+core_setmaster_vs_auth,Fail
3+i915_module_load@load,Fail
4+i915_module_load@reload,Fail
5+i915_module_load@reload-no-display,Fail
6+i915_module_load@resize-bar,Fail
7+i915_pm_rpm@gem-execbuf-stress,Timeout
8+i915_pm_rpm@module-reload,Fail
9+i915_pm_rpm@system-suspend-execbuf,Timeout
10+kms_async_flips@invalid-async-flip,Timeout
11+kms_atomic_transition@modeset-transition-fencing,Timeout
12+kms_big_fb@linear-16bpp-rotate-0,Fail
13+kms_big_fb@linear-16bpp-rotate-180,Fail
14+kms_big_fb@linear-32bpp-rotate-0,Fail
15+kms_big_fb@linear-32bpp-rotate-180,Fail
16+kms_big_fb@linear-8bpp-rotate-0,Fail
17+kms_big_fb@linear-8bpp-rotate-180,Fail
18+kms_big_fb@linear-max-hw-stride-32bpp-rotate-0,Fail
19+kms_ccs@crc-primary-rotation-180-yf-tiled-ccs,Timeout
20+kms_dirtyfb@default-dirtyfb-ioctl,Fail
21+kms_draw_crc@draw-method-render,Fail
22+kms_fb_coherency@memset-crc,Crash
1223 kms_flip_scaled_crc@flip-32bpp-linear-to-64bpp-linear-downscaling,Fail
1324 kms_flip_scaled_crc@flip-32bpp-linear-to-64bpp-linear-upscaling,Fail
1425 kms_flip_scaled_crc@flip-32bpp-xtile-to-64bpp-xtile-downscaling,Fail
@@ -18,8 +29,6 @@ kms_flip_scaled_crc@flip-32bpp-ytile-to-64bpp-ytile-upscaling,Fail · 3 unmodified lines
1829 kms_flip_scaled_crc@flip-32bpp-ytileccs-to-64bpp-ytile-downscaling,Fail
1930 kms_flip_scaled_crc@flip-32bpp-ytileccs-to-64bpp-ytile-upscaling,Fail
2031 kms_flip_scaled_crc@flip-64bpp-linear-to-16bpp-linear-downscaling,Fail
21−kms_flip_scaled_crc@flip-64bpp-linear-to-16bpp-linear-upscaling,Fail
22−kms_flip_scaled_crc@flip-64bpp-linear-to-32bpp-linear-downscaling,Fail
2332 kms_flip_scaled_crc@flip-64bpp-linear-to-32bpp-linear-upscaling,Fail
2433 kms_flip_scaled_crc@flip-64bpp-xtile-to-16bpp-xtile-downscaling,Fail
2534 kms_flip_scaled_crc@flip-64bpp-xtile-to-16bpp-xtile-upscaling,Fail
@@ -31,18 +40,26 @@ kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-downscaling,Fail · 5 unmodified lines
3140 kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-upscaling,Fail
3241 kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling,Fail
3342 kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilercccs-downscaling,Fail
34−kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilercccs-upscaling,Fail
3543 kms_frontbuffer_tracking@fbc-tiling-linear,Fail
44+kms_lease@lease-uevent,Fail
3645 kms_plane_alpha_blend@alpha-basic,Fail
3746 kms_plane_alpha_blend@alpha-opaque-fb,Fail
3847 kms_plane_alpha_blend@alpha-transparent-fb,Fail
3948 kms_plane_alpha_blend@constant-alpha-max,Fail
40−kms_plane_alpha_blend@pipe-A-alpha-opaque-fb,Fail
41−kms_plane_alpha_blend@pipe-A-alpha-transparent-fb,Fail
42−kms_plane_alpha_blend@pipe-A-constant-alpha-max,Fail
43−kms_plane_alpha_blend@pipe-B-alpha-opaque-fb,Fail
44−kms_plane_alpha_blend@pipe-B-alpha-transparent-fb,Fail
45−kms_plane_alpha_blend@pipe-B-constant-alpha-max,Fail
46−kms_plane_alpha_blend@pipe-C-alpha-opaque-fb,Fail
47−kms_plane_alpha_blend@pipe-C-alpha-transparent-fb,Fail
48−kms_plane_alpha_blend@pipe-C-constant-alpha-max,Fail
49+kms_plane_scaling@plane-scaler-with-clipping-clamping-rotation,Timeout
50+kms_pm_rpm@modeset-stress-extra-wait,Timeout
51+kms_pm_rpm@universal-planes,Timeout
52+kms_pm_rpm@universal-planes-dpms,Timeout
53+perf@i915-ref-count,Fail
54+perf_pmu@module-unload,Fail
55+perf_pmu@rc6,Crash
56+perf_pmu@rc6-suspend,Crash
57+sysfs_heartbeat_interval@long,Timeout
58+sysfs_heartbeat_interval@off,Timeout
59+sysfs_preempt_timeout@off,Timeout
60+sysfs_timeslice_duration@off,Timeout
61+xe_module_load@force-load,Fail
62+xe_module_load@load,Fail
63+xe_module_load@many-reload,Fail
64+xe_module_load@reload,Fail
65+xe_module_load@reload-no-display,Fail
drivers/gpu/drm/ci/xfails/i915-whl-flakes.txt+6−0
@@ -0,0 +1,6 @@
1+# Board Name: dell-latitude-5400-8665U-sarien
2+# Bug Report: https://lore.kernel.org/intel-gfx/af4ca4df-a3ef-4943-bdbf-4c3af2c333af@collabora.com/T/#u
3+# IGT Version: 1.28-g0df7b9b97
4+# Linux Version: 6.9.0-rc7
5+# Failure Rate: 50
6+kms_pm_rpm@modeset-lpsp-stress
drivers/gpu/drm/ci/xfails/i915-whl-skips.txt+21−1
@@ -1,2 +1,22 @@
11 # This is generating kernel oops with divide error
2−kms_plane_scaling@invalid-parameters
2+kms_plane_scaling@invalid-parameters
3+
4+# Skip driver specific tests
5+^amdgpu.*
6+msm_.*
7+nouveau_.*
8+panfrost_.*
9+^v3d.*
10+^vc4.*
11+^vmwgfx*
12+
13+# GEM tests takes ~1000 hours, so skip it
14+gem_.*
15+
16+# Hangs the machine and timeout occurs
17+i915_pm_rc6_residency.*
18+i915_suspend.*
19+kms_flip.*
20+
21+# Kernel panic
22+drm_fdinfo.*
drivers/gpu/drm/ci/xfails/mediatek-mt8173-fails.txt+12−18
@@ -1,36 +1,30 @@
1+device_reset@cold-reset-bound,Fail
2+device_reset@reset-bound,Fail
3+device_reset@unbind-cold-reset-rebind,Fail
4+device_reset@unbind-reset-rebind,Fail
5+dumb_buffer@invalid-bpp,Fail
6+fbdev@eof,Fail
7+fbdev@read,Fail
8+fbdev@unaligned-write,Fail
19 kms_3d,Fail
210 kms_bw@linear-tiling-1-displays-1920x1080p,Fail
11+kms_bw@linear-tiling-1-displays-2160x1440p,Fail
312 kms_bw@linear-tiling-1-displays-2560x1440p,Fail
413 kms_bw@linear-tiling-1-displays-3840x2160p,Fail
514 kms_bw@linear-tiling-2-displays-1920x1080p,Fail
15+kms_bw@linear-tiling-2-displays-2160x1440p,Fail
616 kms_bw@linear-tiling-2-displays-2560x1440p,Fail
717 kms_bw@linear-tiling-2-displays-3840x2160p,Fail
8−kms_bw@linear-tiling-3-displays-1920x1080p,Fail
9−kms_bw@linear-tiling-3-displays-2560x1440p,Fail
10−kms_bw@linear-tiling-3-displays-3840x2160p,Fail
1118 kms_color@invalid-gamma-lut-sizes,Fail
12−kms_color@pipe-A-invalid-gamma-lut-sizes,Fail
13−kms_color@pipe-B-invalid-gamma-lut-sizes,Fail
1419 kms_cursor_legacy@cursor-vs-flip-atomic,Fail
1520 kms_cursor_legacy@cursor-vs-flip-legacy,Fail
1621 kms_flip@flip-vs-modeset-vs-hang,Fail
1722 kms_flip@flip-vs-panning-vs-hang,Fail
1823 kms_flip@flip-vs-suspend,Fail
1924 kms_flip@flip-vs-suspend-interruptible,Fail
20−kms_force_connector_basic@force-edid,Fail
21−kms_force_connector_basic@force-load-detect,Fail
22−kms_force_connector_basic@prune-stale-modes,Fail
23−kms_hdmi_inject@inject-4k,Fail
24−kms_plane_scaling@planes-upscale-20x20,Fail
25−kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-25,Fail
26−kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-5,Fail
27−kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75,Fail
28−kms_plane_scaling@upscale-with-modifier-20x20,Fail
29−kms_plane_scaling@upscale-with-pixel-format-20x20,Fail
30−kms_plane_scaling@upscale-with-rotation-20x20,Fail
25+kms_lease@lease-uevent,Fail
3126 kms_properties@get_properties-sanity-atomic,Fail
3227 kms_properties@plane-properties-atomic,Fail
3328 kms_properties@plane-properties-legacy,Fail
3429 kms_rmfb@close-fd,Fail
35−kms_selftest@drm_format,Timeout
36−kms_selftest@drm_format_helper,Timeout
30+tools_test@tools_test,Fail
drivers/gpu/drm/ci/xfails/mediatek-mt8173-flakes.txt+11−0
@@ -0,0 +1,11 @@
1+# Board Name: mt8173-elm-hana
2+# Bug Report: https://lore.kernel.org/linux-mediatek/0b2a1899-15dd-42fa-8f63-ea0ca28dbb17@collabora.com/T/#u
3+# IGT Version: 1.28-g0df7b9b97
4+# Linux Version: 6.9.0-rc7
5+# Failure Rate: 50
6+core_setmaster_vs_auth
7+dumb_buffer@create-clear
8+fbdev@unaligned-write
9+fbdev@write
10+kms_cursor_legacy@cursor-vs-flip-atomic-transitions
11+kms_prop_blob@invalid-set-prop
drivers/gpu/drm/ci/xfails/mediatek-mt8173-skips.txt+16−0
@@ -0,0 +1,16 @@
1+# Skip driver specific tests
2+^amdgpu.*
3+msm_.*
4+nouveau_.*
5+panfrost_.*
6+^v3d.*
7+^vc4.*
8+^vmwgfx*
9+
10+# Skip intel specific tests
11+gem_.*
12+i915_.*
13+
14+# Currently fails and causes coverage loss for other tests
15+# since core_getversion also fails.
16+core_hotunplug.*
drivers/gpu/drm/ci/xfails/mediatek-mt8183-fails.txt+8−13
@@ -1,13 +1,8 @@
1−kms_addfb_basic@addfb25-bad-modifier,Fail
2−kms_bw@linear-tiling-1-displays-2560x1440p,Fail
3−kms_bw@linear-tiling-2-displays-1920x1080p,Fail
4−kms_bw@linear-tiling-2-displays-2560x1440p,Fail
5−kms_bw@linear-tiling-2-displays-3840x2160p,Fail
6−kms_bw@linear-tiling-3-displays-2560x1440p,Fail
7−kms_bw@linear-tiling-3-displays-3840x2160p,Fail
8−kms_color@pipe-A-invalid-gamma-lut-sizes,Fail
9−kms_plane_cursor@overlay,Fail
10−kms_plane_cursor@primary,Fail
11−kms_plane_cursor@viewport,Fail
12−kms_plane_scaling@upscale-with-rotation-20x20,Fail
13−kms_rmfb@close-fd,Fail
1+dumb_buffer@create-clear,Fail
2+dumb_buffer@create-valid-dumb,Fail
3+dumb_buffer@invalid-bpp,Fail
4+dumb_buffer@map-invalid-size,Fail
5+dumb_buffer@map-uaf,Fail
6+dumb_buffer@map-valid,Fail
7+panfrost_prime@gem-prime-import,Fail
8+tools_test@tools_test,Fail
drivers/gpu/drm/ci/xfails/mediatek-mt8183-skips.txt+18−0
@@ -0,0 +1,18 @@
1+# Skip driver specific tests
2+^amdgpu.*
3+msm_.*
4+nouveau_.*
5+^v3d.*
6+^vc4.*
7+^vmwgfx*
8+
9+# Skip intel specific tests
10+gem_.*
11+i915_.*
12+
13+# Panfrost is not a KMS driver, so skip the KMS tests
14+kms_.*
15+
16+# Currently fails and causes coverage loss for other tests
17+# since core_getversion also fails.
18+core_hotunplug.*
drivers/gpu/drm/ci/xfails/meson-g12b-fails.txt+8−16
@@ -1,16 +1,8 @@
1−kms_3d,Fail
2−kms_cursor_legacy@forked-bo,Fail
3−kms_cursor_legacy@forked-move,Fail
4−kms_cursor_legacy@single-bo,Fail
5−kms_cursor_legacy@single-move,Fail
6−kms_cursor_legacy@torture-bo,Fail
7−kms_cursor_legacy@torture-move,Fail
8−kms_force_connector_basic@force-edid,Fail
9−kms_hdmi_inject@inject-4k,Fail
10−kms_plane_cursor@overlay,Fail
11−kms_plane_cursor@primary,Fail
12−kms_plane_cursor@viewport,Fail
13−kms_properties@connector-properties-atomic,Fail
14−kms_properties@connector-properties-legacy,Fail
15−kms_properties@get_properties-sanity-atomic,Fail
16−kms_properties@get_properties-sanity-non-atomic,Fail
1+dumb_buffer@create-clear,Fail
2+dumb_buffer@create-valid-dumb,Fail
3+dumb_buffer@invalid-bpp,Fail
4+dumb_buffer@map-invalid-size,Fail
5+dumb_buffer@map-uaf,Fail
6+dumb_buffer@map-valid,Fail
7+panfrost_prime@gem-prime-import,Fail
8+tools_test@tools_test,Fail
drivers/gpu/drm/ci/xfails/meson-g12b-skips.txt+18−0
@@ -0,0 +1,18 @@
1+# Skip driver specific tests
2+^amdgpu.*
3+msm_.*
4+nouveau_.*
5+^v3d.*
6+^vc4.*
7+^vmwgfx*
8+
9+# Skip intel specific tests
10+gem_.*
11+i915_.*
12+
13+# Panfrost is not a KMS driver, so skip the KMS tests
14+kms_.*
15+
16+# Currently fails and causes coverage loss for other tests
17+# since core_getversion also fails.
18+core_hotunplug.*
drivers/gpu/drm/ci/xfails/msm-apq8016-fails.txt+11−15
@@ -1,19 +1,15 @@
1+device_reset@cold-reset-bound,Fail
2+device_reset@reset-bound,Fail
3+device_reset@unbind-cold-reset-rebind,Fail
4+device_reset@unbind-reset-rebind,Fail
5+dumb_buffer@invalid-bpp,Fail
16 kms_3d,Fail
2−kms_addfb_basic@addfb25-bad-modifier,Fail
3−kms_cursor_legacy@all-pipes-forked-bo,Fail
4−kms_cursor_legacy@all-pipes-forked-move,Fail
5−kms_cursor_legacy@all-pipes-single-bo,Fail
6−kms_cursor_legacy@all-pipes-single-move,Fail
7−kms_cursor_legacy@all-pipes-torture-bo,Fail
8−kms_cursor_legacy@all-pipes-torture-move,Fail
9−kms_cursor_legacy@pipe-A-forked-bo,Fail
10−kms_cursor_legacy@pipe-A-forked-move,Fail
11−kms_cursor_legacy@pipe-A-single-bo,Fail
12−kms_cursor_legacy@pipe-A-single-move,Fail
13−kms_cursor_legacy@pipe-A-torture-bo,Fail
14−kms_cursor_legacy@pipe-A-torture-move,Fail
7+kms_cursor_legacy@forked-move,Fail
8+kms_cursor_legacy@single-bo,Fail
9+kms_cursor_legacy@torture-bo,Fail
10+kms_cursor_legacy@torture-move,Fail
1511 kms_force_connector_basic@force-edid,Fail
1612 kms_hdmi_inject@inject-4k,Fail
17−kms_selftest@drm_format,Timeout
18−kms_selftest@drm_format_helper,Timeout
13+kms_lease@lease-uevent,Fail
1914 msm_mapping@ring,Fail
15+tools_test@tools_test,Fail
drivers/gpu/drm/ci/xfails/msm-apq8016-skips.txt+15−0
@@ -0,0 +1,15 @@
1+# Skip driver specific tests
2+^amdgpu.*
3+nouveau_.*
4+panfrost_.*
5+^v3d.*
6+^vc4.*
7+^vmwgfx*
8+
9+# Skip intel specific tests
10+gem_.*
11+i915_.*
12+
13+# Currently fails and causes coverage loss for other tests
14+# since core_getversion also fails.
15+core_hotunplug.*
drivers/gpu/drm/ci/xfails/msm-apq8096-fails.txt+7−1
@@ -1,2 +1,8 @@
1+device_reset@cold-reset-bound,Fail
2+device_reset@reset-bound,Fail
3+device_reset@unbind-cold-reset-rebind,Fail
4+device_reset@unbind-reset-rebind,Fail
5+dumb_buffer@invalid-bpp,Fail
16 kms_3d,Fail
2−kms_addfb_basic@addfb25-bad-modifier,Fail
7+kms_lease@lease-uevent,Fail
8+tools_test@tools_test,Fail
drivers/gpu/drm/ci/xfails/msm-apq8096-flakes.txt+6−0
@@ -0,0 +1,6 @@
1+# Board Name: apq8096-db820c
2+# Bug Report: https://lore.kernel.org/linux-arm-msm/661483c8-ad82-400d-bcd8-e94986d20d7d@collabora.com/T/#u
3+# IGT Version: 1.28-g0df7b9b97
4+# Linux Version: 6.9.0-rc7
5+# Failure Rate: 50
6+dumb_buffer@create-clear
drivers/gpu/drm/ci/xfails/msm-apq8096-skips.txt+25−1
@@ -1,2 +1,26 @@
11 # Whole machine hangs
2−kms_cursor_legacy@all-pipes-torture-move
2+kms_cursor_legacy@all-pipes-torture-move
3+
4+# Skip driver specific tests
5+^amdgpu.*
6+nouveau_.*
7+panfrost_.*
8+^v3d.*
9+^vc4.*
10+^vmwgfx*
11+
12+# Skip intel specific tests
13+gem_.*
14+i915_.*
15+
16+# Currently fails and causes coverage loss for other tests
17+# since core_getversion also fails.
18+core_hotunplug.*
19+
20+# gpu fault
21+# [IGT] msm_mapping: executing
22+# [IGT] msm_mapping: starting subtest shadow
23+# *** gpu fault: ttbr0=00000001030ea000 iova=0000000001074000 dir=WRITE type=PERMISSION source=1f030000 (0,0,0,0)
24+# msm_mdp 901000.display-controller: RBBM | ME master split | status=0x701000B0
25+# watchdog: BUG: soft lockup - CPU#0 stuck for 26s! [kworker/u16:3:46]
26+msm_mapping@shadow
drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-fails.txt+174−1
@@ -1,18 +1,191 @@
1+device_reset@cold-reset-bound,Fail
2+device_reset@reset-bound,Fail
3+device_reset@unbind-cold-reset-rebind,Fail
4+device_reset@unbind-reset-rebind,Fail
5+dumb_buffer@invalid-bpp,Fail
6+kms_atomic_transition@plane-primary-toggle-with-vblank-wait,Fail
17 kms_color@ctm-0-25,Fail
28 kms_color@ctm-0-50,Fail
39 kms_color@ctm-0-75,Fail
410 kms_color@ctm-blue-to-red,Fail
511 kms_color@ctm-green-to-red,Fail
12+kms_color@ctm-max,Fail
613 kms_color@ctm-negative,Fail
714 kms_color@ctm-red-to-blue,Fail
815 kms_color@ctm-signed,Fail
16+kms_content_protection@atomic,Crash
17+kms_content_protection@atomic-dpms,Crash
18+kms_content_protection@content-type-change,Crash
19+kms_content_protection@lic-type-0,Crash
20+kms_content_protection@lic-type-1,Crash
21+kms_content_protection@srm,Crash
22+kms_content_protection@type1,Crash
23+kms_content_protection@uevent,Crash
24+kms_cursor_crc@cursor-alpha-opaque,Fail
25+kms_cursor_crc@cursor-alpha-transparent,Fail
26+kms_cursor_crc@cursor-dpms,Fail
27+kms_cursor_crc@cursor-offscreen-128x128,Fail
28+kms_cursor_crc@cursor-offscreen-128x42,Fail
29+kms_cursor_crc@cursor-offscreen-256x256,Fail
30+kms_cursor_crc@cursor-offscreen-256x85,Fail
31+kms_cursor_crc@cursor-offscreen-32x10,Fail
32+kms_cursor_crc@cursor-offscreen-32x32,Fail
33+kms_cursor_crc@cursor-offscreen-512x170,Fail
34+kms_cursor_crc@cursor-offscreen-512x512,Fail
35+kms_cursor_crc@cursor-offscreen-64x21,Fail
36+kms_cursor_crc@cursor-offscreen-64x64,Fail
37+kms_cursor_crc@cursor-onscreen-128x128,Fail
38+kms_cursor_crc@cursor-onscreen-128x42,Fail
39+kms_cursor_crc@cursor-onscreen-256x256,Fail
40+kms_cursor_crc@cursor-onscreen-256x85,Fail
41+kms_cursor_crc@cursor-onscreen-32x10,Fail
42+kms_cursor_crc@cursor-onscreen-32x32,Fail
43+kms_cursor_crc@cursor-onscreen-512x170,Fail
44+kms_cursor_crc@cursor-onscreen-512x512,Fail
45+kms_cursor_crc@cursor-onscreen-64x21,Fail
46+kms_cursor_crc@cursor-onscreen-64x64,Fail
47+kms_cursor_crc@cursor-random-128x128,Fail
48+kms_cursor_crc@cursor-random-128x42,Fail
49+kms_cursor_crc@cursor-random-256x256,Fail
50+kms_cursor_crc@cursor-random-256x85,Fail
51+kms_cursor_crc@cursor-random-32x10,Fail
52+kms_cursor_crc@cursor-random-32x32,Fail
53+kms_cursor_crc@cursor-random-512x170,Fail
54+kms_cursor_crc@cursor-random-512x512,Fail
55+kms_cursor_crc@cursor-random-64x21,Fail
56+kms_cursor_crc@cursor-random-64x64,Fail
57+kms_cursor_crc@cursor-rapid-movement-128x128,Fail
58+kms_cursor_crc@cursor-rapid-movement-128x42,Fail
59+kms_cursor_crc@cursor-rapid-movement-256x256,Fail
60+kms_cursor_crc@cursor-rapid-movement-256x85,Fail
61+kms_cursor_crc@cursor-rapid-movement-32x10,Fail
62+kms_cursor_crc@cursor-rapid-movement-32x32,Fail
63+kms_cursor_crc@cursor-rapid-movement-512x170,Fail
64+kms_cursor_crc@cursor-rapid-movement-512x512,Fail
65+kms_cursor_crc@cursor-rapid-movement-64x21,Fail
66+kms_cursor_crc@cursor-rapid-movement-64x64,Fail
67+kms_cursor_crc@cursor-size-change,Fail
68+kms_cursor_crc@cursor-sliding-128x128,Fail
69+kms_cursor_crc@cursor-sliding-128x42,Fail
70+kms_cursor_crc@cursor-sliding-256x256,Fail
71+kms_cursor_crc@cursor-sliding-256x85,Fail
72+kms_cursor_crc@cursor-sliding-32x10,Fail
73+kms_cursor_crc@cursor-sliding-32x32,Fail
74+kms_cursor_crc@cursor-sliding-512x170,Fail
75+kms_cursor_crc@cursor-sliding-512x512,Fail
76+kms_cursor_crc@cursor-sliding-64x21,Fail
77+kms_cursor_crc@cursor-sliding-64x64,Fail
78+kms_cursor_edge_walk@128x128-left-edge,Fail
79+kms_cursor_edge_walk@128x128-right-edge,Fail
80+kms_cursor_edge_walk@128x128-top-bottom,Fail
81+kms_cursor_edge_walk@128x128-top-edge,Fail
82+kms_cursor_edge_walk@256x256-left-edge,Fail
83+kms_cursor_edge_walk@256x256-right-edge,Fail
84+kms_cursor_edge_walk@256x256-top-bottom,Fail
85+kms_cursor_edge_walk@256x256-top-edge,Fail
86+kms_cursor_edge_walk@64x64-left-edge,Fail
87+kms_cursor_edge_walk@64x64-right-edge,Fail
88+kms_cursor_edge_walk@64x64-top-bottom,Fail
89+kms_cursor_edge_walk@64x64-top-edge,Fail
90+kms_cursor_legacy@2x-cursor-vs-flip-atomic,Fail
91+kms_cursor_legacy@2x-cursor-vs-flip-legacy,Fail
92+kms_cursor_legacy@2x-flip-vs-cursor-atomic,Fail
93+kms_cursor_legacy@2x-flip-vs-cursor-legacy,Fail
94+kms_cursor_legacy@2x-long-cursor-vs-flip-atomic,Fail
95+kms_cursor_legacy@2x-long-cursor-vs-flip-legacy,Fail
96+kms_cursor_legacy@2x-long-flip-vs-cursor-atomic,Fail
97+kms_cursor_legacy@2x-long-flip-vs-cursor-legacy,Fail
998 kms_cursor_legacy@cursor-vs-flip-toggle,Fail
1099 kms_cursor_legacy@cursor-vs-flip-varying-size,Fail
100+kms_display_modes@extended-mode-basic,Fail
101+kms_flip@2x-flip-vs-modeset-vs-hang,Fail
102+kms_flip@2x-flip-vs-panning-vs-hang,Fail
103+kms_flip@absolute-wf_vblank,Fail
104+kms_flip@absolute-wf_vblank-interruptible,Fail
105+kms_flip@basic-flip-vs-wf_vblank,Fail
106+kms_flip@basic-plain-flip,Fail
107+kms_flip@blocking-absolute-wf_vblank,Fail
108+kms_flip@blocking-absolute-wf_vblank-interruptible,Fail
109+kms_flip@blocking-wf_vblank,Fail
110+kms_flip@busy-flip,Fail
111+kms_flip@dpms-off-confusion,Fail
112+kms_flip@dpms-off-confusion-interruptible,Fail
113+kms_flip@dpms-vs-vblank-race,Fail
114+kms_flip@dpms-vs-vblank-race-interruptible,Fail
115+kms_flip@flip-vs-absolute-wf_vblank,Fail
116+kms_flip@flip-vs-absolute-wf_vblank-interruptible,Fail
117+kms_flip@flip-vs-blocking-wf-vblank,Fail
118+kms_flip@flip-vs-expired-vblank,Fail
119+kms_flip@flip-vs-expired-vblank-interruptible,Fail
11120 kms_flip@flip-vs-modeset-vs-hang,Fail
121+kms_flip@flip-vs-panning,Fail
122+kms_flip@flip-vs-panning-interruptible,Fail
12123 kms_flip@flip-vs-panning-vs-hang,Fail
124+kms_flip@flip-vs-rmfb,Fail
125+kms_flip@flip-vs-rmfb-interruptible,Fail
126+kms_flip@flip-vs-wf_vblank-interruptible,Fail
127+kms_flip@modeset-vs-vblank-race,Fail
128+kms_flip@modeset-vs-vblank-race-interruptible,Fail
129+kms_flip@plain-flip-fb-recreate,Fail
130+kms_flip@plain-flip-fb-recreate-interruptible,Fail
131+kms_flip@plain-flip-interruptible,Fail
132+kms_flip@plain-flip-ts-check,Fail
133+kms_flip@plain-flip-ts-check-interruptible,Fail
134+kms_flip@wf_vblank-ts-check,Fail
135+kms_flip@wf_vblank-ts-check-interruptible,Fail
136+kms_lease@cursor-implicit-plane,Fail
137+kms_lease@lease-uevent,Fail
138+kms_lease@page-flip-implicit-plane,Fail
139+kms_lease@setcrtc-implicit-plane,Fail
140+kms_lease@simple-lease,Fail
141+kms_multipipe_modeset@basic-max-pipe-crc-check,Fail
13142 kms_pipe_crc_basic@compare-crc-sanitycheck-nv12,Fail
143+kms_pipe_crc_basic@compare-crc-sanitycheck-xr24,Fail
144+kms_pipe_crc_basic@disable-crc-after-crtc,Fail
145+kms_pipe_crc_basic@nonblocking-crc,Fail
146+kms_pipe_crc_basic@nonblocking-crc-frame-sequence,Fail
147+kms_pipe_crc_basic@read-crc,Fail
148+kms_pipe_crc_basic@read-crc-frame-sequence,Fail
149+kms_plane@pixel-format,Fail
150+kms_plane@pixel-format-source-clamping,Fail
151+kms_plane@plane-panning-bottom-right,Fail
152+kms_plane@plane-panning-top-left,Fail
153+kms_plane@plane-position-covered,Fail
154+kms_plane@plane-position-hole,Fail
155+kms_plane@plane-position-hole-dpms,Fail
14156 kms_plane_alpha_blend@alpha-7efc,Fail
157+kms_plane_alpha_blend@alpha-basic,Fail
158+kms_plane_alpha_blend@alpha-opaque-fb,Fail
159+kms_plane_alpha_blend@alpha-transparent-fb,Fail
160+kms_plane_alpha_blend@constant-alpha-max,Fail
161+kms_plane_alpha_blend@constant-alpha-mid,Fail
162+kms_plane_alpha_blend@constant-alpha-min,Fail
15163 kms_plane_alpha_blend@coverage-7efc,Fail
16164 kms_plane_alpha_blend@coverage-vs-premult-vs-constant,Fail
165+kms_plane_cursor@primary,Fail
166+kms_plane_lowres@tiling-none,Fail
167+kms_plane_multiple@tiling-none,Fail
17168 kms_rmfb@close-fd,Fail
18−kms_universal_plane@universal-plane-sanity,Fail
169+kms_rotation_crc@cursor-rotation-180,Fail
170+kms_rotation_crc@primary-rotation-180,Fail
171+kms_sequence@get-busy,Fail
172+kms_sequence@get-forked,Fail
173+kms_sequence@get-forked-busy,Fail
174+kms_sequence@get-idle,Fail
175+kms_sequence@queue-busy,Fail
176+kms_sequence@queue-idle,Fail
177+kms_vblank@accuracy-idle,Fail
178+kms_vblank@crtc-id,Fail
179+kms_vblank@query-busy,Fail
180+kms_vblank@query-forked,Fail
181+kms_vblank@query-forked-busy,Fail
182+kms_vblank@query-idle,Fail
183+kms_vblank@ts-continuation-dpms-rpm,Fail
184+kms_vblank@ts-continuation-idle,Fail
185+kms_vblank@ts-continuation-modeset,Fail
186+kms_vblank@ts-continuation-modeset-rpm,Fail
187+kms_vblank@wait-busy,Fail
188+kms_vblank@wait-forked,Fail
189+kms_vblank@wait-forked-busy,Fail
190+kms_vblank@wait-idle,Fail
191+tools_test@tools_test,Fail
drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-flakes.txt+8−0
@@ -0,0 +1,8 @@
1+# Board Name: sc7180-trogdor-kingoftown
2+# Bug Report: https://lore.kernel.org/linux-arm-msm/661483c8-ad82-400d-bcd8-e94986d20d7d@collabora.com/T/#u
3+# IGT Version: 1.28-g0df7b9b97
4+# Linux Version: 6.9.0-rc7
5+# Failure Rate: 50
6+msm_mapping@shadow
7+msm_shrink@copy-gpu-oom-32
8+msm_shrink@copy-gpu-oom-8
drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-skips.txt+19−0
@@ -1,2 +1,21 @@
11 # Suspend to RAM seems to be broken on this machine
22 .*suspend.*
3+
4+# Skip driver specific tests
5+^amdgpu.*
6+nouveau_.*
7+panfrost_.*
8+^v3d.*
9+^vc4.*
10+^vmwgfx*
11+
12+# Skip intel specific tests
13+gem_.*
14+i915_.*
15+
16+# Currently fails and causes coverage loss for other tests
17+# since core_getversion also fails.
18+core_hotunplug.*
19+
20+# Timeout occurs
21+kms_flip@2x-wf_vblank-ts-check
drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-lazor-limozeen-fails.txt+174−1
@@ -1,18 +1,191 @@
1+device_reset@cold-reset-bound,Fail
2+device_reset@reset-bound,Fail
3+device_reset@unbind-cold-reset-rebind,Fail
4+device_reset@unbind-reset-rebind,Fail
5+dumb_buffer@invalid-bpp,Fail
6+kms_atomic_transition@plane-primary-toggle-with-vblank-wait,Fail
17 kms_color@ctm-0-25,Fail
28 kms_color@ctm-0-50,Fail
39 kms_color@ctm-0-75,Fail
410 kms_color@ctm-blue-to-red,Fail
511 kms_color@ctm-green-to-red,Fail
12+kms_color@ctm-max,Fail
613 kms_color@ctm-negative,Fail
714 kms_color@ctm-red-to-blue,Fail
815 kms_color@ctm-signed,Fail
16+kms_content_protection@atomic,Crash
17+kms_content_protection@atomic-dpms,Crash
18+kms_content_protection@content-type-change,Crash
19+kms_content_protection@lic-type-0,Crash
20+kms_content_protection@lic-type-1,Crash
21+kms_content_protection@srm,Crash
22+kms_content_protection@type1,Crash
23+kms_content_protection@uevent,Crash
24+kms_cursor_crc@cursor-alpha-opaque,Fail
25+kms_cursor_crc@cursor-alpha-transparent,Fail
26+kms_cursor_crc@cursor-dpms,Fail
27+kms_cursor_crc@cursor-offscreen-128x128,Fail
28+kms_cursor_crc@cursor-offscreen-128x42,Fail
29+kms_cursor_crc@cursor-offscreen-256x256,Fail
30+kms_cursor_crc@cursor-offscreen-256x85,Fail
31+kms_cursor_crc@cursor-offscreen-32x10,Fail
32+kms_cursor_crc@cursor-offscreen-32x32,Fail
33+kms_cursor_crc@cursor-offscreen-512x170,Fail
34+kms_cursor_crc@cursor-offscreen-512x512,Fail
35+kms_cursor_crc@cursor-offscreen-64x21,Fail
36+kms_cursor_crc@cursor-offscreen-64x64,Fail
37+kms_cursor_crc@cursor-onscreen-128x128,Fail
38+kms_cursor_crc@cursor-onscreen-128x42,Fail
39+kms_cursor_crc@cursor-onscreen-256x256,Fail
40+kms_cursor_crc@cursor-onscreen-256x85,Fail
41+kms_cursor_crc@cursor-onscreen-32x10,Fail
42+kms_cursor_crc@cursor-onscreen-32x32,Fail
43+kms_cursor_crc@cursor-onscreen-512x170,Fail
44+kms_cursor_crc@cursor-onscreen-512x512,Fail
45+kms_cursor_crc@cursor-onscreen-64x21,Fail
46+kms_cursor_crc@cursor-onscreen-64x64,Fail
47+kms_cursor_crc@cursor-random-128x128,Fail
48+kms_cursor_crc@cursor-random-128x42,Fail
49+kms_cursor_crc@cursor-random-256x256,Fail
50+kms_cursor_crc@cursor-random-256x85,Fail
51+kms_cursor_crc@cursor-random-32x10,Fail
52+kms_cursor_crc@cursor-random-32x32,Fail
53+kms_cursor_crc@cursor-random-512x170,Fail
54+kms_cursor_crc@cursor-random-512x512,Fail
55+kms_cursor_crc@cursor-random-64x21,Fail
56+kms_cursor_crc@cursor-random-64x64,Fail
57+kms_cursor_crc@cursor-rapid-movement-128x128,Fail
58+kms_cursor_crc@cursor-rapid-movement-128x42,Fail
59+kms_cursor_crc@cursor-rapid-movement-256x256,Fail
60+kms_cursor_crc@cursor-rapid-movement-256x85,Fail
61+kms_cursor_crc@cursor-rapid-movement-32x10,Fail
62+kms_cursor_crc@cursor-rapid-movement-32x32,Fail
63+kms_cursor_crc@cursor-rapid-movement-512x170,Fail
64+kms_cursor_crc@cursor-rapid-movement-512x512,Fail
65+kms_cursor_crc@cursor-rapid-movement-64x21,Fail
66+kms_cursor_crc@cursor-rapid-movement-64x64,Fail
67+kms_cursor_crc@cursor-size-change,Fail
68+kms_cursor_crc@cursor-sliding-128x128,Fail
69+kms_cursor_crc@cursor-sliding-128x42,Fail
70+kms_cursor_crc@cursor-sliding-256x256,Fail
71+kms_cursor_crc@cursor-sliding-256x85,Fail
72+kms_cursor_crc@cursor-sliding-32x10,Fail
73+kms_cursor_crc@cursor-sliding-32x32,Fail
74+kms_cursor_crc@cursor-sliding-512x170,Fail
75+kms_cursor_crc@cursor-sliding-512x512,Fail
76+kms_cursor_crc@cursor-sliding-64x21,Fail
77+kms_cursor_crc@cursor-sliding-64x64,Fail
78+kms_cursor_edge_walk@128x128-left-edge,Fail
79+kms_cursor_edge_walk@128x128-right-edge,Fail
80+kms_cursor_edge_walk@128x128-top-bottom,Fail
81+kms_cursor_edge_walk@128x128-top-edge,Fail
82+kms_cursor_edge_walk@256x256-left-edge,Fail
83+kms_cursor_edge_walk@256x256-right-edge,Fail
84+kms_cursor_edge_walk@256x256-top-bottom,Fail
85+kms_cursor_edge_walk@256x256-top-edge,Fail
86+kms_cursor_edge_walk@64x64-left-edge,Fail
87+kms_cursor_edge_walk@64x64-right-edge,Fail
88+kms_cursor_edge_walk@64x64-top-bottom,Fail
89+kms_cursor_edge_walk@64x64-top-edge,Fail
90+kms_cursor_legacy@2x-cursor-vs-flip-atomic,Fail
91+kms_cursor_legacy@2x-cursor-vs-flip-legacy,Fail
92+kms_cursor_legacy@2x-flip-vs-cursor-atomic,Fail
93+kms_cursor_legacy@2x-flip-vs-cursor-legacy,Fail
94+kms_cursor_legacy@2x-long-cursor-vs-flip-atomic,Fail
95+kms_cursor_legacy@2x-long-cursor-vs-flip-legacy,Fail
96+kms_cursor_legacy@2x-long-flip-vs-cursor-atomic,Fail
97+kms_cursor_legacy@2x-long-flip-vs-cursor-legacy,Fail
998 kms_cursor_legacy@cursor-vs-flip-toggle,Fail
1099 kms_cursor_legacy@cursor-vs-flip-varying-size,Fail
100+kms_display_modes@extended-mode-basic,Fail
101+kms_flip@2x-flip-vs-modeset-vs-hang,Fail
102+kms_flip@2x-flip-vs-panning-vs-hang,Fail
103+kms_flip@absolute-wf_vblank,Fail
104+kms_flip@absolute-wf_vblank-interruptible,Fail
105+kms_flip@basic-flip-vs-wf_vblank,Fail
106+kms_flip@basic-plain-flip,Fail
107+kms_flip@blocking-absolute-wf_vblank,Fail
108+kms_flip@blocking-absolute-wf_vblank-interruptible,Fail
109+kms_flip@blocking-wf_vblank,Fail
110+kms_flip@busy-flip,Fail
111+kms_flip@dpms-off-confusion,Fail
112+kms_flip@dpms-off-confusion-interruptible,Fail
113+kms_flip@dpms-vs-vblank-race,Fail
114+kms_flip@dpms-vs-vblank-race-interruptible,Fail
115+kms_flip@flip-vs-absolute-wf_vblank,Fail
116+kms_flip@flip-vs-absolute-wf_vblank-interruptible,Fail
117+kms_flip@flip-vs-blocking-wf-vblank,Fail
118+kms_flip@flip-vs-expired-vblank,Fail
119+kms_flip@flip-vs-expired-vblank-interruptible,Fail
11120 kms_flip@flip-vs-modeset-vs-hang,Fail
121+kms_flip@flip-vs-panning,Fail
122+kms_flip@flip-vs-panning-interruptible,Fail
12123 kms_flip@flip-vs-panning-vs-hang,Fail
124+kms_flip@flip-vs-rmfb,Fail
125+kms_flip@flip-vs-rmfb-interruptible,Fail
126+kms_flip@flip-vs-wf_vblank-interruptible,Fail
127+kms_flip@modeset-vs-vblank-race,Fail
128+kms_flip@modeset-vs-vblank-race-interruptible,Fail
129+kms_flip@plain-flip-fb-recreate,Fail
130+kms_flip@plain-flip-fb-recreate-interruptible,Fail
131+kms_flip@plain-flip-interruptible,Fail
132+kms_flip@plain-flip-ts-check,Fail
133+kms_flip@plain-flip-ts-check-interruptible,Fail
134+kms_flip@wf_vblank-ts-check,Fail
135+kms_flip@wf_vblank-ts-check-interruptible,Fail
136+kms_lease@cursor-implicit-plane,Fail
137+kms_lease@lease-uevent,Fail
138+kms_lease@page-flip-implicit-plane,Fail
139+kms_lease@setcrtc-implicit-plane,Fail
140+kms_lease@simple-lease,Fail
141+kms_multipipe_modeset@basic-max-pipe-crc-check,Fail
13142 kms_pipe_crc_basic@compare-crc-sanitycheck-nv12,Fail
143+kms_pipe_crc_basic@compare-crc-sanitycheck-xr24,Fail
144+kms_pipe_crc_basic@disable-crc-after-crtc,Fail
145+kms_pipe_crc_basic@nonblocking-crc,Fail
146+kms_pipe_crc_basic@nonblocking-crc-frame-sequence,Fail
147+kms_pipe_crc_basic@read-crc,Fail
148+kms_pipe_crc_basic@read-crc-frame-sequence,Fail
149+kms_plane@pixel-format,Fail
150+kms_plane@pixel-format-source-clamping,Fail
151+kms_plane@plane-panning-bottom-right,Fail
152+kms_plane@plane-panning-top-left,Fail
153+kms_plane@plane-position-covered,Fail
154+kms_plane@plane-position-hole,Fail
155+kms_plane@plane-position-hole-dpms,Fail
14156 kms_plane_alpha_blend@alpha-7efc,Fail
157+kms_plane_alpha_blend@alpha-basic,Fail
158+kms_plane_alpha_blend@alpha-opaque-fb,Fail
159+kms_plane_alpha_blend@alpha-transparent-fb,Fail
160+kms_plane_alpha_blend@constant-alpha-max,Fail
161+kms_plane_alpha_blend@constant-alpha-mid,Fail
162+kms_plane_alpha_blend@constant-alpha-min,Fail
15163 kms_plane_alpha_blend@coverage-7efc,Fail
16164 kms_plane_alpha_blend@coverage-vs-premult-vs-constant,Fail
165+kms_plane_cursor@primary,Fail
166+kms_plane_lowres@tiling-none,Fail
167+kms_plane_multiple@tiling-none,Fail
17168 kms_rmfb@close-fd,Fail
18−kms_universal_plane@universal-plane-sanity,Fail
169+kms_rotation_crc@cursor-rotation-180,Fail
170+kms_rotation_crc@primary-rotation-180,Fail
171+kms_sequence@get-busy,Fail
172+kms_sequence@get-forked,Fail
173+kms_sequence@get-forked-busy,Fail
174+kms_sequence@get-idle,Fail
175+kms_sequence@queue-busy,Fail
176+kms_sequence@queue-idle,Fail
177+kms_vblank@accuracy-idle,Fail
178+kms_vblank@crtc-id,Fail
179+kms_vblank@query-busy,Fail
180+kms_vblank@query-forked,Fail
181+kms_vblank@query-forked-busy,Fail
182+kms_vblank@query-idle,Fail
183+kms_vblank@ts-continuation-dpms-rpm,Fail
184+kms_vblank@ts-continuation-idle,Fail
185+kms_vblank@ts-continuation-modeset,Fail
186+kms_vblank@ts-continuation-modeset-rpm,Fail
187+kms_vblank@wait-busy,Fail
188+kms_vblank@wait-forked,Fail
189+kms_vblank@wait-forked-busy,Fail
190+kms_vblank@wait-idle,Fail
191+tools_test@tools_test,Fail
drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-lazor-limozeen-flakes.txt+6−0
@@ -0,0 +1,6 @@
1+# Board Name: sc7180-trogdor-lazor-limozeen-nots-r5
2+# Bug Report: https://lore.kernel.org/linux-arm-msm/661483c8-ad82-400d-bcd8-e94986d20d7d@collabora.com/T/#u
3+# IGT Version: 1.28-g0df7b9b97
4+# Linux Version: 6.9.0-rc7
5+# Failure Rate: 50
6+msm_mapping@shadow
drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-lazor-limozeen-skips.txt+16−0
@@ -1,2 +1,18 @@
11 # Suspend to RAM seems to be broken on this machine
22 .*suspend.*
3+
4+# Skip driver specific tests
5+^amdgpu.*
6+nouveau_.*
7+panfrost_.*
8+^v3d.*
9+^vc4.*
10+^vmwgfx*
11+
12+# Skip intel specific tests
13+gem_.*
14+i915_.*
15+
16+# Currently fails and causes coverage loss for other tests
17+# since core_getversion also fails.
18+core_hotunplug.*
drivers/gpu/drm/ci/xfails/msm-sdm845-fails.txt+7−31
@@ -1,3 +1,8 @@
1+device_reset@cold-reset-bound,Fail
2+device_reset@reset-bound,Fail
3+device_reset@unbind-cold-reset-rebind,Fail
4+device_reset@unbind-reset-rebind,Fail
5+dumb_buffer@invalid-bpp,Fail
16 kms_color@ctm-0-25,Fail
27 kms_color@ctm-0-50,Fail
38 kms_color@ctm-0-75,Fail
@@ -6,17 +11,6 @@ kms_color@ctm-green-to-red,Fail · 2 unmodified lines
611 kms_color@ctm-negative,Fail
712 kms_color@ctm-red-to-blue,Fail
813 kms_color@ctm-signed,Fail
9−kms_color@pipe-A-ctm-0-25,Fail
10−kms_color@pipe-A-ctm-0-5,Fail
11−kms_color@pipe-A-ctm-0-75,Fail
12−kms_color@pipe-A-ctm-blue-to-red,Fail
13−kms_color@pipe-A-ctm-green-to-red,Fail
14−kms_color@pipe-A-ctm-max,Fail
15−kms_color@pipe-A-ctm-negative,Fail
16−kms_color@pipe-A-ctm-red-to-blue,Fail
17−kms_color@pipe-A-legacy-gamma,Fail
18−kms_cursor_legacy@basic-flip-after-cursor-atomic,Fail
19−kms_cursor_legacy@basic-flip-after-cursor-varying-size,Fail
2014 kms_cursor_legacy@basic-flip-before-cursor-atomic,Fail
2115 kms_cursor_legacy@basic-flip-before-cursor-legacy,Fail
2216 kms_cursor_legacy@cursor-vs-flip-atomic,Fail
@@ -31,30 +25,12 @@ kms_cursor_legacy@flip-vs-cursor-crc-legacy,Fail · 8 unmodified lines
3125 kms_cursor_legacy@flip-vs-cursor-legacy,Fail
3226 kms_flip@flip-vs-modeset-vs-hang,Fail
3327 kms_flip@flip-vs-panning-vs-hang,Fail
28+kms_lease@lease-uevent,Fail
3429 kms_pipe_crc_basic@compare-crc-sanitycheck-nv12,Fail
3530 kms_plane_alpha_blend@alpha-7efc,Fail
3631 kms_plane_alpha_blend@coverage-7efc,Fail
3732 kms_plane_alpha_blend@coverage-vs-premult-vs-constant,Fail
38−kms_plane_alpha_blend@pipe-A-alpha-7efc,Fail
39−kms_plane_alpha_blend@pipe-A-coverage-7efc,Fail
40−kms_plane_alpha_blend@pipe-A-coverage-vs-premult-vs-constant,Fail
4133 kms_plane_cursor@overlay,Fail
42−kms_plane_cursor@pipe-A-overlay-size-128,Fail
43−kms_plane_cursor@pipe-A-overlay-size-256,Fail
44−kms_plane_cursor@pipe-A-overlay-size-64,Fail
45−kms_plane_cursor@pipe-A-viewport-size-128,Fail
46−kms_plane_cursor@pipe-A-viewport-size-256,Fail
47−kms_plane_cursor@pipe-A-viewport-size-64,Fail
4834 kms_plane_cursor@viewport,Fail
49−kms_plane_scaling@downscale-with-pixel-format-factor-0-25,Timeout
50−kms_plane_scaling@downscale-with-pixel-format-factor-0-5,Timeout
51−kms_plane_scaling@downscale-with-pixel-format-factor-0-75,Timeout
52−kms_plane_scaling@plane-downscale-with-pixel-format-factor-0-25,Timeout
53−kms_plane_scaling@plane-downscale-with-pixel-format-factor-0-5,Timeout
54−kms_plane_scaling@plane-downscale-with-pixel-format-factor-0-75,Timeout
55−kms_plane_scaling@plane-scaler-with-clipping-clamping-pixel-formats,Timeout
56−kms_plane_scaling@plane-scaler-with-pixel-format-unity-scaling,Timeout
57−kms_plane_scaling@planes-downscale-factor-0-25,Fail
58−kms_plane_scaling@scaler-with-clipping-clamping,Timeout
59−kms_plane_scaling@scaler-with-pixel-format-unity-scaling,Timeout
6035 kms_rmfb@close-fd,Fail
36+tools_test@tools_test,Fail
drivers/gpu/drm/ci/xfails/msm-sdm845-flakes.txt+11−14
@@ -1,22 +1,19 @@
1−# Board Name: msm:sdm845
2−# Bug Report: https://lore.kernel.org/dri-devel/46287831-edfa-78e8-6055-d7a08831c445@collabora.com/T/#u
1+# Board Name: sdm845-cheza-r3
2+# Bug Report: https://lore.kernel.org/linux-arm-msm/661483c8-ad82-400d-bcd8-e94986d20d7d@collabora.com/T/#u
3+# IGT Version: 1.28-g0df7b9b97
4+# Linux Version: 6.9.0-rc7
35 # Failure Rate: 50
4−# IGT Version: 1.28-gd2af13d9f
5−# Linux Version: 6.7.0-rc3
6−
7−# Reported by deqp-runner
6+kms_cursor_legacy@basic-flip-after-cursor-atomic
87 kms_cursor_legacy@basic-flip-after-cursor-legacy
9−kms_cursor_legacy@flip-vs-cursor-toggle
8+kms_cursor_legacy@basic-flip-after-cursor-varying-size
9+kms_cursor_legacy@basic-flip-before-cursor-varying-size
10+kms_cursor_legacy@flip-vs-cursor-atomic-transitions
11+kms_cursor_legacy@flip-vs-cursor-atomic-transitions-varying-size
1012 kms_cursor_legacy@flip-vs-cursor-varying-size
13+kms_cursor_legacy@short-flip-after-cursor-atomic-transitions
14+kms_cursor_legacy@short-flip-after-cursor-atomic-transitions-varying-size
1115 kms_cursor_legacy@short-flip-after-cursor-toggle
1216 kms_cursor_legacy@short-flip-before-cursor-atomic-transitions
1317 kms_cursor_legacy@short-flip-before-cursor-atomic-transitions-varying-size
1418 msm_shrink@copy-gpu-32
1519 msm_shrink@copy-gpu-oom-32
16−
17−# The below test shows inconsistency across multiple runs, giving
18−# results of Pass and Fail alternately.
19−kms_cursor_legacy@basic-flip-before-cursor-varying-size
20−kms_cursor_legacy@flip-vs-cursor-atomic-transitions
21−kms_cursor_legacy@short-flip-after-cursor-atomic-transitions
22−kms_cursor_legacy@short-flip-after-cursor-atomic-transitions-varying-size
drivers/gpu/drm/ci/xfails/msm-sdm845-skips.txt+19−0
@@ -5,3 +5,22 @@ kms_bw.* · 4 unmodified lines
55 # https://gitlab.freedesktop.org/gfx-ci/linux/-/commit/4b49f902ec6f2bb382cbbf489870573f4b43371e
66 # https://gitlab.freedesktop.org/gfx-ci/linux/-/commit/38cdf4c5559771e2474ae0fecef8469f65147bc1
77 msm_mapping@*
8+
9+# Skip driver specific tests
10+^amdgpu.*
11+nouveau_.*
12+panfrost_.*
13+^v3d.*
14+^vc4.*
15+^vmwgfx*
16+
17+# Skip intel specific tests
18+gem_.*
19+i915_.*
20+
21+# Currently fails and causes coverage loss for other tests
22+# since core_getversion also fails.
23+core_hotunplug.*
24+
25+# Whole machine hangs
26+kms_cursor_crc.*
drivers/gpu/drm/ci/xfails/rockchip-rk3288-fails.txt+8−54
@@ -1,54 +1,8 @@
1−kms_3d,Crash
2−kms_bw@linear-tiling-2-displays-1920x1080p,Fail
3−kms_bw@linear-tiling-2-displays-2560x1440p,Fail
4−kms_bw@linear-tiling-2-displays-3840x2160p,Fail
5−kms_bw@linear-tiling-3-displays-1920x1080p,Fail
6−kms_bw@linear-tiling-3-displays-2560x1440p,Fail
7−kms_bw@linear-tiling-3-displays-3840x2160p,Fail
8−kms_flip@flip-vs-modeset-vs-hang,Crash
9−kms_flip@flip-vs-panning-vs-hang,Crash
10−kms_force_connector_basic@force-load-detect,Fail
11−kms_invalid_mode@int-max-clock,Crash
12−kms_pipe_crc_basic@compare-crc-sanitycheck-nv12,Crash
13−kms_pipe_crc_basic@nonblocking-crc-frame-sequence,Crash
14−kms_pipe_crc_basic@read-crc-frame-sequence,Crash
15−kms_plane@pixel-format,Crash
16−kms_plane@pixel-format-source-clamping,Crash
17−kms_plane@plane-position-hole,Crash
18−kms_plane@plane-position-hole-dpms,Crash
19−kms_plane_cursor@overlay,Crash
20−kms_plane_cursor@pipe-A-overlay-size-128,Fail
21−kms_plane_cursor@pipe-A-overlay-size-256,Fail
22−kms_plane_cursor@pipe-A-overlay-size-64,Fail
23−kms_plane_cursor@pipe-A-primary-size-128,Fail
24−kms_plane_cursor@pipe-A-primary-size-256,Fail
25−kms_plane_cursor@pipe-A-primary-size-64,Fail
26−kms_plane_cursor@pipe-A-viewport-size-128,Fail
27−kms_plane_cursor@pipe-A-viewport-size-256,Fail
28−kms_plane_cursor@pipe-A-viewport-size-64,Fail
29−kms_plane_cursor@pipe-B-overlay-size-128,Fail
30−kms_plane_cursor@pipe-B-overlay-size-256,Fail
31−kms_plane_cursor@pipe-B-overlay-size-64,Fail
32−kms_plane_cursor@pipe-B-primary-size-128,Fail
33−kms_plane_cursor@pipe-B-primary-size-256,Fail
34−kms_plane_cursor@pipe-B-primary-size-64,Fail
35−kms_plane_cursor@pipe-B-viewport-size-128,Fail
36−kms_plane_cursor@pipe-B-viewport-size-256,Fail
37−kms_plane_cursor@pipe-B-viewport-size-64,Fail
38−kms_plane_cursor@primary,Crash
39−kms_plane_cursor@viewport,Crash
40−kms_plane_lowres@tiling-none,Fail
41−kms_plane_scaling@downscale-with-modifier-factor-0-25,Fail
42−kms_plane_scaling@downscale-with-rotation-factor-0-25,Fail
43−kms_plane_scaling@upscale-with-modifier-20x20,Fail
44−kms_plane_scaling@upscale-with-modifier-factor-0-25,Fail
45−kms_plane_scaling@upscale-with-pixel-format-20x20,Fail
46−kms_plane_scaling@upscale-with-pixel-format-factor-0-25,Fail
47−kms_plane_scaling@upscale-with-rotation-20x20,Fail
48−kms_prime@basic-crc,Fail
49−kms_properties@connector-properties-atomic,Crash
50−kms_properties@connector-properties-legacy,Crash
51−kms_properties@get_properties-sanity-atomic,Crash
52−kms_properties@get_properties-sanity-non-atomic,Crash
53−kms_rmfb@close-fd,Crash
54−kms_setmode@invalid-clone-single-crtc,Crash
1+dumb_buffer@create-clear,Crash
2+dumb_buffer@create-valid-dumb,Crash
3+dumb_buffer@invalid-bpp,Crash
4+dumb_buffer@map-invalid-size,Crash
5+dumb_buffer@map-uaf,Crash
6+dumb_buffer@map-valid,Crash
7+panfrost_prime@gem-prime-import,Crash
8+tools_test@tools_test,Crash
drivers/gpu/drm/ci/xfails/rockchip-rk3288-skips.txt+20−1
@@ -49,4 +49,23 @@ kms_plane_lowres@pipe-F-tiling-y · 48 unmodified lines
4949 kms_cursor_crc.*
5050
5151 # Machine is hanging in this test, so skip it
52−kms_pipe_crc_basic@disable-crc-after-crtc
52+kms_pipe_crc_basic@disable-crc-after-crtc
53+
54+# Skip driver specific tests
55+^amdgpu.*
56+msm_.*
57+nouveau_.*
58+^v3d.*
59+^vc4.*
60+^vmwgfx*
61+
62+# Skip intel specific tests
63+gem_.*
64+i915_.*
65+
66+# Panfrost is not a KMS driver, so skip the KMS tests
67+kms_.*
68+
69+# Currently fails and causes coverage loss for other tests
70+# since core_getversion also fails.
71+core_hotunplug.*
drivers/gpu/drm/ci/xfails/rockchip-rk3399-fails.txt+8−75
@@ -1,75 +1,8 @@
1−kms_color@gamma,Fail
2−kms_color@legacy-gamma,Fail
3−kms_color@pipe-A-legacy-gamma,Fail
4−kms_color@pipe-B-legacy-gamma,Fail
5−kms_cursor_crc@cursor-alpha-opaque,Fail
6−kms_cursor_crc@cursor-alpha-transparent,Fail
7−kms_cursor_crc@cursor-dpms,Fail
8−kms_cursor_crc@cursor-offscreen-32x10,Fail
9−kms_cursor_crc@cursor-offscreen-32x32,Fail
10−kms_cursor_crc@cursor-offscreen-64x64,Fail
11−kms_cursor_crc@cursor-onscreen-32x10,Fail
12−kms_cursor_crc@cursor-onscreen-32x32,Fail
13−kms_cursor_crc@cursor-onscreen-64x21,Fail
14−kms_cursor_crc@cursor-onscreen-64x64,Fail
15−kms_cursor_crc@cursor-random-32x10,Fail
16−kms_cursor_crc@cursor-random-32x32,Fail
17−kms_cursor_crc@cursor-random-64x21,Fail
18−kms_cursor_crc@cursor-random-64x64,Fail
19−kms_cursor_crc@cursor-rapid-movement-32x32,Fail
20−kms_cursor_crc@cursor-rapid-movement-64x21,Fail
21−kms_cursor_crc@cursor-rapid-movement-64x64,Fail
22−kms_cursor_crc@cursor-size-change,Fail
23−kms_cursor_crc@cursor-sliding-32x10,Fail
24−kms_cursor_crc@cursor-sliding-32x32,Fail
25−kms_cursor_crc@cursor-sliding-64x21,Fail
26−kms_cursor_crc@cursor-sliding-64x64,Fail
27−kms_flip@basic-flip-vs-wf_vblank,Fail
28−kms_flip@blocking-wf_vblank,Fail
29−kms_flip@dpms-vs-vblank-race,Fail
30−kms_flip@flip-vs-absolute-wf_vblank,Fail
31−kms_flip@flip-vs-absolute-wf_vblank-interruptible,Fail
32−kms_flip@flip-vs-blocking-wf-vblank,Fail
33−kms_flip@flip-vs-modeset-vs-hang,Fail
34−kms_flip@flip-vs-panning,Fail
35−kms_flip@flip-vs-panning-interruptible,Fail
36−kms_flip@flip-vs-panning-vs-hang,Fail
37−kms_flip@modeset-vs-vblank-race,Fail
38−kms_flip@plain-flip-fb-recreate,Fail
39−kms_flip@plain-flip-fb-recreate-interruptible,Fail
40−kms_flip@plain-flip-ts-check,Fail
41−kms_flip@plain-flip-ts-check-interruptible,Fail
42−kms_flip@wf_vblank-ts-check,Fail
43−kms_flip@wf_vblank-ts-check-interruptible,Fail
44−kms_invalid_mode@int-max-clock,Fail
45−kms_pipe_crc_basic@compare-crc-sanitycheck-nv12,Fail
46−kms_pipe_crc_basic@compare-crc-sanitycheck-xr24,Fail
47−kms_pipe_crc_basic@disable-crc-after-crtc,Fail
48−kms_pipe_crc_basic@nonblocking-crc,Fail
49−kms_pipe_crc_basic@nonblocking-crc-frame-sequence,Fail
50−kms_pipe_crc_basic@read-crc,Fail
51−kms_pipe_crc_basic@read-crc-frame-sequence,Fail
52−kms_plane@pixel-format,Fail
53−kms_plane@pixel-format-source-clamping,Fail
54−kms_plane@plane-panning-bottom-right,Fail
55−kms_plane@plane-panning-top-left,Fail
56−kms_plane@plane-position-covered,Fail
57−kms_plane@plane-position-hole,Fail
58−kms_plane@plane-position-hole-dpms,Fail
59−kms_plane_cursor@overlay,Fail
60−kms_plane_cursor@pipe-B-overlay-size-128,Fail
61−kms_plane_cursor@pipe-B-overlay-size-256,Fail
62−kms_plane_cursor@pipe-B-overlay-size-64,Fail
63−kms_plane_cursor@pipe-B-primary-size-128,Fail
64−kms_plane_cursor@pipe-B-primary-size-256,Fail
65−kms_plane_cursor@pipe-B-primary-size-64,Fail
66−kms_plane_cursor@pipe-B-viewport-size-128,Fail
67−kms_plane_cursor@pipe-B-viewport-size-256,Fail
68−kms_plane_cursor@pipe-B-viewport-size-64,Fail
69−kms_plane_cursor@primary,Fail
70−kms_plane_cursor@viewport,Fail
71−kms_plane_multiple@atomic-pipe-B-tiling-none,Fail
72−kms_plane_multiple@tiling-none,Fail
73−kms_prime@basic-crc,Fail
74−kms_rmfb@close-fd,Fail
75−kms_universal_plane@universal-plane-pipe-B-functional,Fail
1+dumb_buffer@create-clear,Fail
2+dumb_buffer@create-valid-dumb,Fail
3+dumb_buffer@invalid-bpp,Fail
4+dumb_buffer@map-invalid-size,Fail
5+dumb_buffer@map-uaf,Fail
6+dumb_buffer@map-valid,Fail
7+panfrost_prime@gem-prime-import,Fail
8+tools_test@tools_test,Fail
drivers/gpu/drm/ci/xfails/rockchip-rk3399-flakes.txt+6−7
@@ -1,7 +1,6 @@
1−kms_bw@linear-tiling-2-displays-1920x1080p
2−kms_cursor_crc@cursor-offscreen-64x21
3−kms_flip@dpms-vs-vblank-race-interruptible
4−kms_flip@flip-vs-wf_vblank-interruptible
5−kms_plane_cursor@overlay
6−kms_plane_cursor@primary
7−kms_plane_cursor@viewport
1+# Board Name: rk3399-gru-kevin
2+# Bug Report: https://lore.kernel.org/dri-devel/5cc34a8b-c1fa-4744-9031-2d33ecf41011@collabora.com/T/#u
3+# IGT Version: 1.28-g0df7b9b97
4+# Linux Version: 6.9.0-rc7
5+# Failure Rate: 50
6+panfrost_submit@pan-unhandled-pagefault
drivers/gpu/drm/ci/xfails/rockchip-rk3399-skips.txt+19−0
@@ -3,3 +3,22 @@ · 2 unmodified lines
33
44 # Too unstable, machine ends up hanging after lots of Oopses
55 kms_cursor_legacy.*
6+
7+# Skip driver specific tests
8+^amdgpu.*
9+msm_.*
10+nouveau_.*
11+^v3d.*
12+^vc4.*
13+^vmwgfx*
14+
15+# Skip intel specific tests
16+gem_.*
17+i915_.*
18+
19+# Panfrost is not a KMS driver, so skip the KMS tests
20+kms_.*
21+
22+# Currently fails and causes coverage loss for other tests
23+# since core_getversion also fails.
24+core_hotunplug.*
drivers/gpu/drm/ci/xfails/update-xfails.py+2−2
@@ -93,10 +93,10 @@ def add_unit_test_or_update_result_to_fails_if_present(fails_txt, unit_test, fai · 92 unmodified lines
9393 def split_unit_test_from_collate(xfails):
9494 for job_name in xfails.keys():
9595 for job_id in xfails[job_name].copy().keys():
96− if "not found" in xfails[job_name][job_id]:
96+ if "not found" in xfails[job_name][job_id].content_as_str:
9797 del xfails[job_name][job_id]
9898 continue
99− xfails[job_name][job_id] = xfails[job_name][job_id].strip().split("\n")
99+ xfails[job_name][job_id] = xfails[job_name][job_id].content_as_str.splitlines()
100100
101101
102102 def get_xfails_from_pipeline_url(pipeline_url):
drivers/gpu/drm/ci/xfails/virtio_gpu-none-fails.txt+68−26
@@ -1,33 +1,72 @@
1−kms_addfb_basic@addfb25-bad-modifier,Fail
21 kms_addfb_basic@bad-pitch-65536,Fail
32 kms_addfb_basic@bo-too-small,Fail
43 kms_addfb_basic@size-max,Fail
54 kms_addfb_basic@too-high,Fail
65 kms_atomic_transition@plane-primary-toggle-with-vblank-wait,Fail
76 kms_bw@linear-tiling-1-displays-1920x1080p,Fail
7+kms_bw@linear-tiling-1-displays-2160x1440p,Fail
88 kms_bw@linear-tiling-1-displays-2560x1440p,Fail
99 kms_bw@linear-tiling-1-displays-3840x2160p,Fail
10+kms_bw@linear-tiling-10-displays-1920x1080p,Fail
11+kms_bw@linear-tiling-10-displays-2160x1440p,Fail
12+kms_bw@linear-tiling-10-displays-2560x1440p,Fail
13+kms_bw@linear-tiling-10-displays-3840x2160p,Fail
14+kms_bw@linear-tiling-11-displays-1920x1080p,Fail
15+kms_bw@linear-tiling-11-displays-2160x1440p,Fail
16+kms_bw@linear-tiling-11-displays-2560x1440p,Fail
17+kms_bw@linear-tiling-11-displays-3840x2160p,Fail
18+kms_bw@linear-tiling-12-displays-1920x1080p,Fail
19+kms_bw@linear-tiling-12-displays-2160x1440p,Fail
20+kms_bw@linear-tiling-12-displays-2560x1440p,Fail
21+kms_bw@linear-tiling-12-displays-3840x2160p,Fail
22+kms_bw@linear-tiling-13-displays-1920x1080p,Fail
23+kms_bw@linear-tiling-13-displays-2160x1440p,Fail
24+kms_bw@linear-tiling-13-displays-2560x1440p,Fail
25+kms_bw@linear-tiling-13-displays-3840x2160p,Fail
26+kms_bw@linear-tiling-14-displays-1920x1080p,Fail
27+kms_bw@linear-tiling-14-displays-2160x1440p,Fail
28+kms_bw@linear-tiling-14-displays-2560x1440p,Fail
29+kms_bw@linear-tiling-14-displays-3840x2160p,Fail
30+kms_bw@linear-tiling-15-displays-1920x1080p,Fail
31+kms_bw@linear-tiling-15-displays-2160x1440p,Fail
32+kms_bw@linear-tiling-15-displays-2560x1440p,Fail
33+kms_bw@linear-tiling-15-displays-3840x2160p,Fail
34+kms_bw@linear-tiling-16-displays-1920x1080p,Fail
35+kms_bw@linear-tiling-16-displays-2160x1440p,Fail
36+kms_bw@linear-tiling-16-displays-2560x1440p,Fail
37+kms_bw@linear-tiling-16-displays-3840x2160p,Fail
1038 kms_bw@linear-tiling-2-displays-1920x1080p,Fail
39+kms_bw@linear-tiling-2-displays-2160x1440p,Fail
1140 kms_bw@linear-tiling-2-displays-2560x1440p,Fail
1241 kms_bw@linear-tiling-2-displays-3840x2160p,Fail
1342 kms_bw@linear-tiling-3-displays-1920x1080p,Fail
43+kms_bw@linear-tiling-3-displays-2160x1440p,Fail
1444 kms_bw@linear-tiling-3-displays-2560x1440p,Fail
1545 kms_bw@linear-tiling-3-displays-3840x2160p,Fail
1646 kms_bw@linear-tiling-4-displays-1920x1080p,Fail
47+kms_bw@linear-tiling-4-displays-2160x1440p,Fail
1748 kms_bw@linear-tiling-4-displays-2560x1440p,Fail
1849 kms_bw@linear-tiling-4-displays-3840x2160p,Fail
1950 kms_bw@linear-tiling-5-displays-1920x1080p,Fail
51+kms_bw@linear-tiling-5-displays-2160x1440p,Fail
2052 kms_bw@linear-tiling-5-displays-2560x1440p,Fail
2153 kms_bw@linear-tiling-5-displays-3840x2160p,Fail
2254 kms_bw@linear-tiling-6-displays-1920x1080p,Fail
55+kms_bw@linear-tiling-6-displays-2160x1440p,Fail
2356 kms_bw@linear-tiling-6-displays-2560x1440p,Fail
2457 kms_bw@linear-tiling-6-displays-3840x2160p,Fail
2558 kms_bw@linear-tiling-7-displays-1920x1080p,Fail
59+kms_bw@linear-tiling-7-displays-2160x1440p,Fail
2660 kms_bw@linear-tiling-7-displays-2560x1440p,Fail
2761 kms_bw@linear-tiling-7-displays-3840x2160p,Fail
2862 kms_bw@linear-tiling-8-displays-1920x1080p,Fail
63+kms_bw@linear-tiling-8-displays-2160x1440p,Fail
2964 kms_bw@linear-tiling-8-displays-2560x1440p,Fail
3065 kms_bw@linear-tiling-8-displays-3840x2160p,Fail
66+kms_bw@linear-tiling-9-displays-1920x1080p,Fail
67+kms_bw@linear-tiling-9-displays-2160x1440p,Fail
68+kms_bw@linear-tiling-9-displays-2560x1440p,Fail
69+kms_bw@linear-tiling-9-displays-3840x2160p,Fail
3170 kms_flip@absolute-wf_vblank,Fail
3271 kms_flip@absolute-wf_vblank-interruptible,Fail
3372 kms_flip@basic-flip-vs-wf_vblank,Fail
@@ -54,31 +93,34 @@ kms_flip@plain-flip-ts-check-interruptible,Fail · 20 unmodified lines
5493 kms_flip@wf_vblank-ts-check,Fail
5594 kms_flip@wf_vblank-ts-check-interruptible,Fail
5695 kms_invalid_mode@int-max-clock,Fail
57−kms_plane_scaling@downscale-with-modifier-factor-0-25,Fail
58−kms_plane_scaling@downscale-with-rotation-factor-0-25,Fail
59−kms_plane_scaling@planes-upscale-20x20,Fail
60−kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-25,Fail
61−kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-5,Fail
62−kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75,Fail
63−kms_plane_scaling@upscale-with-modifier-20x20,Fail
64−kms_plane_scaling@upscale-with-modifier-factor-0-25,Fail
65−kms_plane_scaling@upscale-with-pixel-format-20x20,Fail
66−kms_plane_scaling@upscale-with-pixel-format-factor-0-25,Fail
67−kms_plane_scaling@upscale-with-rotation-20x20,Fail
68−kms_selftest@drm_format,Timeout
69−kms_selftest@drm_format_helper,Timeout
96+kms_lease@cursor-implicit-plane,Fail
97+kms_lease@lease-uevent,Fail
98+kms_lease@page-flip-implicit-plane,Fail
99+kms_lease@setcrtc-implicit-plane,Fail
100+kms_lease@simple-lease,Fail
101+kms_sequence@get-busy,Fail
102+kms_sequence@get-forked,Fail
103+kms_sequence@get-forked-busy,Fail
104+kms_sequence@get-idle,Fail
105+kms_sequence@queue-busy,Fail
106+kms_sequence@queue-idle,Fail
70107 kms_setmode@basic,Fail
108+kms_vblank@accuracy-idle,Fail
71109 kms_vblank@crtc-id,Fail
72110 kms_vblank@invalid,Fail
73−kms_vblank@pipe-A-accuracy-idle,Fail
74−kms_vblank@pipe-A-query-busy,Fail
75−kms_vblank@pipe-A-query-forked,Fail
76−kms_vblank@pipe-A-query-forked-busy,Fail
77−kms_vblank@pipe-A-query-idle,Fail
78−kms_vblank@pipe-A-ts-continuation-idle,Fail
79−kms_vblank@pipe-A-ts-continuation-modeset,Fail
80−kms_vblank@pipe-A-ts-continuation-suspend,Fail
81−kms_vblank@pipe-A-wait-busy,Fail
82−kms_vblank@pipe-A-wait-forked,Fail
83−kms_vblank@pipe-A-wait-forked-busy,Fail
84−kms_vblank@pipe-A-wait-idle,Fail
111+kms_vblank@query-busy,Fail
112+kms_vblank@query-forked,Fail
113+kms_vblank@query-forked-busy,Fail
114+kms_vblank@query-idle,Fail
115+kms_vblank@ts-continuation-dpms-rpm,Fail
116+kms_vblank@ts-continuation-dpms-suspend,Fail
117+kms_vblank@ts-continuation-idle,Fail
118+kms_vblank@ts-continuation-modeset,Fail
119+kms_vblank@ts-continuation-modeset-rpm,Fail
120+kms_vblank@ts-continuation-suspend,Fail
121+kms_vblank@wait-busy,Fail
122+kms_vblank@wait-forked,Fail
123+kms_vblank@wait-forked-busy,Fail
124+kms_vblank@wait-idle,Fail
125+perf@i915-ref-count,Fail
126+tools_test@tools_test,Fail
drivers/gpu/drm/ci/xfails/virtio_gpu-none-skips.txt+19−1
@@ -3,4 +3,22 @@ · 2 unmodified lines
33 kms_cursor_legacy.*
44
55 # Job just hangs without any output
6−kms_flip@flip-vs-suspend.*
6+kms_flip@flip-vs-suspend.*
7+
8+# Skip driver specific tests
9+^amdgpu.*
10+msm_.*
11+nouveau_.*
12+panfrost_.*
13+^v3d.*
14+^vc4.*
15+^vmwgfx*
16+
17+# Skip intel specific tests
18+gem_.*
19+i915_.*
20+xe_.*
21+
22+# Currently fails and causes coverage loss for other tests
23+# since core_getversion also fails.
24+core_hotunplug.*
drivers/gpu/drm/ci/xfails/vkms-none-fails.txt+57−0
@@ -0,0 +1,57 @@
1+core_hotunplug@hotrebind,Fail
2+core_hotunplug@hotrebind-lateclose,Fail
3+core_hotunplug@hotreplug,Fail
4+core_hotunplug@hotreplug-lateclose,Fail
5+core_hotunplug@hotunbind-rebind,Fail
6+core_hotunplug@hotunplug-rescan,Fail
7+core_hotunplug@unbind-rebind,Fail
8+core_hotunplug@unplug-rescan,Fail
9+device_reset@cold-reset-bound,Fail
10+device_reset@reset-bound,Fail
11+device_reset@unbind-cold-reset-rebind,Fail
12+device_reset@unbind-reset-rebind,Fail
13+dumb_buffer@invalid-bpp,Fail
14+kms_content_protection@atomic,Crash
15+kms_content_protection@atomic-dpms,Crash
16+kms_content_protection@content-type-change,Crash
17+kms_content_protection@lic-type-0,Crash
18+kms_content_protection@lic-type-1,Crash
19+kms_content_protection@srm,Crash
20+kms_content_protection@type1,Crash
21+kms_content_protection@uevent,Crash
22+kms_cursor_crc@cursor-rapid-movement-128x128,Fail
23+kms_cursor_crc@cursor-rapid-movement-128x42,Fail
24+kms_cursor_crc@cursor-rapid-movement-256x256,Fail
25+kms_cursor_crc@cursor-rapid-movement-256x85,Fail
26+kms_cursor_crc@cursor-rapid-movement-32x10,Fail
27+kms_cursor_crc@cursor-rapid-movement-32x32,Fail
28+kms_cursor_crc@cursor-rapid-movement-512x170,Fail
29+kms_cursor_crc@cursor-rapid-movement-512x512,Fail
30+kms_cursor_crc@cursor-rapid-movement-64x21,Fail
31+kms_cursor_crc@cursor-rapid-movement-64x64,Fail
32+kms_cursor_legacy@basic-flip-before-cursor-atomic,Fail
33+kms_cursor_legacy@basic-flip-before-cursor-legacy,Fail
34+kms_cursor_legacy@cursor-vs-flip-atomic,Fail
35+kms_cursor_legacy@cursor-vs-flip-legacy,Fail
36+kms_cursor_legacy@cursor-vs-flip-toggle,Fail
37+kms_cursor_legacy@cursor-vs-flip-varying-size,Fail
38+kms_cursor_legacy@flip-vs-cursor-atomic,Fail
39+kms_cursor_legacy@flip-vs-cursor-crc-atomic,Fail
40+kms_cursor_legacy@flip-vs-cursor-crc-legacy,Fail
41+kms_cursor_legacy@flip-vs-cursor-legacy,Fail
42+kms_flip@flip-vs-modeset-vs-hang,Fail
43+kms_flip@flip-vs-panning-vs-hang,Fail
44+kms_flip@flip-vs-suspend,Timeout
45+kms_flip@flip-vs-suspend-interruptible,Timeout
46+kms_flip@plain-flip-fb-recreate,Fail
47+kms_lease@lease-uevent,Fail
48+kms_pipe_crc_basic@nonblocking-crc,Fail
49+kms_pipe_crc_basic@nonblocking-crc-frame-sequence,Fail
50+kms_writeback@writeback-check-output,Fail
51+kms_writeback@writeback-check-output-XRGB2101010,Fail
52+kms_writeback@writeback-fb-id,Fail
53+kms_writeback@writeback-fb-id-XRGB2101010,Fail
54+kms_writeback@writeback-invalid-parameters,Fail
55+kms_writeback@writeback-pixel-formats,Fail
56+perf@i915-ref-count,Fail
57+tools_test@tools_test,Fail
drivers/gpu/drm/ci/xfails/vkms-none-flakes.txt+69−0
@@ -0,0 +1,69 @@
1+# Board Name: vkms
2+# Bug Report: https://lore.kernel.org/dri-devel/61ed26af-062c-443c-9df2-d1ee319f3fb0@collabora.com/T/#u
3+# Failure Rate: 50
4+# IGT Version: 1.28-g0df7b9b97
5+# Linux Version: 6.9.0-rc7
6+kms_cursor_legacy@long-nonblocking-modeset-vs-cursor-atomic
7+
8+# Board Name: vkms
9+# Bug Report: https://lore.kernel.org/dri-devel/61ed26af-062c-443c-9df2-d1ee319f3fb0@collabora.com/T/#u
10+# Failure Rate: 50
11+# IGT Version: 1.28-g0df7b9b97
12+# Linux Version: 6.9.0-rc7
13+kms_flip@basic-flip-vs-wf_vblank
14+
15+# Board Name: vkms
16+# Bug Report: https://lore.kernel.org/dri-devel/61ed26af-062c-443c-9df2-d1ee319f3fb0@collabora.com/T/#u
17+# Failure Rate: 50
18+# IGT Version: 1.28-g0df7b9b97
19+# Linux Version: 6.9.0-rc7
20+kms_flip@flip-vs-expired-vblank-interruptible
21+
22+# Board Name: vkms
23+# Bug Report: https://lore.kernel.org/dri-devel/61ed26af-062c-443c-9df2-d1ee319f3fb0@collabora.com/T/#u
24+# Failure Rate: 50
25+# IGT Version: 1.28-g0df7b9b97
26+# Linux Version: 6.9.0-rc7
27+kms_flip@flip-vs-wf_vblank-interruptible
28+
29+# Board Name: vkms
30+# Bug Report: https://lore.kernel.org/dri-devel/61ed26af-062c-443c-9df2-d1ee319f3fb0@collabora.com/T/#u
31+# Failure Rate: 50
32+# IGT Version: 1.28-g0df7b9b97
33+# Linux Version: 6.9.0-rc7
34+kms_flip@plain-flip-fb-recreate-interruptible
35+
36+# Board Name: vkms
37+# Bug Report: https://lore.kernel.org/dri-devel/61ed26af-062c-443c-9df2-d1ee319f3fb0@collabora.com/T/#u
38+# Failure Rate: 50
39+# IGT Version: 1.28-g0df7b9b97
40+# Linux Version: 6.9.0-rc7
41+kms_flip@plain-flip-ts-check
42+
43+# Board Name: vkms
44+# Bug Report: https://lore.kernel.org/dri-devel/61ed26af-062c-443c-9df2-d1ee319f3fb0@collabora.com/T/#u
45+# Failure Rate: 50
46+# IGT Version: 1.28-g0df7b9b97
47+# Linux Version: 6.9.0-rc7
48+kms_flip@plain-flip-ts-check-interruptible
49+
50+# Board Name: vkms
51+# Bug Report: https://lore.kernel.org/dri-devel/61ed26af-062c-443c-9df2-d1ee319f3fb0@collabora.com/T/#u
52+# Failure Rate: 50
53+# IGT Version: 1.28-g0df7b9b97
54+# Linux Version: 6.9.0-rc7
55+kms_flip@flip-vs-absolute-wf_vblank
56+
57+# Board Name: vkms
58+# Bug Report: https://lore.kernel.org/dri-devel/61ed26af-062c-443c-9df2-d1ee319f3fb0@collabora.com/T/#u
59+# Failure Rate: 50
60+# IGT Version: 1.28-g0df7b9b97
61+# Linux Version: 6.9.0-rc7
62+kms_flip@flip-vs-absolute-wf_vblank-interruptible
63+
64+# Board Name: vkms
65+# Bug Report: https://lore.kernel.org/dri-devel/61ed26af-062c-443c-9df2-d1ee319f3fb0@collabora.com/T/#u
66+# Failure Rate: 50
67+# IGT Version: 1.28-g0df7b9b97
68+# Linux Version: 6.9.0-rc7
69+kms_flip@flip-vs-blocking-wf-vblank
drivers/gpu/drm/ci/xfails/vkms-none-skips.txt+119−0
@@ -0,0 +1,119 @@
1+# keeps printing vkms_vblank_simulate: vblank timer overrun and never ends
2+kms_invalid_mode@int-max-clock
3+
4+# Kernel panic
5+kms_cursor_crc@cursor-rapid-movement-32x10
6+# Oops: 0000 [#1] PREEMPT SMP NOPTI
7+# CPU: 0 PID: 2635 Comm: kworker/u8:13 Not tainted 6.9.0-rc7-g40935263a1fd #1
8+# Hardware name: ChromiumOS crosvm, BIOS 0
9+# Workqueue: vkms_composer vkms_composer_worker [vkms]
10+# RIP: 0010:compose_active_planes+0x1c7/0x4e0 [vkms]
11+# Code: c9 0f 84 6a 01 00 00 8b 42 30 2b 42 28 41 39 c5 0f 8c 6f 01 00 00 49 83 c7 01 49 39 df 74 3b 4b 8b 34 fc 48 8b 96 48 01 00 00 <8b> 42 78 89 c1 83 e1 0a a8 20 74 b1 45 89 f5 41 f7 d5 44 03 6a 34
12+# RSP: 0018:ffffbb4700c17d58 EFLAGS: 00010246
13+# RAX: 0000000000000400 RBX: 0000000000000002 RCX: 0000000000000002
14+# RDX: 0000000000000000 RSI: ffffa2ad0788c000 RDI: 00000000fff479a8
15+# RBP: 0000000000000004 R08: 0000000000000000 R09: 0000000000000000
16+# R10: ffffa2ad0bb14000 R11: 0000000000000000 R12: ffffa2ad03e21700
17+# R13: 0000000000000003 R14: 0000000000000004 R15: 0000000000000000
18+# FS: 0000000000000000(0000) GS:ffffa2ad2bc00000(0000) knlGS:0000000000000000
19+# CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
20+# CR2: 0000000000000078 CR3: 000000010bd30000 CR4: 0000000000350ef0
21+# Call Trace:
22+# <TASK>
23+# ? __die+0x1e/0x60
24+# ? page_fault_oops+0x17b/0x490
25+# ? exc_page_fault+0x6d/0x230
26+# ? asm_exc_page_fault+0x26/0x30
27+# ? compose_active_planes+0x1c7/0x4e0 [vkms]
28+# ? compose_active_planes+0x2a3/0x4e0 [vkms]
29+# ? srso_return_thunk+0x5/0x5f
30+# vkms_composer_worker+0x205/0x240 [vkms]
31+# process_one_work+0x1f4/0x6b0
32+# ? lock_is_held_type+0x9e/0x110
33+# worker_thread+0x17e/0x350
34+# ? __pfx_worker_thread+0x10/0x10
35+# kthread+0xce/0x100
36+# ? __pfx_kthread+0x10/0x10
37+# ret_from_fork+0x2f/0x50
38+# ? __pfx_kthread+0x10/0x10
39+# ret_from_fork_asm+0x1a/0x30
40+# </TASK>
41+# Modules linked in: vkms
42+# CR2: 0000000000000078
43+# ---[ end trace 0000000000000000 ]---
44+# RIP: 0010:compose_active_planes+0x1c7/0x4e0 [vkms]
45+# Code: c9 0f 84 6a 01 00 00 8b 42 30 2b 42 28 41 39 c5 0f 8c 6f 01 00 00 49 83 c7 01 49 39 df 74 3b 4b 8b 34 fc 48 8b 96 48 01 00 00 <8b> 42 78 89 c1 83 e1 0a a8 20 74 b1 45 89 f5 41 f7 d5 44 03 6a 34
46+# RSP: 0018:ffffbb4700c17d58 EFLAGS: 00010246
47+# RAX: 0000000000000400 RBX: 0000000000000002 RCX: 0000000000000002
48+# RDX: 0000000000000000 RSI: ffffa2ad0788c000 RDI: 00000000fff479a8
49+# RBP: 0000000000000004 R08: 0000000000000000 R09: 0000000000000000
50+# R10: ffffa2ad0bb14000 R11: 0000000000000000 R12: ffffa2ad03e21700
51+# R13: 0000000000000003 R14: 0000000000000004 R15: 0000000000000000
52+# FS: 0000000000000000(0000) GS:ffffa2ad2bc00000(0000) knlGS:0000000000000000
53+# CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
54+
55+kms_cursor_crc@cursor-rapid-movement-256x85
56+# [drm:drm_crtc_add_crc_entry] *ERROR* Overflow of CRC buffer, userspace reads too slow.
57+# Oops: 0000 [#1] PREEMPT SMP NOPTI
58+# CPU: 1 PID: 10 Comm: kworker/u8:0 Not tainted 6.9.0-rc7-g646381cde463 #1
59+# Hardware name: ChromiumOS crosvm, BIOS 0
60+# Workqueue: vkms_composer vkms_composer_worker [vkms]
61+# RIP: 0010:compose_active_planes+0x1c7/0x4e0 [vkms]
62+# Code: c9 0f 84 6a 01 00 00 8b 42 30 2b 42 28 41 39 c5 0f 8c 6f 01 00 00 49 83 c7 01 49 39 df 74 3b 4b 8b 34 fc 48 8b 96 48 01 00 00 <8b> 42 78 89 c1 83 e1 0a a8 20 74 b1 45 89 f5 41 f7 d5 44 03 6a 34
63+# RSP: 0018:ffffa7e980057d58 EFLAGS: 00010246
64+# RAX: 0000000000000400 RBX: 0000000000000002 RCX: 0000000000000002
65+# RDX: 0000000000000000 RSI: ffff977987aa5c00 RDI: 000000001b43a85f
66+# RBP: 0000000000000001 R08: 0000000000000000 R09: 0000000000000000
67+# R10: ffff977981bf0000 R11: 0000000000000000 R12: ffff977989622590
68+# R13: 0000000000000000 R14: 0000000000000001 R15: 0000000000000000
69+# FS: 0000000000000000(0000) GS:ffff9779abd00000(0000) knlGS:0000000000000000
70+# CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
71+# CR2: 0000000000000078 CR3: 0000000109b38000 CR4: 0000000000350ef0
72+# Call Trace:
73+# <TASK>
74+# ? __die+0x1e/0x60
75+# ? page_fault_oops+0x17b/0x490
76+# ? exc_page_fault+0x6d/0x230
77+# ? asm_exc_page_fault+0x26/0x30
78+# ? compose_active_planes+0x1c7/0x4e0 [vkms]
79+# ? compose_active_planes+0x2a3/0x4e0 [vkms]
80+# ? srso_return_thunk+0x5/0x5f
81+# vkms_composer_worker+0x205/0x240 [vkms]
82+# process_one_work+0x1f4/0x6b0
83+# ? lock_is_held_type+0x9e/0x110
84+# worker_thread+0x17e/0x350
85+# ? __pfx_worker_thread+0x10/0x10
86+# kthread+0xce/0x100
87+# ? __pfx_kthread+0x10/0x10
88+# ret_from_fork+0x2f/0x50
89+# ? __pfx_kthread+0x10/0x10
90+# ret_from_fork_asm+0x1a/0x30
91+# </TASK>
92+# Modules linked in: vkms
93+# CR2: 0000000000000078
94+# ---[ end trace 0000000000000000 ]---
95+# RIP: 0010:compose_active_planes+0x1c7/0x4e0 [vkms]
96+# Code: c9 0f 84 6a 01 00 00 8b 42 30 2b 42 28 41 39 c5 0f 8c 6f 01 00 00 49 83 c7 01 49 39 df 74 3b 4b 8b 34 fc 48 8b 96 48 01 00 00 <8b> 42 78 89 c1 83 e1 0a a8 20 74 b1 45 89 f5 41 f7 d5 44 03 6a 34
97+# RSP: 0018:ffffa7e980057d58 EFLAGS: 00010246
98+# RAX: 0000000000000400 RBX: 0000000000000002 RCX: 0000000000000002
99+# RDX: 0000000000000000 RSI: ffff977987aa5c00 RDI: 000000001b43a85f
100+# RBP: 0000000000000001 R08: 0000000000000000 R09: 0000000000000000
101+# R10: ffff977981bf0000 R11: 0000000000000000 R12: ffff977989622590
102+# R13: 0000000000000000 R14: 0000000000000001 R15: 0000000000000000
103+# FS: 0000000000000000(0000) GS:ffff9779abd00000(0000) knlGS:0000000000000000
104+# CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
105+# CR2: 0000000000000078 CR3: 0000000109b38000 CR4: 0000000000350ef0
106+
107+# Skip driver specific tests
108+^amdgpu.*
109+msm_.*
110+nouveau_.*
111+panfrost_.*
112+^v3d.*
113+^vc4.*
114+^vmwgfx*
115+
116+# Skip intel specific tests
117+gem_.*
118+i915_.*
119+xe_.*
drivers/gpu/drm/display/Kconfig+7−0
@@ -70,3 +70,10 @@ config DRM_DISPLAY_HDMI_HELPER · 69 unmodified lines
7070 depends on DRM_DISPLAY_HELPER
7171 help
7272 DRM display helpers for HDMI.
73+
74+config DRM_DISPLAY_HDMI_STATE_HELPER
75+ bool
76+ depends on DRM_DISPLAY_HELPER
77+ select DRM_DISPLAY_HDMI_HELPER
78+ help
79+ DRM KMS state helpers for HDMI.
drivers/gpu/drm/display/Makefile+2−0
@@ -14,6 +14,8 @@ drm_display_helper-$(CONFIG_DRM_DISPLAY_HDCP_HELPER) += drm_hdcp_helper.o · 13 unmodified lines
1414 drm_display_helper-$(CONFIG_DRM_DISPLAY_HDMI_HELPER) += \
1515 drm_hdmi_helper.o \
1616 drm_scdc_helper.o
17+drm_display_helper-$(CONFIG_DRM_DISPLAY_HDMI_STATE_HELPER) += \
18+ drm_hdmi_state_helper.o
1719 drm_display_helper-$(CONFIG_DRM_DISPLAY_DP_AUX_CHARDEV) += drm_dp_aux_dev.o
1820 drm_display_helper-$(CONFIG_DRM_DISPLAY_DP_AUX_CEC) += drm_dp_cec.o
1921
drivers/gpu/drm/display/drm_hdmi_helper.c+61−0
@@ -195,3 +195,64 @@ void drm_hdmi_avi_infoframe_content_type(struct hdmi_avi_infoframe *frame, · 194 unmodified lines
195195 frame->itc = conn_state->content_type != DRM_MODE_CONTENT_TYPE_NO_DATA;
196196 }
197197 EXPORT_SYMBOL(drm_hdmi_avi_infoframe_content_type);
198+
199+/**
200+ * drm_hdmi_compute_mode_clock() - Computes the TMDS Character Rate
201+ * @mode: Display mode to compute the clock for
202+ * @bpc: Bits per character
203+ * @fmt: Output Pixel Format used
204+ *
205+ * Returns the TMDS Character Rate for a given mode, bpc count and output format.
206+ *
207+ * RETURNS:
208+ * The TMDS Character Rate, in Hertz, or 0 on error.
209+ */
210+unsigned long long
211+drm_hdmi_compute_mode_clock(const struct drm_display_mode *mode,
212+ unsigned int bpc, enum hdmi_colorspace fmt)
213+{
214+ unsigned long long clock = mode->clock * 1000ULL;
215+ unsigned int vic = drm_match_cea_mode(mode);
216+
217+ /*
218+ * CTA-861-G Spec, section 5.4 - Color Coding and Quantization
219+ * mandates that VIC 1 always uses 8 bpc.
220+ */
221+ if (vic == 1 && bpc != 8)
222+ return 0;
223+
224+ if (fmt == HDMI_COLORSPACE_YUV422) {
225+ /*
226+ * HDMI 1.0 Spec, section 6.5 - Pixel Encoding states that
227+ * YUV422 sends 24 bits over three channels, with Cb and Cr
228+ * components being sent on odd and even pixels, respectively.
229+ *
230+ * If fewer than 12 bpc are sent, data are left justified.
231+ */
232+ if (bpc > 12)
233+ return 0;
234+
235+ /*
236+ * HDMI 1.0 Spec, section 6.5 - Pixel Encoding
237+ * specifies that YUV422 sends two 12-bits components over
238+ * three TMDS channels per pixel clock, which is equivalent to
239+ * three 8-bits components over three channels used by RGB as
240+ * far as the clock rate goes.
241+ */
242+ bpc = 8;
243+ }
244+
245+ /*
246+ * HDMI 2.0 Spec, Section 7.1 - YCbCr 4:2:0 Pixel Encoding
247+ * specifies that YUV420 encoding is carried at a TMDS Character Rate
248+ * equal to half the pixel clock rate.
249+ */
250+ if (fmt == HDMI_COLORSPACE_YUV420)
251+ clock = clock / 2;
252+
253+ if (mode->flags & DRM_MODE_FLAG_DBLCLK)
254+ clock = clock * 2;
255+
256+ return DIV_ROUND_CLOSEST_ULL(clock * bpc, 8);
257+}
258+EXPORT_SYMBOL(drm_hdmi_compute_mode_clock);
drivers/gpu/drm/display/drm_hdmi_state_helper.c+752−0
@@ -0,0 +1,752 @@
1+// SPDX-License-Identifier: MIT
2+
3+#include <drm/drm_atomic.h>
4+#include <drm/drm_connector.h>
5+#include <drm/drm_edid.h>
6+#include <drm/drm_print.h>
7+
8+#include <drm/display/drm_hdmi_helper.h>
9+#include <drm/display/drm_hdmi_state_helper.h>
10+
11+/**
12+ * __drm_atomic_helper_connector_hdmi_reset() - Initializes all HDMI @drm_connector_state resources
13+ * @connector: DRM connector
14+ * @new_conn_state: connector state to reset
15+ *
16+ * Initializes all HDMI resources from a @drm_connector_state without
17+ * actually allocating it. This is useful for HDMI drivers, in
18+ * combination with __drm_atomic_helper_connector_reset() or
19+ * drm_atomic_helper_connector_reset().
20+ */
21+void __drm_atomic_helper_connector_hdmi_reset(struct drm_connector *connector,
22+ struct drm_connector_state *new_conn_state)
23+{
24+ unsigned int max_bpc = connector->max_bpc;
25+
26+ new_conn_state->max_bpc = max_bpc;
27+ new_conn_state->max_requested_bpc = max_bpc;
28+ new_conn_state->hdmi.broadcast_rgb = DRM_HDMI_BROADCAST_RGB_AUTO;
29+}
30+EXPORT_SYMBOL(__drm_atomic_helper_connector_hdmi_reset);
31+
32+static const struct drm_display_mode *
33+connector_state_get_mode(const struct drm_connector_state *conn_state)
34+{
35+ struct drm_atomic_state *state;
36+ struct drm_crtc_state *crtc_state;
37+ struct drm_crtc *crtc;
38+
39+ state = conn_state->state;
40+ if (!state)
41+ return NULL;
42+
43+ crtc = conn_state->crtc;
44+ if (!crtc)
45+ return NULL;
46+
47+ crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
48+ if (!crtc_state)
49+ return NULL;
50+
51+ return &crtc_state->mode;
52+}
53+
54+static bool hdmi_is_limited_range(const struct drm_connector *connector,
55+ const struct drm_connector_state *conn_state)
56+{
57+ const struct drm_display_info *info = &connector->display_info;
58+ const struct drm_display_mode *mode =
59+ connector_state_get_mode(conn_state);
60+
61+ /*
62+ * The Broadcast RGB property only applies to RGB format, and
63+ * i915 just assumes limited range for YCbCr output, so let's
64+ * just do the same.
65+ */
66+ if (conn_state->hdmi.output_format != HDMI_COLORSPACE_RGB)
67+ return true;
68+
69+ if (conn_state->hdmi.broadcast_rgb == DRM_HDMI_BROADCAST_RGB_FULL)
70+ return false;
71+
72+ if (conn_state->hdmi.broadcast_rgb == DRM_HDMI_BROADCAST_RGB_LIMITED)
73+ return true;
74+
75+ if (!info->is_hdmi)
76+ return false;
77+
78+ return drm_default_rgb_quant_range(mode) == HDMI_QUANTIZATION_RANGE_LIMITED;
79+}
80+
81+static bool
82+sink_supports_format_bpc(const struct drm_connector *connector,
83+ const struct drm_display_info *info,
84+ const struct drm_display_mode *mode,
85+ unsigned int format, unsigned int bpc)
86+{
87+ struct drm_device *dev = connector->dev;
88+ u8 vic = drm_match_cea_mode(mode);
89+
90+ /*
91+ * CTA-861-F, section 5.4 - Color Coding & Quantization states
92+ * that the bpc must be 8, 10, 12 or 16 except for the default
93+ * 640x480 VIC1 where the value must be 8.
94+ *
95+ * The definition of default here is ambiguous but the spec
96+ * refers to VIC1 being the default timing in several occasions
97+ * so our understanding is that for the default timing (ie,
98+ * VIC1), the bpc must be 8.
99+ */
100+ if (vic == 1 && bpc != 8) {
101+ drm_dbg_kms(dev, "VIC1 requires a bpc of 8, got %u\n", bpc);
102+ return false;
103+ }
104+
105+ if (!info->is_hdmi &&
106+ (format != HDMI_COLORSPACE_RGB || bpc != 8)) {
107+ drm_dbg_kms(dev, "DVI Monitors require an RGB output at 8 bpc\n");
108+ return false;
109+ }
110+
111+ if (!(connector->hdmi.supported_formats & BIT(format))) {
112+ drm_dbg_kms(dev, "%s format unsupported by the connector.\n",
113+ drm_hdmi_connector_get_output_format_name(format));
114+ return false;
115+ }
116+
117+ switch (format) {
118+ case HDMI_COLORSPACE_RGB:
119+ drm_dbg_kms(dev, "RGB Format, checking the constraints.\n");
120+
121+ /*
122+ * In some cases, like when the EDID readout fails, or
123+ * is not an HDMI compliant EDID for some reason, the
124+ * color_formats field will be blank and not report any
125+ * format supported. In such a case, assume that RGB is
126+ * supported so we can keep things going and light up
127+ * the display.
128+ */
129+ if (!(info->color_formats & DRM_COLOR_FORMAT_RGB444))
130+ drm_warn(dev, "HDMI Sink doesn't support RGB, something's wrong.\n");
131+
132+ if (bpc == 10 && !(info->edid_hdmi_rgb444_dc_modes & DRM_EDID_HDMI_DC_30)) {
133+ drm_dbg_kms(dev, "10 BPC but sink doesn't support Deep Color 30.\n");
134+ return false;
135+ }
136+
137+ if (bpc == 12 && !(info->edid_hdmi_rgb444_dc_modes & DRM_EDID_HDMI_DC_36)) {
138+ drm_dbg_kms(dev, "12 BPC but sink doesn't support Deep Color 36.\n");
139+ return false;
140+ }
141+
142+ drm_dbg_kms(dev, "RGB format supported in that configuration.\n");
143+
144+ return true;
145+
146+ case HDMI_COLORSPACE_YUV420:
147+ /* TODO: YUV420 is unsupported at the moment. */
148+ drm_dbg_kms(dev, "YUV420 format isn't supported yet.\n");
149+ return false;
150+
151+ case HDMI_COLORSPACE_YUV422:
152+ drm_dbg_kms(dev, "YUV422 format, checking the constraints.\n");
153+
154+ if (!(info->color_formats & DRM_COLOR_FORMAT_YCBCR422)) {
155+ drm_dbg_kms(dev, "Sink doesn't support YUV422.\n");
156+ return false;
157+ }
158+
159+ if (bpc > 12) {
160+ drm_dbg_kms(dev, "YUV422 only supports 12 bpc or lower.\n");
161+ return false;
162+ }
163+
164+ /*
165+ * HDMI Spec 1.3 - Section 6.5 Pixel Encodings and Color Depth
166+ * states that Deep Color is not relevant for YUV422 so we
167+ * don't need to check the Deep Color bits in the EDIDs here.
168+ */
169+
170+ drm_dbg_kms(dev, "YUV422 format supported in that configuration.\n");
171+
172+ return true;
173+
174+ case HDMI_COLORSPACE_YUV444:
175+ drm_dbg_kms(dev, "YUV444 format, checking the constraints.\n");
176+
177+ if (!(info->color_formats & DRM_COLOR_FORMAT_YCBCR444)) {
178+ drm_dbg_kms(dev, "Sink doesn't support YUV444.\n");
179+ return false;
180+ }
181+
182+ if (bpc == 10 && !(info->edid_hdmi_ycbcr444_dc_modes & DRM_EDID_HDMI_DC_30)) {
183+ drm_dbg_kms(dev, "10 BPC but sink doesn't support Deep Color 30.\n");
184+ return false;
185+ }
186+
187+ if (bpc == 12 && !(info->edid_hdmi_ycbcr444_dc_modes & DRM_EDID_HDMI_DC_36)) {
188+ drm_dbg_kms(dev, "12 BPC but sink doesn't support Deep Color 36.\n");
189+ return false;
190+ }
191+
192+ drm_dbg_kms(dev, "YUV444 format supported in that configuration.\n");
193+
194+ return true;
195+ }
196+
197+ drm_dbg_kms(dev, "Unsupported pixel format.\n");
198+ return false;
199+}
200+
201+static enum drm_mode_status
202+hdmi_clock_valid(const struct drm_connector *connector,
203+ const struct drm_display_mode *mode,
204+ unsigned long long clock)
205+{
206+ const struct drm_connector_hdmi_funcs *funcs = connector->hdmi.funcs;
207+ const struct drm_display_info *info = &connector->display_info;
208+
209+ if (info->max_tmds_clock && clock > info->max_tmds_clock * 1000)
210+ return MODE_CLOCK_HIGH;
211+
212+ if (funcs && funcs->tmds_char_rate_valid) {
213+ enum drm_mode_status status;
214+
215+ status = funcs->tmds_char_rate_valid(connector, mode, clock);
216+ if (status != MODE_OK)
217+ return status;
218+ }
219+
220+ return MODE_OK;
221+}
222+
223+static int
224+hdmi_compute_clock(const struct drm_connector *connector,
225+ struct drm_connector_state *conn_state,
226+ const struct drm_display_mode *mode,
227+ unsigned int bpc, enum hdmi_colorspace fmt)
228+{
229+ enum drm_mode_status status;
230+ unsigned long long clock;
231+
232+ clock = drm_hdmi_compute_mode_clock(mode, bpc, fmt);
233+ if (!clock)
234+ return -EINVAL;
235+
236+ status = hdmi_clock_valid(connector, mode, clock);
237+ if (status != MODE_OK)
238+ return -EINVAL;
239+
240+ conn_state->hdmi.tmds_char_rate = clock;
241+
242+ return 0;
243+}
244+
245+static bool
246+hdmi_try_format_bpc(const struct drm_connector *connector,
247+ struct drm_connector_state *conn_state,
248+ const struct drm_display_mode *mode,
249+ unsigned int bpc, enum hdmi_colorspace fmt)
250+{
251+ const struct drm_display_info *info = &connector->display_info;
252+ struct drm_device *dev = connector->dev;
253+ int ret;
254+
255+ drm_dbg_kms(dev, "Trying %s output format\n",
256+ drm_hdmi_connector_get_output_format_name(fmt));
257+
258+ if (!sink_supports_format_bpc(connector, info, mode, fmt, bpc)) {
259+ drm_dbg_kms(dev, "%s output format not supported with %u bpc\n",
260+ drm_hdmi_connector_get_output_format_name(fmt),
261+ bpc);
262+ return false;
263+ }
264+
265+ ret = hdmi_compute_clock(connector, conn_state, mode, bpc, fmt);
266+ if (ret) {
267+ drm_dbg_kms(dev, "Couldn't compute clock for %s output format and %u bpc\n",
268+ drm_hdmi_connector_get_output_format_name(fmt),
269+ bpc);
270+ return false;
271+ }
272+
273+ drm_dbg_kms(dev, "%s output format supported with %u (TMDS char rate: %llu Hz)\n",
274+ drm_hdmi_connector_get_output_format_name(fmt),
275+ bpc, conn_state->hdmi.tmds_char_rate);
276+
277+ return true;
278+}
279+
280+static int
281+hdmi_compute_format(const struct drm_connector *connector,
282+ struct drm_connector_state *conn_state,
283+ const struct drm_display_mode *mode,
284+ unsigned int bpc)
285+{
286+ struct drm_device *dev = connector->dev;
287+
288+ /*
289+ * TODO: Add support for YCbCr420 output for HDMI 2.0 capable
290+ * devices, for modes that only support YCbCr420.
291+ */
292+ if (hdmi_try_format_bpc(connector, conn_state, mode, bpc, HDMI_COLORSPACE_RGB)) {
293+ conn_state->hdmi.output_format = HDMI_COLORSPACE_RGB;
294+ return 0;
295+ }
296+
297+ drm_dbg_kms(dev, "Failed. No Format Supported for that bpc count.\n");
298+
299+ return -EINVAL;
300+}
301+
302+static int
303+hdmi_compute_config(const struct drm_connector *connector,
304+ struct drm_connector_state *conn_state,
305+ const struct drm_display_mode *mode)
306+{
307+ struct drm_device *dev = connector->dev;
308+ unsigned int max_bpc = clamp_t(unsigned int,
309+ conn_state->max_bpc,
310+ 8, connector->max_bpc);
311+ unsigned int bpc;
312+ int ret;
313+
314+ for (bpc = max_bpc; bpc >= 8; bpc -= 2) {
315+ drm_dbg_kms(dev, "Trying with a %d bpc output\n", bpc);
316+
317+ ret = hdmi_compute_format(connector, conn_state, mode, bpc);
318+ if (ret)
319+ continue;
320+
321+ conn_state->hdmi.output_bpc = bpc;
322+
323+ drm_dbg_kms(dev,
324+ "Mode %ux%u @ %uHz: Found configuration: bpc: %u, fmt: %s, clock: %llu\n",
325+ mode->hdisplay, mode->vdisplay, drm_mode_vrefresh(mode),
326+ conn_state->hdmi.output_bpc,
327+ drm_hdmi_connector_get_output_format_name(conn_state->hdmi.output_format),
328+ conn_state->hdmi.tmds_char_rate);
329+
330+ return 0;
331+ }
332+
333+ return -EINVAL;
334+}
335+
336+static int hdmi_generate_avi_infoframe(const struct drm_connector *connector,
337+ struct drm_connector_state *conn_state)
338+{
339+ const struct drm_display_mode *mode =
340+ connector_state_get_mode(conn_state);
341+ struct drm_connector_hdmi_infoframe *infoframe =
342+ &conn_state->hdmi.infoframes.avi;
343+ struct hdmi_avi_infoframe *frame =
344+ &infoframe->data.avi;
345+ bool is_limited_range = conn_state->hdmi.is_limited_range;
346+ enum hdmi_quantization_range rgb_quant_range =
347+ is_limited_range ? HDMI_QUANTIZATION_RANGE_LIMITED : HDMI_QUANTIZATION_RANGE_FULL;
348+ int ret;
349+
350+ ret = drm_hdmi_avi_infoframe_from_display_mode(frame, connector, mode);
351+ if (ret)
352+ return ret;
353+
354+ frame->colorspace = conn_state->hdmi.output_format;
355+
356+ /*
357+ * FIXME: drm_hdmi_avi_infoframe_quant_range() doesn't handle
358+ * YUV formats at all at the moment, so if we ever support YUV
359+ * formats this needs to be revised.
360+ */
361+ drm_hdmi_avi_infoframe_quant_range(frame, connector, mode, rgb_quant_range);
362+ drm_hdmi_avi_infoframe_colorimetry(frame, conn_state);
363+ drm_hdmi_avi_infoframe_bars(frame, conn_state);
364+
365+ infoframe->set = true;
366+
367+ return 0;
368+}
369+
370+static int hdmi_generate_spd_infoframe(const struct drm_connector *connector,
371+ struct drm_connector_state *conn_state)
372+{
373+ struct drm_connector_hdmi_infoframe *infoframe =
374+ &conn_state->hdmi.infoframes.spd;
375+ struct hdmi_spd_infoframe *frame =
376+ &infoframe->data.spd;
377+ int ret;
378+
379+ ret = hdmi_spd_infoframe_init(frame,
380+ connector->hdmi.vendor,
381+ connector->hdmi.product);
382+ if (ret)
383+ return ret;
384+
385+ frame->sdi = HDMI_SPD_SDI_PC;
386+
387+ infoframe->set = true;
388+
389+ return 0;
390+}
391+
392+static int hdmi_generate_hdr_infoframe(const struct drm_connector *connector,
393+ struct drm_connector_state *conn_state)
394+{
395+ struct drm_connector_hdmi_infoframe *infoframe =
396+ &conn_state->hdmi.infoframes.hdr_drm;
397+ struct hdmi_drm_infoframe *frame =
398+ &infoframe->data.drm;
399+ int ret;
400+
401+ if (connector->max_bpc < 10)
402+ return 0;
403+
404+ if (!conn_state->hdr_output_metadata)
405+ return 0;
406+
407+ ret = drm_hdmi_infoframe_set_hdr_metadata(frame, conn_state);
408+ if (ret)
409+ return ret;
410+
411+ infoframe->set = true;
412+
413+ return 0;
414+}
415+
416+static int hdmi_generate_hdmi_vendor_infoframe(const struct drm_connector *connector,
417+ struct drm_connector_state *conn_state)
418+{
419+ const struct drm_display_info *info = &connector->display_info;
420+ const struct drm_display_mode *mode =
421+ connector_state_get_mode(conn_state);
422+ struct drm_connector_hdmi_infoframe *infoframe =
423+ &conn_state->hdmi.infoframes.hdmi;
424+ struct hdmi_vendor_infoframe *frame =
425+ &infoframe->data.vendor.hdmi;
426+ int ret;
427+
428+ if (!info->has_hdmi_infoframe)
429+ return 0;
430+
431+ ret = drm_hdmi_vendor_infoframe_from_display_mode(frame, connector, mode);
432+ if (ret)
433+ return ret;
434+
435+ infoframe->set = true;
436+
437+ return 0;
438+}
439+
440+static int
441+hdmi_generate_infoframes(const struct drm_connector *connector,
442+ struct drm_connector_state *conn_state)
443+{
444+ const struct drm_display_info *info = &connector->display_info;
445+ int ret;
446+
447+ if (!info->is_hdmi)
448+ return 0;
449+
450+ ret = hdmi_generate_avi_infoframe(connector, conn_state);
451+ if (ret)
452+ return ret;
453+
454+ ret = hdmi_generate_spd_infoframe(connector, conn_state);
455+ if (ret)
456+ return ret;
457+
458+ /*
459+ * Audio Infoframes will be generated by ALSA, and updated by
460+ * drm_atomic_helper_connector_hdmi_update_audio_infoframe().
461+ */
462+
463+ ret = hdmi_generate_hdr_infoframe(connector, conn_state);
464+ if (ret)
465+ return ret;
466+
467+ ret = hdmi_generate_hdmi_vendor_infoframe(connector, conn_state);
468+ if (ret)
469+ return ret;
470+
471+ return 0;
472+}
473+
474+/**
475+ * drm_atomic_helper_connector_hdmi_check() - Helper to check HDMI connector atomic state
476+ * @connector: DRM Connector
477+ * @state: the DRM State object
478+ *
479+ * Provides a default connector state check handler for HDMI connectors.
480+ * Checks that a desired connector update is valid, and updates various
481+ * fields of derived state.
482+ *
483+ * RETURNS:
484+ * Zero on success, or an errno code otherwise.
485+ */
486+int drm_atomic_helper_connector_hdmi_check(struct drm_connector *connector,
487+ struct drm_atomic_state *state)
488+{
489+ struct drm_connector_state *old_conn_state =
490+ drm_atomic_get_old_connector_state(state, connector);
491+ struct drm_connector_state *new_conn_state =
492+ drm_atomic_get_new_connector_state(state, connector);
493+ const struct drm_display_mode *mode =
494+ connector_state_get_mode(new_conn_state);
495+ int ret;
496+
497+ new_conn_state->hdmi.is_limited_range = hdmi_is_limited_range(connector, new_conn_state);
498+
499+ ret = hdmi_compute_config(connector, new_conn_state, mode);
500+ if (ret)
501+ return ret;
502+
503+ ret = hdmi_generate_infoframes(connector, new_conn_state);
504+ if (ret)
505+ return ret;
506+
507+ if (old_conn_state->hdmi.broadcast_rgb != new_conn_state->hdmi.broadcast_rgb ||
508+ old_conn_state->hdmi.output_bpc != new_conn_state->hdmi.output_bpc ||
509+ old_conn_state->hdmi.output_format != new_conn_state->hdmi.output_format) {
510+ struct drm_crtc *crtc = new_conn_state->crtc;
511+ struct drm_crtc_state *crtc_state;
512+
513+ crtc_state = drm_atomic_get_crtc_state(state, crtc);
514+ if (IS_ERR(crtc_state))
515+ return PTR_ERR(crtc_state);
516+
517+ crtc_state->mode_changed = true;
518+ }
519+
520+ return 0;
521+}
522+EXPORT_SYMBOL(drm_atomic_helper_connector_hdmi_check);
523+
524+#define HDMI_MAX_INFOFRAME_SIZE 29
525+
526+static int clear_device_infoframe(struct drm_connector *connector,
527+ enum hdmi_infoframe_type type)
528+{
529+ const struct drm_connector_hdmi_funcs *funcs = connector->hdmi.funcs;
530+ struct drm_device *dev = connector->dev;
531+ int ret;
532+
533+ drm_dbg_kms(dev, "Clearing infoframe type 0x%x\n", type);
534+
535+ if (!funcs || !funcs->clear_infoframe) {
536+ drm_dbg_kms(dev, "Function not implemented, bailing.\n");
537+ return 0;
538+ }
539+
540+ ret = funcs->clear_infoframe(connector, type);
541+ if (ret) {
542+ drm_dbg_kms(dev, "Call failed: %d\n", ret);
543+ return ret;
544+ }
545+
546+ return 0;
547+}
548+
549+static int clear_infoframe(struct drm_connector *connector,
550+ struct drm_connector_hdmi_infoframe *old_frame)
551+{
552+ int ret;
553+
554+ ret = clear_device_infoframe(connector, old_frame->data.any.type);
555+ if (ret)
556+ return ret;
557+
558+ return 0;
559+}
560+
561+static int write_device_infoframe(struct drm_connector *connector,
562+ union hdmi_infoframe *frame)
563+{
564+ const struct drm_connector_hdmi_funcs *funcs = connector->hdmi.funcs;
565+ struct drm_device *dev = connector->dev;
566+ u8 buffer[HDMI_MAX_INFOFRAME_SIZE];
567+ int ret;
568+ int len;
569+
570+ drm_dbg_kms(dev, "Writing infoframe type %x\n", frame->any.type);
571+
572+ if (!funcs || !funcs->write_infoframe) {
573+ drm_dbg_kms(dev, "Function not implemented, bailing.\n");
574+ return -EINVAL;
575+ }
576+
577+ len = hdmi_infoframe_pack(frame, buffer, sizeof(buffer));
578+ if (len < 0)
579+ return len;
580+
581+ ret = funcs->write_infoframe(connector, frame->any.type, buffer, len);
582+ if (ret) {
583+ drm_dbg_kms(dev, "Call failed: %d\n", ret);
584+ return ret;
585+ }
586+
587+ return 0;
588+}
589+
590+static int write_infoframe(struct drm_connector *connector,
591+ struct drm_connector_hdmi_infoframe *new_frame)
592+{
593+ int ret;
594+
595+ ret = write_device_infoframe(connector, &new_frame->data);
596+ if (ret)
597+ return ret;
598+
599+ return 0;
600+}
601+
602+static int write_or_clear_infoframe(struct drm_connector *connector,
603+ struct drm_connector_hdmi_infoframe *old_frame,
604+ struct drm_connector_hdmi_infoframe *new_frame)
605+{
606+ if (new_frame->set)
607+ return write_infoframe(connector, new_frame);
608+
609+ if (old_frame->set && !new_frame->set)
610+ return clear_infoframe(connector, old_frame);
611+
612+ return 0;
613+}
614+
615+/**
616+ * drm_atomic_helper_connector_hdmi_update_infoframes - Update the Infoframes
617+ * @connector: A pointer to the HDMI connector
618+ * @state: The HDMI connector state to generate the infoframe from
619+ *
620+ * This function is meant for HDMI connector drivers to write their
621+ * infoframes. It will typically be used in a
622+ * @drm_connector_helper_funcs.atomic_enable implementation.
623+ *
624+ * Returns:
625+ * Zero on success, error code on failure.
626+ */
627+int drm_atomic_helper_connector_hdmi_update_infoframes(struct drm_connector *connector,
628+ struct drm_atomic_state *state)
629+{
630+ struct drm_connector_state *old_conn_state =
631+ drm_atomic_get_old_connector_state(state, connector);
632+ struct drm_connector_state *new_conn_state =
633+ drm_atomic_get_new_connector_state(state, connector);
634+ struct drm_display_info *info = &connector->display_info;
635+ int ret;
636+
637+ if (!info->is_hdmi)
638+ return 0;
639+
640+ mutex_lock(&connector->hdmi.infoframes.lock);
641+
642+ ret = write_or_clear_infoframe(connector,
643+ &old_conn_state->hdmi.infoframes.avi,
644+ &new_conn_state->hdmi.infoframes.avi);
645+ if (ret)
646+ goto out;
647+
648+ if (connector->hdmi.infoframes.audio.set) {
649+ ret = write_infoframe(connector,
650+ &connector->hdmi.infoframes.audio);
651+ if (ret)
652+ goto out;
653+ }
654+
655+ ret = write_or_clear_infoframe(connector,
656+ &old_conn_state->hdmi.infoframes.hdr_drm,
657+ &new_conn_state->hdmi.infoframes.hdr_drm);
658+ if (ret)
659+ goto out;
660+
661+ ret = write_or_clear_infoframe(connector,
662+ &old_conn_state->hdmi.infoframes.spd,
663+ &new_conn_state->hdmi.infoframes.spd);
664+ if (ret)
665+ goto out;
666+
667+ if (info->has_hdmi_infoframe) {
668+ ret = write_or_clear_infoframe(connector,
669+ &old_conn_state->hdmi.infoframes.hdmi,
670+ &new_conn_state->hdmi.infoframes.hdmi);
671+ if (ret)
672+ goto out;
673+ }
674+
675+out:
676+ mutex_unlock(&connector->hdmi.infoframes.lock);
677+ return ret;
678+}
679+EXPORT_SYMBOL(drm_atomic_helper_connector_hdmi_update_infoframes);
680+
681+/**
682+ * drm_atomic_helper_connector_hdmi_update_audio_infoframe - Update the Audio Infoframe
683+ * @connector: A pointer to the HDMI connector
684+ * @frame: A pointer to the audio infoframe to write
685+ *
686+ * This function is meant for HDMI connector drivers to update their
687+ * audio infoframe. It will typically be used in one of the ALSA hooks
688+ * (most likely prepare).
689+ *
690+ * Returns:
691+ * Zero on success, error code on failure.
692+ */
693+int
694+drm_atomic_helper_connector_hdmi_update_audio_infoframe(struct drm_connector *connector,
695+ struct hdmi_audio_infoframe *frame)
696+{
697+ struct drm_connector_hdmi_infoframe *infoframe =
698+ &connector->hdmi.infoframes.audio;
699+ struct drm_display_info *info = &connector->display_info;
700+ int ret;
701+
702+ if (!info->is_hdmi)
703+ return 0;
704+
705+ mutex_lock(&connector->hdmi.infoframes.lock);
706+
707+ memcpy(&infoframe->data, frame, sizeof(infoframe->data));
708+ infoframe->set = true;
709+
710+ ret = write_infoframe(connector, infoframe);
711+
712+ mutex_unlock(&connector->hdmi.infoframes.lock);
713+
714+ return ret;
715+}
716+EXPORT_SYMBOL(drm_atomic_helper_connector_hdmi_update_audio_infoframe);
717+
718+/**
719+ * drm_atomic_helper_connector_hdmi_disable_audio_infoframe - Stop sending the Audio Infoframe
720+ * @connector: A pointer to the HDMI connector
721+ *
722+ * This function is meant for HDMI connector drivers to stop sending their
723+ * audio infoframe. It will typically be used in one of the ALSA hooks
724+ * (most likely shutdown).
725+ *
726+ * Returns:
727+ * Zero on success, error code on failure.
728+ */
729+int
730+drm_atomic_helper_connector_hdmi_disable_audio_infoframe(struct drm_connector *connector)
731+{
732+ struct drm_connector_hdmi_infoframe *infoframe =
733+ &connector->hdmi.infoframes.audio;
734+ struct drm_display_info *info = &connector->display_info;
735+ int ret;
736+
737+ if (!info->is_hdmi)
738+ return 0;
739+
740+ mutex_lock(&connector->hdmi.infoframes.lock);
741+
742+ infoframe->set = false;
743+
744+ ret = clear_infoframe(connector, infoframe);
745+
746+ memset(&infoframe->data, 0, sizeof(infoframe->data));
747+
748+ mutex_unlock(&connector->hdmi.infoframes.lock);
749+
750+ return ret;
751+}
752+EXPORT_SYMBOL(drm_atomic_helper_connector_hdmi_disable_audio_infoframe);
drivers/gpu/drm/drm_atomic.c+11−0
@@ -1143,6 +1143,17 @@ static void drm_atomic_connector_print_state(struct drm_printer *p, · 1142 unmodified lines
11431143 drm_printf(p, "\tmax_requested_bpc=%d\n", state->max_requested_bpc);
11441144 drm_printf(p, "\tcolorspace=%s\n", drm_get_colorspace_name(state->colorspace));
11451145
1146+ if (connector->connector_type == DRM_MODE_CONNECTOR_HDMIA ||
1147+ connector->connector_type == DRM_MODE_CONNECTOR_HDMIB) {
1148+ drm_printf(p, "\tbroadcast_rgb=%s\n",
1149+ drm_hdmi_connector_get_broadcast_rgb_name(state->hdmi.broadcast_rgb));
1150+ drm_printf(p, "\tis_limited_range=%c\n", state->hdmi.is_limited_range ? 'y' : 'n');
1151+ drm_printf(p, "\toutput_bpc=%u\n", state->hdmi.output_bpc);
1152+ drm_printf(p, "\toutput_format=%s\n",
1153+ drm_hdmi_connector_get_output_format_name(state->hdmi.output_format));
1154+ drm_printf(p, "\ttmds_char_rate=%llu\n", state->hdmi.tmds_char_rate);
1155+ }
1156+
11461157 if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
11471158 if (state->writeback_job && state->writeback_job->fb)
11481159 drm_printf(p, "\tfb=%d\n", state->writeback_job->fb->base.id);
drivers/gpu/drm/drm_atomic_uapi.c+4−0
@@ -776,6 +776,8 @@ static int drm_atomic_connector_set_property(struct drm_connector *connector, · 775 unmodified lines
776776 state->max_requested_bpc = val;
777777 } else if (property == connector->privacy_screen_sw_state_property) {
778778 state->privacy_screen_sw_state = val;
779+ } else if (property == connector->broadcast_rgb_property) {
780+ state->hdmi.broadcast_rgb = val;
779781 } else if (connector->funcs->atomic_set_property) {
780782 return connector->funcs->atomic_set_property(connector,
781783 state, property, val);
@@ -859,6 +861,8 @@ drm_atomic_connector_get_property(struct drm_connector *connector, · 77 unmodified lines
859861 *val = state->max_requested_bpc;
860862 } else if (property == connector->privacy_screen_sw_state_property) {
861863 *val = state->privacy_screen_sw_state;
864+ } else if (property == connector->broadcast_rgb_property) {
865+ *val = state->hdmi.broadcast_rgb;
862866 } else if (connector->funcs->atomic_get_property) {
863867 return connector->funcs->atomic_get_property(connector,
864868 state, property, val);
drivers/gpu/drm/drm_bridge.c+0−42
@@ -353,13 +353,8 @@ err_reset_bridge: · 352 unmodified lines
353353 bridge->encoder = NULL;
354354 list_del(&bridge->chain_node);
355355
356−#ifdef CONFIG_OF
357356 DRM_ERROR("failed to attach bridge %pOF to encoder %s: %d\n",
358357 bridge->of_node, encoder->name, ret);
359−#else
360− DRM_ERROR("failed to attach bridge to encoder %s: %d\n",
361− encoder->name, ret);
362−#endif
363358
364359 return ret;
365360 }
@@ -472,43 +467,6 @@ void drm_bridge_detach(struct drm_bridge *bridge) · 106 unmodified lines
472467 * needed, in order to gradually transition to the new model.
473468 */
474469
475−/**
476− * drm_bridge_chain_mode_fixup - fixup proposed mode for all bridges in the
477− * encoder chain
478− * @bridge: bridge control structure
479− * @mode: desired mode to be set for the bridge
480− * @adjusted_mode: updated mode that works for this bridge
481− *
482− * Calls &drm_bridge_funcs.mode_fixup for all the bridges in the
483− * encoder chain, starting from the first bridge to the last.
484− *
485− * Note: the bridge passed should be the one closest to the encoder
486− *
487− * RETURNS:
488− * true on success, false on failure
489− */
490−bool drm_bridge_chain_mode_fixup(struct drm_bridge *bridge,
491− const struct drm_display_mode *mode,
492− struct drm_display_mode *adjusted_mode)
493−{
494− struct drm_encoder *encoder;
495−
496− if (!bridge)
497− return true;
498−
499− encoder = bridge->encoder;
500− list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) {
501− if (!bridge->funcs->mode_fixup)
502− continue;
503−
504− if (!bridge->funcs->mode_fixup(bridge, mode, adjusted_mode))
505− return false;
506− }
507−
508− return true;
509−}
510−EXPORT_SYMBOL(drm_bridge_chain_mode_fixup);
511−
512470 /**
513471 * drm_bridge_chain_mode_valid - validate the mode against all bridges in the
514472 * encoder chain.
drivers/gpu/drm/drm_bridge_connector.c+91−16
@@ -15,8 +15,10 @@ · 14 unmodified lines
1515 #include <drm/drm_connector.h>
1616 #include <drm/drm_device.h>
1717 #include <drm/drm_edid.h>
18+#include <drm/drm_managed.h>
1819 #include <drm/drm_modeset_helper_vtables.h>
1920 #include <drm/drm_probe_helper.h>
21+#include <drm/display/drm_hdmi_state_helper.h>
2022
2123 /**
2224 * DOC: overview
@@ -86,6 +88,13 @@ struct drm_bridge_connector { · 63 unmodified lines
8688 * connector modes detection, if any (see &DRM_BRIDGE_OP_MODES).
8789 */
8890 struct drm_bridge *bridge_modes;
91+ /**
92+ * @bridge_hdmi:
93+ *
94+ * The bridge in the chain that implements necessary support for the
95+ * HDMI connector infrastructure, if any (see &DRM_BRIDGE_OP_HDMI).
96+ */
97+ struct drm_bridge *bridge_hdmi;
8998 };
9099
91100 #define to_drm_bridge_connector(x) \
@@ -193,19 +202,6 @@ drm_bridge_connector_detect(struct drm_connector *connector, bool force) · 101 unmodified lines
193202 return status;
194203 }
195204
196−static void drm_bridge_connector_destroy(struct drm_connector *connector)
197−{
198− struct drm_bridge_connector *bridge_connector =
199− to_drm_bridge_connector(connector);
200−
201− drm_connector_unregister(connector);
202− drm_connector_cleanup(connector);
203−
204− fwnode_handle_put(connector->fwnode);
205−
206− kfree(bridge_connector);
207−}
208−
209205 static void drm_bridge_connector_debugfs_init(struct drm_connector *connector,
210206 struct dentry *root)
211207 {
@@ -224,7 +220,6 @@ static const struct drm_connector_funcs drm_bridge_connector_funcs = { · 12 unmodified lines
224220 .reset = drm_atomic_helper_connector_reset,
225221 .detect = drm_bridge_connector_detect,
226222 .fill_modes = drm_helper_probe_single_connector_modes,
227− .destroy = drm_bridge_connector_destroy,
228223 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
229224 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
230225 .debugfs_init = drm_bridge_connector_debugfs_init,
@@ -300,6 +295,60 @@ static const struct drm_connector_helper_funcs drm_bridge_connector_helper_funcs · 69 unmodified lines
300295 .disable_hpd = drm_bridge_connector_disable_hpd,
301296 };
302297
298+static enum drm_mode_status
299+drm_bridge_connector_tmds_char_rate_valid(const struct drm_connector *connector,
300+ const struct drm_display_mode *mode,
301+ unsigned long long tmds_rate)
302+{
303+ struct drm_bridge_connector *bridge_connector =
304+ to_drm_bridge_connector(connector);
305+ struct drm_bridge *bridge;
306+
307+ bridge = bridge_connector->bridge_hdmi;
308+ if (!bridge)
309+ return MODE_ERROR;
310+
311+ if (bridge->funcs->hdmi_tmds_char_rate_valid)
312+ return bridge->funcs->hdmi_tmds_char_rate_valid(bridge, mode, tmds_rate);
313+ else
314+ return MODE_OK;
315+}
316+
317+static int drm_bridge_connector_clear_infoframe(struct drm_connector *connector,
318+ enum hdmi_infoframe_type type)
319+{
320+ struct drm_bridge_connector *bridge_connector =
321+ to_drm_bridge_connector(connector);
322+ struct drm_bridge *bridge;
323+
324+ bridge = bridge_connector->bridge_hdmi;
325+ if (!bridge)
326+ return -EINVAL;
327+
328+ return bridge->funcs->hdmi_clear_infoframe(bridge, type);
329+}
330+
331+static int drm_bridge_connector_write_infoframe(struct drm_connector *connector,
332+ enum hdmi_infoframe_type type,
333+ const u8 *buffer, size_t len)
334+{
335+ struct drm_bridge_connector *bridge_connector =
336+ to_drm_bridge_connector(connector);
337+ struct drm_bridge *bridge;
338+
339+ bridge = bridge_connector->bridge_hdmi;
340+ if (!bridge)
341+ return -EINVAL;
342+
343+ return bridge->funcs->hdmi_write_infoframe(bridge, type, buffer, len);
344+}
345+
346+static const struct drm_connector_hdmi_funcs drm_bridge_connector_hdmi_funcs = {
347+ .tmds_char_rate_valid = drm_bridge_connector_tmds_char_rate_valid,
348+ .clear_infoframe = drm_bridge_connector_clear_infoframe,
349+ .write_infoframe = drm_bridge_connector_write_infoframe,
350+};
351+
303352 /* -----------------------------------------------------------------------------
304353 * Bridge Connector Initialisation
305354 */
@@ -325,10 +374,12 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm, · 19 unmodified lines
325374 struct drm_connector *connector;
326375 struct i2c_adapter *ddc = NULL;
327376 struct drm_bridge *bridge, *panel_bridge = NULL;
377+ unsigned int supported_formats = BIT(HDMI_COLORSPACE_RGB);
378+ unsigned int max_bpc = 8;
328379 int connector_type;
329380 int ret;
330381
331− bridge_connector = kzalloc(sizeof(*bridge_connector), GFP_KERNEL);
382+ bridge_connector = drmm_kzalloc(drm, sizeof(*bridge_connector), GFP_KERNEL);
332383 if (!bridge_connector)
333384 return ERR_PTR(-ENOMEM);
334385
@@ -361,6 +412,20 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm, · 26 unmodified lines
361412 bridge_connector->bridge_detect = bridge;
362413 if (bridge->ops & DRM_BRIDGE_OP_MODES)
363414 bridge_connector->bridge_modes = bridge;
415+ if (bridge->ops & DRM_BRIDGE_OP_HDMI) {
416+ if (bridge_connector->bridge_hdmi)
417+ return ERR_PTR(-EBUSY);
418+ if (!bridge->funcs->hdmi_write_infoframe ||
419+ !bridge->funcs->hdmi_clear_infoframe)
420+ return ERR_PTR(-EINVAL);
421+
422+ bridge_connector->bridge_hdmi = bridge;
423+
424+ if (bridge->supported_formats)
425+ supported_formats = bridge->supported_formats;
426+ if (bridge->max_bpc)
427+ max_bpc = bridge->max_bpc;
428+ }
364429
365430 if (!drm_bridge_get_next_bridge(bridge))
366431 connector_type = bridge->type;
@@ -383,7 +448,17 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm, · 16 unmodified lines
383448 return ERR_PTR(-EINVAL);
384449 }
385450
386− ret = drm_connector_init_with_ddc(drm, connector,
451+ if (bridge_connector->bridge_hdmi)
452+ ret = drmm_connector_hdmi_init(drm, connector,
453+ bridge_connector->bridge_hdmi->vendor,
454+ bridge_connector->bridge_hdmi->product,
455+ &drm_bridge_connector_funcs,
456+ &drm_bridge_connector_hdmi_funcs,
457+ connector_type, ddc,
458+ supported_formats,
459+ max_bpc);
460+ else
461+ ret = drmm_connector_init(drm, connector,
387462 &drm_bridge_connector_funcs,
388463 connector_type, ddc);
389464 if (ret) {
drivers/gpu/drm/drm_connector.c+201−0
@@ -278,6 +278,7 @@ static int __drm_connector_init(struct drm_device *dev, · 277 unmodified lines
278278 INIT_LIST_HEAD(&connector->modes);
279279 mutex_init(&connector->mutex);
280280 mutex_init(&connector->edid_override_mutex);
281+ mutex_init(&connector->hdmi.infoframes.lock);
281282 connector->edid_blob_ptr = NULL;
282283 connector->epoch_counter = 0;
283284 connector->tile_blob_ptr = NULL;
@@ -452,6 +453,86 @@ int drmm_connector_init(struct drm_device *dev, · 168 unmodified lines
452453 }
453454 EXPORT_SYMBOL(drmm_connector_init);
454455
456+/**
457+ * drmm_connector_hdmi_init - Init a preallocated HDMI connector
458+ * @dev: DRM device
459+ * @connector: A pointer to the HDMI connector to init
460+ * @vendor: HDMI Controller Vendor name
461+ * @product: HDMI Controller Product name
462+ * @funcs: callbacks for this connector
463+ * @hdmi_funcs: HDMI-related callbacks for this connector
464+ * @connector_type: user visible type of the connector
465+ * @ddc: optional pointer to the associated ddc adapter
466+ * @supported_formats: Bitmask of @hdmi_colorspace listing supported output formats
467+ * @max_bpc: Maximum bits per char the HDMI connector supports
468+ *
469+ * Initialises a preallocated HDMI connector. Connectors can be
470+ * subclassed as part of driver connector objects.
471+ *
472+ * Cleanup is automatically handled with a call to
473+ * drm_connector_cleanup() in a DRM-managed action.
474+ *
475+ * The connector structure should be allocated with drmm_kzalloc().
476+ *
477+ * Returns:
478+ * Zero on success, error code on failure.
479+ */
480+int drmm_connector_hdmi_init(struct drm_device *dev,
481+ struct drm_connector *connector,
482+ const char *vendor, const char *product,
483+ const struct drm_connector_funcs *funcs,
484+ const struct drm_connector_hdmi_funcs *hdmi_funcs,
485+ int connector_type,
486+ struct i2c_adapter *ddc,
487+ unsigned long supported_formats,
488+ unsigned int max_bpc)
489+{
490+ int ret;
491+
492+ if (!vendor || !product)
493+ return -EINVAL;
494+
495+ if ((strlen(vendor) > DRM_CONNECTOR_HDMI_VENDOR_LEN) ||
496+ (strlen(product) > DRM_CONNECTOR_HDMI_PRODUCT_LEN))
497+ return -EINVAL;
498+
499+ if (!(connector_type == DRM_MODE_CONNECTOR_HDMIA ||
500+ connector_type == DRM_MODE_CONNECTOR_HDMIB))
501+ return -EINVAL;
502+
503+ if (!supported_formats || !(supported_formats & BIT(HDMI_COLORSPACE_RGB)))
504+ return -EINVAL;
505+
506+ if (!(max_bpc == 8 || max_bpc == 10 || max_bpc == 12))
507+ return -EINVAL;
508+
509+ ret = drmm_connector_init(dev, connector, funcs, connector_type, ddc);
510+ if (ret)
511+ return ret;
512+
513+ connector->hdmi.supported_formats = supported_formats;
514+ strtomem_pad(connector->hdmi.vendor, vendor, 0);
515+ strtomem_pad(connector->hdmi.product, product, 0);
516+
517+ /*
518+ * drm_connector_attach_max_bpc_property() requires the
519+ * connector to have a state.
520+ */
521+ if (connector->funcs->reset)
522+ connector->funcs->reset(connector);
523+
524+ drm_connector_attach_max_bpc_property(connector, 8, max_bpc);
525+ connector->max_bpc = max_bpc;
526+
527+ if (max_bpc > 8)
528+ drm_connector_attach_hdr_output_metadata_property(connector);
529+
530+ connector->hdmi.funcs = hdmi_funcs;
531+
532+ return 0;
533+}
534+EXPORT_SYMBOL(drmm_connector_hdmi_init);
535+
455536 /**
456537 * drm_connector_attach_edid_property - attach edid property.
457538 * @connector: the connector
@@ -584,6 +665,7 @@ void drm_connector_cleanup(struct drm_connector *connector) · 126 unmodified lines
584665 connector->funcs->atomic_destroy_state(connector,
585666 connector->state);
586667
668+ mutex_destroy(&connector->hdmi.infoframes.lock);
587669 mutex_destroy(&connector->mutex);
588670
589671 memset(connector, 0, sizeof(*connector));
@@ -1005,6 +1087,7 @@ static const struct drm_prop_enum_list drm_tv_mode_enum_list[] = { · 415 unmodified lines
10051087 { DRM_MODE_TV_MODE_PAL_M, "PAL-M" },
10061088 { DRM_MODE_TV_MODE_PAL_N, "PAL-N" },
10071089 { DRM_MODE_TV_MODE_SECAM, "SECAM" },
1090+ { DRM_MODE_TV_MODE_MONOCHROME, "Mono" },
10081091 };
10091092 DRM_ENUM_NAME_FN(drm_get_tv_mode_name, drm_tv_mode_enum_list)
10101093
@@ -1144,6 +1227,53 @@ static const u32 dp_colorspaces = · 133 unmodified lines
11441227 BIT(DRM_MODE_COLORIMETRY_BT2020_CYCC) |
11451228 BIT(DRM_MODE_COLORIMETRY_BT2020_YCC);
11461229
1230+static const struct drm_prop_enum_list broadcast_rgb_names[] = {
1231+ { DRM_HDMI_BROADCAST_RGB_AUTO, "Automatic" },
1232+ { DRM_HDMI_BROADCAST_RGB_FULL, "Full" },
1233+ { DRM_HDMI_BROADCAST_RGB_LIMITED, "Limited 16:235" },
1234+};
1235+
1236+/*
1237+ * drm_hdmi_connector_get_broadcast_rgb_name - Return a string for HDMI connector RGB broadcast selection
1238+ * @broadcast_rgb: Broadcast RGB selection to compute name of
1239+ *
1240+ * Returns: the name of the Broadcast RGB selection, or NULL if the type
1241+ * is not valid.
1242+ */
1243+const char *
1244+drm_hdmi_connector_get_broadcast_rgb_name(enum drm_hdmi_broadcast_rgb broadcast_rgb)
1245+{
1246+ if (broadcast_rgb >= ARRAY_SIZE(broadcast_rgb_names))
1247+ return NULL;
1248+
1249+ return broadcast_rgb_names[broadcast_rgb].name;
1250+}
1251+EXPORT_SYMBOL(drm_hdmi_connector_get_broadcast_rgb_name);
1252+
1253+static const char * const output_format_str[] = {
1254+ [HDMI_COLORSPACE_RGB] = "RGB",
1255+ [HDMI_COLORSPACE_YUV420] = "YUV 4:2:0",
1256+ [HDMI_COLORSPACE_YUV422] = "YUV 4:2:2",
1257+ [HDMI_COLORSPACE_YUV444] = "YUV 4:4:4",
1258+};
1259+
1260+/*
1261+ * drm_hdmi_connector_get_output_format_name() - Return a string for HDMI connector output format
1262+ * @fmt: Output format to compute name of
1263+ *
1264+ * Returns: the name of the output format, or NULL if the type is not
1265+ * valid.
1266+ */
1267+const char *
1268+drm_hdmi_connector_get_output_format_name(enum hdmi_colorspace fmt)
1269+{
1270+ if (fmt >= ARRAY_SIZE(output_format_str))
1271+ return NULL;
1272+
1273+ return output_format_str[fmt];
1274+}
1275+EXPORT_SYMBOL(drm_hdmi_connector_get_output_format_name);
1276+
11471277 /**
11481278 * DOC: standard connector properties
11491279 *
@@ -1616,6 +1746,38 @@ EXPORT_SYMBOL(drm_connector_attach_dp_subconnector_property); · 466 unmodified lines
16161746 /**
16171747 * DOC: HDMI connector properties
16181748 *
1749+ * Broadcast RGB (HDMI specific)
1750+ * Indicates the Quantization Range (Full vs Limited) used. The color
1751+ * processing pipeline will be adjusted to match the value of the
1752+ * property, and the Infoframes will be generated and sent accordingly.
1753+ *
1754+ * This property is only relevant if the HDMI output format is RGB. If
1755+ * it's one of the YCbCr variant, it will be ignored.
1756+ *
1757+ * The CRTC attached to the connector must be configured by user-space to
1758+ * always produce full-range pixels.
1759+ *
1760+ * The value of this property can be one of the following:
1761+ *
1762+ * Automatic:
1763+ * The quantization range is selected automatically based on the
1764+ * mode according to the HDMI specifications (HDMI 1.4b - Section
1765+ * 6.6 - Video Quantization Ranges).
1766+ *
1767+ * Full:
1768+ * Full quantization range is forced.
1769+ *
1770+ * Limited 16:235:
1771+ * Limited quantization range is forced. Unlike the name suggests,
1772+ * this works for any number of bits-per-component.
1773+ *
1774+ * Property values other than Automatic can result in colors being off (if
1775+ * limited is selected but the display expects full), or a black screen
1776+ * (if full is selected but the display expects limited).
1777+ *
1778+ * Drivers can set up this property by calling
1779+ * drm_connector_attach_broadcast_rgb_property().
1780+ *
16191781 * content type (HDMI specific):
16201782 * Indicates content type setting to be used in HDMI infoframes to indicate
16211783 * content type for the external device, so that it adjusts its display
@@ -1697,6 +1859,12 @@ EXPORT_SYMBOL(drm_connector_attach_dp_subconnector_property); · 75 unmodified lines
16971859 * TV Mode is CCIR System B (aka 625-lines) together with
16981860 * the SECAM Color Encoding.
16991861 *
1862+ * Mono:
1863+ *
1864+ * Use timings appropriate to the DRM mode, including
1865+ * equalizing pulses for a 525-line or 625-line mode,
1866+ * with no pedestal or color encoding.
1867+ *
17001868 * Drivers can set up this property by calling
17011869 * drm_mode_create_tv_properties().
17021870 */
@@ -2478,6 +2646,39 @@ int drm_connector_attach_hdr_output_metadata_property(struct drm_connector *conn · 775 unmodified lines
24782646 }
24792647 EXPORT_SYMBOL(drm_connector_attach_hdr_output_metadata_property);
24802648
2649+/**
2650+ * drm_connector_attach_broadcast_rgb_property - attach "Broadcast RGB" property
2651+ * @connector: connector to attach the property on.
2652+ *
2653+ * This is used to add support for forcing the RGB range on a connector
2654+ *
2655+ * Returns:
2656+ * Zero on success, negative errno on failure.
2657+ */
2658+int drm_connector_attach_broadcast_rgb_property(struct drm_connector *connector)
2659+{
2660+ struct drm_device *dev = connector->dev;
2661+ struct drm_property *prop;
2662+
2663+ prop = connector->broadcast_rgb_property;
2664+ if (!prop) {
2665+ prop = drm_property_create_enum(dev, DRM_MODE_PROP_ENUM,
2666+ "Broadcast RGB",
2667+ broadcast_rgb_names,
2668+ ARRAY_SIZE(broadcast_rgb_names));
2669+ if (!prop)
2670+ return -EINVAL;
2671+
2672+ connector->broadcast_rgb_property = prop;
2673+ }
2674+
2675+ drm_object_attach_property(&connector->base, prop,
2676+ DRM_HDMI_BROADCAST_RGB_AUTO);
2677+
2678+ return 0;
2679+}
2680+EXPORT_SYMBOL(drm_connector_attach_broadcast_rgb_property);
2681+
24812682 /**
24822683 * drm_connector_attach_colorspace_property - attach "Colorspace" property
24832684 * @connector: connector to attach the property on.
drivers/gpu/drm/drm_crtc_internal.h+2−0
@@ -303,6 +303,8 @@ const u8 *drm_edid_find_extension(const struct drm_edid *drm_edid, · 302 unmodified lines
303303 int ext_id, int *ext_index);
304304 void drm_edid_cta_sad_get(const struct cea_sad *cta_sad, u8 *sad);
305305 void drm_edid_cta_sad_set(struct cea_sad *cta_sad, const u8 *sad);
306+ssize_t drm_edid_connector_property_show(struct drm_connector *connector,
307+ char *buf, loff_t off, size_t count);
306308
307309 /* drm_edid_load.c */
308310 #ifdef CONFIG_DRM_LOAD_EDID_FIRMWARE
drivers/gpu/drm/drm_debugfs.c+156−2
@@ -520,6 +520,156 @@ static const struct file_operations drm_connector_fops = { · 519 unmodified lines
520520 .write = connector_write
521521 };
522522
523+#define HDMI_MAX_INFOFRAME_SIZE 29
524+
525+static ssize_t
526+audio_infoframe_read(struct file *filp, char __user *ubuf, size_t count, loff_t *ppos)
527+{
528+ struct drm_connector_hdmi_infoframe *infoframe;
529+ struct drm_connector *connector;
530+ union hdmi_infoframe *frame;
531+ u8 buf[HDMI_INFOFRAME_SIZE(AUDIO)];
532+ ssize_t len = 0;
533+
534+ connector = filp->private_data;
535+ mutex_lock(&connector->hdmi.infoframes.lock);
536+
537+ infoframe = &connector->hdmi.infoframes.audio;
538+ if (!infoframe->set)
539+ goto out;
540+
541+ frame = &infoframe->data;
542+ len = hdmi_infoframe_pack(frame, buf, sizeof(buf));
543+ if (len < 0)
544+ goto out;
545+
546+ len = simple_read_from_buffer(ubuf, count, ppos, buf, len);
547+
548+out:
549+ mutex_unlock(&connector->hdmi.infoframes.lock);
550+ return len;
551+}
552+
553+static const struct file_operations audio_infoframe_fops = {
554+ .owner = THIS_MODULE,
555+ .open = simple_open,
556+ .read = audio_infoframe_read,
557+};
558+
559+static int create_hdmi_audio_infoframe_file(struct drm_connector *connector,
560+ struct dentry *parent)
561+{
562+ struct dentry *file;
563+
564+ file = debugfs_create_file("audio", 0400, parent, connector, &audio_infoframe_fops);
565+ if (IS_ERR(file))
566+ return PTR_ERR(file);
567+
568+ return 0;
569+}
570+
571+#define DEFINE_INFOFRAME_FILE(_f) \
572+static ssize_t _f##_read_infoframe(struct file *filp, \
573+ char __user *ubuf, \
574+ size_t count, \
575+ loff_t *ppos) \
576+{ \
577+ struct drm_connector_hdmi_infoframe *infoframe; \
578+ struct drm_connector_state *conn_state; \
579+ struct drm_connector *connector; \
580+ union hdmi_infoframe *frame; \
581+ struct drm_device *dev; \
582+ u8 buf[HDMI_MAX_INFOFRAME_SIZE]; \
583+ ssize_t len = 0; \
584+ \
585+ connector = filp->private_data; \
586+ dev = connector->dev; \
587+ \
588+ drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); \
589+ \
590+ conn_state = connector->state; \
591+ infoframe = &conn_state->hdmi.infoframes._f; \
592+ if (!infoframe->set) \
593+ goto out; \
594+ \
595+ frame = &infoframe->data; \
596+ len = hdmi_infoframe_pack(frame, buf, sizeof(buf)); \
597+ if (len < 0) \
598+ goto out; \
599+ \
600+ len = simple_read_from_buffer(ubuf, count, ppos, buf, len); \
601+ \
602+out: \
603+ drm_modeset_unlock(&dev->mode_config.connection_mutex); \
604+ return len; \
605+} \
606+\
607+static const struct file_operations _f##_infoframe_fops = { \
608+ .owner = THIS_MODULE, \
609+ .open = simple_open, \
610+ .read = _f##_read_infoframe, \
611+}; \
612+\
613+static int create_hdmi_## _f ## _infoframe_file(struct drm_connector *connector, \
614+ struct dentry *parent) \
615+{ \
616+ struct dentry *file; \
617+ \
618+ file = debugfs_create_file(#_f, 0400, parent, connector, &_f ## _infoframe_fops); \
619+ if (IS_ERR(file)) \
620+ return PTR_ERR(file); \
621+ \
622+ return 0; \
623+}
624+
625+DEFINE_INFOFRAME_FILE(avi);
626+DEFINE_INFOFRAME_FILE(hdmi);
627+DEFINE_INFOFRAME_FILE(hdr_drm);
628+DEFINE_INFOFRAME_FILE(spd);
629+
630+static int create_hdmi_infoframe_files(struct drm_connector *connector,
631+ struct dentry *parent)
632+{
633+ int ret;
634+
635+ ret = create_hdmi_audio_infoframe_file(connector, parent);
636+ if (ret)
637+ return ret;
638+
639+ ret = create_hdmi_avi_infoframe_file(connector, parent);
640+ if (ret)
641+ return ret;
642+
643+ ret = create_hdmi_hdmi_infoframe_file(connector, parent);
644+ if (ret)
645+ return ret;
646+
647+ ret = create_hdmi_hdr_drm_infoframe_file(connector, parent);
648+ if (ret)
649+ return ret;
650+
651+ ret = create_hdmi_spd_infoframe_file(connector, parent);
652+ if (ret)
653+ return ret;
654+
655+ return 0;
656+}
657+
658+static void hdmi_debugfs_add(struct drm_connector *connector)
659+{
660+ struct dentry *dir;
661+
662+ if (!(connector->connector_type == DRM_MODE_CONNECTOR_HDMIA ||
663+ connector->connector_type == DRM_MODE_CONNECTOR_HDMIB))
664+ return;
665+
666+ dir = debugfs_create_dir("infoframes", connector->debugfs_entry);
667+ if (IS_ERR(dir))
668+ return;
669+
670+ create_hdmi_infoframe_files(connector, dir);
671+}
672+
523673 void drm_debugfs_connector_add(struct drm_connector *connector)
524674 {
525675 struct drm_device *dev = connector->dev;
@@ -547,6 +697,8 @@ void drm_debugfs_connector_add(struct drm_connector *connector) · 21 unmodified lines
547697 debugfs_create_file("output_bpc", 0444, root, connector,
548698 &output_bpc_fops);
549699
700+ hdmi_debugfs_add(connector);
701+
550702 if (connector->funcs->debugfs_init)
551703 connector->funcs->debugfs_init(connector, root);
552704 }
@@ -597,10 +749,10 @@ static int bridges_show(struct seq_file *m, void *data) · 44 unmodified lines
597749 drm_printf(&p, "\ttype: [%d] %s\n",
598750 bridge->type,
599751 drm_get_connector_type_name(bridge->type));
600−#ifdef CONFIG_OF
752+
601753 if (bridge->of_node)
602754 drm_printf(&p, "\tOF: %pOFfc\n", bridge->of_node);
603−#endif
755+
604756 drm_printf(&p, "\tops: [0x%x]", bridge->ops);
605757 if (bridge->ops & DRM_BRIDGE_OP_DETECT)
606758 drm_puts(&p, " detect");
@@ -610,6 +762,8 @@ static int bridges_show(struct seq_file *m, void *data) · 3 unmodified lines
610762 drm_puts(&p, " hpd");
611763 if (bridge->ops & DRM_BRIDGE_OP_MODES)
612764 drm_puts(&p, " modes");
765+ if (bridge->ops & DRM_BRIDGE_OP_HDMI)
766+ drm_puts(&p, " hdmi");
613767 drm_puts(&p, "\n");
614768 }
615769
drivers/gpu/drm/drm_drv.c+3−3
@@ -346,7 +346,7 @@ void drm_minor_release(struct drm_minor *minor) · 345 unmodified lines
346346 * if (ret)
347347 * return ret;
348348 *
349− * drm_fbdev_generic_setup(drm, 32);
349+ * drm_fbdev_{...}_setup(drm, 32);
350350 *
351351 * return 0;
352352 * }
@@ -947,9 +947,9 @@ int drm_dev_register(struct drm_device *dev, unsigned long flags) · 594 unmodified lines
947947 }
948948 drm_panic_register(dev);
949949
950− DRM_INFO("Initialized %s %d.%d.%d %s for %s on minor %d\n",
950+ DRM_INFO("Initialized %s %d.%d.%d for %s on minor %d\n",
951951 driver->name, driver->major, driver->minor,
952− driver->patchlevel, driver->date,
952+ driver->patchlevel,
953953 dev->dev ? dev_name(dev->dev) : "virtual device",
954954 dev->primary ? dev->primary->index : dev->accel->index);
955955
drivers/gpu/drm/drm_edid.c+33−28
@@ -2464,34 +2464,6 @@ fail: · 2463 unmodified lines
24642464 return NULL;
24652465 }
24662466
2467−/**
2468− * drm_do_get_edid - get EDID data using a custom EDID block read function
2469− * @connector: connector we're probing
2470− * @read_block: EDID block read function
2471− * @context: private data passed to the block read function
2472− *
2473− * When the I2C adapter connected to the DDC bus is hidden behind a device that
2474− * exposes a different interface to read EDID blocks this function can be used
2475− * to get EDID data using a custom block read function.
2476− *
2477− * As in the general case the DDC bus is accessible by the kernel at the I2C
2478− * level, drivers must make all reasonable efforts to expose it as an I2C
2479− * adapter and use drm_get_edid() instead of abusing this function.
2480− *
2481− * The EDID may be overridden using debugfs override_edid or firmware EDID
2482− * (drm_edid_load_firmware() and drm.edid_firmware parameter), in this priority
2483− * order. Having either of them bypasses actual EDID reads.
2484− *
2485− * Return: Pointer to valid EDID or NULL if we couldn't find any.
2486− */
2487−struct edid *drm_do_get_edid(struct drm_connector *connector,
2488− read_block_fn read_block,
2489− void *context)
2490−{
2491− return _drm_do_get_edid(connector, read_block, context, NULL);
2492−}
2493−EXPORT_SYMBOL_GPL(drm_do_get_edid);
2494−
24952467 /**
24962468 * drm_edid_raw - Get a pointer to the raw EDID data.
24972469 * @drm_edid: drm_edid container
@@ -6969,6 +6941,39 @@ out: · 4471 unmodified lines
69696941 return ret;
69706942 }
69716943
6944+/* For sysfs edid show implementation */
6945+ssize_t drm_edid_connector_property_show(struct drm_connector *connector,
6946+ char *buf, loff_t off, size_t count)
6947+{
6948+ const void *edid;
6949+ size_t size;
6950+ ssize_t ret = 0;
6951+
6952+ mutex_lock(&connector->dev->mode_config.mutex);
6953+
6954+ if (!connector->edid_blob_ptr)
6955+ goto unlock;
6956+
6957+ edid = connector->edid_blob_ptr->data;
6958+ size = connector->edid_blob_ptr->length;
6959+ if (!edid)
6960+ goto unlock;
6961+
6962+ if (off >= size)
6963+ goto unlock;
6964+
6965+ if (off + count > size)
6966+ count = size - off;
6967+
6968+ memcpy(buf, edid + off, count);
6969+
6970+ ret = count;
6971+unlock:
6972+ mutex_unlock(&connector->dev->mode_config.mutex);
6973+
6974+ return ret;
6975+}
6976+
69726977 /**
69736978 * drm_edid_connector_update - Update connector information from EDID
69746979 * @connector: Connector
drivers/gpu/drm/drm_fb_helper.c+2−9
@@ -85,12 +85,8 @@ static DEFINE_MUTEX(kernel_fb_helper_lock); · 84 unmodified lines
8585 * The fb helper functions are useful to provide an fbdev on top of a drm kernel
8686 * mode setting driver. They can be used mostly independently from the crtc
8787 * helper functions used by many drivers to implement the kernel mode setting
88− * interfaces.
89− *
90− * Drivers that support a dumb buffer with a virtual address and mmap support,
91− * should try out the generic fbdev emulation using drm_fbdev_generic_setup().
92− * It will automatically set up deferred I/O if the driver requires a shadow
93− * buffer.
88+ * interfaces. Drivers that use one of the shared memory managers, TTM, SHMEM,
89+ * DMA, should instead use the corresponding fbdev emulation.
9490 *
9591 * Existing fbdev implementations should restore the fbdev console by using
9692 * drm_fb_helper_lastclose() as their &drm_driver.lastclose callback.
@@ -126,9 +122,6 @@ static DEFINE_MUTEX(kernel_fb_helper_lock); · 29 unmodified lines
126122 * atomic context. If drm_fb_helper_deferred_io() is used as the deferred_io
127123 * callback it will also schedule dirty_work with the damage collected from the
128124 * mmap page writes.
129− *
130− * Deferred I/O is not compatible with SHMEM. Such drivers should request an
131− * fbdev shadow buffer and call drm_fbdev_generic_setup() instead.
132125 */
133126
134127 static void drm_fb_helper_restore_lut_atomic(struct drm_crtc *crtc)
drivers/gpu/drm/drm_fbdev_dma.c+52−14
@@ -4,6 +4,7 @@ · 3 unmodified lines
44
55 #include <drm/drm_crtc_helper.h>
66 #include <drm/drm_drv.h>
7+#include <drm/drm_fb_dma_helper.h>
78 #include <drm/drm_fb_helper.h>
89 #include <drm/drm_framebuffer.h>
910 #include <drm/drm_gem_dma_helper.h>
@@ -35,6 +36,22 @@ static int drm_fbdev_dma_fb_release(struct fb_info *info, int user) · 25 unmodified lines
3536 return 0;
3637 }
3738
39+FB_GEN_DEFAULT_DEFERRED_DMAMEM_OPS(drm_fbdev_dma,
40+ drm_fb_helper_damage_range,
41+ drm_fb_helper_damage_area);
42+
43+static int drm_fbdev_dma_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
44+{
45+ struct drm_fb_helper *fb_helper = info->par;
46+ struct drm_framebuffer *fb = fb_helper->fb;
47+ struct drm_gem_dma_object *dma = drm_fb_dma_get_gem_obj(fb, 0);
48+
49+ if (!dma->map_noncoherent)
50+ vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
51+
52+ return fb_deferred_io_mmap(info, vma);
53+}
54+
3855 static void drm_fbdev_dma_fb_destroy(struct fb_info *info)
3956 {
4057 struct drm_fb_helper *fb_helper = info->par;
@@ -42,6 +59,7 @@ static void drm_fbdev_dma_fb_destroy(struct fb_info *info) · 1 unmodified line
4259 if (!fb_helper->dev)
4360 return;
4461
62+ fb_deferred_io_cleanup(info);
4563 drm_fb_helper_fini(fb_helper);
4664
4765 drm_client_buffer_vunmap(fb_helper->buffer);
@@ -51,20 +69,13 @@ static void drm_fbdev_dma_fb_destroy(struct fb_info *info) · 3 unmodified lines
5169 kfree(fb_helper);
5270 }
5371
54−static int drm_fbdev_dma_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
55−{
56− struct drm_fb_helper *fb_helper = info->par;
57−
58− return drm_gem_prime_mmap(fb_helper->buffer->gem, vma);
59−}
60−
6172 static const struct fb_ops drm_fbdev_dma_fb_ops = {
6273 .owner = THIS_MODULE,
6374 .fb_open = drm_fbdev_dma_fb_open,
6475 .fb_release = drm_fbdev_dma_fb_release,
65− __FB_DEFAULT_DMAMEM_OPS_RDWR,
76+ __FB_DEFAULT_DEFERRED_OPS_RDWR(drm_fbdev_dma),
6677 DRM_FB_HELPER_DEFAULT_OPS,
67− __FB_DEFAULT_DMAMEM_OPS_DRAW,
78+ __FB_DEFAULT_DEFERRED_OPS_DRAW(drm_fbdev_dma),
6879 .fb_mmap = drm_fbdev_dma_fb_mmap,
6980 .fb_destroy = drm_fbdev_dma_fb_destroy,
7081 };
@@ -98,10 +109,6 @@ static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper, · 27 unmodified lines
98109 dma_obj = to_drm_gem_dma_obj(buffer->gem);
99110
100111 fb = buffer->fb;
101− if (drm_WARN_ON(dev, fb->funcs->dirty)) {
102− ret = -ENODEV; /* damage handling not supported; use generic emulation */
103− goto err_drm_client_buffer_delete;
104− }
105112
106113 ret = drm_client_buffer_vmap(buffer, &map);
107114 if (ret) {
@@ -112,7 +119,7 @@ static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper, · 4 unmodified lines
112119 }
113120
114121 fb_helper->buffer = buffer;
115− fb_helper->fb = buffer->fb;
122+ fb_helper->fb = fb;
116123
117124 info = drm_fb_helper_alloc_info(fb_helper);
118125 if (IS_ERR(info)) {
@@ -133,8 +140,19 @@ static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper, · 14 unmodified lines
133140 info->fix.smem_start = page_to_phys(virt_to_page(info->screen_buffer));
134141 info->fix.smem_len = info->screen_size;
135142
143+ /* deferred I/O */
144+ fb_helper->fbdefio.delay = HZ / 20;
145+ fb_helper->fbdefio.deferred_io = drm_fb_helper_deferred_io;
146+
147+ info->fbdefio = &fb_helper->fbdefio;
148+ ret = fb_deferred_io_init(info);
149+ if (ret)
150+ goto err_drm_fb_helper_release_info;
151+
136152 return 0;
137153
154+err_drm_fb_helper_release_info:
155+ drm_fb_helper_release_info(fb_helper);
138156 err_drm_client_buffer_vunmap:
139157 fb_helper->fb = NULL;
140158 fb_helper->buffer = NULL;
@@ -144,8 +162,28 @@ err_drm_client_buffer_delete: · 3 unmodified lines
144162 return ret;
145163 }
146164
165+static int drm_fbdev_dma_helper_fb_dirty(struct drm_fb_helper *helper,
166+ struct drm_clip_rect *clip)
167+{
168+ struct drm_device *dev = helper->dev;
169+ int ret;
170+
171+ /* Call damage handlers only if necessary */
172+ if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
173+ return 0;
174+
175+ if (helper->fb->funcs->dirty) {
176+ ret = helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1);
177+ if (drm_WARN_ONCE(dev, ret, "Dirty helper failed: ret=%d\n", ret))
178+ return ret;
179+ }
180+
181+ return 0;
182+}
183+
147184 static const struct drm_fb_helper_funcs drm_fbdev_dma_helper_funcs = {
148185 .fb_probe = drm_fbdev_dma_helper_fb_probe,
186+ .fb_dirty = drm_fbdev_dma_helper_fb_dirty,
149187 };
150188
151189 /*
drivers/gpu/drm/drm_fbdev_shmem.c+317−0
@@ -0,0 +1,317 @@
1+// SPDX-License-Identifier: MIT
2+
3+#include <linux/fb.h>
4+
5+#include <drm/drm_crtc_helper.h>
6+#include <drm/drm_drv.h>
7+#include <drm/drm_fb_helper.h>
8+#include <drm/drm_framebuffer.h>
9+#include <drm/drm_gem_framebuffer_helper.h>
10+#include <drm/drm_gem_shmem_helper.h>
11+
12+#include <drm/drm_fbdev_shmem.h>
13+
14+/*
15+ * struct fb_ops
16+ */
17+
18+static int drm_fbdev_shmem_fb_open(struct fb_info *info, int user)
19+{
20+ struct drm_fb_helper *fb_helper = info->par;
21+
22+ /* No need to take a ref for fbcon because it unbinds on unregister */
23+ if (user && !try_module_get(fb_helper->dev->driver->fops->owner))
24+ return -ENODEV;
25+
26+ return 0;
27+}
28+
29+static int drm_fbdev_shmem_fb_release(struct fb_info *info, int user)
30+{
31+ struct drm_fb_helper *fb_helper = info->par;
32+
33+ if (user)
34+ module_put(fb_helper->dev->driver->fops->owner);
35+
36+ return 0;
37+}
38+
39+FB_GEN_DEFAULT_DEFERRED_SYSMEM_OPS(drm_fbdev_shmem,
40+ drm_fb_helper_damage_range,
41+ drm_fb_helper_damage_area);
42+
43+static int drm_fbdev_shmem_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
44+{
45+ struct drm_fb_helper *fb_helper = info->par;
46+ struct drm_framebuffer *fb = fb_helper->fb;
47+ struct drm_gem_object *obj = drm_gem_fb_get_obj(fb, 0);
48+ struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
49+
50+ if (shmem->map_wc)
51+ vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
52+
53+ return fb_deferred_io_mmap(info, vma);
54+}
55+
56+static void drm_fbdev_shmem_fb_destroy(struct fb_info *info)
57+{
58+ struct drm_fb_helper *fb_helper = info->par;
59+
60+ if (!fb_helper->dev)
61+ return;
62+
63+ fb_deferred_io_cleanup(info);
64+ drm_fb_helper_fini(fb_helper);
65+
66+ drm_client_buffer_vunmap(fb_helper->buffer);
67+ drm_client_framebuffer_delete(fb_helper->buffer);
68+ drm_client_release(&fb_helper->client);
69+ drm_fb_helper_unprepare(fb_helper);
70+ kfree(fb_helper);
71+}
72+
73+static const struct fb_ops drm_fbdev_shmem_fb_ops = {
74+ .owner = THIS_MODULE,
75+ .fb_open = drm_fbdev_shmem_fb_open,
76+ .fb_release = drm_fbdev_shmem_fb_release,
77+ __FB_DEFAULT_DEFERRED_OPS_RDWR(drm_fbdev_shmem),
78+ DRM_FB_HELPER_DEFAULT_OPS,
79+ __FB_DEFAULT_DEFERRED_OPS_DRAW(drm_fbdev_shmem),
80+ .fb_mmap = drm_fbdev_shmem_fb_mmap,
81+ .fb_destroy = drm_fbdev_shmem_fb_destroy,
82+};
83+
84+static struct page *drm_fbdev_shmem_get_page(struct fb_info *info, unsigned long offset)
85+{
86+ struct drm_fb_helper *fb_helper = info->par;
87+ struct drm_framebuffer *fb = fb_helper->fb;
88+ struct drm_gem_object *obj = drm_gem_fb_get_obj(fb, 0);
89+ struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
90+ unsigned int i = offset >> PAGE_SHIFT;
91+ struct page *page;
92+
93+ if (fb_WARN_ON_ONCE(info, offset > obj->size))
94+ return NULL;
95+
96+ page = shmem->pages[i]; // protected by active vmap
97+ if (page)
98+ get_page(page);
99+ fb_WARN_ON_ONCE(info, !page);
100+
101+ return page;
102+}
103+
104+/*
105+ * struct drm_fb_helper
106+ */
107+
108+static int drm_fbdev_shmem_helper_fb_probe(struct drm_fb_helper *fb_helper,
109+ struct drm_fb_helper_surface_size *sizes)
110+{
111+ struct drm_client_dev *client = &fb_helper->client;
112+ struct drm_device *dev = fb_helper->dev;
113+ struct drm_client_buffer *buffer;
114+ struct drm_gem_shmem_object *shmem;
115+ struct drm_framebuffer *fb;
116+ struct fb_info *info;
117+ u32 format;
118+ struct iosys_map map;
119+ int ret;
120+
121+ drm_dbg_kms(dev, "surface width(%d), height(%d) and bpp(%d)\n",
122+ sizes->surface_width, sizes->surface_height,
123+ sizes->surface_bpp);
124+
125+ format = drm_driver_legacy_fb_format(dev, sizes->surface_bpp, sizes->surface_depth);
126+ buffer = drm_client_framebuffer_create(client, sizes->surface_width,
127+ sizes->surface_height, format);
128+ if (IS_ERR(buffer))
129+ return PTR_ERR(buffer);
130+ shmem = to_drm_gem_shmem_obj(buffer->gem);
131+
132+ fb = buffer->fb;
133+
134+ ret = drm_client_buffer_vmap(buffer, &map);
135+ if (ret) {
136+ goto err_drm_client_buffer_delete;
137+ } else if (drm_WARN_ON(dev, map.is_iomem)) {
138+ ret = -ENODEV; /* I/O memory not supported; use generic emulation */
139+ goto err_drm_client_buffer_delete;
140+ }
141+
142+ fb_helper->buffer = buffer;
143+ fb_helper->fb = fb;
144+
145+ info = drm_fb_helper_alloc_info(fb_helper);
146+ if (IS_ERR(info)) {
147+ ret = PTR_ERR(info);
148+ goto err_drm_client_buffer_vunmap;
149+ }
150+
151+ drm_fb_helper_fill_info(info, fb_helper, sizes);
152+
153+ info->fbops = &drm_fbdev_shmem_fb_ops;
154+
155+ /* screen */
156+ info->flags |= FBINFO_VIRTFB; /* system memory */
157+ if (!shmem->map_wc)
158+ info->flags |= FBINFO_READS_FAST; /* signal caching */
159+ info->screen_size = sizes->surface_height * fb->pitches[0];
160+ info->screen_buffer = map.vaddr;
161+ info->fix.smem_len = info->screen_size;
162+
163+ /* deferred I/O */
164+ fb_helper->fbdefio.delay = HZ / 20;
165+ fb_helper->fbdefio.get_page = drm_fbdev_shmem_get_page;
166+ fb_helper->fbdefio.deferred_io = drm_fb_helper_deferred_io;
167+
168+ info->fbdefio = &fb_helper->fbdefio;
169+ ret = fb_deferred_io_init(info);
170+ if (ret)
171+ goto err_drm_fb_helper_release_info;
172+
173+ return 0;
174+
175+err_drm_fb_helper_release_info:
176+ drm_fb_helper_release_info(fb_helper);
177+err_drm_client_buffer_vunmap:
178+ fb_helper->fb = NULL;
179+ fb_helper->buffer = NULL;
180+ drm_client_buffer_vunmap(buffer);
181+err_drm_client_buffer_delete:
182+ drm_client_framebuffer_delete(buffer);
183+ return ret;
184+}
185+
186+static int drm_fbdev_shmem_helper_fb_dirty(struct drm_fb_helper *helper,
187+ struct drm_clip_rect *clip)
188+{
189+ struct drm_device *dev = helper->dev;
190+ int ret;
191+
192+ /* Call damage handlers only if necessary */
193+ if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
194+ return 0;
195+
196+ if (helper->fb->funcs->dirty) {
197+ ret = helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1);
198+ if (drm_WARN_ONCE(dev, ret, "Dirty helper failed: ret=%d\n", ret))
199+ return ret;
200+ }
201+
202+ return 0;
203+}
204+
205+static const struct drm_fb_helper_funcs drm_fbdev_shmem_helper_funcs = {
206+ .fb_probe = drm_fbdev_shmem_helper_fb_probe,
207+ .fb_dirty = drm_fbdev_shmem_helper_fb_dirty,
208+};
209+
210+/*
211+ * struct drm_client_funcs
212+ */
213+
214+static void drm_fbdev_shmem_client_unregister(struct drm_client_dev *client)
215+{
216+ struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
217+
218+ if (fb_helper->info) {
219+ drm_fb_helper_unregister_info(fb_helper);
220+ } else {
221+ drm_client_release(&fb_helper->client);
222+ drm_fb_helper_unprepare(fb_helper);
223+ kfree(fb_helper);
224+ }
225+}
226+
227+static int drm_fbdev_shmem_client_restore(struct drm_client_dev *client)
228+{
229+ drm_fb_helper_lastclose(client->dev);
230+
231+ return 0;
232+}
233+
234+static int drm_fbdev_shmem_client_hotplug(struct drm_client_dev *client)
235+{
236+ struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
237+ struct drm_device *dev = client->dev;
238+ int ret;
239+
240+ if (dev->fb_helper)
241+ return drm_fb_helper_hotplug_event(dev->fb_helper);
242+
243+ ret = drm_fb_helper_init(dev, fb_helper);
244+ if (ret)
245+ goto err_drm_err;
246+
247+ if (!drm_drv_uses_atomic_modeset(dev))
248+ drm_helper_disable_unused_functions(dev);
249+
250+ ret = drm_fb_helper_initial_config(fb_helper);
251+ if (ret)
252+ goto err_drm_fb_helper_fini;
253+
254+ return 0;
255+
256+err_drm_fb_helper_fini:
257+ drm_fb_helper_fini(fb_helper);
258+err_drm_err:
259+ drm_err(dev, "fbdev-shmem: Failed to setup emulation (ret=%d)\n", ret);
260+ return ret;
261+}
262+
263+static const struct drm_client_funcs drm_fbdev_shmem_client_funcs = {
264+ .owner = THIS_MODULE,
265+ .unregister = drm_fbdev_shmem_client_unregister,
266+ .restore = drm_fbdev_shmem_client_restore,
267+ .hotplug = drm_fbdev_shmem_client_hotplug,
268+};
269+
270+/**
271+ * drm_fbdev_shmem_setup() - Setup fbdev emulation for GEM SHMEM helpers
272+ * @dev: DRM device
273+ * @preferred_bpp: Preferred bits per pixel for the device.
274+ * 32 is used if this is zero.
275+ *
276+ * This function sets up fbdev emulation for GEM DMA drivers that support
277+ * dumb buffers with a virtual address and that can be mmap'ed.
278+ * drm_fbdev_shmem_setup() shall be called after the DRM driver registered
279+ * the new DRM device with drm_dev_register().
280+ *
281+ * Restore, hotplug events and teardown are all taken care of. Drivers that do
282+ * suspend/resume need to call drm_fb_helper_set_suspend_unlocked() themselves.
283+ * Simple drivers might use drm_mode_config_helper_suspend().
284+ *
285+ * This function is safe to call even when there are no connectors present.
286+ * Setup will be retried on the next hotplug event.
287+ *
288+ * The fbdev is destroyed by drm_dev_unregister().
289+ */
290+void drm_fbdev_shmem_setup(struct drm_device *dev, unsigned int preferred_bpp)
291+{
292+ struct drm_fb_helper *fb_helper;
293+ int ret;
294+
295+ drm_WARN(dev, !dev->registered, "Device has not been registered.\n");
296+ drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n");
297+
298+ fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
299+ if (!fb_helper)
300+ return;
301+ drm_fb_helper_prepare(dev, fb_helper, preferred_bpp, &drm_fbdev_shmem_helper_funcs);
302+
303+ ret = drm_client_init(dev, &fb_helper->client, "fbdev", &drm_fbdev_shmem_client_funcs);
304+ if (ret) {
305+ drm_err(dev, "Failed to register client: %d\n", ret);
306+ goto err_drm_client_init;
307+ }
308+
309+ drm_client_register(&fb_helper->client);
310+
311+ return;
312+
313+err_drm_client_init:
314+ drm_fb_helper_unprepare(fb_helper);
315+ kfree(fb_helper);
316+}
317+EXPORT_SYMBOL(drm_fbdev_shmem_setup);
drivers/gpu/drm/drm_fbdev_ttm.crenamed from drivers/gpu/drm/drm_fbdev_generic.c+40−40
@@ -10,10 +10,10 @@ · 9 unmodified lines
1010 #include <drm/drm_gem.h>
1111 #include <drm/drm_print.h>
1212
13−#include <drm/drm_fbdev_generic.h>
13+#include <drm/drm_fbdev_ttm.h>
1414
1515 /* @user: 1=userspace, 0=fbcon */
16−static int drm_fbdev_generic_fb_open(struct fb_info *info, int user)
16+static int drm_fbdev_ttm_fb_open(struct fb_info *info, int user)
1717 {
1818 struct drm_fb_helper *fb_helper = info->par;
1919
@@ -24,7 +24,7 @@ static int drm_fbdev_generic_fb_open(struct fb_info *info, int user) · 4 unmodified lines
2424 return 0;
2525 }
2626
27−static int drm_fbdev_generic_fb_release(struct fb_info *info, int user)
27+static int drm_fbdev_ttm_fb_release(struct fb_info *info, int user)
2828 {
2929 struct drm_fb_helper *fb_helper = info->par;
3030
@@ -34,11 +34,11 @@ static int drm_fbdev_generic_fb_release(struct fb_info *info, int user) · 3 unmodified lines
3434 return 0;
3535 }
3636
37−FB_GEN_DEFAULT_DEFERRED_SYSMEM_OPS(drm_fbdev_generic,
37+FB_GEN_DEFAULT_DEFERRED_SYSMEM_OPS(drm_fbdev_ttm,
3838 drm_fb_helper_damage_range,
3939 drm_fb_helper_damage_area);
4040
41−static void drm_fbdev_generic_fb_destroy(struct fb_info *info)
41+static void drm_fbdev_ttm_fb_destroy(struct fb_info *info)
4242 {
4343 struct drm_fb_helper *fb_helper = info->par;
4444 void *shadow = info->screen_buffer;
@@ -56,19 +56,19 @@ static void drm_fbdev_generic_fb_destroy(struct fb_info *info) · 11 unmodified lines
5656 kfree(fb_helper);
5757 }
5858
59−static const struct fb_ops drm_fbdev_generic_fb_ops = {
59+static const struct fb_ops drm_fbdev_ttm_fb_ops = {
6060 .owner = THIS_MODULE,
61− .fb_open = drm_fbdev_generic_fb_open,
62− .fb_release = drm_fbdev_generic_fb_release,
63− FB_DEFAULT_DEFERRED_OPS(drm_fbdev_generic),
61+ .fb_open = drm_fbdev_ttm_fb_open,
62+ .fb_release = drm_fbdev_ttm_fb_release,
63+ FB_DEFAULT_DEFERRED_OPS(drm_fbdev_ttm),
6464 DRM_FB_HELPER_DEFAULT_OPS,
65− .fb_destroy = drm_fbdev_generic_fb_destroy,
65+ .fb_destroy = drm_fbdev_ttm_fb_destroy,
6666 };
6767
6868 /*
6969 * This function uses the client API to create a framebuffer backed by a dumb buffer.
7070 */
71−static int drm_fbdev_generic_helper_fb_probe(struct drm_fb_helper *fb_helper,
71+static int drm_fbdev_ttm_helper_fb_probe(struct drm_fb_helper *fb_helper,
7272 struct drm_fb_helper_surface_size *sizes)
7373 {
7474 struct drm_client_dev *client = &fb_helper->client;
@@ -108,7 +108,7 @@ static int drm_fbdev_generic_helper_fb_probe(struct drm_fb_helper *fb_helper, · 33 unmodified lines
108108
109109 drm_fb_helper_fill_info(info, fb_helper, sizes);
110110
111− info->fbops = &drm_fbdev_generic_fb_ops;
111+ info->fbops = &drm_fbdev_ttm_fb_ops;
112112
113113 /* screen */
114114 info->flags |= FBINFO_VIRTFB | FBINFO_READS_FAST;
@@ -137,9 +137,9 @@ err_drm_client_framebuffer_delete: · 22 unmodified lines
137137 return ret;
138138 }
139139
140−static void drm_fbdev_generic_damage_blit_real(struct drm_fb_helper *fb_helper,
141− struct drm_clip_rect *clip,
142− struct iosys_map *dst)
140+static void drm_fbdev_ttm_damage_blit_real(struct drm_fb_helper *fb_helper,
141+ struct drm_clip_rect *clip,
142+ struct iosys_map *dst)
143143 {
144144 struct drm_framebuffer *fb = fb_helper->fb;
145145 size_t offset = clip->y1 * fb->pitches[0];
@@ -176,8 +176,8 @@ static void drm_fbdev_generic_damage_blit_real(struct drm_fb_helper *fb_helper, · 30 unmodified lines
176176 }
177177 }
178178
179−static int drm_fbdev_generic_damage_blit(struct drm_fb_helper *fb_helper,
180− struct drm_clip_rect *clip)
179+static int drm_fbdev_ttm_damage_blit(struct drm_fb_helper *fb_helper,
180+ struct drm_clip_rect *clip)
181181 {
182182 struct drm_client_buffer *buffer = fb_helper->buffer;
183183 struct iosys_map map, dst;
@@ -201,7 +201,7 @@ static int drm_fbdev_generic_damage_blit(struct drm_fb_helper *fb_helper, · 17 unmodified lines
201201 goto out;
202202
203203 dst = map;
204− drm_fbdev_generic_damage_blit_real(fb_helper, clip, &dst);
204+ drm_fbdev_ttm_damage_blit_real(fb_helper, clip, &dst);
205205
206206 drm_client_buffer_vunmap_local(buffer);
207207
@@ -211,8 +211,8 @@ out: · 3 unmodified lines
211211 return ret;
212212 }
213213
214−static int drm_fbdev_generic_helper_fb_dirty(struct drm_fb_helper *helper,
215− struct drm_clip_rect *clip)
214+static int drm_fbdev_ttm_helper_fb_dirty(struct drm_fb_helper *helper,
215+ struct drm_clip_rect *clip)
216216 {
217217 struct drm_device *dev = helper->dev;
218218 int ret;
@@ -221,7 +221,7 @@ static int drm_fbdev_generic_helper_fb_dirty(struct drm_fb_helper *helper, · 2 unmodified lines
221221 if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
222222 return 0;
223223
224− ret = drm_fbdev_generic_damage_blit(helper, clip);
224+ ret = drm_fbdev_ttm_damage_blit(helper, clip);
225225 if (drm_WARN_ONCE(dev, ret, "Damage blitter failed: ret=%d\n", ret))
226226 return ret;
227227
@@ -234,12 +234,12 @@ static int drm_fbdev_generic_helper_fb_dirty(struct drm_fb_helper *helper, · 6 unmodified lines
234234 return 0;
235235 }
236236
237−static const struct drm_fb_helper_funcs drm_fbdev_generic_helper_funcs = {
238− .fb_probe = drm_fbdev_generic_helper_fb_probe,
239− .fb_dirty = drm_fbdev_generic_helper_fb_dirty,
237+static const struct drm_fb_helper_funcs drm_fbdev_ttm_helper_funcs = {
238+ .fb_probe = drm_fbdev_ttm_helper_fb_probe,
239+ .fb_dirty = drm_fbdev_ttm_helper_fb_dirty,
240240 };
241241
242−static void drm_fbdev_generic_client_unregister(struct drm_client_dev *client)
242+static void drm_fbdev_ttm_client_unregister(struct drm_client_dev *client)
243243 {
244244 struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
245245
@@ -252,14 +252,14 @@ static void drm_fbdev_generic_client_unregister(struct drm_client_dev *client) · 6 unmodified lines
252252 }
253253 }
254254
255−static int drm_fbdev_generic_client_restore(struct drm_client_dev *client)
255+static int drm_fbdev_ttm_client_restore(struct drm_client_dev *client)
256256 {
257257 drm_fb_helper_lastclose(client->dev);
258258
259259 return 0;
260260 }
261261
262−static int drm_fbdev_generic_client_hotplug(struct drm_client_dev *client)
262+static int drm_fbdev_ttm_client_hotplug(struct drm_client_dev *client)
263263 {
264264 struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
265265 struct drm_device *dev = client->dev;
@@ -284,32 +284,32 @@ static int drm_fbdev_generic_client_hotplug(struct drm_client_dev *client) · 18 unmodified lines
284284 err_drm_fb_helper_fini:
285285 drm_fb_helper_fini(fb_helper);
286286 err_drm_err:
287− drm_err(dev, "fbdev: Failed to setup generic emulation (ret=%d)\n", ret);
287+ drm_err(dev, "fbdev: Failed to setup emulation (ret=%d)\n", ret);
288288 return ret;
289289 }
290290
291−static const struct drm_client_funcs drm_fbdev_generic_client_funcs = {
291+static const struct drm_client_funcs drm_fbdev_ttm_client_funcs = {
292292 .owner = THIS_MODULE,
293− .unregister = drm_fbdev_generic_client_unregister,
294− .restore = drm_fbdev_generic_client_restore,
295− .hotplug = drm_fbdev_generic_client_hotplug,
293+ .unregister = drm_fbdev_ttm_client_unregister,
294+ .restore = drm_fbdev_ttm_client_restore,
295+ .hotplug = drm_fbdev_ttm_client_hotplug,
296296 };
297297
298298 /**
299− * drm_fbdev_generic_setup() - Setup generic fbdev emulation
299+ * drm_fbdev_ttm_setup() - Setup fbdev emulation for TTM-based drivers
300300 * @dev: DRM device
301301 * @preferred_bpp: Preferred bits per pixel for the device.
302302 *
303− * This function sets up generic fbdev emulation for drivers that supports
303+ * This function sets up fbdev emulation for TTM-based drivers that support
304304 * dumb buffers with a virtual address and that can be mmap'ed.
305− * drm_fbdev_generic_setup() shall be called after the DRM driver registered
305+ * drm_fbdev_ttm_setup() shall be called after the DRM driver registered
306306 * the new DRM device with drm_dev_register().
307307 *
308308 * Restore, hotplug events and teardown are all taken care of. Drivers that do
309309 * suspend/resume need to call drm_fb_helper_set_suspend_unlocked() themselves.
310310 * Simple drivers might use drm_mode_config_helper_suspend().
311311 *
312− * In order to provide fixed mmap-able memory ranges, generic fbdev emulation
312+ * In order to provide fixed mmap-able memory ranges, fbdev emulation
313313 * uses a shadow buffer in system memory. The implementation blits the shadow
314314 * fbdev buffer onto the real buffer in regular intervals.
315315 *
@@ -318,7 +318,7 @@ static const struct drm_client_funcs drm_fbdev_generic_client_funcs = { · 2 unmodified lines
318318 *
319319 * The fbdev is destroyed by drm_dev_unregister().
320320 */
321−void drm_fbdev_generic_setup(struct drm_device *dev, unsigned int preferred_bpp)
321+void drm_fbdev_ttm_setup(struct drm_device *dev, unsigned int preferred_bpp)
322322 {
323323 struct drm_fb_helper *fb_helper;
324324 int ret;
@@ -329,9 +329,9 @@ void drm_fbdev_generic_setup(struct drm_device *dev, unsigned int preferred_bpp) · 4 unmodified lines
329329 fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
330330 if (!fb_helper)
331331 return;
332− drm_fb_helper_prepare(dev, fb_helper, preferred_bpp, &drm_fbdev_generic_helper_funcs);
332+ drm_fb_helper_prepare(dev, fb_helper, preferred_bpp, &drm_fbdev_ttm_helper_funcs);
333333
334− ret = drm_client_init(dev, &fb_helper->client, "fbdev", &drm_fbdev_generic_client_funcs);
334+ ret = drm_client_init(dev, &fb_helper->client, "fbdev", &drm_fbdev_ttm_client_funcs);
335335 if (ret) {
336336 drm_err(dev, "Failed to register client: %d\n", ret);
337337 goto err_drm_client_init;
@@ -346,4 +346,4 @@ err_drm_client_init: · 8 unmodified lines
346346 kfree(fb_helper);
347347 return;
348348 }
349−EXPORT_SYMBOL(drm_fbdev_generic_setup);
349+EXPORT_SYMBOL(drm_fbdev_ttm_setup);
drivers/gpu/drm/drm_ioctl.c+3−2
@@ -529,9 +529,10 @@ int drm_version(struct drm_device *dev, void *data, · 528 unmodified lines
529529 version->version_patchlevel = dev->driver->patchlevel;
530530 err = drm_copy_field(version->name, &version->name_len,
531531 dev->driver->name);
532+
533+ /* Driver date is deprecated. Userspace expects a non-empty string. */
532534 if (!err)
533− err = drm_copy_field(version->date, &version->date_len,
534− dev->driver->date);
535+ err = drm_copy_field(version->date, &version->date_len, "0");
535536 if (!err)
536537 err = drm_copy_field(version->desc, &version->desc_len,
537538 dev->driver->desc);
drivers/gpu/drm/drm_mipi_dbi.c+54−23
@@ -206,6 +206,7 @@ int mipi_dbi_buf_copy(void *dst, struct iosys_map *src, struct drm_framebuffer * · 205 unmodified lines
206206 struct drm_rect *clip, bool swap,
207207 struct drm_format_conv_state *fmtcnv_state)
208208 {
209+ struct mipi_dbi_dev *dbidev = drm_to_mipi_dbi_dev(fb->dev);
209210 struct drm_gem_object *gem = drm_gem_fb_get_obj(fb, 0);
210211 struct iosys_map dst_map = IOSYS_MAP_INIT_VADDR(dst);
211212 int ret;
@@ -222,8 +223,18 @@ int mipi_dbi_buf_copy(void *dst, struct iosys_map *src, struct drm_framebuffer * · 10 unmodified lines
222223 else
223224 drm_fb_memcpy(&dst_map, NULL, src, fb, clip);
224225 break;
226+ case DRM_FORMAT_RGB888:
227+ drm_fb_memcpy(&dst_map, NULL, src, fb, clip);
228+ break;
225229 case DRM_FORMAT_XRGB8888:
226− drm_fb_xrgb8888_to_rgb565(&dst_map, NULL, src, fb, clip, fmtcnv_state, swap);
230+ switch (dbidev->pixel_format) {
231+ case DRM_FORMAT_RGB565:
232+ drm_fb_xrgb8888_to_rgb565(&dst_map, NULL, src, fb, clip, fmtcnv_state, swap);
233+ break;
234+ case DRM_FORMAT_RGB888:
235+ drm_fb_xrgb8888_to_rgb888(&dst_map, NULL, src, fb, clip, fmtcnv_state);
236+ break;
237+ }
227238 break;
228239 default:
229240 drm_err_once(fb->dev, "Format is not supported: %p4cc\n",
@@ -260,9 +271,11 @@ static void mipi_dbi_fb_dirty(struct iosys_map *src, struct drm_framebuffer *fb, · 30 unmodified lines
260271 struct mipi_dbi_dev *dbidev = drm_to_mipi_dbi_dev(fb->dev);
261272 unsigned int height = rect->y2 - rect->y1;
262273 unsigned int width = rect->x2 - rect->x1;
274+ const struct drm_format_info *dst_format;
263275 struct mipi_dbi *dbi = &dbidev->dbi;
264276 bool swap = dbi->swap_bytes;
265277 int ret = 0;
278+ size_t len;
266279 bool full;
267280 void *tr;
268281
@@ -283,8 +296,13 @@ static void mipi_dbi_fb_dirty(struct iosys_map *src, struct drm_framebuffer *fb, · 14 unmodified lines
283296 mipi_dbi_set_window_address(dbidev, rect->x1, rect->x2 - 1, rect->y1,
284297 rect->y2 - 1);
285298
286− ret = mipi_dbi_command_buf(dbi, MIPI_DCS_WRITE_MEMORY_START, tr,
287− width * height * 2);
299+ if (fb->format->format == DRM_FORMAT_XRGB8888)
300+ dst_format = drm_format_info(dbidev->pixel_format);
301+ else
302+ dst_format = fb->format;
303+ len = drm_format_info_min_pitch(dst_format, 0, width) * height;
304+
305+ ret = mipi_dbi_command_buf(dbi, MIPI_DCS_WRITE_MEMORY_START, tr, len);
288306 err_msg:
289307 if (ret)
290308 drm_err_once(fb->dev, "Failed to update display %d\n", ret);
@@ -572,7 +590,7 @@ static const uint32_t mipi_dbi_formats[] = { · 281 unmodified lines
572590 * has one fixed &drm_display_mode which is rotated according to @rotation.
573591 * This mode is used to set the mode config min/max width/height properties.
574592 *
575− * Use mipi_dbi_dev_init() if you don't need custom formats.
593+ * Use mipi_dbi_dev_init() if you want native RGB565 and emulated XRGB8888 format.
576594 *
577595 * Note:
578596 * Some of the helper functions expects RGB565 to be the default format and the
@@ -631,6 +649,9 @@ int mipi_dbi_dev_init_with_formats(struct mipi_dbi_dev *dbidev, · 52 unmodified lines
631649 drm->mode_config.min_height = dbidev->mode.vdisplay;
632650 drm->mode_config.max_height = dbidev->mode.vdisplay;
633651 dbidev->rotation = rotation;
652+ dbidev->pixel_format = formats[0];
653+ if (formats[0] == DRM_FORMAT_RGB888)
654+ dbidev->dbi.write_memory_bpw = 8;
634655
635656 DRM_DEBUG_KMS("rotation = %u\n", rotation);
636657
@@ -824,15 +845,6 @@ u32 mipi_dbi_spi_cmd_max_speed(struct spi_device *spi, size_t len) · 187 unmodified lines
824845 }
825846 EXPORT_SYMBOL(mipi_dbi_spi_cmd_max_speed);
826847
827−static bool mipi_dbi_machine_little_endian(void)
828−{
829−#if defined(__LITTLE_ENDIAN)
830− return true;
831−#else
832− return false;
833−#endif
834−}
835−
836848 /*
837849 * MIPI DBI Type C Option 1
838850 *
@@ -855,7 +867,7 @@ static int mipi_dbi_spi1e_transfer(struct mipi_dbi *dbi, int dc, · 16 unmodified lines
855867 const void *buf, size_t len,
856868 unsigned int bpw)
857869 {
858− bool swap_bytes = (bpw == 16 && mipi_dbi_machine_little_endian());
870+ bool swap_bytes = (bpw == 16);
859871 size_t chunk, max_chunk = dbi->tx_buf9_len;
860872 struct spi_device *spi = dbi->spi;
861873 struct spi_transfer tr = {
@@ -1004,7 +1016,7 @@ static int mipi_dbi_spi1_transfer(struct mipi_dbi *dbi, int dc, · 142 unmodified lines
10041016 size_t chunk = min(len, max_chunk);
10051017 unsigned int i;
10061018
1007− if (bpw == 16 && mipi_dbi_machine_little_endian()) {
1019+ if (bpw == 16) {
10081020 for (i = 0; i < (chunk * 2); i += 2) {
10091021 dst16[i] = *src16 >> 8;
10101022 dst16[i + 1] = *src16++ & 0xFF;
@@ -1088,7 +1100,7 @@ static int mipi_dbi_typec1_command_read(struct mipi_dbi *dbi, u8 *cmd, · 77 unmodified lines
10881100 static int mipi_dbi_typec1_command(struct mipi_dbi *dbi, u8 *cmd,
10891101 u8 *parameters, size_t num)
10901102 {
1091− unsigned int bpw = (*cmd == MIPI_DCS_WRITE_MEMORY_START) ? 16 : 8;
1103+ unsigned int bpw = 8;
10921104 int ret;
10931105
10941106 if (mipi_dbi_command_is_read(dbi, *cmd))
@@ -1100,6 +1112,9 @@ static int mipi_dbi_typec1_command(struct mipi_dbi *dbi, u8 *cmd, · 5 unmodified lines
11001112 if (ret || !num)
11011113 return ret;
11021114
1115+ if (*cmd == MIPI_DCS_WRITE_MEMORY_START)
1116+ bpw = dbi->write_memory_bpw;
1117+
11031118 return mipi_dbi_spi1_transfer(dbi, 1, parameters, num, bpw);
11041119 }
11051120
@@ -1193,8 +1208,8 @@ static int mipi_dbi_typec3_command(struct mipi_dbi *dbi, u8 *cmd, · 87 unmodified lines
11931208 if (ret || !num)
11941209 return ret;
11951210
1196− if (*cmd == MIPI_DCS_WRITE_MEMORY_START && !dbi->swap_bytes)
1197− bpw = 16;
1211+ if (*cmd == MIPI_DCS_WRITE_MEMORY_START)
1212+ bpw = dbi->write_memory_bpw;
11981213
11991214 spi_bus_lock(spi->controller);
12001215 gpiod_set_value_cansleep(dbi->dc, 1);
@@ -1218,11 +1233,23 @@ static int mipi_dbi_typec3_command(struct mipi_dbi *dbi, u8 *cmd, · 17 unmodified lines
12181233 * If @dc is set, a Type C Option 3 interface is assumed, if not
12191234 * Type C Option 1.
12201235 *
1221− * If the SPI master driver doesn't support the necessary bits per word,
1222− * the following transformation is used:
1236+ * If the command is %MIPI_DCS_WRITE_MEMORY_START and the pixel format is RGB565, endianness has
1237+ * to be taken into account. The MIPI DBI serial interface is big endian and framebuffers are
1238+ * assumed stored in memory as little endian (%DRM_FORMAT_BIG_ENDIAN is not supported).
12231239 *
1224− * - 9-bit: reorder buffer as 9x 8-bit words, padded with no-op command.
1225− * - 16-bit: if big endian send as 8-bit, if little endian swap bytes
1240+ * This is how endianness is handled:
1241+ *
1242+ * Option 1 (D/C as a bit): The buffer is sent on the wire byte by byte so the 16-bit buffer is
1243+ * byteswapped before transfer.
1244+ *
1245+ * Option 3 (D/C as a gpio): If the SPI controller supports 16 bits per word the buffer can be
1246+ * sent as-is. If not the caller is responsible for swapping the bytes
1247+ * before calling mipi_dbi_command_buf() and the buffer is sent 8 bpw.
1248+ *
1249+ * This handling is optimised for %DRM_FORMAT_RGB565 framebuffers.
1250+ *
1251+ * If the interface is Option 1 and the SPI controller doesn't support 9 bits per word,
1252+ * the buffer is sent as 9x 8-bit words, padded with MIPI DCS no-op commands if necessary.
12261253 *
12271254 * Returns:

24 more lines aren’t shown here.

drivers/gpu/drm/drm_mipi_dsi.c+322−0

This diff is large: its 343 lines aren’t shown here.

drivers/gpu/drm/drm_mm.c+0−35

This diff is large: its 42 lines aren’t shown here.

drivers/gpu/drm/drm_mode_object.c+1−0

This diff is large: its 8 lines aren’t shown here.

drivers/gpu/drm/drm_modes.c+4−1

This diff is large: its 19 lines aren’t shown here.

drivers/gpu/drm/drm_panel_orientation_quirks.c+1−0

This diff is large: its 6 lines aren’t shown here.

drivers/gpu/drm/drm_panic.c+200−84

This diff is large: its 429 lines aren’t shown here.

drivers/gpu/drm/drm_print.c+30−42

This diff is large: its 116 lines aren’t shown here.

drivers/gpu/drm/drm_probe_helper.c+7−6

This diff is large: its 34 lines aren’t shown here.

drivers/gpu/drm/drm_simple_kms_helper.c+1−0

This diff is large: its 6 lines aren’t shown here.

drivers/gpu/drm/drm_sysfs.c+2−22

This diff is large: its 32 lines aren’t shown here.

drivers/gpu/drm/gma500/cdv_intel_dp.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/gud/gud_drv.c+3−2

This diff is large: its 24 lines aren’t shown here.

drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c+10−7

This diff is large: its 33 lines aren’t shown here.

drivers/gpu/drm/hisilicon/kirin/Kconfig+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c+5−6

This diff is large: its 32 lines aren’t shown here.

drivers/gpu/drm/hisilicon/kirin/dw_dsi_reg.h+2−0

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/hisilicon/kirin/kirin_ade_reg.h+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/hyperv/hyperv_drm_drv.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/i2c/tda998x_drv.c+10−9

This diff is large: its 44 lines aren’t shown here.

drivers/gpu/drm/i915/Kconfig+0−1

This diff is large: its 8 lines aren’t shown here.

drivers/gpu/drm/i915/Makefile+3−24

This diff is large: its 49 lines aren’t shown here.

drivers/gpu/drm/i915/display/dvo_ns2501.c+0−1

This diff is large: its 8 lines aren’t shown here.

drivers/gpu/drm/i915/display/g4x_dp.c+16−21

This diff is large: its 94 lines aren’t shown here.

drivers/gpu/drm/i915/display/i9xx_plane.c+58−46

This diff is large: its 261 lines aren’t shown here.

drivers/gpu/drm/i915/display/i9xx_plane_regs.h+112−0

This diff is large: its 113 lines aren’t shown here.

drivers/gpu/drm/i915/display/i9xx_wm.c+57−57

This diff is large: its 341 lines aren’t shown here.

drivers/gpu/drm/i915/display/icl_dsi.c+29−17

This diff is large: its 155 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_alpm.c+414−0

This diff is large: its 415 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_alpm.h+27−0

This diff is large: its 28 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_atomic.c+0−1

This diff is large: its 8 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_atomic_plane.c+44−18

This diff is large: its 123 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_atomic_plane.h+1−0

This diff is large: its 7 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_audio.c+16−1

This diff is large: its 45 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_audio_regs.h+3−0

This diff is large: its 8 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_bios.c+129−114

This diff is large: its 623 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_bw.c+63−2

This diff is large: its 107 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_cdclk.c+51−79

This diff is large: its 277 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_color.c+88−55

This diff is large: its 377 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_color.h+3−1

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_color_regs.h+5−0

This diff is large: its 12 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_crt.c+31−19

This diff is large: its 133 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_crtc.c+6−9

This diff is large: its 51 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_crtc_state_dump.c+8−7

This diff is large: its 29 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_cursor.c+80−22

This diff is large: its 190 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_cursor_regs.h+112−0

This diff is large: its 113 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_cx0_phy.c+323−45

This diff is large: its 554 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_cx0_phy.h+4−4

This diff is large: its 17 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_cx0_phy_regs.h+40−8

This diff is large: its 59 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_ddi.c+65−64

This diff is large: its 326 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_display.c+466−357

This diff is large: its 1835 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_display.h+8−5

This diff is large: its 34 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_display_debugfs.c+8−4

This diff is large: its 48 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_display_device.c+654−283

This diff is large: its 1194 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_display_device.h+88−1

This diff is large: its 110 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_display_irq.c+29−17

This diff is large: its 145 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_display_limits.h+14−7

This diff is large: its 31 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_display_params.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_display_power.c+12−8

This diff is large: its 55 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_display_power_well.c+7−7

This diff is large: its 48 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_display_types.h+62−25

This diff is large: its 215 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_dkl_phy.c+0−1

This diff is large: its 8 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_dmc.c+14−7

This diff is large: its 57 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_dmc.h+3−3

This diff is large: its 21 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_dp.c+248−166

This diff is large: its 909 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_dp.h+15−9

This diff is large: its 89 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c+130−19

This diff is large: its 276 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_dp_aux_regs.h+14−4

This diff is large: its 40 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_dp_hdcp.c+3−2

This diff is large: its 19 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_dp_link_training.c+527−11

This diff is large: its 614 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_dp_link_training.h+7−1

This diff is large: its 27 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_dp_mst.c+48−36

This diff is large: its 213 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_dpll.c+34−29

This diff is large: its 179 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_dpll_mgr.h+1−0

This diff is large: its 8 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_dpt.c+5−4

This diff is large: its 30 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_dpt.h+3−2

This diff is large: its 12 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_dpt_common.c+1−0

This diff is large: its 8 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_drrs.c+4−4

This diff is large: its 36 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_dsb.c+10−21

This diff is large: its 90 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_dsb.h+9−0

This diff is large: its 17 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_dsi_vbt.c+3−3

This diff is large: its 26 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_dvo.c+3−2

This diff is large: its 17 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_encoder.c+39−0

This diff is large: its 40 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_encoder.h+16−0

This diff is large: its 17 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_fb.c+30−15

This diff is large: its 114 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_fb_pin.c+35−40

This diff is large: its 163 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_fb_pin.h+6−6

This diff is large: its 20 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_fbc.c+16−22

This diff is large: its 99 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_fbdev.c+21−19

This diff is large: its 113 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_fbdev_fb.c+3−3

This diff is large: its 20 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_fbdev_fb.h+2−2

This diff is large: its 11 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_fdi.c+8−7

This diff is large: its 64 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_fifo_underrun.c+8−5

This diff is large: its 42 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_frontbuffer.c+2−0

This diff is large: its 16 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_hdcp.c+26−1

This diff is large: its 48 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_hdcp_gsc.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_hdcp_gsc_message.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_hdmi.c+23−18

This diff is large: its 125 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_hotplug_irq.c+8−4

This diff is large: its 35 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_lpe_audio.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_lspcon.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_lvds.c+16−15

This diff is large: its 95 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_modeset_setup.c+30−30

This diff is large: its 145 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_modeset_verify.c+4−4

This diff is large: its 30 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_overlay.c+11−10

This diff is large: its 45 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_overlay.h+3−3

This diff is large: its 28 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_panel.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_pch_display.c+11−10

This diff is large: its 56 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_pipe_crc.c+11−10

This diff is large: its 76 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_pipe_crc_regs.h+152−0

This diff is large: its 153 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_pps.c+16−16

This diff is large: its 102 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_pps_regs.h+8−8

This diff is large: its 57 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_psr.c+448−521

This diff is large: its 1717 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_psr_regs.h+27−66

This diff is large: its 214 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_sprite.c+0−1

This diff is large: its 8 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_sprite_regs.h+141−101

This diff is large: its 383 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_sprite_uapi.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_tdf.h+25−0

This diff is large: its 26 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_vblank.c+82−87

This diff is large: its 301 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_vblank.h+5−0

This diff is large: its 19 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_vbt_defs.h+642−87

This diff is large: its 891 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_vdsc.c+9−10

This diff is large: its 56 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_vdsc_regs.h+3−3

This diff is large: its 17 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_vrr.c+148−34

This diff is large: its 296 lines aren’t shown here.

drivers/gpu/drm/i915/display/intel_vrr_regs.h+127−0

This diff is large: its 128 lines aren’t shown here.

drivers/gpu/drm/i915/display/skl_universal_plane.c+141−65

This diff is large: its 385 lines aren’t shown here.

drivers/gpu/drm/i915/display/skl_universal_plane.h+2−0

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/i915/display/skl_universal_plane_regs.h+442−0

This diff is large: its 443 lines aren’t shown here.

drivers/gpu/drm/i915/display/skl_watermark.c+26−108

This diff is large: its 216 lines aren’t shown here.

drivers/gpu/drm/i915/display/skl_watermark.h+8−5

This diff is large: its 34 lines aren’t shown here.

drivers/gpu/drm/i915/display/skl_watermark_regs.h+0−83

This diff is large: its 90 lines aren’t shown here.

drivers/gpu/drm/i915/display/vlv_dsi.c+2−1

This diff is large: its 10 lines aren’t shown here.

drivers/gpu/drm/i915/gem/i915_gem_stolen.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/i915/gt/intel_ggtt.c+2−2

This diff is large: its 11 lines aren’t shown here.

drivers/gpu/drm/i915/gt/intel_ggtt_gmch.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/i915/gt/intel_gt.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/i915/gt/intel_gt_clock_utils.c+2−1

This diff is large: its 17 lines aren’t shown here.

drivers/gpu/drm/i915/gt/intel_gt_pm_debugfs.c+0−1

This diff is large: its 8 lines aren’t shown here.

drivers/gpu/drm/i915/gt/intel_reset.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/i915/gt/intel_rps.c+7−6

This diff is large: its 42 lines aren’t shown here.

drivers/gpu/drm/i915/gt/selftest_context.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/i915/gt/uc/intel_gsc_proxy.c+2−2

This diff is large: its 11 lines aren’t shown here.

drivers/gpu/drm/i915/gvt/cmd_parser.c+8−7

This diff is large: its 43 lines aren’t shown here.

drivers/gpu/drm/i915/gvt/display.c+39−34

This diff is large: its 195 lines aren’t shown here.

drivers/gpu/drm/i915/gvt/dmabuf.c+2−1

This diff is large: its 12 lines aren’t shown here.

drivers/gpu/drm/i915/gvt/fb_decoder.c+13−10

This diff is large: its 84 lines aren’t shown here.

drivers/gpu/drm/i915/gvt/handlers.c+84−79

This diff is large: its 310 lines aren’t shown here.

drivers/gpu/drm/i915/gvt/kvmgt.c+1−0

This diff is large: its 7 lines aren’t shown here.

drivers/gpu/drm/i915/gvt/reg.h+0−3

This diff is large: its 10 lines aren’t shown here.

drivers/gpu/drm/i915/i915_drv.h+10−1

This diff is large: its 25 lines aren’t shown here.

drivers/gpu/drm/i915/i915_gpu_error.c+3−2

This diff is large: its 26 lines aren’t shown here.

drivers/gpu/drm/i915/i915_irq.c+3−2

This diff is large: its 19 lines aren’t shown here.

drivers/gpu/drm/i915/i915_pci.c+76−75

This diff is large: its 165 lines aren’t shown here.

drivers/gpu/drm/i915/i915_reg.h+72−855

This diff is large: its 1179 lines aren’t shown here.

drivers/gpu/drm/i915/i915_suspend.c+32−16

This diff is large: its 92 lines aren’t shown here.

drivers/gpu/drm/i915/intel_clock_gating.c+7−7

This diff is large: its 30 lines aren’t shown here.

drivers/gpu/drm/i915/intel_device_info.c+46−46

This diff is large: its 135 lines aren’t shown here.

drivers/gpu/drm/i915/intel_gvt_mmio_table.c+178−175

This diff is large: its 433 lines aren’t shown here.

drivers/gpu/drm/i915/intel_pci_config.h+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/i915/pxp/intel_pxp_tee.c+2−2

This diff is large: its 11 lines aren’t shown here.

drivers/gpu/drm/i915/soc/intel_dram.c+132−84

This diff is large: its 295 lines aren’t shown here.

drivers/gpu/drm/i915/soc/intel_dram.h+1−0

This diff is large: its 7 lines aren’t shown here.

drivers/gpu/drm/i915/soc/intel_gmch.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/i915/soc/intel_pch.c+2−2

This diff is large: its 13 lines aren’t shown here.

drivers/gpu/drm/imx/ipuv3/imx-ldb.c+12−12

This diff is large: its 68 lines aren’t shown here.

drivers/gpu/drm/imx/ipuv3/imx-tve.c+6−8

This diff is large: its 25 lines aren’t shown here.

drivers/gpu/drm/imx/lcdc/imx-lcdc.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/ingenic/ingenic-drm-drv.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/loongson/Kconfig+1−0

This diff is large: its 8 lines aren’t shown here.

drivers/gpu/drm/loongson/lsdc_drv.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/loongson/lsdc_output_7a1000.c+7−8

This diff is large: its 24 lines aren’t shown here.

drivers/gpu/drm/loongson/lsdc_output_7a2000.c+7−8

This diff is large: its 24 lines aren’t shown here.

drivers/gpu/drm/mediatek/mtk_drm_drv.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/mediatek/mtk_hdmi.c+0−11

This diff is large: its 23 lines aren’t shown here.

drivers/gpu/drm/meson/meson_plane.c+11−6

This diff is large: its 31 lines aren’t shown here.

drivers/gpu/drm/mgag200/Kconfig+8−10

This diff is large: its 23 lines aren’t shown here.

drivers/gpu/drm/mgag200/Makefile+3−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/mgag200/mgag200_bmc.c+107−0

This diff is large: its 120 lines aren’t shown here.

drivers/gpu/drm/mgag200/mgag200_ddc.c+179−0

This diff is large: its 180 lines aren’t shown here.

drivers/gpu/drm/mgag200/mgag200_ddc.h+11−0

This diff is large: its 12 lines aren’t shown here.

drivers/gpu/drm/mgag200/mgag200_drv.c+8−19

This diff is large: its 68 lines aren’t shown here.

drivers/gpu/drm/mgag200/mgag200_drv.h+17−29

This diff is large: its 82 lines aren’t shown here.

drivers/gpu/drm/mgag200/mgag200_g200.c+3−43

This diff is large: its 73 lines aren’t shown here.

drivers/gpu/drm/mgag200/mgag200_g200eh.c+5−41

This diff is large: its 75 lines aren’t shown here.

drivers/gpu/drm/mgag200/mgag200_g200eh3.c+5−41

This diff is large: its 75 lines aren’t shown here.

drivers/gpu/drm/mgag200/mgag200_g200er.c+5−41

This diff is large: its 75 lines aren’t shown here.

drivers/gpu/drm/mgag200/mgag200_g200ev.c+5−41

This diff is large: its 75 lines aren’t shown here.

drivers/gpu/drm/mgag200/mgag200_g200ew3.c+5−41

This diff is large: its 75 lines aren’t shown here.

drivers/gpu/drm/mgag200/mgag200_g200se.c+5−41

This diff is large: its 75 lines aren’t shown here.

drivers/gpu/drm/mgag200/mgag200_g200wb.c+5−41

This diff is large: its 75 lines aren’t shown here.

drivers/gpu/drm/mgag200/mgag200_i2c.c+0−129

This diff is large: its 130 lines aren’t shown here.

drivers/gpu/drm/mgag200/mgag200_mode.c+1−34

This diff is large: its 63 lines aren’t shown here.

drivers/gpu/drm/mgag200/mgag200_vga.c+72−0

This diff is large: its 73 lines aren’t shown here.

drivers/gpu/drm/nouveau/dispnv50/disp.c+4−4

This diff is large: its 36 lines aren’t shown here.

drivers/gpu/drm/nouveau/dispnv50/head.c+1−7

This diff is large: its 24 lines aren’t shown here.

drivers/gpu/drm/nouveau/include/nvkm/subdev/gsp.h+6−0

This diff is large: its 13 lines aren’t shown here.

drivers/gpu/drm/nouveau/nouveau_bo.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/nouveau/nouveau_chan.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/nouveau/nouveau_connector.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/nouveau/nouveau_dmem.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/nouveau/nouveau_drm.c+3−3

This diff is large: its 21 lines aren’t shown here.

drivers/gpu/drm/nouveau/nouveau_exec.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/nouveau/nouveau_fence.c+1−29

This diff is large: its 41 lines aren’t shown here.

drivers/gpu/drm/nouveau/nouveau_fence.h+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/nouveau/nouveau_gem.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/nouveau/nouveau_sched.h+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/nouveau/nouveau_uvmm.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/nouveau/nvkm/subdev/gsp/r535.c+338−24

This diff is large: its 399 lines aren’t shown here.

drivers/gpu/drm/omapdrm/Kconfig+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/omapdrm/omap_gem.c+2−2

This diff is large: its 11 lines aren’t shown here.

drivers/gpu/drm/panel/Kconfig+9−0

This diff is large: its 16 lines aren’t shown here.

drivers/gpu/drm/panel/Makefile+1−0

This diff is large: its 8 lines aren’t shown here.

drivers/gpu/drm/panel/panel-abt-y030xx067a.c+1−0

This diff is large: its 6 lines aren’t shown here.

drivers/gpu/drm/panel/panel-auo-a030jtn01.c+1−0

This diff is large: its 6 lines aren’t shown here.

drivers/gpu/drm/panel/panel-boe-himax8279d.c+0−40

This diff is large: its 123 lines aren’t shown here.

drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c+1327−1430

This diff is large: its 2936 lines aren’t shown here.

drivers/gpu/drm/panel/panel-edp.c+56−204

This diff is large: its 454 lines aren’t shown here.

drivers/gpu/drm/panel/panel-himax-hx83102.c+706−0

This diff is large: its 707 lines aren’t shown here.

drivers/gpu/drm/panel/panel-himax-hx8394.c+1−2

This diff is large: its 10 lines aren’t shown here.

drivers/gpu/drm/panel/panel-ilitek-ili9341.c+4−3

This diff is large: its 28 lines aren’t shown here.

drivers/gpu/drm/panel/panel-ilitek-ili9882t.c+375−455

This diff is large: its 899 lines aren’t shown here.

drivers/gpu/drm/panel/panel-innolux-ej030na.c+1−0

This diff is large: its 6 lines aren’t shown here.

drivers/gpu/drm/panel/panel-innolux-p079zca.c+133−199

This diff is large: its 449 lines aren’t shown here.

drivers/gpu/drm/panel/panel-jdi-lt070me05000.c+0−35

This diff is large: its 109 lines aren’t shown here.

drivers/gpu/drm/panel/panel-khadas-ts050.c+0−39

This diff is large: its 106 lines aren’t shown here.

drivers/gpu/drm/panel/panel-kingdisplay-kd097d04.c+0−48

This diff is large: its 129 lines aren’t shown here.

drivers/gpu/drm/panel/panel-leadtek-ltk050h3146w.c+0−28

This diff is large: its 82 lines aren’t shown here.

drivers/gpu/drm/panel/panel-leadtek-ltk500hd1829.c+0−28

This diff is large: its 82 lines aren’t shown here.

drivers/gpu/drm/panel/panel-lg-sw43408.c+37−37

This diff is large: its 121 lines aren’t shown here.

drivers/gpu/drm/panel/panel-newvision-nv3052c.c+226−0

This diff is large: its 262 lines aren’t shown here.

drivers/gpu/drm/panel/panel-novatek-nt36672a.c+0−29

This diff is large: its 85 lines aren’t shown here.

drivers/gpu/drm/panel/panel-novatek-nt36672e.c+310−337

This diff is large: its 703 lines aren’t shown here.

drivers/gpu/drm/panel/panel-novatek-nt39016.c+1−0

This diff is large: its 6 lines aren’t shown here.

drivers/gpu/drm/panel/panel-olimex-lcd-olinuxino.c+0−44

This diff is large: its 100 lines aren’t shown here.

drivers/gpu/drm/panel/panel-orisetech-ota5601a.c+1−0

This diff is large: its 6 lines aren’t shown here.

drivers/gpu/drm/panel/panel-osd-osd101t2587-53ts.c+1−40

This diff is large: its 105 lines aren’t shown here.

drivers/gpu/drm/panel/panel-panasonic-vvx10f034n00.c+1−46

This diff is large: its 119 lines aren’t shown here.

drivers/gpu/drm/panel/panel-raydium-rm67191.c+0−26

This diff is large: its 89 lines aren’t shown here.

drivers/gpu/drm/panel/panel-raydium-rm692e5.c+0−10

This diff is large: its 41 lines aren’t shown here.

drivers/gpu/drm/panel/panel-samsung-atna33xc20.c+0−36

This diff is large: its 112 lines aren’t shown here.

drivers/gpu/drm/panel/panel-seiko-43wvf1g.c+0−49

This diff is large: its 125 lines aren’t shown here.

drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c+2−61

This diff is large: its 138 lines aren’t shown here.

drivers/gpu/drm/panel/panel-sharp-ls043t1le01.c+0−24

This diff is large: its 80 lines aren’t shown here.

drivers/gpu/drm/panel/panel-simple.c+148−37

This diff is large: its 306 lines aren’t shown here.

drivers/gpu/drm/panel/panel-sitronix-st7703.c+7−28

This diff is large: its 92 lines aren’t shown here.

drivers/gpu/drm/panel/panel-sony-acx565akm.c+0−6

This diff is large: its 20 lines aren’t shown here.

drivers/gpu/drm/panel/panel-tdo-tl070wsh30.c+0−23

This diff is large: its 72 lines aren’t shown here.

drivers/gpu/drm/panel/panel-xinpeng-xpp055c272.c+0−28

This diff is large: its 82 lines aren’t shown here.

drivers/gpu/drm/panfrost/panfrost_drv.c+10−0

This diff is large: its 24 lines aren’t shown here.

drivers/gpu/drm/qxl/qxl_drv.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/radeon/atombios_encoders.c+5−5

This diff is large: its 44 lines aren’t shown here.

drivers/gpu/drm/radeon/evergreen_hdmi.c+2−3

This diff is large: its 19 lines aren’t shown here.

drivers/gpu/drm/radeon/radeon_audio.c+7−6

This diff is large: its 62 lines aren’t shown here.

drivers/gpu/drm/radeon/radeon_connectors.c+6−21

This diff is large: its 76 lines aren’t shown here.

drivers/gpu/drm/radeon/radeon_display.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/radeon/radeon_encoders.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/radeon/radeon_mode.h+0−2

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/renesas/rcar-du/Kconfig+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/rockchip/Kconfig+3−0

This diff is large: its 10 lines aren’t shown here.

drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c+20−0

This diff is large: its 41 lines aren’t shown here.

drivers/gpu/drm/rockchip/inno_hdmi.c+53−99

This diff is large: its 308 lines aren’t shown here.

drivers/gpu/drm/rockchip/rockchip_drm_drv.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/rockchip/rockchip_drm_vop2.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/solomon/ssd130x.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/sti/Kconfig+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/sti/sti_dvo.c+1−0

This diff is large: its 8 lines aren’t shown here.

drivers/gpu/drm/stm/Kconfig+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/sun4i/Kconfig+3−0

This diff is large: its 10 lines aren’t shown here.

drivers/gpu/drm/sun4i/sun4i_backend.c+3−1

This diff is large: its 11 lines aren’t shown here.

drivers/gpu/drm/sun4i/sun4i_crtc.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c+53−30

This diff is large: its 161 lines aren’t shown here.

drivers/gpu/drm/sun4i/sun8i_mixer.c+67−3

This diff is large: its 101 lines aren’t shown here.

drivers/gpu/drm/sun4i/sun8i_mixer.h+20−0

This diff is large: its 34 lines aren’t shown here.

drivers/gpu/drm/sun4i/sun8i_ui_layer.c+8−77

This diff is large: its 144 lines aren’t shown here.

drivers/gpu/drm/sun4i/sun8i_ui_layer.h+4−16

This diff is large: its 26 lines aren’t shown here.

drivers/gpu/drm/sun4i/sun8i_vi_layer.c+8−78

This diff is large: its 145 lines aren’t shown here.

drivers/gpu/drm/sun4i/sun8i_vi_layer.h+4−16

This diff is large: its 26 lines aren’t shown here.

drivers/gpu/drm/sun4i/sunxi_engine.h+10−3

This diff is large: its 38 lines aren’t shown here.

drivers/gpu/drm/tests/Makefile+1−0

This diff is large: its 8 lines aren’t shown here.

drivers/gpu/drm/tests/drm_buddy_test.c+1−0

This diff is large: its 6 lines aren’t shown here.

drivers/gpu/drm/tests/drm_cmdline_parser_test.c+1−0

This diff is large: its 6 lines aren’t shown here.

drivers/gpu/drm/tests/drm_connector_test.c+1051−1

This diff is large: its 1086 lines aren’t shown here.

drivers/gpu/drm/tests/drm_damage_helper_test.c+1−0

This diff is large: its 6 lines aren’t shown here.

drivers/gpu/drm/tests/drm_dp_mst_helper_test.c+1−0

This diff is large: its 6 lines aren’t shown here.

drivers/gpu/drm/tests/drm_exec_test.c+1−0

This diff is large: its 6 lines aren’t shown here.

drivers/gpu/drm/tests/drm_format_test.c+1−0

This diff is large: its 6 lines aren’t shown here.

drivers/gpu/drm/tests/drm_framebuffer_test.c+1−0

This diff is large: its 6 lines aren’t shown here.

drivers/gpu/drm/tests/drm_gem_shmem_test.c+1−0

This diff is large: its 6 lines aren’t shown here.

drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c+1743−0

This diff is large: its 1744 lines aren’t shown here.

drivers/gpu/drm/tests/drm_kunit_edid.h+484−0

This diff is large: its 485 lines aren’t shown here.

drivers/gpu/drm/tests/drm_kunit_helpers.c+1−0

This diff is large: its 6 lines aren’t shown here.

drivers/gpu/drm/tests/drm_managed_test.c+1−0

This diff is large: its 6 lines aren’t shown here.

drivers/gpu/drm/tests/drm_mm_test.c+1−0

This diff is large: its 6 lines aren’t shown here.

drivers/gpu/drm/tests/drm_modes_test.c+1−0

This diff is large: its 6 lines aren’t shown here.

drivers/gpu/drm/tests/drm_plane_helper_test.c+1−0

This diff is large: its 6 lines aren’t shown here.

drivers/gpu/drm/tests/drm_probe_helper_test.c+1−0

This diff is large: its 6 lines aren’t shown here.

drivers/gpu/drm/tests/drm_rect_test.c+1−0

This diff is large: its 6 lines aren’t shown here.

drivers/gpu/drm/tidss/tidss_plane.c+13−1

This diff is large: its 35 lines aren’t shown here.

drivers/gpu/drm/tiny/bochs.c+13−15

This diff is large: its 85 lines aren’t shown here.

drivers/gpu/drm/tiny/cirrus.c+3−2

This diff is large: its 24 lines aren’t shown here.

drivers/gpu/drm/tiny/gm12u320.c+3−2

This diff is large: its 24 lines aren’t shown here.

drivers/gpu/drm/tiny/hx8357d.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/tiny/ili9163.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/tiny/ili9225.c+2−3

This diff is large: its 26 lines aren’t shown here.

drivers/gpu/drm/tiny/ili9341.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/tiny/ili9486.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/tiny/mi0283qt.c+2−3

This diff is large: its 26 lines aren’t shown here.

drivers/gpu/drm/tiny/ofdrm.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/tiny/panel-mipi-dbi.c+56−4

This diff is large: its 102 lines aren’t shown here.

drivers/gpu/drm/tiny/repaper.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/tiny/simpledrm.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/tiny/st7586.c+2−3

This diff is large: its 26 lines aren’t shown here.

drivers/gpu/drm/tiny/st7735r.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/udl/Makefile+7−1

This diff is large: its 12 lines aren’t shown here.

drivers/gpu/drm/udl/udl_drv.c+3−2

This diff is large: its 24 lines aren’t shown here.

drivers/gpu/drm/udl/udl_drv.h+1−11

This diff is large: its 26 lines aren’t shown here.

drivers/gpu/drm/udl/udl_edid.c+80−0

This diff is large: its 81 lines aren’t shown here.

drivers/gpu/drm/udl/udl_edid.h+15−0

This diff is large: its 16 lines aren’t shown here.

drivers/gpu/drm/udl/udl_modeset.c+29−109

This diff is large: its 176 lines aren’t shown here.

drivers/gpu/drm/v3d/v3d_drv.c+11−0

This diff is large: its 32 lines aren’t shown here.

drivers/gpu/drm/v3d/v3d_drv.h+10−1

This diff is large: its 39 lines aren’t shown here.

drivers/gpu/drm/v3d/v3d_perfmon.c+227−1

This diff is large: its 253 lines aren’t shown here.

drivers/gpu/drm/v3d/v3d_performance_counters.h+29−0

This diff is large: its 30 lines aren’t shown here.

drivers/gpu/drm/v3d/v3d_sched.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/vboxvideo/vbox_drv.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/vc4/Kconfig+1−0

This diff is large: its 8 lines aren’t shown here.

drivers/gpu/drm/vc4/tests/vc4_mock.c+2−4

This diff is large: its 19 lines aren’t shown here.

drivers/gpu/drm/vc4/tests/vc4_mock.h+2−7

This diff is large: its 16 lines aren’t shown here.

drivers/gpu/drm/vc4/tests/vc4_mock_plane.c+11−33

This diff is large: its 59 lines aren’t shown here.

drivers/gpu/drm/vc4/vc4_hdmi.c+79−565

This diff is large: its 961 lines aren’t shown here.

drivers/gpu/drm/vc4/vc4_hdmi.h+9−35

This diff is large: its 97 lines aren’t shown here.

drivers/gpu/drm/vc4/vc4_hdmi_phy.c+3−3

This diff is large: its 23 lines aren’t shown here.

drivers/gpu/drm/virtio/virtgpu_display.c+4−6

This diff is large: its 22 lines aren’t shown here.

drivers/gpu/drm/virtio/virtgpu_drv.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/virtio/virtgpu_drv.h+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/virtio/virtgpu_vq.c+6−6

This diff is large: its 28 lines aren’t shown here.

drivers/gpu/drm/vkms/vkms_drv.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/vmwgfx/vmwgfx_drv.c+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/gpu/drm/vmwgfx/vmwgfx_vkms.c+0−1

This diff is large: its 8 lines aren’t shown here.

drivers/gpu/drm/xe/Makefile+4−1

This diff is large: its 26 lines aren’t shown here.

drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_object_types.h+11−0

This diff is large: its 12 lines aren’t shown here.

drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_stolen.hrenamed from drivers/gpu/drm/xe/compat-i915-headers/i915_gem_stolen.h+0−0

File renamed without changes.

drivers/gpu/drm/xe/compat-i915-headers/gt/intel_gt_types.hrenamed from drivers/gpu/drm/xe/compat-i915-headers/intel_gt_types.h+0−0

File renamed without changes.

drivers/gpu/drm/xe/compat-i915-headers/i915_drv.h+1−66

This diff is large: its 92 lines aren’t shown here.

drivers/gpu/drm/xe/compat-i915-headers/intel_runtime_pm.h+51−0

This diff is large: its 63 lines aren’t shown here.

drivers/gpu/drm/xe/compat-i915-headers/intel_uncore.h+5−0

This diff is large: its 10 lines aren’t shown here.

drivers/gpu/drm/xe/display/ext/i915_irq.c+0−1

This diff is large: its 8 lines aren’t shown here.

drivers/gpu/drm/xe/display/intel_fb_bo.c+4−3

This diff is large: its 31 lines aren’t shown here.

drivers/gpu/drm/xe/display/intel_fbdev_fb.c+18−19

This diff is large: its 79 lines aren’t shown here.

drivers/gpu/drm/xe/display/intel_fbdev_fb.h+0−21

This diff is large: its 22 lines aren’t shown here.

drivers/gpu/drm/xe/display/xe_display.c+0−3

This diff is large: its 10 lines aren’t shown here.

drivers/gpu/drm/xe/display/xe_dsb_buffer.c+4−5

This diff is large: its 31 lines aren’t shown here.

drivers/gpu/drm/xe/display/xe_fb_pin.c+12−12

This diff is large: its 73 lines aren’t shown here.

drivers/gpu/drm/xe/display/xe_hdcp_gsc.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/xe/display/xe_plane_initial.c+11−12

This diff is large: its 78 lines aren’t shown here.

drivers/gpu/drm/xe/display/xe_tdf.c+13−0

This diff is large: its 14 lines aren’t shown here.

drivers/gpu/drm/xe/regs/xe_gt_regs.h+3−0

This diff is large: its 10 lines aren’t shown here.

drivers/gpu/drm/xe/xe_device.c+49−0

This diff is large: its 56 lines aren’t shown here.

drivers/gpu/drm/xe/xe_device.h+2−0

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/xe/xe_device_types.h+1−5

This diff is large: its 23 lines aren’t shown here.

drivers/gpu/drm/xe/xe_ggtt.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/gpu/drm/xe/xe_gsc_proxy.c+2−2

This diff is large: its 11 lines aren’t shown here.

drivers/gpu/drm/xe/xe_gt_printk.h+3−0

This diff is large: its 10 lines aren’t shown here.

drivers/gpu/drm/xe/xe_pci.c+2−1

This diff is large: its 17 lines aren’t shown here.

drivers/gpu/drm/xlnx/zynqmp_disp.c+19−25

This diff is large: its 95 lines aren’t shown here.

drivers/gpu/drm/xlnx/zynqmp_dp.c+27−35

This diff is large: its 144 lines aren’t shown here.

drivers/gpu/drm/xlnx/zynqmp_dpsub.c+1−0

This diff is large: its 8 lines aren’t shown here.

drivers/gpu/drm/xlnx/zynqmp_dpsub.h+1−0

This diff is large: its 8 lines aren’t shown here.

drivers/gpu/drm/xlnx/zynqmp_kms.c+16−6

This diff is large: its 56 lines aren’t shown here.

drivers/gpu/drm/xlnx/zynqmp_kms.h+2−2

This diff is large: its 12 lines aren’t shown here.

drivers/misc/mei/gsc_proxy/mei_gsc_proxy.c+2−2

This diff is large: its 11 lines aren’t shown here.

drivers/misc/mei/hdcp/mei_hdcp.c+2−2

This diff is large: its 11 lines aren’t shown here.

drivers/misc/mei/pxp/mei_pxp.c+2−2

This diff is large: its 11 lines aren’t shown here.

drivers/platform/x86/intel_ips.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/video/fbdev/core/fb_defio.c+55−27

This diff is large: its 146 lines aren’t shown here.

include/drm/display/drm_dp.h+24−4

This diff is large: its 60 lines aren’t shown here.

include/drm/display/drm_dp_helper.h+2−1

This diff is large: its 17 lines aren’t shown here.

include/drm/display/drm_hdmi_helper.h+4−0

This diff is large: its 9 lines aren’t shown here.

include/drm/display/drm_hdmi_state_helper.h+23−0

This diff is large: its 24 lines aren’t shown here.

include/drm/drm_bridge.h+81−3

This diff is large: its 112 lines aren’t shown here.

include/drm/drm_connector.h+251−1

This diff is large: its 337 lines aren’t shown here.

include/drm/drm_drv.h+1−1

This diff is large: its 9 lines aren’t shown here.

include/drm/drm_edid.h+0−4

This diff is large: its 11 lines aren’t shown here.

include/drm/drm_fbdev_generic.h+0−15

This diff is large: its 16 lines aren’t shown here.

include/drm/drm_fbdev_shmem.h+15−0

This diff is large: its 16 lines aren’t shown here.

include/drm/drm_fbdev_ttm.h+15−0

This diff is large: its 16 lines aren’t shown here.

include/drm/drm_mipi_dbi.h+10−0

This diff is large: its 24 lines aren’t shown here.

include/drm/drm_mipi_dsi.h+104−18

This diff is large: its 173 lines aren’t shown here.

include/drm/drm_mm.h+0−1

This diff is large: its 8 lines aren’t shown here.

include/drm/drm_mode_config.h+2−2

This diff is large: its 11 lines aren’t shown here.

include/drm/drm_panic.h+9−0

This diff is large: its 16 lines aren’t shown here.

include/drm/drm_print.h+7−7

This diff is large: its 52 lines aren’t shown here.

include/drm/i915_pciids.h+0−767

This diff is large: its 768 lines aren’t shown here.

include/drm/intel/i915_component.hrenamed from include/drm/i915_component.h+0−0

File renamed without changes.

include/drm/intel/i915_drm.hrenamed from include/drm/i915_drm.h+0−0

File renamed without changes.

include/drm/intel/i915_gsc_proxy_mei_interface.hrenamed from include/drm/i915_gsc_proxy_mei_interface.h+0−0

File renamed without changes.

include/drm/intel/i915_hdcp_interface.hrenamed from include/drm/i915_hdcp_interface.h+0−0

File renamed without changes.

include/drm/intel/i915_pciids.h+800−0

This diff is large: its 801 lines aren’t shown here.

include/drm/intel/i915_pxp_tee_interface.hrenamed from include/drm/i915_pxp_tee_interface.h+0−0

File renamed without changes.

include/drm/intel/intel-gtt.hrenamed from include/drm/intel-gtt.h+0−0

File renamed without changes.

include/drm/intel/intel_lpe_audio.hrenamed from include/drm/intel_lpe_audio.h+0−0

File renamed without changes.

include/drm/intel/xe_pciids.hrenamed from include/drm/xe_pciids.h+0−0

File renamed without changes.

include/linux/dma-fence-array.h+3−0

This diff is large: its 17 lines aren’t shown here.

include/linux/dma-heap.h+2−2

This diff is large: its 11 lines aren’t shown here.

include/linux/fb.h+1−0

This diff is large: its 8 lines aren’t shown here.

include/linux/mfd/atmel-hlcdc.h+10−0

This diff is large: its 31 lines aren’t shown here.

include/sound/hdaudio.h+1−1

This diff is large: its 9 lines aren’t shown here.

include/uapi/drm/amdgpu_drm.h+9−0

This diff is large: its 16 lines aren’t shown here.

include/uapi/drm/drm_mode.h+0−8

This diff is large: its 15 lines aren’t shown here.

include/uapi/drm/ivpu_accel.h+68−1

This diff is large: its 96 lines aren’t shown here.

include/uapi/drm/v3d_drm.h+48−0

This diff is large: its 83 lines aren’t shown here.

include/uapi/linux/dma-heap.h+1−1

This diff is large: its 9 lines aren’t shown here.

lib/fonts/Kconfig+10−10

This diff is large: its 90 lines aren’t shown here.

sound/x86/intel_hdmi_audio.c+1−1

This diff is large: its 9 lines aren’t shown here.