* ✗ CI.checkpatch: warning for CCS save restore for IGPU (rev8)
2025-06-19 8:04 [PATCH v8 0/3] CCS save restore for IGPU Satyanarayana K V P
@ 2025-06-19 7:53 ` Patchwork
2025-06-19 7:55 ` ✓ CI.KUnit: success " Patchwork
` (5 subsequent siblings)
6 siblings, 0 replies; 17+ messages in thread
From: Patchwork @ 2025-06-19 7:53 UTC (permalink / raw)
To: Satyanarayana K V P; +Cc: intel-xe
== Series Details ==
Series: CCS save restore for IGPU (rev8)
URL : https://patchwork.freedesktop.org/series/149108/
State : warning
== Summary ==
+ KERNEL=/kernel
+ git clone https://gitlab.freedesktop.org/drm/maintainer-tools mt
Cloning into 'mt'...
warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/
+ git -C mt rev-list -n1 origin/master
f8ff75ae1d2127635239b134695774ed4045d05b
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit 44ffefdbc09b467e8f44e1a33d8b925b628d0108
Author: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
Date: Thu Jun 19 13:34:59 2025 +0530
drm/xe/vf: Register CCS read/write contexts with Guc
Register read write contexts with newly added flags with GUC and
enable the context immediately after registration.
Re-register the context with Guc when resuming from runtime suspend as
soft reset is applied to Guc during xe_pm_runtime_resume().
Make Ring head=tail while unbinding device to avoid issues with VF pause
after device is unbinded.
Signed-off-by: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
+ /mt/dim checkpatch 74c4708b7ac3e4bcecaa618e9f16c0b5c3e75ab3 drm-intel
aff94b778c98 drm/xe/vf: Create contexts for CCS read write
-:197: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#197:
new file mode 100644
-:445: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'id__' - possible side-effects?
#445: FILE: drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h:9:
+#define for_each_ccs_rw_ctx(id__) \
+ for ((id__) = 0; (id__) < XE_SRIOV_VF_CCS_CTX_COUNT; (id__)++)
total: 0 errors, 1 warnings, 1 checks, 401 lines checked
63f231fb5b73 drm/xe/vf: Attach and detach CCS copy commands with BO
44ffefdbc09b drm/xe/vf: Register CCS read/write contexts with Guc
^ permalink raw reply [flat|nested] 17+ messages in thread* ✓ CI.KUnit: success for CCS save restore for IGPU (rev8)
2025-06-19 8:04 [PATCH v8 0/3] CCS save restore for IGPU Satyanarayana K V P
2025-06-19 7:53 ` ✗ CI.checkpatch: warning for CCS save restore for IGPU (rev8) Patchwork
@ 2025-06-19 7:55 ` Patchwork
2025-06-19 8:04 ` [PATCH v8 1/3] drm/xe/vf: Create contexts for CCS read write Satyanarayana K V P
` (4 subsequent siblings)
6 siblings, 0 replies; 17+ messages in thread
From: Patchwork @ 2025-06-19 7:55 UTC (permalink / raw)
To: Satyanarayana K V P; +Cc: intel-xe
== Series Details ==
Series: CCS save restore for IGPU (rev8)
URL : https://patchwork.freedesktop.org/series/149108/
State : success
== Summary ==
+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[07:53:58] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[07:54:03] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[07:54:29] Starting KUnit Kernel (1/1)...
[07:54:29] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[07:54:30] ================== guc_buf (11 subtests) ===================
[07:54:30] [PASSED] test_smallest
[07:54:30] [PASSED] test_largest
[07:54:30] [PASSED] test_granular
[07:54:30] [PASSED] test_unique
[07:54:30] [PASSED] test_overlap
[07:54:30] [PASSED] test_reusable
[07:54:30] [PASSED] test_too_big
[07:54:30] [PASSED] test_flush
[07:54:30] [PASSED] test_lookup
[07:54:30] [PASSED] test_data
[07:54:30] [PASSED] test_class
[07:54:30] ===================== [PASSED] guc_buf =====================
[07:54:30] =================== guc_dbm (7 subtests) ===================
[07:54:30] [PASSED] test_empty
[07:54:30] [PASSED] test_default
[07:54:30] ======================== test_size ========================
[07:54:30] [PASSED] 4
[07:54:30] [PASSED] 8
[07:54:30] [PASSED] 32
[07:54:30] [PASSED] 256
[07:54:30] ==================== [PASSED] test_size ====================
[07:54:30] ======================= test_reuse ========================
[07:54:30] [PASSED] 4
[07:54:30] [PASSED] 8
[07:54:30] [PASSED] 32
[07:54:30] [PASSED] 256
[07:54:30] =================== [PASSED] test_reuse ====================
[07:54:30] =================== test_range_overlap ====================
[07:54:30] [PASSED] 4
[07:54:30] [PASSED] 8
[07:54:30] [PASSED] 32
[07:54:30] [PASSED] 256
[07:54:30] =============== [PASSED] test_range_overlap ================
[07:54:30] =================== test_range_compact ====================
[07:54:30] [PASSED] 4
[07:54:30] [PASSED] 8
[07:54:30] [PASSED] 32
[07:54:30] [PASSED] 256
[07:54:30] =============== [PASSED] test_range_compact ================
[07:54:30] ==================== test_range_spare =====================
[07:54:30] [PASSED] 4
[07:54:30] [PASSED] 8
[07:54:30] [PASSED] 32
[07:54:30] [PASSED] 256
[07:54:30] ================ [PASSED] test_range_spare =================
[07:54:30] ===================== [PASSED] guc_dbm =====================
[07:54:30] =================== guc_idm (6 subtests) ===================
[07:54:30] [PASSED] bad_init
[07:54:30] [PASSED] no_init
[07:54:30] [PASSED] init_fini
[07:54:30] [PASSED] check_used
[07:54:30] [PASSED] check_quota
[07:54:30] [PASSED] check_all
[07:54:30] ===================== [PASSED] guc_idm =====================
[07:54:30] ================== no_relay (3 subtests) ===================
[07:54:30] [PASSED] xe_drops_guc2pf_if_not_ready
[07:54:30] [PASSED] xe_drops_guc2vf_if_not_ready
[07:54:30] [PASSED] xe_rejects_send_if_not_ready
[07:54:30] ==================== [PASSED] no_relay =====================
[07:54:30] ================== pf_relay (14 subtests) ==================
[07:54:30] [PASSED] pf_rejects_guc2pf_too_short
[07:54:30] [PASSED] pf_rejects_guc2pf_too_long
[07:54:30] [PASSED] pf_rejects_guc2pf_no_payload
[07:54:30] [PASSED] pf_fails_no_payload
[07:54:30] [PASSED] pf_fails_bad_origin
[07:54:30] [PASSED] pf_fails_bad_type
[07:54:30] [PASSED] pf_txn_reports_error
[07:54:30] [PASSED] pf_txn_sends_pf2guc
[07:54:30] [PASSED] pf_sends_pf2guc
[07:54:30] [SKIPPED] pf_loopback_nop
[07:54:30] [SKIPPED] pf_loopback_echo
[07:54:30] [SKIPPED] pf_loopback_fail
[07:54:30] [SKIPPED] pf_loopback_busy
[07:54:30] [SKIPPED] pf_loopback_retry
[07:54:30] ==================== [PASSED] pf_relay =====================
[07:54:30] ================== vf_relay (3 subtests) ===================
[07:54:30] [PASSED] vf_rejects_guc2vf_too_short
[07:54:30] [PASSED] vf_rejects_guc2vf_too_long
[07:54:30] [PASSED] vf_rejects_guc2vf_no_payload
[07:54:30] ==================== [PASSED] vf_relay =====================
[07:54:30] ================= pf_service (11 subtests) =================
[07:54:30] [PASSED] pf_negotiate_any
[07:54:30] [PASSED] pf_negotiate_base_match
[07:54:30] [PASSED] pf_negotiate_base_newer
[07:54:30] [PASSED] pf_negotiate_base_next
[07:54:30] [SKIPPED] pf_negotiate_base_older
[07:54:30] [PASSED] pf_negotiate_base_prev
[07:54:30] [PASSED] pf_negotiate_latest_match
[07:54:30] [PASSED] pf_negotiate_latest_newer
[07:54:30] [PASSED] pf_negotiate_latest_next
[07:54:30] [SKIPPED] pf_negotiate_latest_older
[07:54:30] [SKIPPED] pf_negotiate_latest_prev
[07:54:30] =================== [PASSED] pf_service ====================
[07:54:30] ===================== lmtt (1 subtest) =====================
[07:54:30] ======================== test_ops =========================
[07:54:30] [PASSED] 2-level
[07:54:30] [PASSED] multi-level
[07:54:30] ==================== [PASSED] test_ops =====================
[07:54:30] ====================== [PASSED] lmtt =======================
[07:54:30] =================== xe_mocs (2 subtests) ===================
[07:54:30] ================ xe_live_mocs_kernel_kunit ================
[07:54:30] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[07:54:30] ================ xe_live_mocs_reset_kunit =================
[07:54:30] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[07:54:30] ==================== [SKIPPED] xe_mocs =====================
[07:54:30] ================= xe_migrate (2 subtests) ==================
[07:54:30] ================= xe_migrate_sanity_kunit =================
[07:54:30] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[07:54:30] ================== xe_validate_ccs_kunit ==================
[07:54:30] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[07:54:30] =================== [SKIPPED] xe_migrate ===================
[07:54:30] ================== xe_dma_buf (1 subtest) ==================
[07:54:30] ==================== xe_dma_buf_kunit =====================
[07:54:30] ================ [SKIPPED] xe_dma_buf_kunit ================
[07:54:30] =================== [SKIPPED] xe_dma_buf ===================
[07:54:30] ================= xe_bo_shrink (1 subtest) =================
[07:54:30] =================== xe_bo_shrink_kunit ====================
[07:54:30] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[07:54:30] ================== [SKIPPED] xe_bo_shrink ==================
[07:54:30] ==================== xe_bo (2 subtests) ====================
[07:54:30] ================== xe_ccs_migrate_kunit ===================
[07:54:30] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[07:54:30] ==================== xe_bo_evict_kunit ====================
[07:54:30] =============== [SKIPPED] xe_bo_evict_kunit ================
[07:54:30] ===================== [SKIPPED] xe_bo ======================
[07:54:30] ==================== args (11 subtests) ====================
[07:54:30] [PASSED] count_args_test
[07:54:30] [PASSED] call_args_example
[07:54:30] [PASSED] call_args_test
[07:54:30] [PASSED] drop_first_arg_example
[07:54:30] [PASSED] drop_first_arg_test
[07:54:30] [PASSED] first_arg_example
[07:54:30] [PASSED] first_arg_test
[07:54:30] [PASSED] last_arg_example
[07:54:30] [PASSED] last_arg_test
[07:54:30] [PASSED] pick_arg_example
[07:54:30] [PASSED] sep_comma_example
[07:54:30] ====================== [PASSED] args =======================
[07:54:30] =================== xe_pci (2 subtests) ====================
[07:54:30] ==================== check_graphics_ip ====================
[07:54:30] [PASSED] 12.70 Xe_LPG
[07:54:30] [PASSED] 12.71 Xe_LPG
[07:54:30] [PASSED] 12.74 Xe_LPG+
[07:54:30] [PASSED] 20.01 Xe2_HPG
[07:54:30] [PASSED] 20.02 Xe2_HPG
[07:54:30] [PASSED] 20.04 Xe2_LPG
[07:54:30] [PASSED] 30.00 Xe3_LPG
[07:54:30] [PASSED] 30.01 Xe3_LPG
[07:54:30] [PASSED] 30.03 Xe3_LPG
[07:54:30] ================ [PASSED] check_graphics_ip ================
[07:54:30] ===================== check_media_ip ======================
[07:54:30] [PASSED] 13.00 Xe_LPM+
[07:54:30] [PASSED] 13.01 Xe2_HPM
[07:54:30] [PASSED] 20.00 Xe2_LPM
[07:54:30] [PASSED] 30.00 Xe3_LPM
[07:54:30] [PASSED] 30.02 Xe3_LPM
stty: 'standard input': Inappropriate ioctl for device
[07:54:30] ================= [PASSED] check_media_ip ==================
[07:54:30] ===================== [PASSED] xe_pci ======================
[07:54:30] =================== xe_rtp (2 subtests) ====================
[07:54:30] =============== xe_rtp_process_to_sr_tests ================
[07:54:30] [PASSED] coalesce-same-reg
[07:54:30] [PASSED] no-match-no-add
[07:54:30] [PASSED] match-or
[07:54:30] [PASSED] match-or-xfail
[07:54:30] [PASSED] no-match-no-add-multiple-rules
[07:54:30] [PASSED] two-regs-two-entries
[07:54:30] [PASSED] clr-one-set-other
[07:54:30] [PASSED] set-field
[07:54:30] [PASSED] conflict-duplicate
[07:54:30] [PASSED] conflict-not-disjoint
[07:54:30] [PASSED] conflict-reg-type
[07:54:30] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[07:54:30] ================== xe_rtp_process_tests ===================
[07:54:30] [PASSED] active1
[07:54:30] [PASSED] active2
[07:54:30] [PASSED] active-inactive
[07:54:30] [PASSED] inactive-active
[07:54:30] [PASSED] inactive-1st_or_active-inactive
[07:54:30] [PASSED] inactive-2nd_or_active-inactive
[07:54:30] [PASSED] inactive-last_or_active-inactive
[07:54:30] [PASSED] inactive-no_or_active-inactive
[07:54:30] ============== [PASSED] xe_rtp_process_tests ===============
[07:54:30] ===================== [PASSED] xe_rtp ======================
[07:54:30] ==================== xe_wa (1 subtest) =====================
[07:54:30] ======================== xe_wa_gt =========================
[07:54:30] [PASSED] TIGERLAKE (B0)
[07:54:30] [PASSED] DG1 (A0)
[07:54:30] [PASSED] DG1 (B0)
[07:54:30] [PASSED] ALDERLAKE_S (A0)
[07:54:30] [PASSED] ALDERLAKE_S (B0)
[07:54:30] [PASSED] ALDERLAKE_S (C0)
[07:54:30] [PASSED] ALDERLAKE_S (D0)
[07:54:30] [PASSED] ALDERLAKE_P (A0)
[07:54:30] [PASSED] ALDERLAKE_P (B0)
[07:54:30] [PASSED] ALDERLAKE_P (C0)
[07:54:30] [PASSED] ALDERLAKE_S_RPLS (D0)
[07:54:30] [PASSED] ALDERLAKE_P_RPLU (E0)
[07:54:30] [PASSED] DG2_G10 (C0)
[07:54:30] [PASSED] DG2_G11 (B1)
[07:54:30] [PASSED] DG2_G12 (A1)
[07:54:30] [PASSED] METEORLAKE (g:A0, m:A0)
[07:54:30] [PASSED] METEORLAKE (g:A0, m:A0)
[07:54:30] [PASSED] METEORLAKE (g:A0, m:A0)
[07:54:30] [PASSED] LUNARLAKE (g:A0, m:A0)
[07:54:30] [PASSED] LUNARLAKE (g:B0, m:A0)
[07:54:30] [PASSED] BATTLEMAGE (g:A0, m:A1)
[07:54:30] ==================== [PASSED] xe_wa_gt =====================
[07:54:30] ====================== [PASSED] xe_wa ======================
[07:54:30] ============================================================
[07:54:30] Testing complete. Ran 145 tests: passed: 129, skipped: 16
[07:54:30] Elapsed time: 31.260s total, 4.163s configuring, 26.780s building, 0.296s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[07:54:30] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[07:54:32] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[07:54:53] Starting KUnit Kernel (1/1)...
[07:54:53] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[07:54:53] == drm_test_atomic_get_connector_for_encoder (1 subtest) ===
[07:54:53] [PASSED] drm_test_drm_atomic_get_connector_for_encoder
[07:54:53] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ====
[07:54:53] =========== drm_validate_clone_mode (2 subtests) ===========
[07:54:53] ============== drm_test_check_in_clone_mode ===============
[07:54:53] [PASSED] in_clone_mode
[07:54:53] [PASSED] not_in_clone_mode
[07:54:53] ========== [PASSED] drm_test_check_in_clone_mode ===========
[07:54:53] =============== drm_test_check_valid_clones ===============
[07:54:53] [PASSED] not_in_clone_mode
[07:54:53] [PASSED] valid_clone
[07:54:53] [PASSED] invalid_clone
[07:54:53] =========== [PASSED] drm_test_check_valid_clones ===========
[07:54:53] ============= [PASSED] drm_validate_clone_mode =============
[07:54:53] ============= drm_validate_modeset (1 subtest) =============
[07:54:53] [PASSED] drm_test_check_connector_changed_modeset
[07:54:53] ============== [PASSED] drm_validate_modeset ===============
[07:54:53] ====== drm_test_bridge_get_current_state (2 subtests) ======
[07:54:53] [PASSED] drm_test_drm_bridge_get_current_state_atomic
[07:54:53] [PASSED] drm_test_drm_bridge_get_current_state_legacy
[07:54:53] ======== [PASSED] drm_test_bridge_get_current_state ========
[07:54:53] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ======
[07:54:53] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic
[07:54:53] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled
[07:54:53] [PASSED] drm_test_drm_bridge_helper_reset_crtc_legacy
[07:54:53] ======== [PASSED] drm_test_bridge_helper_reset_crtc ========
[07:54:53] ============== drm_bridge_alloc (2 subtests) ===============
[07:54:53] [PASSED] drm_test_drm_bridge_alloc_basic
[07:54:53] [PASSED] drm_test_drm_bridge_alloc_get_put
[07:54:53] ================ [PASSED] drm_bridge_alloc =================
[07:54:53] ================== drm_buddy (7 subtests) ==================
[07:54:53] [PASSED] drm_test_buddy_alloc_limit
[07:54:53] [PASSED] drm_test_buddy_alloc_optimistic
[07:54:53] [PASSED] drm_test_buddy_alloc_pessimistic
[07:54:53] [PASSED] drm_test_buddy_alloc_pathological
[07:54:53] [PASSED] drm_test_buddy_alloc_contiguous
[07:54:53] [PASSED] drm_test_buddy_alloc_clear
[07:54:53] [PASSED] drm_test_buddy_alloc_range_bias
[07:54:53] ==================== [PASSED] drm_buddy ====================
[07:54:53] ============= drm_cmdline_parser (40 subtests) =============
[07:54:53] [PASSED] drm_test_cmdline_force_d_only
[07:54:53] [PASSED] drm_test_cmdline_force_D_only_dvi
[07:54:53] [PASSED] drm_test_cmdline_force_D_only_hdmi
[07:54:53] [PASSED] drm_test_cmdline_force_D_only_not_digital
[07:54:53] [PASSED] drm_test_cmdline_force_e_only
[07:54:53] [PASSED] drm_test_cmdline_res
[07:54:53] [PASSED] drm_test_cmdline_res_vesa
[07:54:53] [PASSED] drm_test_cmdline_res_vesa_rblank
[07:54:53] [PASSED] drm_test_cmdline_res_rblank
[07:54:53] [PASSED] drm_test_cmdline_res_bpp
[07:54:53] [PASSED] drm_test_cmdline_res_refresh
[07:54:53] [PASSED] drm_test_cmdline_res_bpp_refresh
[07:54:53] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[07:54:53] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[07:54:53] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[07:54:53] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[07:54:53] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[07:54:53] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[07:54:53] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[07:54:53] [PASSED] drm_test_cmdline_res_margins_force_on
[07:54:53] [PASSED] drm_test_cmdline_res_vesa_margins
[07:54:53] [PASSED] drm_test_cmdline_name
[07:54:53] [PASSED] drm_test_cmdline_name_bpp
[07:54:53] [PASSED] drm_test_cmdline_name_option
[07:54:53] [PASSED] drm_test_cmdline_name_bpp_option
[07:54:53] [PASSED] drm_test_cmdline_rotate_0
[07:54:53] [PASSED] drm_test_cmdline_rotate_90
[07:54:53] [PASSED] drm_test_cmdline_rotate_180
[07:54:53] [PASSED] drm_test_cmdline_rotate_270
[07:54:53] [PASSED] drm_test_cmdline_hmirror
[07:54:53] [PASSED] drm_test_cmdline_vmirror
[07:54:53] [PASSED] drm_test_cmdline_margin_options
[07:54:53] [PASSED] drm_test_cmdline_multiple_options
[07:54:53] [PASSED] drm_test_cmdline_bpp_extra_and_option
[07:54:53] [PASSED] drm_test_cmdline_extra_and_option
[07:54:53] [PASSED] drm_test_cmdline_freestanding_options
[07:54:53] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[07:54:53] [PASSED] drm_test_cmdline_panel_orientation
[07:54:53] ================ drm_test_cmdline_invalid =================
[07:54:53] [PASSED] margin_only
[07:54:53] [PASSED] interlace_only
[07:54:53] [PASSED] res_missing_x
[07:54:53] [PASSED] res_missing_y
[07:54:53] [PASSED] res_bad_y
[07:54:53] [PASSED] res_missing_y_bpp
[07:54:53] [PASSED] res_bad_bpp
[07:54:53] [PASSED] res_bad_refresh
[07:54:53] [PASSED] res_bpp_refresh_force_on_off
[07:54:53] [PASSED] res_invalid_mode
[07:54:53] [PASSED] res_bpp_wrong_place_mode
[07:54:53] [PASSED] name_bpp_refresh
[07:54:53] [PASSED] name_refresh
[07:54:53] [PASSED] name_refresh_wrong_mode
[07:54:53] [PASSED] name_refresh_invalid_mode
[07:54:53] [PASSED] rotate_multiple
[07:54:53] [PASSED] rotate_invalid_val
[07:54:53] [PASSED] rotate_truncated
[07:54:53] [PASSED] invalid_option
[07:54:53] [PASSED] invalid_tv_option
[07:54:53] [PASSED] truncated_tv_option
[07:54:53] ============ [PASSED] drm_test_cmdline_invalid =============
[07:54:53] =============== drm_test_cmdline_tv_options ===============
[07:54:53] [PASSED] NTSC
[07:54:53] [PASSED] NTSC_443
[07:54:53] [PASSED] NTSC_J
[07:54:53] [PASSED] PAL
[07:54:53] [PASSED] PAL_M
[07:54:53] [PASSED] PAL_N
[07:54:53] [PASSED] SECAM
[07:54:53] [PASSED] MONO_525
[07:54:53] [PASSED] MONO_625
[07:54:53] =========== [PASSED] drm_test_cmdline_tv_options ===========
[07:54:53] =============== [PASSED] drm_cmdline_parser ================
[07:54:53] ========== drmm_connector_hdmi_init (20 subtests) ==========
[07:54:53] [PASSED] drm_test_connector_hdmi_init_valid
[07:54:53] [PASSED] drm_test_connector_hdmi_init_bpc_8
[07:54:53] [PASSED] drm_test_connector_hdmi_init_bpc_10
[07:54:53] [PASSED] drm_test_connector_hdmi_init_bpc_12
[07:54:53] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[07:54:53] [PASSED] drm_test_connector_hdmi_init_bpc_null
[07:54:53] [PASSED] drm_test_connector_hdmi_init_formats_empty
[07:54:53] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[07:54:53] === drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[07:54:53] [PASSED] supported_formats=0x9 yuv420_allowed=1
[07:54:53] [PASSED] supported_formats=0x9 yuv420_allowed=0
[07:54:53] [PASSED] supported_formats=0x3 yuv420_allowed=1
[07:54:53] [PASSED] supported_formats=0x3 yuv420_allowed=0
[07:54:53] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[07:54:53] [PASSED] drm_test_connector_hdmi_init_null_ddc
[07:54:53] [PASSED] drm_test_connector_hdmi_init_null_product
[07:54:53] [PASSED] drm_test_connector_hdmi_init_null_vendor
[07:54:53] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[07:54:53] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[07:54:53] [PASSED] drm_test_connector_hdmi_init_product_valid
[07:54:53] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[07:54:53] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[07:54:53] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[07:54:53] ========= drm_test_connector_hdmi_init_type_valid =========
[07:54:53] [PASSED] HDMI-A
[07:54:53] [PASSED] HDMI-B
[07:54:53] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[07:54:53] ======== drm_test_connector_hdmi_init_type_invalid ========
[07:54:53] [PASSED] Unknown
[07:54:53] [PASSED] VGA
[07:54:53] [PASSED] DVI-I
[07:54:53] [PASSED] DVI-D
[07:54:53] [PASSED] DVI-A
[07:54:53] [PASSED] Composite
[07:54:53] [PASSED] SVIDEO
[07:54:53] [PASSED] LVDS
[07:54:53] [PASSED] Component
[07:54:53] [PASSED] DIN
[07:54:53] [PASSED] DP
[07:54:53] [PASSED] TV
[07:54:53] [PASSED] eDP
[07:54:53] [PASSED] Virtual
[07:54:53] [PASSED] DSI
[07:54:53] [PASSED] DPI
[07:54:53] [PASSED] Writeback
[07:54:53] [PASSED] SPI
[07:54:53] [PASSED] USB
[07:54:53] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[07:54:53] ============ [PASSED] drmm_connector_hdmi_init =============
[07:54:53] ============= drmm_connector_init (3 subtests) =============
[07:54:53] [PASSED] drm_test_drmm_connector_init
[07:54:53] [PASSED] drm_test_drmm_connector_init_null_ddc
[07:54:53] ========= drm_test_drmm_connector_init_type_valid =========
[07:54:53] [PASSED] Unknown
[07:54:53] [PASSED] VGA
[07:54:53] [PASSED] DVI-I
[07:54:53] [PASSED] DVI-D
[07:54:53] [PASSED] DVI-A
[07:54:53] [PASSED] Composite
[07:54:53] [PASSED] SVIDEO
[07:54:53] [PASSED] LVDS
[07:54:53] [PASSED] Component
[07:54:53] [PASSED] DIN
[07:54:53] [PASSED] DP
[07:54:53] [PASSED] HDMI-A
[07:54:53] [PASSED] HDMI-B
[07:54:53] [PASSED] TV
[07:54:53] [PASSED] eDP
[07:54:53] [PASSED] Virtual
[07:54:53] [PASSED] DSI
[07:54:53] [PASSED] DPI
[07:54:53] [PASSED] Writeback
[07:54:53] [PASSED] SPI
[07:54:53] [PASSED] USB
[07:54:53] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[07:54:53] =============== [PASSED] drmm_connector_init ===============
[07:54:53] ========= drm_connector_dynamic_init (6 subtests) ==========
[07:54:53] [PASSED] drm_test_drm_connector_dynamic_init
[07:54:53] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc
[07:54:53] [PASSED] drm_test_drm_connector_dynamic_init_not_added
[07:54:53] [PASSED] drm_test_drm_connector_dynamic_init_properties
[07:54:53] ===== drm_test_drm_connector_dynamic_init_type_valid ======
[07:54:53] [PASSED] Unknown
[07:54:53] [PASSED] VGA
[07:54:53] [PASSED] DVI-I
[07:54:53] [PASSED] DVI-D
[07:54:53] [PASSED] DVI-A
[07:54:53] [PASSED] Composite
[07:54:53] [PASSED] SVIDEO
[07:54:53] [PASSED] LVDS
[07:54:53] [PASSED] Component
[07:54:53] [PASSED] DIN
[07:54:53] [PASSED] DP
[07:54:53] [PASSED] HDMI-A
[07:54:53] [PASSED] HDMI-B
[07:54:53] [PASSED] TV
[07:54:53] [PASSED] eDP
[07:54:53] [PASSED] Virtual
[07:54:53] [PASSED] DSI
[07:54:53] [PASSED] DPI
[07:54:53] [PASSED] Writeback
[07:54:53] [PASSED] SPI
[07:54:53] [PASSED] USB
[07:54:53] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid ==
[07:54:53] ======== drm_test_drm_connector_dynamic_init_name =========
[07:54:53] [PASSED] Unknown
[07:54:53] [PASSED] VGA
[07:54:53] [PASSED] DVI-I
[07:54:53] [PASSED] DVI-D
[07:54:53] [PASSED] DVI-A
[07:54:53] [PASSED] Composite
[07:54:53] [PASSED] SVIDEO
[07:54:53] [PASSED] LVDS
[07:54:53] [PASSED] Component
[07:54:53] [PASSED] DIN
[07:54:53] [PASSED] DP
[07:54:53] [PASSED] HDMI-A
[07:54:53] [PASSED] HDMI-B
[07:54:53] [PASSED] TV
[07:54:53] [PASSED] eDP
[07:54:53] [PASSED] Virtual
[07:54:53] [PASSED] DSI
[07:54:53] [PASSED] DPI
[07:54:53] [PASSED] Writeback
[07:54:53] [PASSED] SPI
[07:54:53] [PASSED] USB
[07:54:53] ==== [PASSED] drm_test_drm_connector_dynamic_init_name =====
[07:54:53] =========== [PASSED] drm_connector_dynamic_init ============
[07:54:53] ==== drm_connector_dynamic_register_early (4 subtests) =====
[07:54:53] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list
[07:54:53] [PASSED] drm_test_drm_connector_dynamic_register_early_defer
[07:54:53] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init
[07:54:53] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object
[07:54:53] ====== [PASSED] drm_connector_dynamic_register_early =======
[07:54:53] ======= drm_connector_dynamic_register (7 subtests) ========
[07:54:53] [PASSED] drm_test_drm_connector_dynamic_register_on_list
[07:54:53] [PASSED] drm_test_drm_connector_dynamic_register_no_defer
[07:54:53] [PASSED] drm_test_drm_connector_dynamic_register_no_init
[07:54:53] [PASSED] drm_test_drm_connector_dynamic_register_mode_object
[07:54:53] [PASSED] drm_test_drm_connector_dynamic_register_sysfs
[07:54:53] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name
[07:54:53] [PASSED] drm_test_drm_connector_dynamic_register_debugfs
[07:54:53] ========= [PASSED] drm_connector_dynamic_register ==========
[07:54:53] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[07:54:53] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[07:54:53] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[07:54:53] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[07:54:53] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[07:54:53] ========== drm_test_get_tv_mode_from_name_valid ===========
[07:54:53] [PASSED] NTSC
[07:54:53] [PASSED] NTSC-443
[07:54:53] [PASSED] NTSC-J
[07:54:53] [PASSED] PAL
[07:54:53] [PASSED] PAL-M
[07:54:53] [PASSED] PAL-N
[07:54:53] [PASSED] SECAM
[07:54:53] [PASSED] Mono
[07:54:53] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[07:54:53] [PASSED] drm_test_get_tv_mode_from_name_truncated
[07:54:53] ============ [PASSED] drm_get_tv_mode_from_name ============
[07:54:53] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[07:54:53] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[07:54:53] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[07:54:53] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[07:54:53] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[07:54:53] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[07:54:53] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[07:54:53] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid =
[07:54:53] [PASSED] VIC 96
[07:54:53] [PASSED] VIC 97
[07:54:53] [PASSED] VIC 101
[07:54:53] [PASSED] VIC 102
[07:54:53] [PASSED] VIC 106
[07:54:53] [PASSED] VIC 107
[07:54:53] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[07:54:53] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[07:54:53] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[07:54:53] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[07:54:53] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[07:54:53] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[07:54:53] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[07:54:53] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[07:54:53] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name ====
[07:54:53] [PASSED] Automatic
[07:54:53] [PASSED] Full
[07:54:53] [PASSED] Limited 16:235
[07:54:53] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[07:54:53] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[07:54:53] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[07:54:53] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[07:54:53] === drm_test_drm_hdmi_connector_get_output_format_name ====
[07:54:53] [PASSED] RGB
[07:54:53] [PASSED] YUV 4:2:0
[07:54:53] [PASSED] YUV 4:2:2
[07:54:53] [PASSED] YUV 4:4:4
[07:54:53] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[07:54:53] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[07:54:53] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[07:54:53] ============= drm_damage_helper (21 subtests) ==============
[07:54:53] [PASSED] drm_test_damage_iter_no_damage
[07:54:53] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[07:54:53] [PASSED] drm_test_damage_iter_no_damage_src_moved
[07:54:53] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[07:54:53] [PASSED] drm_test_damage_iter_no_damage_not_visible
[07:54:53] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[07:54:53] [PASSED] drm_test_damage_iter_no_damage_no_fb
[07:54:53] [PASSED] drm_test_damage_iter_simple_damage
[07:54:53] [PASSED] drm_test_damage_iter_single_damage
[07:54:53] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[07:54:53] [PASSED] drm_test_damage_iter_single_damage_outside_src
[07:54:53] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[07:54:53] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[07:54:53] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[07:54:53] [PASSED] drm_test_damage_iter_single_damage_src_moved
[07:54:53] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[07:54:53] [PASSED] drm_test_damage_iter_damage
[07:54:53] [PASSED] drm_test_damage_iter_damage_one_intersect
[07:54:53] [PASSED] drm_test_damage_iter_damage_one_outside
[07:54:53] [PASSED] drm_test_damage_iter_damage_src_moved
[07:54:53] [PASSED] drm_test_damage_iter_damage_not_visible
[07:54:53] ================ [PASSED] drm_damage_helper ================
[07:54:53] ============== drm_dp_mst_helper (3 subtests) ==============
[07:54:53] ============== drm_test_dp_mst_calc_pbn_mode ==============
[07:54:53] [PASSED] Clock 154000 BPP 30 DSC disabled
[07:54:53] [PASSED] Clock 234000 BPP 30 DSC disabled
[07:54:53] [PASSED] Clock 297000 BPP 24 DSC disabled
[07:54:53] [PASSED] Clock 332880 BPP 24 DSC enabled
[07:54:53] [PASSED] Clock 324540 BPP 24 DSC enabled
[07:54:53] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[07:54:53] ============== drm_test_dp_mst_calc_pbn_div ===============
[07:54:53] [PASSED] Link rate 2000000 lane count 4
[07:54:53] [PASSED] Link rate 2000000 lane count 2
[07:54:53] [PASSED] Link rate 2000000 lane count 1
[07:54:53] [PASSED] Link rate 1350000 lane count 4
[07:54:53] [PASSED] Link rate 1350000 lane count 2
[07:54:53] [PASSED] Link rate 1350000 lane count 1
[07:54:53] [PASSED] Link rate 1000000 lane count 4
[07:54:53] [PASSED] Link rate 1000000 lane count 2
[07:54:53] [PASSED] Link rate 1000000 lane count 1
[07:54:53] [PASSED] Link rate 810000 lane count 4
[07:54:53] [PASSED] Link rate 810000 lane count 2
[07:54:53] [PASSED] Link rate 810000 lane count 1
[07:54:53] [PASSED] Link rate 540000 lane count 4
[07:54:53] [PASSED] Link rate 540000 lane count 2
[07:54:53] [PASSED] Link rate 540000 lane count 1
[07:54:53] [PASSED] Link rate 270000 lane count 4
[07:54:53] [PASSED] Link rate 270000 lane count 2
[07:54:53] [PASSED] Link rate 270000 lane count 1
[07:54:53] [PASSED] Link rate 162000 lane count 4
[07:54:53] [PASSED] Link rate 162000 lane count 2
[07:54:53] [PASSED] Link rate 162000 lane count 1
[07:54:53] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[07:54:53] ========= drm_test_dp_mst_sideband_msg_req_decode =========
[07:54:53] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[07:54:53] [PASSED] DP_POWER_UP_PHY with port number
[07:54:53] [PASSED] DP_POWER_DOWN_PHY with port number
[07:54:53] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[07:54:53] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[07:54:53] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[07:54:53] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[07:54:53] [PASSED] DP_QUERY_PAYLOAD with port number
[07:54:53] [PASSED] DP_QUERY_PAYLOAD with VCPI
[07:54:53] [PASSED] DP_REMOTE_DPCD_READ with port number
[07:54:53] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[07:54:53] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[07:54:53] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[07:54:53] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[07:54:53] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[07:54:53] [PASSED] DP_REMOTE_I2C_READ with port number
[07:54:53] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[07:54:53] [PASSED] DP_REMOTE_I2C_READ with transactions array
[07:54:53] [PASSED] DP_REMOTE_I2C_WRITE with port number
[07:54:53] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[07:54:53] [PASSED] DP_REMOTE_I2C_WRITE with data array
[07:54:53] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[07:54:53] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[07:54:53] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[07:54:53] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[07:54:53] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[07:54:53] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[07:54:53] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[07:54:53] ================ [PASSED] drm_dp_mst_helper ================
[07:54:53] ================== drm_exec (7 subtests) ===================
[07:54:53] [PASSED] sanitycheck
[07:54:53] [PASSED] test_lock
[07:54:53] [PASSED] test_lock_unlock
[07:54:53] [PASSED] test_duplicates
[07:54:53] [PASSED] test_prepare
[07:54:53] [PASSED] test_prepare_array
[07:54:53] [PASSED] test_multiple_loops
[07:54:53] ==================== [PASSED] drm_exec =====================
[07:54:53] =========== drm_format_helper_test (17 subtests) ===========
[07:54:53] ============== drm_test_fb_xrgb8888_to_gray8 ==============
[07:54:53] [PASSED] single_pixel_source_buffer
[07:54:53] [PASSED] single_pixel_clip_rectangle
[07:54:53] [PASSED] well_known_colors
[07:54:53] [PASSED] destination_pitch
[07:54:53] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[07:54:53] ============= drm_test_fb_xrgb8888_to_rgb332 ==============
[07:54:53] [PASSED] single_pixel_source_buffer
[07:54:53] [PASSED] single_pixel_clip_rectangle
[07:54:53] [PASSED] well_known_colors
[07:54:53] [PASSED] destination_pitch
[07:54:53] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[07:54:53] ============= drm_test_fb_xrgb8888_to_rgb565 ==============
[07:54:53] [PASSED] single_pixel_source_buffer
[07:54:53] [PASSED] single_pixel_clip_rectangle
[07:54:53] [PASSED] well_known_colors
[07:54:53] [PASSED] destination_pitch
[07:54:53] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[07:54:53] ============ drm_test_fb_xrgb8888_to_xrgb1555 =============
[07:54:53] [PASSED] single_pixel_source_buffer
[07:54:53] [PASSED] single_pixel_clip_rectangle
[07:54:53] [PASSED] well_known_colors
[07:54:53] [PASSED] destination_pitch
[07:54:53] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[07:54:53] ============ drm_test_fb_xrgb8888_to_argb1555 =============
[07:54:53] [PASSED] single_pixel_source_buffer
[07:54:53] [PASSED] single_pixel_clip_rectangle
[07:54:53] [PASSED] well_known_colors
[07:54:53] [PASSED] destination_pitch
[07:54:53] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[07:54:53] ============ drm_test_fb_xrgb8888_to_rgba5551 =============
[07:54:53] [PASSED] single_pixel_source_buffer
[07:54:53] [PASSED] single_pixel_clip_rectangle
[07:54:53] [PASSED] well_known_colors
[07:54:53] [PASSED] destination_pitch
[07:54:53] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[07:54:53] ============= drm_test_fb_xrgb8888_to_rgb888 ==============
[07:54:53] [PASSED] single_pixel_source_buffer
[07:54:53] [PASSED] single_pixel_clip_rectangle
[07:54:53] [PASSED] well_known_colors
[07:54:53] [PASSED] destination_pitch
[07:54:53] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[07:54:53] ============= drm_test_fb_xrgb8888_to_bgr888 ==============
[07:54:53] [PASSED] single_pixel_source_buffer
[07:54:53] [PASSED] single_pixel_clip_rectangle
[07:54:53] [PASSED] well_known_colors
[07:54:53] [PASSED] destination_pitch
[07:54:53] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ==========
[07:54:53] ============ drm_test_fb_xrgb8888_to_argb8888 =============
[07:54:53] [PASSED] single_pixel_source_buffer
[07:54:53] [PASSED] single_pixel_clip_rectangle
[07:54:53] [PASSED] well_known_colors
[07:54:53] [PASSED] destination_pitch
[07:54:53] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[07:54:53] =========== drm_test_fb_xrgb8888_to_xrgb2101010 ===========
[07:54:53] [PASSED] single_pixel_source_buffer
[07:54:53] [PASSED] single_pixel_clip_rectangle
[07:54:53] [PASSED] well_known_colors
[07:54:53] [PASSED] destination_pitch
[07:54:53] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[07:54:53] =========== drm_test_fb_xrgb8888_to_argb2101010 ===========
[07:54:53] [PASSED] single_pixel_source_buffer
[07:54:53] [PASSED] single_pixel_clip_rectangle
[07:54:53] [PASSED] well_known_colors
[07:54:53] [PASSED] destination_pitch
[07:54:53] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[07:54:53] ============== drm_test_fb_xrgb8888_to_mono ===============
[07:54:53] [PASSED] single_pixel_source_buffer
[07:54:53] [PASSED] single_pixel_clip_rectangle
[07:54:53] [PASSED] well_known_colors
[07:54:53] [PASSED] destination_pitch
[07:54:53] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[07:54:53] ==================== drm_test_fb_swab =====================
[07:54:53] [PASSED] single_pixel_source_buffer
[07:54:53] [PASSED] single_pixel_clip_rectangle
[07:54:53] [PASSED] well_known_colors
[07:54:53] [PASSED] destination_pitch
[07:54:53] ================ [PASSED] drm_test_fb_swab =================
[07:54:53] ============ drm_test_fb_xrgb8888_to_xbgr8888 =============
[07:54:53] [PASSED] single_pixel_source_buffer
[07:54:53] [PASSED] single_pixel_clip_rectangle
[07:54:53] [PASSED] well_known_colors
[07:54:53] [PASSED] destination_pitch
[07:54:53] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[07:54:53] ============ drm_test_fb_xrgb8888_to_abgr8888 =============
[07:54:53] [PASSED] single_pixel_source_buffer
[07:54:53] [PASSED] single_pixel_clip_rectangle
[07:54:53] [PASSED] well_known_colors
[07:54:53] [PASSED] destination_pitch
[07:54:53] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[07:54:53] ================= drm_test_fb_clip_offset =================
[07:54:53] [PASSED] pass through
[07:54:53] [PASSED] horizontal offset
[07:54:53] [PASSED] vertical offset
[07:54:53] [PASSED] horizontal and vertical offset
[07:54:53] [PASSED] horizontal offset (custom pitch)
[07:54:53] [PASSED] vertical offset (custom pitch)
[07:54:53] [PASSED] horizontal and vertical offset (custom pitch)
[07:54:53] ============= [PASSED] drm_test_fb_clip_offset =============
[07:54:53] =================== drm_test_fb_memcpy ====================
[07:54:53] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[07:54:53] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[07:54:53] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[07:54:53] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[07:54:53] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[07:54:53] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[07:54:53] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[07:54:53] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[07:54:53] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[07:54:53] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[07:54:53] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[07:54:53] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[07:54:53] =============== [PASSED] drm_test_fb_memcpy ================
[07:54:53] ============= [PASSED] drm_format_helper_test ==============
[07:54:53] ================= drm_format (18 subtests) =================
[07:54:53] [PASSED] drm_test_format_block_width_invalid
[07:54:53] [PASSED] drm_test_format_block_width_one_plane
[07:54:53] [PASSED] drm_test_format_block_width_two_plane
[07:54:53] [PASSED] drm_test_format_block_width_three_plane
[07:54:53] [PASSED] drm_test_format_block_width_tiled
[07:54:53] [PASSED] drm_test_format_block_height_invalid
[07:54:53] [PASSED] drm_test_format_block_height_one_plane
[07:54:53] [PASSED] drm_test_format_block_height_two_plane
[07:54:53] [PASSED] drm_test_format_block_height_three_plane
[07:54:53] [PASSED] drm_test_format_block_height_tiled
[07:54:53] [PASSED] drm_test_format_min_pitch_invalid
[07:54:53] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[07:54:53] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[07:54:53] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[07:54:53] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[07:54:53] [PASSED] drm_test_format_min_pitch_two_plane
[07:54:53] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[07:54:53] [PASSED] drm_test_format_min_pitch_tiled
[07:54:53] =================== [PASSED] drm_format ====================
[07:54:53] ============== drm_framebuffer (10 subtests) ===============
[07:54:53] ========== drm_test_framebuffer_check_src_coords ==========
[07:54:53] [PASSED] Success: source fits into fb
[07:54:53] [PASSED] Fail: overflowing fb with x-axis coordinate
[07:54:53] [PASSED] Fail: overflowing fb with y-axis coordinate
[07:54:53] [PASSED] Fail: overflowing fb with source width
[07:54:53] [PASSED] Fail: overflowing fb with source height
[07:54:53] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[07:54:53] [PASSED] drm_test_framebuffer_cleanup
[07:54:53] =============== drm_test_framebuffer_create ===============
[07:54:53] [PASSED] ABGR8888 normal sizes
[07:54:53] [PASSED] ABGR8888 max sizes
[07:54:53] [PASSED] ABGR8888 pitch greater than min required
[07:54:53] [PASSED] ABGR8888 pitch less than min required
[07:54:53] [PASSED] ABGR8888 Invalid width
[07:54:53] [PASSED] ABGR8888 Invalid buffer handle
[07:54:53] [PASSED] No pixel format
[07:54:53] [PASSED] ABGR8888 Width 0
[07:54:53] [PASSED] ABGR8888 Height 0
[07:54:53] [PASSED] ABGR8888 Out of bound height * pitch combination
[07:54:53] [PASSED] ABGR8888 Large buffer offset
[07:54:53] [PASSED] ABGR8888 Buffer offset for inexistent plane
[07:54:53] [PASSED] ABGR8888 Invalid flag
[07:54:53] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[07:54:53] [PASSED] ABGR8888 Valid buffer modifier
[07:54:53] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[07:54:53] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[07:54:53] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[07:54:53] [PASSED] NV12 Normal sizes
[07:54:53] [PASSED] NV12 Max sizes
[07:54:53] [PASSED] NV12 Invalid pitch
[07:54:53] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[07:54:53] [PASSED] NV12 different modifier per-plane
[07:54:53] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[07:54:53] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[07:54:53] [PASSED] NV12 Modifier for inexistent plane
[07:54:53] [PASSED] NV12 Handle for inexistent plane
[07:54:53] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[07:54:53] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[07:54:53] [PASSED] YVU420 Normal sizes
[07:54:53] [PASSED] YVU420 Max sizes
[07:54:53] [PASSED] YVU420 Invalid pitch
[07:54:53] [PASSED] YVU420 Different pitches
[07:54:53] [PASSED] YVU420 Different buffer offsets/pitches
[07:54:53] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[07:54:53] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[07:54:53] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[07:54:53] [PASSED] YVU420 Valid modifier
[07:54:53] [PASSED] YVU420 Different modifiers per plane
[07:54:53] [PASSED] YVU420 Modifier for inexistent plane
[07:54:53] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[07:54:53] [PASSED] X0L2 Normal sizes
[07:54:53] [PASSED] X0L2 Max sizes
[07:54:53] [PASSED] X0L2 Invalid pitch
[07:54:53] [PASSED] X0L2 Pitch greater than minimum required
[07:54:53] [PASSED] X0L2 Handle for inexistent plane
[07:54:53] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[07:54:53] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[07:54:53] [PASSED] X0L2 Valid modifier
[07:54:53] [PASSED] X0L2 Modifier for inexistent plane
[07:54:53] =========== [PASSED] drm_test_framebuffer_create ===========
[07:54:53] [PASSED] drm_test_framebuffer_free
[07:54:53] [PASSED] drm_test_framebuffer_init
[07:54:53] [PASSED] drm_test_framebuffer_init_bad_format
[07:54:53] [PASSED] drm_test_framebuffer_init_dev_mismatch
[07:54:53] [PASSED] drm_test_framebuffer_lookup
[07:54:53] [PASSED] drm_test_framebuffer_lookup_inexistent
[07:54:53] [PASSED] drm_test_framebuffer_modifiers_not_supported
[07:54:53] ================= [PASSED] drm_framebuffer =================
[07:54:53] ================ drm_gem_shmem (8 subtests) ================
[07:54:53] [PASSED] drm_gem_shmem_test_obj_create
[07:54:53] [PASSED] drm_gem_shmem_test_obj_create_private
[07:54:53] [PASSED] drm_gem_shmem_test_pin_pages
[07:54:53] [PASSED] drm_gem_shmem_test_vmap
[07:54:53] [PASSED] drm_gem_shmem_test_get_pages_sgt
[07:54:53] [PASSED] drm_gem_shmem_test_get_sg_table
[07:54:53] [PASSED] drm_gem_shmem_test_madvise
[07:54:53] [PASSED] drm_gem_shmem_test_purge
[07:54:53] ================== [PASSED] drm_gem_shmem ==================
[07:54:53] === drm_atomic_helper_connector_hdmi_check (27 subtests) ===
[07:54:53] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[07:54:53] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[07:54:53] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[07:54:53] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[07:54:53] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[07:54:53] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[07:54:53] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420 =======
[07:54:53] [PASSED] Automatic
[07:54:53] [PASSED] Full
[07:54:53] [PASSED] Limited 16:235
[07:54:53] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 ===
[07:54:53] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[07:54:53] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[07:54:53] [PASSED] drm_test_check_disable_connector
[07:54:53] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[07:54:53] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb
[07:54:53] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420
[07:54:53] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422
[07:54:53] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420
[07:54:53] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420
[07:54:53] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[07:54:53] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[07:54:53] [PASSED] drm_test_check_output_bpc_dvi
[07:54:53] [PASSED] drm_test_check_output_bpc_format_vic_1
[07:54:53] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[07:54:53] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[07:54:53] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[07:54:53] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[07:54:53] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[07:54:53] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[07:54:53] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[07:54:53] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[07:54:53] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[07:54:53] [PASSED] drm_test_check_broadcast_rgb_value
[07:54:53] [PASSED] drm_test_check_bpc_8_value
[07:54:53] [PASSED] drm_test_check_bpc_10_value
[07:54:53] [PASSED] drm_test_check_bpc_12_value
[07:54:53] [PASSED] drm_test_check_format_value
[07:54:53] [PASSED] drm_test_check_tmds_char_value
[07:54:53] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[07:54:53] = drm_atomic_helper_connector_hdmi_mode_valid (4 subtests) =
[07:54:53] [PASSED] drm_test_check_mode_valid
[07:54:53] [PASSED] drm_test_check_mode_valid_reject
[07:54:53] [PASSED] drm_test_check_mode_valid_reject_rate
[07:54:53] [PASSED] drm_test_check_mode_valid_reject_max_clock
[07:54:53] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid ===
[07:54:53] ================= drm_managed (2 subtests) =================
[07:54:53] [PASSED] drm_test_managed_release_action
[07:54:53] [PASSED] drm_test_managed_run_action
[07:54:53] =================== [PASSED] drm_managed ===================
[07:54:53] =================== drm_mm (6 subtests) ====================
[07:54:53] [PASSED] drm_test_mm_init
[07:54:53] [PASSED] drm_test_mm_debug
[07:54:53] [PASSED] drm_test_mm_align32
[07:54:53] [PASSED] drm_test_mm_align64
[07:54:53] [PASSED] drm_test_mm_lowest
[07:54:53] [PASSED] drm_test_mm_highest
[07:54:53] ===================== [PASSED] drm_mm ======================
[07:54:53] ============= drm_modes_analog_tv (5 subtests) =============
[07:54:53] [PASSED] drm_test_modes_analog_tv_mono_576i
[07:54:53] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[07:54:53] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[07:54:53] [PASSED] drm_test_modes_analog_tv_pal_576i
[07:54:53] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[07:54:53] =============== [PASSED] drm_modes_analog_tv ===============
[07:54:53] ============== drm_plane_helper (2 subtests) ===============
[07:54:53] =============== drm_test_check_plane_state ================
[07:54:53] [PASSED] clipping_simple
[07:54:53] [PASSED] clipping_rotate_reflect
[07:54:53] [PASSED] positioning_simple
[07:54:53] [PASSED] upscaling
[07:54:53] [PASSED] downscaling
[07:54:53] [PASSED] rounding1
[07:54:53] [PASSED] rounding2
[07:54:53] [PASSED] rounding3
[07:54:53] [PASSED] rounding4
[07:54:53] =========== [PASSED] drm_test_check_plane_state ============
[07:54:53] =========== drm_test_check_invalid_plane_state ============
[07:54:53] [PASSED] positioning_invalid
[07:54:53] [PASSED] upscaling_invalid
[07:54:53] [PASSED] downscaling_invalid
[07:54:53] ======= [PASSED] drm_test_check_invalid_plane_state ========
[07:54:53] ================ [PASSED] drm_plane_helper =================
[07:54:53] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[07:54:53] ====== drm_test_connector_helper_tv_get_modes_check =======
[07:54:53] [PASSED] None
[07:54:53] [PASSED] PAL
[07:54:53] [PASSED] NTSC
[07:54:53] [PASSED] Both, NTSC Default
[07:54:53] [PASSED] Both, PAL Default
[07:54:53] [PASSED] Both, NTSC Default, with PAL on command-line
[07:54:53] [PASSED] Both, PAL Default, with NTSC on command-line
[07:54:53] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[07:54:53] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[07:54:53] ================== drm_rect (9 subtests) ===================
[07:54:53] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[07:54:53] [PASSED] drm_test_rect_clip_scaled_not_clipped
[07:54:53] [PASSED] drm_test_rect_clip_scaled_clipped
[07:54:53] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[07:54:53] ================= drm_test_rect_intersect =================
[07:54:53] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[07:54:53] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[07:54:53] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[07:54:53] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[07:54:53] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[07:54:53] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[07:54:53] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[07:54:53] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[07:54:53] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[07:54:53] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[07:54:53] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[07:54:53] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[07:54:53] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[07:54:53] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[07:54:53] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[07:54:53] ============= [PASSED] drm_test_rect_intersect =============
[07:54:53] ================ drm_test_rect_calc_hscale ================
[07:54:53] [PASSED] normal use
[07:54:53] [PASSED] out of max range
[07:54:53] [PASSED] out of min range
[07:54:53] [PASSED] zero dst
[07:54:53] [PASSED] negative src
[07:54:53] [PASSED] negative dst
[07:54:53] ============ [PASSED] drm_test_rect_calc_hscale ============
[07:54:53] ================ drm_test_rect_calc_vscale ================
[07:54:53] [PASSED] normal use
[07:54:53] [PASSED] out of max range
[07:54:53] [PASSED] out of min range
[07:54:53] [PASSED] zero dst
[07:54:53] [PASSED] negative src
[07:54:53] [PASSED] negative dst
[07:54:53] ============ [PASSED] drm_test_rect_calc_vscale ============
[07:54:53] ================== drm_test_rect_rotate ===================
[07:54:53] [PASSED] reflect-x
[07:54:53] [PASSED] reflect-y
[07:54:53] [PASSED] rotate-0
[07:54:53] [PASSED] rotate-90
[07:54:53] [PASSED] rotate-180
[07:54:53] [PASSED] rotate-270
stty: 'standard input': Inappropriate ioctl for device
[07:54:53] ============== [PASSED] drm_test_rect_rotate ===============
[07:54:53] ================ drm_test_rect_rotate_inv =================
[07:54:53] [PASSED] reflect-x
[07:54:53] [PASSED] reflect-y
[07:54:53] [PASSED] rotate-0
[07:54:53] [PASSED] rotate-90
[07:54:53] [PASSED] rotate-180
[07:54:53] [PASSED] rotate-270
[07:54:53] ============ [PASSED] drm_test_rect_rotate_inv =============
[07:54:53] ==================== [PASSED] drm_rect =====================
[07:54:53] ============ drm_sysfb_modeset_test (1 subtest) ============
[07:54:53] ============ drm_test_sysfb_build_fourcc_list =============
[07:54:53] [PASSED] no native formats
[07:54:53] [PASSED] XRGB8888 as native format
[07:54:53] [PASSED] remove duplicates
[07:54:53] [PASSED] convert alpha formats
[07:54:53] [PASSED] random formats
[07:54:53] ======== [PASSED] drm_test_sysfb_build_fourcc_list =========
[07:54:53] ============= [PASSED] drm_sysfb_modeset_test ==============
[07:54:53] ============================================================
[07:54:53] Testing complete. Ran 616 tests: passed: 616
[07:54:53] Elapsed time: 23.630s total, 1.723s configuring, 21.687s building, 0.190s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[07:54:54] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[07:54:55] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[07:55:03] Starting KUnit Kernel (1/1)...
[07:55:03] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[07:55:03] ================= ttm_device (5 subtests) ==================
[07:55:03] [PASSED] ttm_device_init_basic
[07:55:03] [PASSED] ttm_device_init_multiple
[07:55:03] [PASSED] ttm_device_fini_basic
[07:55:03] [PASSED] ttm_device_init_no_vma_man
[07:55:03] ================== ttm_device_init_pools ==================
[07:55:03] [PASSED] No DMA allocations, no DMA32 required
[07:55:03] [PASSED] DMA allocations, DMA32 required
[07:55:03] [PASSED] No DMA allocations, DMA32 required
[07:55:03] [PASSED] DMA allocations, no DMA32 required
[07:55:03] ============== [PASSED] ttm_device_init_pools ==============
[07:55:03] =================== [PASSED] ttm_device ====================
[07:55:03] ================== ttm_pool (8 subtests) ===================
[07:55:03] ================== ttm_pool_alloc_basic ===================
[07:55:03] [PASSED] One page
[07:55:03] [PASSED] More than one page
[07:55:03] [PASSED] Above the allocation limit
[07:55:03] [PASSED] One page, with coherent DMA mappings enabled
[07:55:03] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[07:55:03] ============== [PASSED] ttm_pool_alloc_basic ===============
[07:55:03] ============== ttm_pool_alloc_basic_dma_addr ==============
[07:55:03] [PASSED] One page
[07:55:03] [PASSED] More than one page
[07:55:03] [PASSED] Above the allocation limit
[07:55:03] [PASSED] One page, with coherent DMA mappings enabled
[07:55:03] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[07:55:03] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[07:55:03] [PASSED] ttm_pool_alloc_order_caching_match
[07:55:03] [PASSED] ttm_pool_alloc_caching_mismatch
[07:55:03] [PASSED] ttm_pool_alloc_order_mismatch
[07:55:03] [PASSED] ttm_pool_free_dma_alloc
[07:55:03] [PASSED] ttm_pool_free_no_dma_alloc
[07:55:03] [PASSED] ttm_pool_fini_basic
[07:55:03] ==================== [PASSED] ttm_pool =====================
[07:55:03] ================ ttm_resource (8 subtests) =================
[07:55:03] ================= ttm_resource_init_basic =================
[07:55:03] [PASSED] Init resource in TTM_PL_SYSTEM
[07:55:03] [PASSED] Init resource in TTM_PL_VRAM
[07:55:03] [PASSED] Init resource in a private placement
[07:55:03] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[07:55:03] ============= [PASSED] ttm_resource_init_basic =============
[07:55:03] [PASSED] ttm_resource_init_pinned
[07:55:03] [PASSED] ttm_resource_fini_basic
[07:55:03] [PASSED] ttm_resource_manager_init_basic
[07:55:03] [PASSED] ttm_resource_manager_usage_basic
[07:55:03] [PASSED] ttm_resource_manager_set_used_basic
[07:55:03] [PASSED] ttm_sys_man_alloc_basic
[07:55:03] [PASSED] ttm_sys_man_free_basic
[07:55:03] ================== [PASSED] ttm_resource ===================
[07:55:03] =================== ttm_tt (15 subtests) ===================
[07:55:03] ==================== ttm_tt_init_basic ====================
[07:55:03] [PASSED] Page-aligned size
[07:55:03] [PASSED] Extra pages requested
[07:55:03] ================ [PASSED] ttm_tt_init_basic ================
[07:55:03] [PASSED] ttm_tt_init_misaligned
[07:55:03] [PASSED] ttm_tt_fini_basic
[07:55:03] [PASSED] ttm_tt_fini_sg
[07:55:03] [PASSED] ttm_tt_fini_shmem
[07:55:03] [PASSED] ttm_tt_create_basic
[07:55:03] [PASSED] ttm_tt_create_invalid_bo_type
[07:55:03] [PASSED] ttm_tt_create_ttm_exists
[07:55:03] [PASSED] ttm_tt_create_failed
[07:55:03] [PASSED] ttm_tt_destroy_basic
[07:55:03] [PASSED] ttm_tt_populate_null_ttm
[07:55:03] [PASSED] ttm_tt_populate_populated_ttm
[07:55:03] [PASSED] ttm_tt_unpopulate_basic
[07:55:03] [PASSED] ttm_tt_unpopulate_empty_ttm
[07:55:03] [PASSED] ttm_tt_swapin_basic
[07:55:03] ===================== [PASSED] ttm_tt ======================
[07:55:03] =================== ttm_bo (14 subtests) ===================
[07:55:03] =========== ttm_bo_reserve_optimistic_no_ticket ===========
[07:55:03] [PASSED] Cannot be interrupted and sleeps
[07:55:03] [PASSED] Cannot be interrupted, locks straight away
[07:55:03] [PASSED] Can be interrupted, sleeps
[07:55:03] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[07:55:03] [PASSED] ttm_bo_reserve_locked_no_sleep
[07:55:03] [PASSED] ttm_bo_reserve_no_wait_ticket
[07:55:03] [PASSED] ttm_bo_reserve_double_resv
[07:55:03] [PASSED] ttm_bo_reserve_interrupted
[07:55:03] [PASSED] ttm_bo_reserve_deadlock
[07:55:03] [PASSED] ttm_bo_unreserve_basic
[07:55:03] [PASSED] ttm_bo_unreserve_pinned
[07:55:03] [PASSED] ttm_bo_unreserve_bulk
[07:55:03] [PASSED] ttm_bo_put_basic
[07:55:03] [PASSED] ttm_bo_put_shared_resv
[07:55:03] [PASSED] ttm_bo_pin_basic
[07:55:03] [PASSED] ttm_bo_pin_unpin_resource
[07:55:03] [PASSED] ttm_bo_multiple_pin_one_unpin
[07:55:03] ===================== [PASSED] ttm_bo ======================
[07:55:03] ============== ttm_bo_validate (22 subtests) ===============
[07:55:03] ============== ttm_bo_init_reserved_sys_man ===============
[07:55:03] [PASSED] Buffer object for userspace
[07:55:03] [PASSED] Kernel buffer object
[07:55:03] [PASSED] Shared buffer object
[07:55:03] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[07:55:03] ============== ttm_bo_init_reserved_mock_man ==============
[07:55:03] [PASSED] Buffer object for userspace
[07:55:03] [PASSED] Kernel buffer object
[07:55:03] [PASSED] Shared buffer object
[07:55:03] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[07:55:03] [PASSED] ttm_bo_init_reserved_resv
[07:55:03] ================== ttm_bo_validate_basic ==================
[07:55:03] [PASSED] Buffer object for userspace
[07:55:03] [PASSED] Kernel buffer object
[07:55:03] [PASSED] Shared buffer object
[07:55:03] ============== [PASSED] ttm_bo_validate_basic ==============
[07:55:03] [PASSED] ttm_bo_validate_invalid_placement
[07:55:03] ============= ttm_bo_validate_same_placement ==============
[07:55:03] [PASSED] System manager
[07:55:03] [PASSED] VRAM manager
[07:55:03] ========= [PASSED] ttm_bo_validate_same_placement ==========
[07:55:03] [PASSED] ttm_bo_validate_failed_alloc
[07:55:03] [PASSED] ttm_bo_validate_pinned
[07:55:03] [PASSED] ttm_bo_validate_busy_placement
[07:55:03] ================ ttm_bo_validate_multihop =================
[07:55:03] [PASSED] Buffer object for userspace
[07:55:03] [PASSED] Kernel buffer object
[07:55:03] [PASSED] Shared buffer object
[07:55:03] ============ [PASSED] ttm_bo_validate_multihop =============
[07:55:03] ========== ttm_bo_validate_no_placement_signaled ==========
[07:55:03] [PASSED] Buffer object in system domain, no page vector
[07:55:03] [PASSED] Buffer object in system domain with an existing page vector
[07:55:03] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[07:55:03] ======== ttm_bo_validate_no_placement_not_signaled ========
[07:55:03] [PASSED] Buffer object for userspace
[07:55:03] [PASSED] Kernel buffer object
[07:55:03] [PASSED] Shared buffer object
[07:55:03] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[07:55:03] [PASSED] ttm_bo_validate_move_fence_signaled
[07:55:03] ========= ttm_bo_validate_move_fence_not_signaled =========
[07:55:03] [PASSED] Waits for GPU
[07:55:03] [PASSED] Tries to lock straight away
[07:55:04] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[07:55:04] [PASSED] ttm_bo_validate_swapout
[07:55:04] [PASSED] ttm_bo_validate_happy_evict
[07:55:04] [PASSED] ttm_bo_validate_all_pinned_evict
[07:55:04] [PASSED] ttm_bo_validate_allowed_only_evict
[07:55:04] [PASSED] ttm_bo_validate_deleted_evict
[07:55:04] [PASSED] ttm_bo_validate_busy_domain_evict
[07:55:04] [PASSED] ttm_bo_validate_evict_gutting
[07:55:04] [PASSED] ttm_bo_validate_recrusive_evict
stty: 'standard input': Inappropriate ioctl for device
[07:55:04] ================= [PASSED] ttm_bo_validate =================
[07:55:04] ============================================================
[07:55:04] Testing complete. Ran 102 tests: passed: 102
[07:55:04] Elapsed time: 10.152s total, 1.710s configuring, 7.824s building, 0.532s running
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
^ permalink raw reply [flat|nested] 17+ messages in thread* [PATCH v8 1/3] drm/xe/vf: Create contexts for CCS read write
2025-06-19 8:04 [PATCH v8 0/3] CCS save restore for IGPU Satyanarayana K V P
2025-06-19 7:53 ` ✗ CI.checkpatch: warning for CCS save restore for IGPU (rev8) Patchwork
2025-06-19 7:55 ` ✓ CI.KUnit: success " Patchwork
@ 2025-06-19 8:04 ` Satyanarayana K V P
2025-06-20 16:20 ` Matthew Brost
2025-06-19 8:04 ` [PATCH v8 2/3] drm/xe/vf: Attach and detach CCS copy commands with BO Satyanarayana K V P
` (3 subsequent siblings)
6 siblings, 1 reply; 17+ messages in thread
From: Satyanarayana K V P @ 2025-06-19 8:04 UTC (permalink / raw)
To: intel-xe
Cc: Satyanarayana K V P, Michal Wajdeczko, Matthew Brost,
Michał Winiarski, Tomasz Lis, Matthew Auld
Create two LRCs to handle CCS meta data read / write from CCS pool in the
VM. Read context is used to hold GPU instructions to be executed at save
time and write context is used to hold GPU instructions to be executed at
the restore time.
Allocate batch buffer pool using suballocator for both read and write
contexts.
Migration framework is reused to create LRCAs for read and write.
Signed-off-by: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Michał Winiarski <michal.winiarski@intel.com>
---
Cc: Tomasz Lis <tomasz.lis@intel.com>
Cc: Matthew Auld <matthew.auld@intel.com>
V7 -> V8:
- None.
V6 -> V7:
- Fixed review comments (Michal Wajdeczko & Matthew Brost).
V5 -> V6:
- Added id field in the xe_tile_vf_ccs structure for self identification.
V4 -> V5:
- Modified read/write contexts to enums from #defines (Matthew Brost).
- The CCS BB pool size is calculated based on the system memory size (Michal
Wajdeczko & Matthew Brost).
V3 -> V4:
- Fixed issues reported by patchworks.
V2 -> V3:
- Added new variable which denotes the initialization of contexts.
V1 -> V2:
- Fixed review comments.
---
drivers/gpu/drm/xe/Makefile | 1 +
drivers/gpu/drm/xe/xe_device.c | 4 +
drivers/gpu/drm/xe/xe_device_types.h | 4 +
drivers/gpu/drm/xe/xe_gt_debugfs.c | 36 ++++
drivers/gpu/drm/xe/xe_sriov.c | 19 ++
drivers/gpu/drm/xe/xe_sriov.h | 1 +
drivers/gpu/drm/xe/xe_sriov_types.h | 5 +
drivers/gpu/drm/xe/xe_sriov_vf_ccs.c | 210 +++++++++++++++++++++
drivers/gpu/drm/xe/xe_sriov_vf_ccs.h | 13 ++
drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h | 45 +++++
10 files changed, 338 insertions(+)
create mode 100644 drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
create mode 100644 drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
create mode 100644 drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
index f5f5775acdc0..3b5241937742 100644
--- a/drivers/gpu/drm/xe/Makefile
+++ b/drivers/gpu/drm/xe/Makefile
@@ -140,6 +140,7 @@ xe-y += \
xe_memirq.o \
xe_sriov.o \
xe_sriov_vf.o \
+ xe_sriov_vf_ccs.o \
xe_tile_sriov_vf.o
xe-$(CONFIG_PCI_IOV) += \
diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
index 8cfcfff250ca..f1335c1d0183 100644
--- a/drivers/gpu/drm/xe/xe_device.c
+++ b/drivers/gpu/drm/xe/xe_device.c
@@ -926,6 +926,10 @@ int xe_device_probe(struct xe_device *xe)
xe_vsec_init(xe);
+ err = xe_sriov_late_init(xe);
+ if (err)
+ goto err_unregister_display;
+
return devm_add_action_or_reset(xe->drm.dev, xe_device_sanitize, xe);
err_unregister_display:
diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h
index 003afb279a5e..5d2d87cc1c20 100644
--- a/drivers/gpu/drm/xe/xe_device_types.h
+++ b/drivers/gpu/drm/xe/xe_device_types.h
@@ -22,6 +22,7 @@
#include "xe_pmu_types.h"
#include "xe_pt_types.h"
#include "xe_sriov_types.h"
+#include "xe_sriov_vf_ccs_types.h"
#include "xe_step_types.h"
#include "xe_survivability_mode_types.h"
#include "xe_ttm_vram_mgr_types.h"
@@ -234,6 +235,9 @@ struct xe_tile {
struct {
/** @sriov.vf.ggtt_balloon: GGTT regions excluded from use. */
struct xe_ggtt_node *ggtt_balloon[2];
+
+ /** @sriov.vf.ccs: CCS read and write contexts for VF. */
+ struct xe_tile_vf_ccs ccs[XE_SRIOV_VF_CCS_CTX_COUNT];
} vf;
} sriov;
diff --git a/drivers/gpu/drm/xe/xe_gt_debugfs.c b/drivers/gpu/drm/xe/xe_gt_debugfs.c
index 848618acdca8..404844515523 100644
--- a/drivers/gpu/drm/xe/xe_gt_debugfs.c
+++ b/drivers/gpu/drm/xe/xe_gt_debugfs.c
@@ -134,6 +134,30 @@ static int sa_info(struct xe_gt *gt, struct drm_printer *p)
return 0;
}
+static int sa_info_vf_ccs(struct xe_gt *gt, struct drm_printer *p)
+{
+ struct xe_tile *tile = gt_to_tile(gt);
+ struct xe_sa_manager *bb_pool;
+ enum xe_sriov_vf_ccs_rw_ctxs ctx_id;
+
+ if (!IS_VF_CCS_READY(gt_to_xe(gt)))
+ return 0;
+
+ xe_pm_runtime_get(gt_to_xe(gt));
+
+ for_each_ccs_rw_ctx(ctx_id) {
+ drm_printf(p, "ccs %s bb suballoc info\n", ctx_id ? "write" : "read");
+ drm_printf(p, "-------------------------\n");
+ bb_pool = tile->sriov.vf.ccs[ctx_id].mem.ccs_bb_pool;
+ drm_suballoc_dump_debug_info(&bb_pool->base, p, bb_pool->gpu_addr);
+ drm_puts(p, "\n");
+ }
+
+ xe_pm_runtime_put(gt_to_xe(gt));
+
+ return 0;
+}
+
static int topology(struct xe_gt *gt, struct drm_printer *p)
{
xe_pm_runtime_get(gt_to_xe(gt));
@@ -303,6 +327,13 @@ static const struct drm_info_list vf_safe_debugfs_list[] = {
{"hwconfig", .show = xe_gt_debugfs_simple_show, .data = hwconfig},
};
+/*
+ * only for GT debugfs files which are valid on VF. Not valid on PF.
+ */
+static const struct drm_info_list vf_only_debugfs_list[] = {
+ {"sa_info_vf_ccs", .show = xe_gt_debugfs_simple_show, .data = sa_info_vf_ccs},
+};
+
/* everything else should be added here */
static const struct drm_info_list pf_only_debugfs_list[] = {
{"hw_engines", .show = xe_gt_debugfs_simple_show, .data = hw_engines},
@@ -419,6 +450,11 @@ void xe_gt_debugfs_register(struct xe_gt *gt)
drm_debugfs_create_files(pf_only_debugfs_list,
ARRAY_SIZE(pf_only_debugfs_list),
root, minor);
+ else
+ drm_debugfs_create_files(vf_only_debugfs_list,
+ ARRAY_SIZE(vf_only_debugfs_list),
+ root, minor);
+
xe_uc_debugfs_register(>->uc, root);
diff --git a/drivers/gpu/drm/xe/xe_sriov.c b/drivers/gpu/drm/xe/xe_sriov.c
index a0eab44c0e76..87911fb4eea7 100644
--- a/drivers/gpu/drm/xe/xe_sriov.c
+++ b/drivers/gpu/drm/xe/xe_sriov.c
@@ -15,6 +15,7 @@
#include "xe_sriov.h"
#include "xe_sriov_pf.h"
#include "xe_sriov_vf.h"
+#include "xe_sriov_vf_ccs.h"
/**
* xe_sriov_mode_to_string - Convert enum value to string.
@@ -157,3 +158,21 @@ const char *xe_sriov_function_name(unsigned int n, char *buf, size_t size)
strscpy(buf, "PF", size);
return buf;
}
+
+/**
+ * xe_sriov_late_init() - SR-IOV late initialization functions.
+ * @xe: the &xe_device to initialize
+ *
+ * On VF this function will initialize code for CCS migration.
+ *
+ * Return: 0 on success or a negative error code on failure.
+ */
+int xe_sriov_late_init(struct xe_device *xe)
+{
+ int err = 0;
+
+ if (IS_VF_CCS_INIT_NEEDED(xe))
+ err = xe_sriov_vf_ccs_init(xe);
+
+ return err;
+}
diff --git a/drivers/gpu/drm/xe/xe_sriov.h b/drivers/gpu/drm/xe/xe_sriov.h
index 688fbabf08f1..0e0c1abf2d14 100644
--- a/drivers/gpu/drm/xe/xe_sriov.h
+++ b/drivers/gpu/drm/xe/xe_sriov.h
@@ -18,6 +18,7 @@ const char *xe_sriov_function_name(unsigned int n, char *buf, size_t len);
void xe_sriov_probe_early(struct xe_device *xe);
void xe_sriov_print_info(struct xe_device *xe, struct drm_printer *p);
int xe_sriov_init(struct xe_device *xe);
+int xe_sriov_late_init(struct xe_device *xe);
static inline enum xe_sriov_mode xe_device_sriov_mode(const struct xe_device *xe)
{
diff --git a/drivers/gpu/drm/xe/xe_sriov_types.h b/drivers/gpu/drm/xe/xe_sriov_types.h
index ca94382a721e..8abfdb2c5ead 100644
--- a/drivers/gpu/drm/xe/xe_sriov_types.h
+++ b/drivers/gpu/drm/xe/xe_sriov_types.h
@@ -71,6 +71,11 @@ struct xe_device_vf {
/** @migration.gt_flags: Per-GT request flags for VF migration recovery */
unsigned long gt_flags;
} migration;
+
+ struct {
+ /** @initialized: Initilalization of vf ccs is completed or not */
+ bool initialized;
+ } ccs;
};
#endif
diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
new file mode 100644
index 000000000000..ff5ad472eb96
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
@@ -0,0 +1,210 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2025 Intel Corporation
+ */
+
+#include "instructions/xe_mi_commands.h"
+#include "instructions/xe_gpu_commands.h"
+#include "xe_bo.h"
+#include "xe_device.h"
+#include "xe_migrate.h"
+#include "xe_sa.h"
+#include "xe_sriov_printk.h"
+#include "xe_sriov_vf_ccs.h"
+#include "xe_sriov_vf_ccs_types.h"
+
+/**
+ * DOC: VF save/restore of compression Meta Data
+ *
+ * VF KMD registers two special contexts/LRCAs.
+ *
+ * Save Context/LRCA: contain necessary cmds+page table to trigger Meta data /
+ * compression control surface (Aka CCS) save in regular System memory in VM.
+ *
+ * Restore Context/LRCA: contain necessary cmds+page table to trigger Meta data /
+ * compression control surface (Aka CCS) Restore from regular System memory in
+ * VM to corresponding CCS pool.
+ *
+ * Below diagram explain steps needed for VF save/Restore of compression Meta Data::
+ *
+ * CCS Save CCS Restore VF KMD Guc BCS
+ * LRCA LRCA
+ * | | | | |
+ * | | | | |
+ * | Create Save LRCA | | |
+ * [ ]<----------------------------- [ ] | |
+ * | | | | |
+ * | | | | |
+ * | | | Register save LRCA | |
+ * | | | with Guc | |
+ * | | [ ]--------------------------->[ ] |
+ * | | | | |
+ * | | Create restore LRCA | | |
+ * | [ ]<------------------[ ] | |
+ * | | | | |
+ * | | | Register restore LRCA | |
+ * | | | with Guc | |
+ * | | [ ]--------------------------->[ ] |
+ * | | | | |
+ * | | | | |
+ * | | [ ]------------------------- | |
+ * | | [ ] Allocate main memory. | | |
+ * | | [ ] Allocate CCS memory. | | |
+ * | | [ ] Update Main memory & | | |
+ * [ ]<------------------------------[ ] CCS pages PPGTT + BB | | |
+ * | [ ]<------------------[ ] cmds to save & restore.| | |
+ * | | [ ]<------------------------ | |
+ * | | | | |
+ * | | | | |
+ * | | | | |
+ * : : : : :
+ * ---------------------------- VF Paused -------------------------------------
+ * | | | | |
+ * | | | | |
+ * | | | |Schedule |
+ * | | | |CCS Save |
+ * | | | | LRCA |
+ * | | | [ ]------>[ ]
+ * | | | | |
+ * | | | | |
+ * | | | |CCS save |
+ * | | | |completed|
+ * | | | [ ]<------[ ]
+ * | | | | |
+ * : : : : :
+ * ---------------------------- VM Migrated -----------------------------------
+ * | | | | |
+ * | | | | |
+ * : : : : :
+ * ---------------------------- VF Resumed ------------------------------------
+ * | | | | |
+ * | | | | |
+ * | | [ ]-------------- | |
+ * | | [ ] Fix up GGTT | | |
+ * | | [ ]<------------- | |
+ * | | | | |
+ * | | | | |
+ * | | | Notify VF_RESFIX_DONE | |
+ * | | [ ]--------------------------->[ ] |
+ * | | | | |
+ * | | | |Schedule |
+ * | | | |CCS |
+ * | | | |Restore |
+ * | | | |LRCA |
+ * | | | [ ]------>[ ]
+ * | | | | |
+ * | | | | |
+ * | | | |CCS |
+ * | | | |restore |
+ * | | | |completed|
+ * | | | [ ]<------[ ]
+ * | | | | |
+ * | | | | |
+ * | | | VF_RESFIX_DONE complete | |
+ * | | | notification | |
+ * | | [ ]<---------------------------[ ] |
+ * | | | | |
+ * | | | | |
+ * : : : : :
+ * ------------------------- Continue VM restore ------------------------------
+ */
+
+static u64 get_ccs_bb_pool_size(struct xe_device *xe)
+{
+ u64 sys_mem_size, ccs_mem_size, ptes, bb_pool_size;
+ struct sysinfo si;
+
+ si_meminfo(&si);
+ sys_mem_size = si.totalram * si.mem_unit;
+ ccs_mem_size = sys_mem_size / NUM_BYTES_PER_CCS_BYTE(xe);
+ ptes = DIV_ROUND_UP(sys_mem_size + ccs_mem_size, XE_PAGE_SIZE);
+
+ /**
+ * We need below BB size to hold PTE mappings and some DWs for copy
+ * command. In reality, we need space for many copy commands. So, let
+ * us allocate double the calculated size which is enough to holds GPU
+ * instructions for the whole region.
+ */
+ bb_pool_size = ptes * sizeof(u32);
+
+ return round_up(bb_pool_size * 2, SZ_1M);
+}
+
+static int alloc_bb_pool(struct xe_tile *tile, struct xe_tile_vf_ccs *ctx)
+{
+ struct xe_device *xe = tile_to_xe(tile);
+ struct xe_sa_manager *sa_manager;
+ u64 bb_pool_size;
+ int offset, err;
+
+ bb_pool_size = get_ccs_bb_pool_size(xe);
+ xe_sriov_info(xe, "Allocating %s CCS BB pool size = %lldMB\n",
+ ctx->ctx_id ? "Restore" : "Save", bb_pool_size / SZ_1M);
+
+ sa_manager = xe_sa_bo_manager_init(tile, bb_pool_size, SZ_16);
+
+ if (IS_ERR(sa_manager)) {
+ xe_sriov_err(xe, "Suballocator init failed with error: %pe\n",
+ sa_manager);
+ err = PTR_ERR(sa_manager);
+ return err;
+ }
+
+ offset = 0;
+ xe_map_memset(xe, &sa_manager->bo->vmap, offset, MI_NOOP,
+ bb_pool_size);
+
+ offset = bb_pool_size - sizeof(u32);
+ xe_map_wr(xe, &sa_manager->bo->vmap, offset, u32, MI_BATCH_BUFFER_END);
+
+ ctx->mem.ccs_bb_pool = sa_manager;
+
+ return 0;
+}
+
+/**
+ * xe_sriov_vf_ccs_init - Setup LRCA for save & restore.
+ * @xe: the &xe_device to start recovery on
+ *
+ * This function shall be called only by VF. It initializes
+ * LRCA and suballocator needed for CCS save & restore.
+ *
+ * Return: 0 on success. Negative error code on failure.
+ */
+int xe_sriov_vf_ccs_init(struct xe_device *xe)
+{
+ enum xe_sriov_vf_ccs_rw_ctxs ctx_id;
+ struct xe_migrate *migrate;
+ struct xe_tile_vf_ccs *ctx;
+ struct xe_tile *tile;
+ int tile_id, err;
+
+ xe_assert(xe, IS_SRIOV_VF(xe));
+ xe_assert(xe, !IS_DGFX(xe));
+ xe_assert(xe, xe_device_has_flat_ccs(xe));
+
+ for_each_tile(tile, xe, tile_id) {
+ for_each_ccs_rw_ctx(ctx_id) {
+ ctx = &tile->sriov.vf.ccs[ctx_id];
+ ctx->ctx_id = ctx_id;
+
+ migrate = xe_migrate_init(tile);
+ if (IS_ERR(migrate)) {
+ err = PTR_ERR(migrate);
+ goto err_ret;
+ }
+ ctx->migrate = migrate;
+
+ err = alloc_bb_pool(tile, ctx);
+ if (err)
+ goto err_ret;
+ }
+ }
+
+ xe->sriov.vf.ccs.initialized = 1;
+
+ return 0;
+
+err_ret:
+ return err;
+}
diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
new file mode 100644
index 000000000000..5df9ba028d14
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
@@ -0,0 +1,13 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2025 Intel Corporation
+ */
+
+#ifndef _XE_SRIOV_VF_CCS_H_
+#define _XE_SRIOV_VF_CCS_H_
+
+struct xe_device;
+
+int xe_sriov_vf_ccs_init(struct xe_device *xe);
+
+#endif
diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h b/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
new file mode 100644
index 000000000000..6dc279d206ec
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
@@ -0,0 +1,45 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2025 Intel Corporation
+ */
+
+#ifndef _XE_SRIOV_VF_CCS_TYPES_H_
+#define _XE_SRIOV_VF_CCS_TYPES_H_
+
+#define for_each_ccs_rw_ctx(id__) \
+ for ((id__) = 0; (id__) < XE_SRIOV_VF_CCS_CTX_COUNT; (id__)++)
+
+#define IS_VF_CCS_READY(xe) ({ \
+ struct xe_device *___xe = (xe); \
+ xe_assert(___xe, IS_SRIOV_VF(___xe)); \
+ ___xe->sriov.vf.ccs.initialized; \
+ })
+
+#define IS_VF_CCS_INIT_NEEDED(xe) ({\
+ struct xe_device *___xe = (xe); \
+ IS_SRIOV_VF(___xe) && !IS_DGFX(___xe) && \
+ xe_device_has_flat_ccs(___xe) && GRAPHICS_VER(___xe) >= 20; \
+ })
+
+enum xe_sriov_vf_ccs_rw_ctxs {
+ XE_SRIOV_VF_CCS_READ_CTX,
+ XE_SRIOV_VF_CCS_WRITE_CTX,
+ XE_SRIOV_VF_CCS_CTX_COUNT
+};
+
+struct xe_migrate;
+struct xe_sa_manager;
+
+struct xe_tile_vf_ccs {
+ /** @id: Id to which context it belongs to */
+ enum xe_sriov_vf_ccs_rw_ctxs ctx_id;
+ /** @migrate: Migration helper for save/restore of CCS data */
+ struct xe_migrate *migrate;
+
+ struct {
+ /** @ccs_rw_bb_pool: Pool from which batch buffers are allocated. */
+ struct xe_sa_manager *ccs_bb_pool;
+ } mem;
+};
+
+#endif
--
2.43.0
^ permalink raw reply related [flat|nested] 17+ messages in thread* Re: [PATCH v8 1/3] drm/xe/vf: Create contexts for CCS read write
2025-06-19 8:04 ` [PATCH v8 1/3] drm/xe/vf: Create contexts for CCS read write Satyanarayana K V P
@ 2025-06-20 16:20 ` Matthew Brost
2025-06-24 9:21 ` K V P, Satyanarayana
0 siblings, 1 reply; 17+ messages in thread
From: Matthew Brost @ 2025-06-20 16:20 UTC (permalink / raw)
To: Satyanarayana K V P
Cc: intel-xe, Michal Wajdeczko, Michał Winiarski, Tomasz Lis,
Matthew Auld
On Thu, Jun 19, 2025 at 01:34:57PM +0530, Satyanarayana K V P wrote:
> Create two LRCs to handle CCS meta data read / write from CCS pool in the
> VM. Read context is used to hold GPU instructions to be executed at save
> time and write context is used to hold GPU instructions to be executed at
> the restore time.
>
> Allocate batch buffer pool using suballocator for both read and write
> contexts.
>
> Migration framework is reused to create LRCAs for read and write.
>
> Signed-off-by: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> Cc: Matthew Brost <matthew.brost@intel.com>
> Cc: Michał Winiarski <michal.winiarski@intel.com>
> ---
> Cc: Tomasz Lis <tomasz.lis@intel.com>
> Cc: Matthew Auld <matthew.auld@intel.com>
>
> V7 -> V8:
> - None.
>
> V6 -> V7:
> - Fixed review comments (Michal Wajdeczko & Matthew Brost).
>
> V5 -> V6:
> - Added id field in the xe_tile_vf_ccs structure for self identification.
>
> V4 -> V5:
> - Modified read/write contexts to enums from #defines (Matthew Brost).
> - The CCS BB pool size is calculated based on the system memory size (Michal
> Wajdeczko & Matthew Brost).
>
> V3 -> V4:
> - Fixed issues reported by patchworks.
>
> V2 -> V3:
> - Added new variable which denotes the initialization of contexts.
>
> V1 -> V2:
> - Fixed review comments.
> ---
> drivers/gpu/drm/xe/Makefile | 1 +
> drivers/gpu/drm/xe/xe_device.c | 4 +
> drivers/gpu/drm/xe/xe_device_types.h | 4 +
> drivers/gpu/drm/xe/xe_gt_debugfs.c | 36 ++++
> drivers/gpu/drm/xe/xe_sriov.c | 19 ++
> drivers/gpu/drm/xe/xe_sriov.h | 1 +
> drivers/gpu/drm/xe/xe_sriov_types.h | 5 +
> drivers/gpu/drm/xe/xe_sriov_vf_ccs.c | 210 +++++++++++++++++++++
> drivers/gpu/drm/xe/xe_sriov_vf_ccs.h | 13 ++
> drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h | 45 +++++
> 10 files changed, 338 insertions(+)
> create mode 100644 drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
> create mode 100644 drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
> create mode 100644 drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
>
> diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
> index f5f5775acdc0..3b5241937742 100644
> --- a/drivers/gpu/drm/xe/Makefile
> +++ b/drivers/gpu/drm/xe/Makefile
> @@ -140,6 +140,7 @@ xe-y += \
> xe_memirq.o \
> xe_sriov.o \
> xe_sriov_vf.o \
> + xe_sriov_vf_ccs.o \
> xe_tile_sriov_vf.o
>
> xe-$(CONFIG_PCI_IOV) += \
> diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
> index 8cfcfff250ca..f1335c1d0183 100644
> --- a/drivers/gpu/drm/xe/xe_device.c
> +++ b/drivers/gpu/drm/xe/xe_device.c
> @@ -926,6 +926,10 @@ int xe_device_probe(struct xe_device *xe)
>
> xe_vsec_init(xe);
>
> + err = xe_sriov_late_init(xe);
> + if (err)
> + goto err_unregister_display;
> +
> return devm_add_action_or_reset(xe->drm.dev, xe_device_sanitize, xe);
>
> err_unregister_display:
> diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h
> index 003afb279a5e..5d2d87cc1c20 100644
> --- a/drivers/gpu/drm/xe/xe_device_types.h
> +++ b/drivers/gpu/drm/xe/xe_device_types.h
> @@ -22,6 +22,7 @@
> #include "xe_pmu_types.h"
> #include "xe_pt_types.h"
> #include "xe_sriov_types.h"
> +#include "xe_sriov_vf_ccs_types.h"
> #include "xe_step_types.h"
> #include "xe_survivability_mode_types.h"
> #include "xe_ttm_vram_mgr_types.h"
> @@ -234,6 +235,9 @@ struct xe_tile {
> struct {
> /** @sriov.vf.ggtt_balloon: GGTT regions excluded from use. */
> struct xe_ggtt_node *ggtt_balloon[2];
> +
> + /** @sriov.vf.ccs: CCS read and write contexts for VF. */
> + struct xe_tile_vf_ccs ccs[XE_SRIOV_VF_CCS_CTX_COUNT];
> } vf;
> } sriov;
>
> diff --git a/drivers/gpu/drm/xe/xe_gt_debugfs.c b/drivers/gpu/drm/xe/xe_gt_debugfs.c
> index 848618acdca8..404844515523 100644
> --- a/drivers/gpu/drm/xe/xe_gt_debugfs.c
> +++ b/drivers/gpu/drm/xe/xe_gt_debugfs.c
> @@ -134,6 +134,30 @@ static int sa_info(struct xe_gt *gt, struct drm_printer *p)
> return 0;
> }
>
> +static int sa_info_vf_ccs(struct xe_gt *gt, struct drm_printer *p)
> +{
> + struct xe_tile *tile = gt_to_tile(gt);
> + struct xe_sa_manager *bb_pool;
> + enum xe_sriov_vf_ccs_rw_ctxs ctx_id;
> +
> + if (!IS_VF_CCS_READY(gt_to_xe(gt)))
> + return 0;
> +
> + xe_pm_runtime_get(gt_to_xe(gt));
> +
> + for_each_ccs_rw_ctx(ctx_id) {
> + drm_printf(p, "ccs %s bb suballoc info\n", ctx_id ? "write" : "read");
> + drm_printf(p, "-------------------------\n");
> + bb_pool = tile->sriov.vf.ccs[ctx_id].mem.ccs_bb_pool;
> + drm_suballoc_dump_debug_info(&bb_pool->base, p, bb_pool->gpu_addr);
> + drm_puts(p, "\n");
> + }
> +
> + xe_pm_runtime_put(gt_to_xe(gt));
> +
> + return 0;
> +}
> +
> static int topology(struct xe_gt *gt, struct drm_printer *p)
> {
> xe_pm_runtime_get(gt_to_xe(gt));
> @@ -303,6 +327,13 @@ static const struct drm_info_list vf_safe_debugfs_list[] = {
> {"hwconfig", .show = xe_gt_debugfs_simple_show, .data = hwconfig},
> };
>
> +/*
> + * only for GT debugfs files which are valid on VF. Not valid on PF.
> + */
> +static const struct drm_info_list vf_only_debugfs_list[] = {
> + {"sa_info_vf_ccs", .show = xe_gt_debugfs_simple_show, .data = sa_info_vf_ccs},
> +};
> +
> /* everything else should be added here */
> static const struct drm_info_list pf_only_debugfs_list[] = {
> {"hw_engines", .show = xe_gt_debugfs_simple_show, .data = hw_engines},
> @@ -419,6 +450,11 @@ void xe_gt_debugfs_register(struct xe_gt *gt)
> drm_debugfs_create_files(pf_only_debugfs_list,
> ARRAY_SIZE(pf_only_debugfs_list),
> root, minor);
> + else
> + drm_debugfs_create_files(vf_only_debugfs_list,
> + ARRAY_SIZE(vf_only_debugfs_list),
> + root, minor);
> +
>
> xe_uc_debugfs_register(>->uc, root);
>
> diff --git a/drivers/gpu/drm/xe/xe_sriov.c b/drivers/gpu/drm/xe/xe_sriov.c
> index a0eab44c0e76..87911fb4eea7 100644
> --- a/drivers/gpu/drm/xe/xe_sriov.c
> +++ b/drivers/gpu/drm/xe/xe_sriov.c
> @@ -15,6 +15,7 @@
> #include "xe_sriov.h"
> #include "xe_sriov_pf.h"
> #include "xe_sriov_vf.h"
> +#include "xe_sriov_vf_ccs.h"
>
> /**
> * xe_sriov_mode_to_string - Convert enum value to string.
> @@ -157,3 +158,21 @@ const char *xe_sriov_function_name(unsigned int n, char *buf, size_t size)
> strscpy(buf, "PF", size);
> return buf;
> }
> +
> +/**
> + * xe_sriov_late_init() - SR-IOV late initialization functions.
> + * @xe: the &xe_device to initialize
> + *
> + * On VF this function will initialize code for CCS migration.
> + *
> + * Return: 0 on success or a negative error code on failure.
> + */
> +int xe_sriov_late_init(struct xe_device *xe)
> +{
> + int err = 0;
> +
> + if (IS_VF_CCS_INIT_NEEDED(xe))
> + err = xe_sriov_vf_ccs_init(xe);
> +
> + return err;
> +}
> diff --git a/drivers/gpu/drm/xe/xe_sriov.h b/drivers/gpu/drm/xe/xe_sriov.h
> index 688fbabf08f1..0e0c1abf2d14 100644
> --- a/drivers/gpu/drm/xe/xe_sriov.h
> +++ b/drivers/gpu/drm/xe/xe_sriov.h
> @@ -18,6 +18,7 @@ const char *xe_sriov_function_name(unsigned int n, char *buf, size_t len);
> void xe_sriov_probe_early(struct xe_device *xe);
> void xe_sriov_print_info(struct xe_device *xe, struct drm_printer *p);
> int xe_sriov_init(struct xe_device *xe);
> +int xe_sriov_late_init(struct xe_device *xe);
>
> static inline enum xe_sriov_mode xe_device_sriov_mode(const struct xe_device *xe)
> {
> diff --git a/drivers/gpu/drm/xe/xe_sriov_types.h b/drivers/gpu/drm/xe/xe_sriov_types.h
> index ca94382a721e..8abfdb2c5ead 100644
> --- a/drivers/gpu/drm/xe/xe_sriov_types.h
> +++ b/drivers/gpu/drm/xe/xe_sriov_types.h
> @@ -71,6 +71,11 @@ struct xe_device_vf {
> /** @migration.gt_flags: Per-GT request flags for VF migration recovery */
> unsigned long gt_flags;
> } migration;
> +
> + struct {
> + /** @initialized: Initilalization of vf ccs is completed or not */
> + bool initialized;
> + } ccs;
> };
>
> #endif
> diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
> new file mode 100644
> index 000000000000..ff5ad472eb96
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
> @@ -0,0 +1,210 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright © 2025 Intel Corporation
> + */
> +
> +#include "instructions/xe_mi_commands.h"
> +#include "instructions/xe_gpu_commands.h"
> +#include "xe_bo.h"
> +#include "xe_device.h"
> +#include "xe_migrate.h"
> +#include "xe_sa.h"
> +#include "xe_sriov_printk.h"
> +#include "xe_sriov_vf_ccs.h"
> +#include "xe_sriov_vf_ccs_types.h"
> +
> +/**
> + * DOC: VF save/restore of compression Meta Data
> + *
> + * VF KMD registers two special contexts/LRCAs.
> + *
> + * Save Context/LRCA: contain necessary cmds+page table to trigger Meta data /
> + * compression control surface (Aka CCS) save in regular System memory in VM.
> + *
> + * Restore Context/LRCA: contain necessary cmds+page table to trigger Meta data /
> + * compression control surface (Aka CCS) Restore from regular System memory in
> + * VM to corresponding CCS pool.
> + *
> + * Below diagram explain steps needed for VF save/Restore of compression Meta Data::
> + *
> + * CCS Save CCS Restore VF KMD Guc BCS
> + * LRCA LRCA
> + * | | | | |
> + * | | | | |
> + * | Create Save LRCA | | |
> + * [ ]<----------------------------- [ ] | |
> + * | | | | |
> + * | | | | |
> + * | | | Register save LRCA | |
> + * | | | with Guc | |
> + * | | [ ]--------------------------->[ ] |
> + * | | | | |
> + * | | Create restore LRCA | | |
> + * | [ ]<------------------[ ] | |
> + * | | | | |
> + * | | | Register restore LRCA | |
> + * | | | with Guc | |
> + * | | [ ]--------------------------->[ ] |
> + * | | | | |
> + * | | | | |
> + * | | [ ]------------------------- | |
> + * | | [ ] Allocate main memory. | | |
> + * | | [ ] Allocate CCS memory. | | |
> + * | | [ ] Update Main memory & | | |
> + * [ ]<------------------------------[ ] CCS pages PPGTT + BB | | |
> + * | [ ]<------------------[ ] cmds to save & restore.| | |
> + * | | [ ]<------------------------ | |
> + * | | | | |
> + * | | | | |
> + * | | | | |
> + * : : : : :
> + * ---------------------------- VF Paused -------------------------------------
> + * | | | | |
> + * | | | | |
> + * | | | |Schedule |
> + * | | | |CCS Save |
> + * | | | | LRCA |
> + * | | | [ ]------>[ ]
> + * | | | | |
> + * | | | | |
> + * | | | |CCS save |
> + * | | | |completed|
> + * | | | [ ]<------[ ]
> + * | | | | |
> + * : : : : :
> + * ---------------------------- VM Migrated -----------------------------------
> + * | | | | |
> + * | | | | |
> + * : : : : :
> + * ---------------------------- VF Resumed ------------------------------------
> + * | | | | |
> + * | | | | |
> + * | | [ ]-------------- | |
> + * | | [ ] Fix up GGTT | | |
> + * | | [ ]<------------- | |
> + * | | | | |
> + * | | | | |
> + * | | | Notify VF_RESFIX_DONE | |
> + * | | [ ]--------------------------->[ ] |
> + * | | | | |
> + * | | | |Schedule |
> + * | | | |CCS |
> + * | | | |Restore |
> + * | | | |LRCA |
> + * | | | [ ]------>[ ]
> + * | | | | |
> + * | | | | |
> + * | | | |CCS |
> + * | | | |restore |
> + * | | | |completed|
> + * | | | [ ]<------[ ]
> + * | | | | |
> + * | | | | |
> + * | | | VF_RESFIX_DONE complete | |
> + * | | | notification | |
> + * | | [ ]<---------------------------[ ] |
> + * | | | | |
> + * | | | | |
> + * : : : : :
> + * ------------------------- Continue VM restore ------------------------------
> + */
> +
> +static u64 get_ccs_bb_pool_size(struct xe_device *xe)
> +{
> + u64 sys_mem_size, ccs_mem_size, ptes, bb_pool_size;
> + struct sysinfo si;
> +
> + si_meminfo(&si);
> + sys_mem_size = si.totalram * si.mem_unit;
> + ccs_mem_size = sys_mem_size / NUM_BYTES_PER_CCS_BYTE(xe);
> + ptes = DIV_ROUND_UP(sys_mem_size + ccs_mem_size, XE_PAGE_SIZE);
> +
> + /**
> + * We need below BB size to hold PTE mappings and some DWs for copy
> + * command. In reality, we need space for many copy commands. So, let
> + * us allocate double the calculated size which is enough to holds GPU
> + * instructions for the whole region.
> + */
> + bb_pool_size = ptes * sizeof(u32);
> +
> + return round_up(bb_pool_size * 2, SZ_1M);
> +}
> +
> +static int alloc_bb_pool(struct xe_tile *tile, struct xe_tile_vf_ccs *ctx)
> +{
> + struct xe_device *xe = tile_to_xe(tile);
> + struct xe_sa_manager *sa_manager;
> + u64 bb_pool_size;
> + int offset, err;
> +
> + bb_pool_size = get_ccs_bb_pool_size(xe);
> + xe_sriov_info(xe, "Allocating %s CCS BB pool size = %lldMB\n",
> + ctx->ctx_id ? "Restore" : "Save", bb_pool_size / SZ_1M);
> +
> + sa_manager = xe_sa_bo_manager_init(tile, bb_pool_size, SZ_16);
> +
> + if (IS_ERR(sa_manager)) {
> + xe_sriov_err(xe, "Suballocator init failed with error: %pe\n",
> + sa_manager);
> + err = PTR_ERR(sa_manager);
> + return err;
> + }
> +
> + offset = 0;
> + xe_map_memset(xe, &sa_manager->bo->vmap, offset, MI_NOOP,
> + bb_pool_size);
> +
> + offset = bb_pool_size - sizeof(u32);
> + xe_map_wr(xe, &sa_manager->bo->vmap, offset, u32, MI_BATCH_BUFFER_END);
> +
> + ctx->mem.ccs_bb_pool = sa_manager;
> +
> + return 0;
> +}
> +
> +/**
> + * xe_sriov_vf_ccs_init - Setup LRCA for save & restore.
> + * @xe: the &xe_device to start recovery on
> + *
> + * This function shall be called only by VF. It initializes
> + * LRCA and suballocator needed for CCS save & restore.
> + *
> + * Return: 0 on success. Negative error code on failure.
> + */
> +int xe_sriov_vf_ccs_init(struct xe_device *xe)
> +{
> + enum xe_sriov_vf_ccs_rw_ctxs ctx_id;
> + struct xe_migrate *migrate;
> + struct xe_tile_vf_ccs *ctx;
> + struct xe_tile *tile;
> + int tile_id, err;
> +
> + xe_assert(xe, IS_SRIOV_VF(xe));
> + xe_assert(xe, !IS_DGFX(xe));
> + xe_assert(xe, xe_device_has_flat_ccs(xe));
> +
> + for_each_tile(tile, xe, tile_id) {
Nit: This only needs to be done for 1 tile. All iGPU are 1 tile, so this
works but you could rewrite this entire series to avoid loops and rather
use xe_device_get_root_tile(). That might be better a bit more future
proof.
Nit aside, this LGTM and you can keep my previous:
Acked-by: Matthew Brost <matthew.brost@intel.com>
> + for_each_ccs_rw_ctx(ctx_id) {
> + ctx = &tile->sriov.vf.ccs[ctx_id];
> + ctx->ctx_id = ctx_id;
> +
> + migrate = xe_migrate_init(tile);
> + if (IS_ERR(migrate)) {
> + err = PTR_ERR(migrate);
> + goto err_ret;
> + }
> + ctx->migrate = migrate;
> +
> + err = alloc_bb_pool(tile, ctx);
> + if (err)
> + goto err_ret;
> + }
> + }
> +
> + xe->sriov.vf.ccs.initialized = 1;
> +
> + return 0;
> +
> +err_ret:
> + return err;
> +}
> diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
> new file mode 100644
> index 000000000000..5df9ba028d14
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
> @@ -0,0 +1,13 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2025 Intel Corporation
> + */
> +
> +#ifndef _XE_SRIOV_VF_CCS_H_
> +#define _XE_SRIOV_VF_CCS_H_
> +
> +struct xe_device;
> +
> +int xe_sriov_vf_ccs_init(struct xe_device *xe);
> +
> +#endif
> diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h b/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
> new file mode 100644
> index 000000000000..6dc279d206ec
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
> @@ -0,0 +1,45 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2025 Intel Corporation
> + */
> +
> +#ifndef _XE_SRIOV_VF_CCS_TYPES_H_
> +#define _XE_SRIOV_VF_CCS_TYPES_H_
> +
> +#define for_each_ccs_rw_ctx(id__) \
> + for ((id__) = 0; (id__) < XE_SRIOV_VF_CCS_CTX_COUNT; (id__)++)
> +
> +#define IS_VF_CCS_READY(xe) ({ \
> + struct xe_device *___xe = (xe); \
> + xe_assert(___xe, IS_SRIOV_VF(___xe)); \
> + ___xe->sriov.vf.ccs.initialized; \
> + })
> +
> +#define IS_VF_CCS_INIT_NEEDED(xe) ({\
> + struct xe_device *___xe = (xe); \
> + IS_SRIOV_VF(___xe) && !IS_DGFX(___xe) && \
> + xe_device_has_flat_ccs(___xe) && GRAPHICS_VER(___xe) >= 20; \
> + })
> +
> +enum xe_sriov_vf_ccs_rw_ctxs {
> + XE_SRIOV_VF_CCS_READ_CTX,
> + XE_SRIOV_VF_CCS_WRITE_CTX,
> + XE_SRIOV_VF_CCS_CTX_COUNT
> +};
> +
> +struct xe_migrate;
> +struct xe_sa_manager;
> +
> +struct xe_tile_vf_ccs {
> + /** @id: Id to which context it belongs to */
> + enum xe_sriov_vf_ccs_rw_ctxs ctx_id;
> + /** @migrate: Migration helper for save/restore of CCS data */
> + struct xe_migrate *migrate;
> +
> + struct {
> + /** @ccs_rw_bb_pool: Pool from which batch buffers are allocated. */
> + struct xe_sa_manager *ccs_bb_pool;
> + } mem;
> +};
> +
> +#endif
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 17+ messages in thread* Re: [PATCH v8 1/3] drm/xe/vf: Create contexts for CCS read write
2025-06-20 16:20 ` Matthew Brost
@ 2025-06-24 9:21 ` K V P, Satyanarayana
0 siblings, 0 replies; 17+ messages in thread
From: K V P, Satyanarayana @ 2025-06-24 9:21 UTC (permalink / raw)
To: Matthew Brost
Cc: intel-xe, Michal Wajdeczko, Michał Winiarski, Tomasz Lis,
Matthew Auld
[-- Attachment #1: Type: text/plain, Size: 21984 bytes --]
Hi.
On 20-06-2025 21:50, Matthew Brost wrote:
> On Thu, Jun 19, 2025 at 01:34:57PM +0530, Satyanarayana K V P wrote:
>> Create two LRCs to handle CCS meta data read / write from CCS pool in the
>> VM. Read context is used to hold GPU instructions to be executed at save
>> time and write context is used to hold GPU instructions to be executed at
>> the restore time.
>>
>> Allocate batch buffer pool using suballocator for both read and write
>> contexts.
>>
>> Migration framework is reused to create LRCAs for read and write.
>>
>> Signed-off-by: Satyanarayana K V P<satyanarayana.k.v.p@intel.com>
>> Cc: Michal Wajdeczko<michal.wajdeczko@intel.com>
>> Cc: Matthew Brost<matthew.brost@intel.com>
>> Cc: Michał Winiarski<michal.winiarski@intel.com>
>> ---
>> Cc: Tomasz Lis<tomasz.lis@intel.com>
>> Cc: Matthew Auld<matthew.auld@intel.com>
>>
>> V7 -> V8:
>> - None.
>>
>> V6 -> V7:
>> - Fixed review comments (Michal Wajdeczko & Matthew Brost).
>>
>> V5 -> V6:
>> - Added id field in the xe_tile_vf_ccs structure for self identification.
>>
>> V4 -> V5:
>> - Modified read/write contexts to enums from #defines (Matthew Brost).
>> - The CCS BB pool size is calculated based on the system memory size (Michal
>> Wajdeczko & Matthew Brost).
>>
>> V3 -> V4:
>> - Fixed issues reported by patchworks.
>>
>> V2 -> V3:
>> - Added new variable which denotes the initialization of contexts.
>>
>> V1 -> V2:
>> - Fixed review comments.
>> ---
>> drivers/gpu/drm/xe/Makefile | 1 +
>> drivers/gpu/drm/xe/xe_device.c | 4 +
>> drivers/gpu/drm/xe/xe_device_types.h | 4 +
>> drivers/gpu/drm/xe/xe_gt_debugfs.c | 36 ++++
>> drivers/gpu/drm/xe/xe_sriov.c | 19 ++
>> drivers/gpu/drm/xe/xe_sriov.h | 1 +
>> drivers/gpu/drm/xe/xe_sriov_types.h | 5 +
>> drivers/gpu/drm/xe/xe_sriov_vf_ccs.c | 210 +++++++++++++++++++++
>> drivers/gpu/drm/xe/xe_sriov_vf_ccs.h | 13 ++
>> drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h | 45 +++++
>> 10 files changed, 338 insertions(+)
>> create mode 100644 drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
>> create mode 100644 drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
>> create mode 100644 drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
>>
>> diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
>> index f5f5775acdc0..3b5241937742 100644
>> --- a/drivers/gpu/drm/xe/Makefile
>> +++ b/drivers/gpu/drm/xe/Makefile
>> @@ -140,6 +140,7 @@ xe-y += \
>> xe_memirq.o \
>> xe_sriov.o \
>> xe_sriov_vf.o \
>> + xe_sriov_vf_ccs.o \
>> xe_tile_sriov_vf.o
>>
>> xe-$(CONFIG_PCI_IOV) += \
>> diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
>> index 8cfcfff250ca..f1335c1d0183 100644
>> --- a/drivers/gpu/drm/xe/xe_device.c
>> +++ b/drivers/gpu/drm/xe/xe_device.c
>> @@ -926,6 +926,10 @@ int xe_device_probe(struct xe_device *xe)
>>
>> xe_vsec_init(xe);
>>
>> + err = xe_sriov_late_init(xe);
>> + if (err)
>> + goto err_unregister_display;
>> +
>> return devm_add_action_or_reset(xe->drm.dev, xe_device_sanitize, xe);
>>
>> err_unregister_display:
>> diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h
>> index 003afb279a5e..5d2d87cc1c20 100644
>> --- a/drivers/gpu/drm/xe/xe_device_types.h
>> +++ b/drivers/gpu/drm/xe/xe_device_types.h
>> @@ -22,6 +22,7 @@
>> #include "xe_pmu_types.h"
>> #include "xe_pt_types.h"
>> #include "xe_sriov_types.h"
>> +#include "xe_sriov_vf_ccs_types.h"
>> #include "xe_step_types.h"
>> #include "xe_survivability_mode_types.h"
>> #include "xe_ttm_vram_mgr_types.h"
>> @@ -234,6 +235,9 @@ struct xe_tile {
>> struct {
>> /** @sriov.vf.ggtt_balloon: GGTT regions excluded from use. */
>> struct xe_ggtt_node *ggtt_balloon[2];
>> +
>> + /** @sriov.vf.ccs: CCS read and write contexts for VF. */
>> + struct xe_tile_vf_ccs ccs[XE_SRIOV_VF_CCS_CTX_COUNT];
>> } vf;
>> } sriov;
>>
>> diff --git a/drivers/gpu/drm/xe/xe_gt_debugfs.c b/drivers/gpu/drm/xe/xe_gt_debugfs.c
>> index 848618acdca8..404844515523 100644
>> --- a/drivers/gpu/drm/xe/xe_gt_debugfs.c
>> +++ b/drivers/gpu/drm/xe/xe_gt_debugfs.c
>> @@ -134,6 +134,30 @@ static int sa_info(struct xe_gt *gt, struct drm_printer *p)
>> return 0;
>> }
>>
>> +static int sa_info_vf_ccs(struct xe_gt *gt, struct drm_printer *p)
>> +{
>> + struct xe_tile *tile = gt_to_tile(gt);
>> + struct xe_sa_manager *bb_pool;
>> + enum xe_sriov_vf_ccs_rw_ctxs ctx_id;
>> +
>> + if (!IS_VF_CCS_READY(gt_to_xe(gt)))
>> + return 0;
>> +
>> + xe_pm_runtime_get(gt_to_xe(gt));
>> +
>> + for_each_ccs_rw_ctx(ctx_id) {
>> + drm_printf(p, "ccs %s bb suballoc info\n", ctx_id ? "write" : "read");
>> + drm_printf(p, "-------------------------\n");
>> + bb_pool = tile->sriov.vf.ccs[ctx_id].mem.ccs_bb_pool;
>> + drm_suballoc_dump_debug_info(&bb_pool->base, p, bb_pool->gpu_addr);
>> + drm_puts(p, "\n");
>> + }
>> +
>> + xe_pm_runtime_put(gt_to_xe(gt));
>> +
>> + return 0;
>> +}
>> +
>> static int topology(struct xe_gt *gt, struct drm_printer *p)
>> {
>> xe_pm_runtime_get(gt_to_xe(gt));
>> @@ -303,6 +327,13 @@ static const struct drm_info_list vf_safe_debugfs_list[] = {
>> {"hwconfig", .show = xe_gt_debugfs_simple_show, .data = hwconfig},
>> };
>>
>> +/*
>> + * only for GT debugfs files which are valid on VF. Not valid on PF.
>> + */
>> +static const struct drm_info_list vf_only_debugfs_list[] = {
>> + {"sa_info_vf_ccs", .show = xe_gt_debugfs_simple_show, .data = sa_info_vf_ccs},
>> +};
>> +
>> /* everything else should be added here */
>> static const struct drm_info_list pf_only_debugfs_list[] = {
>> {"hw_engines", .show = xe_gt_debugfs_simple_show, .data = hw_engines},
>> @@ -419,6 +450,11 @@ void xe_gt_debugfs_register(struct xe_gt *gt)
>> drm_debugfs_create_files(pf_only_debugfs_list,
>> ARRAY_SIZE(pf_only_debugfs_list),
>> root, minor);
>> + else
>> + drm_debugfs_create_files(vf_only_debugfs_list,
>> + ARRAY_SIZE(vf_only_debugfs_list),
>> + root, minor);
>> +
>>
>> xe_uc_debugfs_register(>->uc, root);
>>
>> diff --git a/drivers/gpu/drm/xe/xe_sriov.c b/drivers/gpu/drm/xe/xe_sriov.c
>> index a0eab44c0e76..87911fb4eea7 100644
>> --- a/drivers/gpu/drm/xe/xe_sriov.c
>> +++ b/drivers/gpu/drm/xe/xe_sriov.c
>> @@ -15,6 +15,7 @@
>> #include "xe_sriov.h"
>> #include "xe_sriov_pf.h"
>> #include "xe_sriov_vf.h"
>> +#include "xe_sriov_vf_ccs.h"
>>
>> /**
>> * xe_sriov_mode_to_string - Convert enum value to string.
>> @@ -157,3 +158,21 @@ const char *xe_sriov_function_name(unsigned int n, char *buf, size_t size)
>> strscpy(buf, "PF", size);
>> return buf;
>> }
>> +
>> +/**
>> + * xe_sriov_late_init() - SR-IOV late initialization functions.
>> + * @xe: the &xe_device to initialize
>> + *
>> + * On VF this function will initialize code for CCS migration.
>> + *
>> + * Return: 0 on success or a negative error code on failure.
>> + */
>> +int xe_sriov_late_init(struct xe_device *xe)
>> +{
>> + int err = 0;
>> +
>> + if (IS_VF_CCS_INIT_NEEDED(xe))
>> + err = xe_sriov_vf_ccs_init(xe);
>> +
>> + return err;
>> +}
>> diff --git a/drivers/gpu/drm/xe/xe_sriov.h b/drivers/gpu/drm/xe/xe_sriov.h
>> index 688fbabf08f1..0e0c1abf2d14 100644
>> --- a/drivers/gpu/drm/xe/xe_sriov.h
>> +++ b/drivers/gpu/drm/xe/xe_sriov.h
>> @@ -18,6 +18,7 @@ const char *xe_sriov_function_name(unsigned int n, char *buf, size_t len);
>> void xe_sriov_probe_early(struct xe_device *xe);
>> void xe_sriov_print_info(struct xe_device *xe, struct drm_printer *p);
>> int xe_sriov_init(struct xe_device *xe);
>> +int xe_sriov_late_init(struct xe_device *xe);
>>
>> static inline enum xe_sriov_mode xe_device_sriov_mode(const struct xe_device *xe)
>> {
>> diff --git a/drivers/gpu/drm/xe/xe_sriov_types.h b/drivers/gpu/drm/xe/xe_sriov_types.h
>> index ca94382a721e..8abfdb2c5ead 100644
>> --- a/drivers/gpu/drm/xe/xe_sriov_types.h
>> +++ b/drivers/gpu/drm/xe/xe_sriov_types.h
>> @@ -71,6 +71,11 @@ struct xe_device_vf {
>> /** @migration.gt_flags: Per-GT request flags for VF migration recovery */
>> unsigned long gt_flags;
>> } migration;
>> +
>> + struct {
>> + /** @initialized: Initilalization of vf ccs is completed or not */
>> + bool initialized;
>> + } ccs;
>> };
>>
>> #endif
>> diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
>> new file mode 100644
>> index 000000000000..ff5ad472eb96
>> --- /dev/null
>> +++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
>> @@ -0,0 +1,210 @@
>> +// SPDX-License-Identifier: MIT
>> +/*
>> + * Copyright © 2025 Intel Corporation
>> + */
>> +
>> +#include "instructions/xe_mi_commands.h"
>> +#include "instructions/xe_gpu_commands.h"
>> +#include "xe_bo.h"
>> +#include "xe_device.h"
>> +#include "xe_migrate.h"
>> +#include "xe_sa.h"
>> +#include "xe_sriov_printk.h"
>> +#include "xe_sriov_vf_ccs.h"
>> +#include "xe_sriov_vf_ccs_types.h"
>> +
>> +/**
>> + * DOC: VF save/restore of compression Meta Data
>> + *
>> + * VF KMD registers two special contexts/LRCAs.
>> + *
>> + * Save Context/LRCA: contain necessary cmds+page table to trigger Meta data /
>> + * compression control surface (Aka CCS) save in regular System memory in VM.
>> + *
>> + * Restore Context/LRCA: contain necessary cmds+page table to trigger Meta data /
>> + * compression control surface (Aka CCS) Restore from regular System memory in
>> + * VM to corresponding CCS pool.
>> + *
>> + * Below diagram explain steps needed for VF save/Restore of compression Meta Data::
>> + *
>> + * CCS Save CCS Restore VF KMD Guc BCS
>> + * LRCA LRCA
>> + * | | | | |
>> + * | | | | |
>> + * | Create Save LRCA | | |
>> + * [ ]<----------------------------- [ ] | |
>> + * | | | | |
>> + * | | | | |
>> + * | | | Register save LRCA | |
>> + * | | | with Guc | |
>> + * | | [ ]--------------------------->[ ] |
>> + * | | | | |
>> + * | | Create restore LRCA | | |
>> + * | [ ]<------------------[ ] | |
>> + * | | | | |
>> + * | | | Register restore LRCA | |
>> + * | | | with Guc | |
>> + * | | [ ]--------------------------->[ ] |
>> + * | | | | |
>> + * | | | | |
>> + * | | [ ]------------------------- | |
>> + * | | [ ] Allocate main memory. | | |
>> + * | | [ ] Allocate CCS memory. | | |
>> + * | | [ ] Update Main memory & | | |
>> + * [ ]<------------------------------[ ] CCS pages PPGTT + BB | | |
>> + * | [ ]<------------------[ ] cmds to save & restore.| | |
>> + * | | [ ]<------------------------ | |
>> + * | | | | |
>> + * | | | | |
>> + * | | | | |
>> + * : : : : :
>> + * ---------------------------- VF Paused -------------------------------------
>> + * | | | | |
>> + * | | | | |
>> + * | | | |Schedule |
>> + * | | | |CCS Save |
>> + * | | | | LRCA |
>> + * | | | [ ]------>[ ]
>> + * | | | | |
>> + * | | | | |
>> + * | | | |CCS save |
>> + * | | | |completed|
>> + * | | | [ ]<------[ ]
>> + * | | | | |
>> + * : : : : :
>> + * ---------------------------- VM Migrated -----------------------------------
>> + * | | | | |
>> + * | | | | |
>> + * : : : : :
>> + * ---------------------------- VF Resumed ------------------------------------
>> + * | | | | |
>> + * | | | | |
>> + * | | [ ]-------------- | |
>> + * | | [ ] Fix up GGTT | | |
>> + * | | [ ]<------------- | |
>> + * | | | | |
>> + * | | | | |
>> + * | | | Notify VF_RESFIX_DONE | |
>> + * | | [ ]--------------------------->[ ] |
>> + * | | | | |
>> + * | | | |Schedule |
>> + * | | | |CCS |
>> + * | | | |Restore |
>> + * | | | |LRCA |
>> + * | | | [ ]------>[ ]
>> + * | | | | |
>> + * | | | | |
>> + * | | | |CCS |
>> + * | | | |restore |
>> + * | | | |completed|
>> + * | | | [ ]<------[ ]
>> + * | | | | |
>> + * | | | | |
>> + * | | | VF_RESFIX_DONE complete | |
>> + * | | | notification | |
>> + * | | [ ]<---------------------------[ ] |
>> + * | | | | |
>> + * | | | | |
>> + * : : : : :
>> + * ------------------------- Continue VM restore ------------------------------
>> + */
>> +
>> +static u64 get_ccs_bb_pool_size(struct xe_device *xe)
>> +{
>> + u64 sys_mem_size, ccs_mem_size, ptes, bb_pool_size;
>> + struct sysinfo si;
>> +
>> + si_meminfo(&si);
>> + sys_mem_size = si.totalram * si.mem_unit;
>> + ccs_mem_size = sys_mem_size / NUM_BYTES_PER_CCS_BYTE(xe);
>> + ptes = DIV_ROUND_UP(sys_mem_size + ccs_mem_size, XE_PAGE_SIZE);
>> +
>> + /**
>> + * We need below BB size to hold PTE mappings and some DWs for copy
>> + * command. In reality, we need space for many copy commands. So, let
>> + * us allocate double the calculated size which is enough to holds GPU
>> + * instructions for the whole region.
>> + */
>> + bb_pool_size = ptes * sizeof(u32);
>> +
>> + return round_up(bb_pool_size * 2, SZ_1M);
>> +}
>> +
>> +static int alloc_bb_pool(struct xe_tile *tile, struct xe_tile_vf_ccs *ctx)
>> +{
>> + struct xe_device *xe = tile_to_xe(tile);
>> + struct xe_sa_manager *sa_manager;
>> + u64 bb_pool_size;
>> + int offset, err;
>> +
>> + bb_pool_size = get_ccs_bb_pool_size(xe);
>> + xe_sriov_info(xe, "Allocating %s CCS BB pool size = %lldMB\n",
>> + ctx->ctx_id ? "Restore" : "Save", bb_pool_size / SZ_1M);
>> +
>> + sa_manager = xe_sa_bo_manager_init(tile, bb_pool_size, SZ_16);
>> +
>> + if (IS_ERR(sa_manager)) {
>> + xe_sriov_err(xe, "Suballocator init failed with error: %pe\n",
>> + sa_manager);
>> + err = PTR_ERR(sa_manager);
>> + return err;
>> + }
>> +
>> + offset = 0;
>> + xe_map_memset(xe, &sa_manager->bo->vmap, offset, MI_NOOP,
>> + bb_pool_size);
>> +
>> + offset = bb_pool_size - sizeof(u32);
>> + xe_map_wr(xe, &sa_manager->bo->vmap, offset, u32, MI_BATCH_BUFFER_END);
>> +
>> + ctx->mem.ccs_bb_pool = sa_manager;
>> +
>> + return 0;
>> +}
>> +
>> +/**
>> + * xe_sriov_vf_ccs_init - Setup LRCA for save & restore.
>> + * @xe: the &xe_device to start recovery on
>> + *
>> + * This function shall be called only by VF. It initializes
>> + * LRCA and suballocator needed for CCS save & restore.
>> + *
>> + * Return: 0 on success. Negative error code on failure.
>> + */
>> +int xe_sriov_vf_ccs_init(struct xe_device *xe)
>> +{
>> + enum xe_sriov_vf_ccs_rw_ctxs ctx_id;
>> + struct xe_migrate *migrate;
>> + struct xe_tile_vf_ccs *ctx;
>> + struct xe_tile *tile;
>> + int tile_id, err;
>> +
>> + xe_assert(xe, IS_SRIOV_VF(xe));
>> + xe_assert(xe, !IS_DGFX(xe));
>> + xe_assert(xe, xe_device_has_flat_ccs(xe));
>> +
>> + for_each_tile(tile, xe, tile_id) {
> Nit: This only needs to be done for 1 tile. All iGPU are 1 tile, so this
> works but you could rewrite this entire series to avoid loops and rather
> use xe_device_get_root_tile(). That might be better a bit more future
> proof.
>
> Nit aside, this LGTM and you can keep my previous:
> Acked-by: Matthew Brost<matthew.brost@intel.com>
Fixed in the new version.
-Satya.
>> + for_each_ccs_rw_ctx(ctx_id) {
>> + ctx = &tile->sriov.vf.ccs[ctx_id];
>> + ctx->ctx_id = ctx_id;
>> +
>> + migrate = xe_migrate_init(tile);
>> + if (IS_ERR(migrate)) {
>> + err = PTR_ERR(migrate);
>> + goto err_ret;
>> + }
>> + ctx->migrate = migrate;
>> +
>> + err = alloc_bb_pool(tile, ctx);
>> + if (err)
>> + goto err_ret;
>> + }
>> + }
>> +
>> + xe->sriov.vf.ccs.initialized = 1;
>> +
>> + return 0;
>> +
>> +err_ret:
>> + return err;
>> +}
>> diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
>> new file mode 100644
>> index 000000000000..5df9ba028d14
>> --- /dev/null
>> +++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
>> @@ -0,0 +1,13 @@
>> +/* SPDX-License-Identifier: MIT */
>> +/*
>> + * Copyright © 2025 Intel Corporation
>> + */
>> +
>> +#ifndef _XE_SRIOV_VF_CCS_H_
>> +#define _XE_SRIOV_VF_CCS_H_
>> +
>> +struct xe_device;
>> +
>> +int xe_sriov_vf_ccs_init(struct xe_device *xe);
>> +
>> +#endif
>> diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h b/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
>> new file mode 100644
>> index 000000000000..6dc279d206ec
>> --- /dev/null
>> +++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
>> @@ -0,0 +1,45 @@
>> +/* SPDX-License-Identifier: MIT */
>> +/*
>> + * Copyright © 2025 Intel Corporation
>> + */
>> +
>> +#ifndef _XE_SRIOV_VF_CCS_TYPES_H_
>> +#define _XE_SRIOV_VF_CCS_TYPES_H_
>> +
>> +#define for_each_ccs_rw_ctx(id__) \
>> + for ((id__) = 0; (id__) < XE_SRIOV_VF_CCS_CTX_COUNT; (id__)++)
>> +
>> +#define IS_VF_CCS_READY(xe) ({ \
>> + struct xe_device *___xe = (xe); \
>> + xe_assert(___xe, IS_SRIOV_VF(___xe)); \
>> + ___xe->sriov.vf.ccs.initialized; \
>> + })
>> +
>> +#define IS_VF_CCS_INIT_NEEDED(xe) ({\
>> + struct xe_device *___xe = (xe); \
>> + IS_SRIOV_VF(___xe) && !IS_DGFX(___xe) && \
>> + xe_device_has_flat_ccs(___xe) && GRAPHICS_VER(___xe) >= 20; \
>> + })
>> +
>> +enum xe_sriov_vf_ccs_rw_ctxs {
>> + XE_SRIOV_VF_CCS_READ_CTX,
>> + XE_SRIOV_VF_CCS_WRITE_CTX,
>> + XE_SRIOV_VF_CCS_CTX_COUNT
>> +};
>> +
>> +struct xe_migrate;
>> +struct xe_sa_manager;
>> +
>> +struct xe_tile_vf_ccs {
>> + /** @id: Id to which context it belongs to */
>> + enum xe_sriov_vf_ccs_rw_ctxs ctx_id;
>> + /** @migrate: Migration helper for save/restore of CCS data */
>> + struct xe_migrate *migrate;
>> +
>> + struct {
>> + /** @ccs_rw_bb_pool: Pool from which batch buffers are allocated. */
>> + struct xe_sa_manager *ccs_bb_pool;
>> + } mem;
>> +};
>> +
>> +#endif
>> --
>> 2.43.0
>>
[-- Attachment #2: Type: text/html, Size: 22228 bytes --]
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v8 2/3] drm/xe/vf: Attach and detach CCS copy commands with BO
2025-06-19 8:04 [PATCH v8 0/3] CCS save restore for IGPU Satyanarayana K V P
` (2 preceding siblings ...)
2025-06-19 8:04 ` [PATCH v8 1/3] drm/xe/vf: Create contexts for CCS read write Satyanarayana K V P
@ 2025-06-19 8:04 ` Satyanarayana K V P
2025-06-20 16:25 ` Matthew Brost
2025-06-19 8:04 ` [PATCH v8 3/3] drm/xe/vf: Register CCS read/write contexts with Guc Satyanarayana K V P
` (2 subsequent siblings)
6 siblings, 1 reply; 17+ messages in thread
From: Satyanarayana K V P @ 2025-06-19 8:04 UTC (permalink / raw)
To: intel-xe
Cc: Satyanarayana K V P, Michal Wajdeczko, Matthew Brost,
Matthew Auld, Michał Winiarski, Tomasz Lis
Attach CCS read/write copy commands to BO for old and new mem types as
NULL -> tt or system -> tt.
Detach the CCS read/write copy commands from BO while deleting ttm bo
from xe_ttm_bo_delete_mem_notify().
Signed-off-by: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Matthew Auld <matthew.auld@intel.com>
Cc: Michał Winiarski <michal.winiarski@intel.com>
---
Cc: Tomasz Lis <tomasz.lis@intel.com>
V7 -> V8:
- Removed xe_bb_ccs_realloc() and created a single BB by calculating the
BB size first and then emitting the commands. (Matthew Brost)
- Added xe_assert() if BB is not NULL in xe_sriov_vf_ccs_attach_bo().
V6 -> V7:
- Created xe_bb_ccs_realloc() to create a single BB instead of maintaining
a list. (Matthew Brost)
V5 -> V6:
- Removed dead code from xe_migrate_ccs_rw_copy() function. (Matthew Brost)
V4 -> V5:
- Create a list of BBs for the given BO and fixed memory leak while
detaching BOs. (Matthew Brost).
- Fixed review comments (Matthew Brost & Matthew Auld).
- Yet to cleanup xe_migrate_ccs_rw_copy() function.
V3 -> V4:
- Fixed issues reported by patchworks.
V2 -> V3:
- Attach and detach functions check for IS_VF_CCS_READY().
V1 -> V2:
- Fixed review comments.
---
drivers/gpu/drm/xe/xe_bb.c | 35 ++++++
drivers/gpu/drm/xe/xe_bb.h | 3 +
drivers/gpu/drm/xe/xe_bo.c | 23 ++++
drivers/gpu/drm/xe/xe_bo_types.h | 3 +
drivers/gpu/drm/xe/xe_migrate.c | 130 +++++++++++++++++++++
drivers/gpu/drm/xe/xe_migrate.h | 6 +
drivers/gpu/drm/xe/xe_sriov_vf_ccs.c | 72 ++++++++++++
drivers/gpu/drm/xe/xe_sriov_vf_ccs.h | 3 +
drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h | 8 ++
9 files changed, 283 insertions(+)
diff --git a/drivers/gpu/drm/xe/xe_bb.c b/drivers/gpu/drm/xe/xe_bb.c
index 9570672fce33..533352dc892f 100644
--- a/drivers/gpu/drm/xe/xe_bb.c
+++ b/drivers/gpu/drm/xe/xe_bb.c
@@ -60,6 +60,41 @@ struct xe_bb *xe_bb_new(struct xe_gt *gt, u32 dwords, bool usm)
return ERR_PTR(err);
}
+struct xe_bb *xe_bb_ccs_new(struct xe_gt *gt, u32 dwords,
+ enum xe_sriov_vf_ccs_rw_ctxs ctx_id)
+{
+ struct xe_bb *bb = kmalloc(sizeof(*bb), GFP_KERNEL);
+ struct xe_tile *tile = gt_to_tile(gt);
+ struct xe_sa_manager *bb_pool;
+ int err;
+
+ if (!bb)
+ return ERR_PTR(-ENOMEM);
+ /*
+ * We need to allocate space for the requested number of dwords &
+ * one additional MI_BATCH_BUFFER_END dword. Since the whole SA
+ * is submitted to HW, we need to make sure that the last instruction
+ * is not over written when the last chunk of SA is allocated for BB.
+ * So, this extra DW acts as a guard here.
+ */
+
+ bb_pool = tile->sriov.vf.ccs[ctx_id].mem.ccs_bb_pool;
+ bb->bo = xe_sa_bo_new(bb_pool, 4 * (dwords + 1));
+
+ if (IS_ERR(bb->bo)) {
+ err = PTR_ERR(bb->bo);
+ goto err;
+ }
+
+ bb->cs = xe_sa_bo_cpu_addr(bb->bo);
+ bb->len = 0;
+
+ return bb;
+err:
+ kfree(bb);
+ return ERR_PTR(err);
+}
+
static struct xe_sched_job *
__xe_bb_create_job(struct xe_exec_queue *q, struct xe_bb *bb, u64 *addr)
{
diff --git a/drivers/gpu/drm/xe/xe_bb.h b/drivers/gpu/drm/xe/xe_bb.h
index fafacd73dcc3..32c9c4c5d2be 100644
--- a/drivers/gpu/drm/xe/xe_bb.h
+++ b/drivers/gpu/drm/xe/xe_bb.h
@@ -13,8 +13,11 @@ struct dma_fence;
struct xe_gt;
struct xe_exec_queue;
struct xe_sched_job;
+enum xe_sriov_vf_ccs_rw_ctxs;
struct xe_bb *xe_bb_new(struct xe_gt *gt, u32 size, bool usm);
+struct xe_bb *xe_bb_ccs_new(struct xe_gt *gt, u32 dwords,
+ enum xe_sriov_vf_ccs_rw_ctxs ctx_id);
struct xe_sched_job *xe_bb_create_job(struct xe_exec_queue *q,
struct xe_bb *bb);
struct xe_sched_job *xe_bb_create_migration_job(struct xe_exec_queue *q,
diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
index 4e39188a021a..beaf8544bf08 100644
--- a/drivers/gpu/drm/xe/xe_bo.c
+++ b/drivers/gpu/drm/xe/xe_bo.c
@@ -31,6 +31,7 @@
#include "xe_pxp.h"
#include "xe_res_cursor.h"
#include "xe_shrinker.h"
+#include "xe_sriov_vf_ccs.h"
#include "xe_trace_bo.h"
#include "xe_ttm_stolen_mgr.h"
#include "xe_vm.h"
@@ -947,6 +948,20 @@ static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool evict,
dma_fence_put(fence);
xe_pm_runtime_put(xe);
+ /*
+ * CCS meta data is migrated from TT -> SMEM. So, let us detach the
+ * BBs from BO as it is no longer needed.
+ */
+ if (IS_VF_CCS_BB_VALID(xe, bo) && old_mem_type == XE_PL_TT &&
+ new_mem->mem_type == XE_PL_SYSTEM)
+ xe_sriov_vf_ccs_detach_bo(bo);
+
+ if (IS_SRIOV_VF(xe) &&
+ ((move_lacks_source && new_mem->mem_type == XE_PL_TT) ||
+ (old_mem_type == XE_PL_SYSTEM && new_mem->mem_type == XE_PL_TT)) &&
+ handle_system_ccs)
+ ret = xe_sriov_vf_ccs_attach_bo(bo);
+
out:
if ((!ttm_bo->resource || ttm_bo->resource->mem_type == XE_PL_SYSTEM) &&
ttm_bo->ttm) {
@@ -957,6 +972,9 @@ static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool evict,
if (timeout < 0)
ret = timeout;
+ if (IS_VF_CCS_BB_VALID(xe, bo))
+ xe_sriov_vf_ccs_detach_bo(bo);
+
xe_tt_unmap_sg(xe, ttm_bo->ttm);
}
@@ -1483,9 +1501,14 @@ static void xe_ttm_bo_release_notify(struct ttm_buffer_object *ttm_bo)
static void xe_ttm_bo_delete_mem_notify(struct ttm_buffer_object *ttm_bo)
{
+ struct xe_bo *bo = ttm_to_xe_bo(ttm_bo);
+
if (!xe_bo_is_xe_bo(ttm_bo))
return;
+ if (IS_VF_CCS_BB_VALID(ttm_to_xe_device(ttm_bo->bdev), bo))
+ xe_sriov_vf_ccs_detach_bo(bo);
+
/*
* Object is idle and about to be destroyed. Release the
* dma-buf attachment.
diff --git a/drivers/gpu/drm/xe/xe_bo_types.h b/drivers/gpu/drm/xe/xe_bo_types.h
index eb5e83c5f233..642e519fcfd1 100644
--- a/drivers/gpu/drm/xe/xe_bo_types.h
+++ b/drivers/gpu/drm/xe/xe_bo_types.h
@@ -78,6 +78,9 @@ struct xe_bo {
/** @ccs_cleared */
bool ccs_cleared;
+ /** @bb_ccs_rw: BB instructions of CCS read/write. Valid only for VF */
+ struct xe_bb *bb_ccs[XE_SRIOV_VF_CCS_CTX_COUNT];
+
/**
* @cpu_caching: CPU caching mode. Currently only used for userspace
* objects. Exceptions are system memory on DGFX, which is always
diff --git a/drivers/gpu/drm/xe/xe_migrate.c b/drivers/gpu/drm/xe/xe_migrate.c
index 8f8e9fdfb2a8..c730b34071ad 100644
--- a/drivers/gpu/drm/xe/xe_migrate.c
+++ b/drivers/gpu/drm/xe/xe_migrate.c
@@ -940,6 +940,136 @@ struct dma_fence *xe_migrate_copy(struct xe_migrate *m,
return fence;
}
+/**
+ * xe_migrate_ccs_rw_copy() - Copy content of TTM resources.
+ * @m: The migration context.
+ * @src_bo: The buffer object @src is currently bound to.
+ * @read_write : Creates BB commands for CCS read/write.
+ *
+ * Creates batch buffer instructions to copy CCS metadata from CCS pool to
+ * memory and vice versa.
+ *
+ * This function should only be called for IGPU.
+ *
+ * Return: 0 if successful, negative error code on failure.
+ */
+int xe_migrate_ccs_rw_copy(struct xe_migrate *m,
+ struct xe_bo *src_bo,
+ enum xe_sriov_vf_ccs_rw_ctxs read_write)
+
+{
+ bool src_is_pltt = read_write == XE_SRIOV_VF_CCS_WRITE_CTX;
+ bool dst_is_pltt = read_write == XE_SRIOV_VF_CCS_READ_CTX;
+ struct ttm_resource *src = src_bo->ttm.resource;
+ struct xe_gt *gt = m->tile->primary_gt;
+ u32 batch_size, batch_size_allocated;
+ struct xe_device *xe = gt_to_xe(gt);
+ struct xe_res_cursor src_it, ccs_it;
+ u64 size = src_bo->size;
+ struct xe_bb *bb = NULL;
+ u64 src_L0, src_L0_ofs;
+ u32 src_L0_pt;
+ int err;
+
+ xe_res_first_sg(xe_bo_sg(src_bo), 0, size, &src_it);
+
+ xe_res_first_sg(xe_bo_sg(src_bo), xe_bo_ccs_pages_start(src_bo),
+ PAGE_ALIGN(xe_device_ccs_bytes(xe, size)),
+ &ccs_it);
+
+ /* Calculate Batch buffer size */
+ batch_size = 0;
+ while (size) {
+ batch_size += 6; /* Flush + 2 NOP */
+ u64 ccs_ofs, ccs_size;
+ u32 ccs_pt;
+
+ u32 avail_pts = max_mem_transfer_per_pass(xe) / LEVEL0_PAGE_TABLE_ENCODE_SIZE;
+
+ src_L0 = min_t(u64, max_mem_transfer_per_pass(xe), size);
+
+ batch_size += pte_update_size(m, false, src, &src_it, &src_L0,
+ &src_L0_ofs, &src_L0_pt, 0, 0,
+ avail_pts);
+
+ ccs_size = xe_device_ccs_bytes(xe, src_L0);
+ batch_size += pte_update_size(m, 0, NULL, &ccs_it, &ccs_size, &ccs_ofs,
+ &ccs_pt, 0, avail_pts, avail_pts);
+ xe_assert(xe, IS_ALIGNED(ccs_it.start, PAGE_SIZE));
+
+ /* Add copy commands size here */
+ batch_size += EMIT_COPY_CCS_DW;
+
+ size -= src_L0;
+ }
+
+ bb = xe_bb_ccs_new(gt, batch_size, read_write);
+ if (IS_ERR(bb)) {
+ drm_err(&xe->drm, "BB allocation failed.\n");
+ err = PTR_ERR(bb);
+ goto err_ret;
+ }
+
+ batch_size_allocated = batch_size;
+ size = src_bo->size;
+ batch_size = 0;
+
+ /*
+ * Emit PTE and copy commands here.
+ * The CCS copy command can only support limited size. If the size to be
+ * copied is more than the limit, divide copy into chunks. So, calculate
+ * sizes here again before copy command is emitted.
+ */
+ while (size) {
+ batch_size += 6; /* Flush + 2 NOP */
+ u32 flush_flags = 0;
+ u64 ccs_ofs, ccs_size;
+ u32 ccs_pt;
+
+ u32 avail_pts = max_mem_transfer_per_pass(xe) / LEVEL0_PAGE_TABLE_ENCODE_SIZE;
+
+ src_L0 = xe_migrate_res_sizes(m, &src_it);
+
+ batch_size += pte_update_size(m, false, src, &src_it, &src_L0,
+ &src_L0_ofs, &src_L0_pt, 0, 0,
+ avail_pts);
+
+ ccs_size = xe_device_ccs_bytes(xe, src_L0);
+ batch_size += pte_update_size(m, 0, NULL, &ccs_it, &ccs_size, &ccs_ofs,
+ &ccs_pt, 0, avail_pts, avail_pts);
+ xe_assert(xe, IS_ALIGNED(ccs_it.start, PAGE_SIZE));
+ batch_size += EMIT_COPY_CCS_DW;
+
+ emit_pte(m, bb, src_L0_pt, false, true, &src_it, src_L0, src);
+
+ emit_pte(m, bb, ccs_pt, false, false, &ccs_it, ccs_size, src);
+
+ bb->cs[bb->len++] = MI_FLUSH_DW | MI_INVALIDATE_TLB | MI_FLUSH_DW_OP_STOREDW |
+ MI_FLUSH_IMM_DW;
+ bb->cs[bb->len++] = MI_NOOP;
+ bb->cs[bb->len++] = MI_NOOP;
+
+ flush_flags = xe_migrate_ccs_copy(m, bb, src_L0_ofs, src_is_pltt,
+ src_L0_ofs, dst_is_pltt,
+ src_L0, ccs_ofs, true);
+
+ bb->cs[bb->len++] = MI_FLUSH_DW | MI_INVALIDATE_TLB | MI_FLUSH_DW_OP_STOREDW |
+ MI_FLUSH_IMM_DW | flush_flags;
+ bb->cs[bb->len++] = MI_NOOP;
+ bb->cs[bb->len++] = MI_NOOP;
+
+ size -= src_L0;
+ }
+
+ xe_assert(xe, (batch_size_allocated == bb->len));
+ src_bo->bb_ccs[read_write] = bb;
+
+ return 0;
+
+err_ret:
+ return err;
+}
+
static void emit_clear_link_copy(struct xe_gt *gt, struct xe_bb *bb, u64 src_ofs,
u32 size, u32 pitch)
{
diff --git a/drivers/gpu/drm/xe/xe_migrate.h b/drivers/gpu/drm/xe/xe_migrate.h
index fb9839c1bae0..96b0449e7edb 100644
--- a/drivers/gpu/drm/xe/xe_migrate.h
+++ b/drivers/gpu/drm/xe/xe_migrate.h
@@ -24,6 +24,8 @@ struct xe_vm;
struct xe_vm_pgtable_update;
struct xe_vma;
+enum xe_sriov_vf_ccs_rw_ctxs;
+
/**
* struct xe_migrate_pt_update_ops - Callbacks for the
* xe_migrate_update_pgtables() function.
@@ -112,6 +114,10 @@ struct dma_fence *xe_migrate_copy(struct xe_migrate *m,
struct ttm_resource *dst,
bool copy_only_ccs);
+int xe_migrate_ccs_rw_copy(struct xe_migrate *m,
+ struct xe_bo *src_bo,
+ enum xe_sriov_vf_ccs_rw_ctxs read_write);
+
int xe_migrate_access_memory(struct xe_migrate *m, struct xe_bo *bo,
unsigned long offset, void *buf, int len,
int write);
diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
index ff5ad472eb96..242a3da1ef27 100644
--- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
+++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
@@ -5,6 +5,7 @@
#include "instructions/xe_mi_commands.h"
#include "instructions/xe_gpu_commands.h"
+#include "xe_bb.h"
#include "xe_bo.h"
#include "xe_device.h"
#include "xe_migrate.h"
@@ -208,3 +209,74 @@ int xe_sriov_vf_ccs_init(struct xe_device *xe)
err_ret:
return err;
}
+
+/**
+ * xe_sriov_vf_ccs_attach_bo - Insert CCS read write commands in the BO.
+ * @bo: the &buffer object to which batch buffer commands will be added.
+ *
+ * This function shall be called only by VF. It inserts the PTEs and copy
+ * command instructions in the BO by calling xe_migrate_ccs_rw_copy()
+ * function.
+ *
+ * Returns: 0 if successful, negative error code on failure.
+ */
+int xe_sriov_vf_ccs_attach_bo(struct xe_bo *bo)
+{
+ struct xe_device *xe = xe_bo_device(bo);
+ enum xe_sriov_vf_ccs_rw_ctxs ctx_id;
+ struct xe_migrate *migrate;
+ struct xe_tile *tile;
+ struct xe_bb *bb;
+ int tile_id;
+ int err = 0;
+
+ if (!IS_VF_CCS_READY(xe))
+ return 0;
+
+ for_each_tile(tile, xe, tile_id) {
+ for_each_ccs_rw_ctx(ctx_id) {
+ bb = bo->bb_ccs[ctx_id];
+ /* bb should be NULL here. Assert if not NULL */
+ xe_assert(xe, !bb);
+
+ migrate = tile->sriov.vf.ccs[ctx_id].migrate;
+ err = xe_migrate_ccs_rw_copy(migrate, bo, ctx_id);
+ }
+ }
+ return err;
+}
+
+/**
+ * xe_sriov_vf_ccs_detach_bo - Remove CCS read write commands from the BO.
+ * @bo: the &buffer object from which batch buffer commands will be removed.
+ *
+ * This function shall be called only by VF. It removes the PTEs and copy
+ * command instructions from the BO. Make sure to update the BB with MI_NOOP
+ * before freeing.
+ *
+ * Returns: 0 if successful.
+ */
+int xe_sriov_vf_ccs_detach_bo(struct xe_bo *bo)
+{
+ struct xe_device *xe = xe_bo_device(bo);
+ enum xe_sriov_vf_ccs_rw_ctxs ctx_id;
+ struct xe_bb *bb;
+ struct xe_tile *tile;
+ int tile_id;
+
+ if (!IS_VF_CCS_READY(xe))
+ return 0;
+
+ for_each_tile(tile, xe, tile_id) {
+ for_each_ccs_rw_ctx(ctx_id) {
+ bb = bo->bb_ccs[ctx_id];
+ if (!bb)
+ continue;
+
+ memset(bb->cs, MI_NOOP, bb->len * sizeof(u32));
+ xe_bb_free(bb, NULL);
+ bo->bb_ccs[ctx_id] = NULL;
+ }
+ }
+ return 0;
+}
diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
index 5df9ba028d14..5d5e4bd25904 100644
--- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
+++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
@@ -7,7 +7,10 @@
#define _XE_SRIOV_VF_CCS_H_
struct xe_device;
+struct xe_bo;
int xe_sriov_vf_ccs_init(struct xe_device *xe);
+int xe_sriov_vf_ccs_attach_bo(struct xe_bo *bo);
+int xe_sriov_vf_ccs_detach_bo(struct xe_bo *bo);
#endif
diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h b/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
index 6dc279d206ec..e240f3fd18af 100644
--- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
+++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
@@ -27,6 +27,14 @@ enum xe_sriov_vf_ccs_rw_ctxs {
XE_SRIOV_VF_CCS_CTX_COUNT
};
+#define IS_VF_CCS_BB_VALID(xe, bo) ({ \
+ struct xe_device *___xe = (xe); \
+ struct xe_bo *___bo = (bo); \
+ IS_SRIOV_VF(___xe) && \
+ ___bo->bb_ccs[XE_SRIOV_VF_CCS_READ_CTX] && \
+ ___bo->bb_ccs[XE_SRIOV_VF_CCS_WRITE_CTX]; \
+ })
+
struct xe_migrate;
struct xe_sa_manager;
--
2.43.0
^ permalink raw reply related [flat|nested] 17+ messages in thread* Re: [PATCH v8 2/3] drm/xe/vf: Attach and detach CCS copy commands with BO
2025-06-19 8:04 ` [PATCH v8 2/3] drm/xe/vf: Attach and detach CCS copy commands with BO Satyanarayana K V P
@ 2025-06-20 16:25 ` Matthew Brost
2025-06-23 21:41 ` Matthew Brost
0 siblings, 1 reply; 17+ messages in thread
From: Matthew Brost @ 2025-06-20 16:25 UTC (permalink / raw)
To: Satyanarayana K V P
Cc: intel-xe, Michal Wajdeczko, Matthew Auld, Michał Winiarski,
Tomasz Lis
On Thu, Jun 19, 2025 at 01:34:58PM +0530, Satyanarayana K V P wrote:
> Attach CCS read/write copy commands to BO for old and new mem types as
> NULL -> tt or system -> tt.
> Detach the CCS read/write copy commands from BO while deleting ttm bo
> from xe_ttm_bo_delete_mem_notify().
>
> Signed-off-by: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> Cc: Matthew Brost <matthew.brost@intel.com>
> Cc: Matthew Auld <matthew.auld@intel.com>
> Cc: Michał Winiarski <michal.winiarski@intel.com>
> ---
> Cc: Tomasz Lis <tomasz.lis@intel.com>
>
> V7 -> V8:
> - Removed xe_bb_ccs_realloc() and created a single BB by calculating the
> BB size first and then emitting the commands. (Matthew Brost)
> - Added xe_assert() if BB is not NULL in xe_sriov_vf_ccs_attach_bo().
>
> V6 -> V7:
> - Created xe_bb_ccs_realloc() to create a single BB instead of maintaining
> a list. (Matthew Brost)
>
> V5 -> V6:
> - Removed dead code from xe_migrate_ccs_rw_copy() function. (Matthew Brost)
>
> V4 -> V5:
> - Create a list of BBs for the given BO and fixed memory leak while
> detaching BOs. (Matthew Brost).
> - Fixed review comments (Matthew Brost & Matthew Auld).
> - Yet to cleanup xe_migrate_ccs_rw_copy() function.
>
> V3 -> V4:
> - Fixed issues reported by patchworks.
>
> V2 -> V3:
> - Attach and detach functions check for IS_VF_CCS_READY().
>
> V1 -> V2:
> - Fixed review comments.
> ---
> drivers/gpu/drm/xe/xe_bb.c | 35 ++++++
> drivers/gpu/drm/xe/xe_bb.h | 3 +
> drivers/gpu/drm/xe/xe_bo.c | 23 ++++
> drivers/gpu/drm/xe/xe_bo_types.h | 3 +
> drivers/gpu/drm/xe/xe_migrate.c | 130 +++++++++++++++++++++
> drivers/gpu/drm/xe/xe_migrate.h | 6 +
> drivers/gpu/drm/xe/xe_sriov_vf_ccs.c | 72 ++++++++++++
> drivers/gpu/drm/xe/xe_sriov_vf_ccs.h | 3 +
> drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h | 8 ++
> 9 files changed, 283 insertions(+)
>
> diff --git a/drivers/gpu/drm/xe/xe_bb.c b/drivers/gpu/drm/xe/xe_bb.c
> index 9570672fce33..533352dc892f 100644
> --- a/drivers/gpu/drm/xe/xe_bb.c
> +++ b/drivers/gpu/drm/xe/xe_bb.c
> @@ -60,6 +60,41 @@ struct xe_bb *xe_bb_new(struct xe_gt *gt, u32 dwords, bool usm)
> return ERR_PTR(err);
> }
>
> +struct xe_bb *xe_bb_ccs_new(struct xe_gt *gt, u32 dwords,
> + enum xe_sriov_vf_ccs_rw_ctxs ctx_id)
> +{
> + struct xe_bb *bb = kmalloc(sizeof(*bb), GFP_KERNEL);
> + struct xe_tile *tile = gt_to_tile(gt);
> + struct xe_sa_manager *bb_pool;
> + int err;
> +
> + if (!bb)
> + return ERR_PTR(-ENOMEM);
> + /*
> + * We need to allocate space for the requested number of dwords &
> + * one additional MI_BATCH_BUFFER_END dword. Since the whole SA
> + * is submitted to HW, we need to make sure that the last instruction
> + * is not over written when the last chunk of SA is allocated for BB.
> + * So, this extra DW acts as a guard here.
> + */
> +
> + bb_pool = tile->sriov.vf.ccs[ctx_id].mem.ccs_bb_pool;
> + bb->bo = xe_sa_bo_new(bb_pool, 4 * (dwords + 1));
> +
> + if (IS_ERR(bb->bo)) {
> + err = PTR_ERR(bb->bo);
> + goto err;
> + }
> +
> + bb->cs = xe_sa_bo_cpu_addr(bb->bo);
> + bb->len = 0;
> +
> + return bb;
> +err:
> + kfree(bb);
> + return ERR_PTR(err);
> +}
> +
> static struct xe_sched_job *
> __xe_bb_create_job(struct xe_exec_queue *q, struct xe_bb *bb, u64 *addr)
> {
> diff --git a/drivers/gpu/drm/xe/xe_bb.h b/drivers/gpu/drm/xe/xe_bb.h
> index fafacd73dcc3..32c9c4c5d2be 100644
> --- a/drivers/gpu/drm/xe/xe_bb.h
> +++ b/drivers/gpu/drm/xe/xe_bb.h
> @@ -13,8 +13,11 @@ struct dma_fence;
> struct xe_gt;
> struct xe_exec_queue;
> struct xe_sched_job;
> +enum xe_sriov_vf_ccs_rw_ctxs;
>
> struct xe_bb *xe_bb_new(struct xe_gt *gt, u32 size, bool usm);
> +struct xe_bb *xe_bb_ccs_new(struct xe_gt *gt, u32 dwords,
> + enum xe_sriov_vf_ccs_rw_ctxs ctx_id);
> struct xe_sched_job *xe_bb_create_job(struct xe_exec_queue *q,
> struct xe_bb *bb);
> struct xe_sched_job *xe_bb_create_migration_job(struct xe_exec_queue *q,
> diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
> index 4e39188a021a..beaf8544bf08 100644
> --- a/drivers/gpu/drm/xe/xe_bo.c
> +++ b/drivers/gpu/drm/xe/xe_bo.c
> @@ -31,6 +31,7 @@
> #include "xe_pxp.h"
> #include "xe_res_cursor.h"
> #include "xe_shrinker.h"
> +#include "xe_sriov_vf_ccs.h"
> #include "xe_trace_bo.h"
> #include "xe_ttm_stolen_mgr.h"
> #include "xe_vm.h"
> @@ -947,6 +948,20 @@ static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool evict,
> dma_fence_put(fence);
> xe_pm_runtime_put(xe);
>
> + /*
> + * CCS meta data is migrated from TT -> SMEM. So, let us detach the
> + * BBs from BO as it is no longer needed.
> + */
> + if (IS_VF_CCS_BB_VALID(xe, bo) && old_mem_type == XE_PL_TT &&
> + new_mem->mem_type == XE_PL_SYSTEM)
> + xe_sriov_vf_ccs_detach_bo(bo);
> +
> + if (IS_SRIOV_VF(xe) &&
> + ((move_lacks_source && new_mem->mem_type == XE_PL_TT) ||
> + (old_mem_type == XE_PL_SYSTEM && new_mem->mem_type == XE_PL_TT)) &&
> + handle_system_ccs)
> + ret = xe_sriov_vf_ccs_attach_bo(bo);
> +
You don't check the 'ret' value of xe_sriov_vf_ccs_attach_bo. That seems be an oversight.
> out:
> if ((!ttm_bo->resource || ttm_bo->resource->mem_type == XE_PL_SYSTEM) &&
> ttm_bo->ttm) {
> @@ -957,6 +972,9 @@ static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool evict,
> if (timeout < 0)
> ret = timeout;
>
> + if (IS_VF_CCS_BB_VALID(xe, bo))
> + xe_sriov_vf_ccs_detach_bo(bo);
> +
> xe_tt_unmap_sg(xe, ttm_bo->ttm);
> }
>
> @@ -1483,9 +1501,14 @@ static void xe_ttm_bo_release_notify(struct ttm_buffer_object *ttm_bo)
>
> static void xe_ttm_bo_delete_mem_notify(struct ttm_buffer_object *ttm_bo)
> {
> + struct xe_bo *bo = ttm_to_xe_bo(ttm_bo);
> +
> if (!xe_bo_is_xe_bo(ttm_bo))
> return;
>
> + if (IS_VF_CCS_BB_VALID(ttm_to_xe_device(ttm_bo->bdev), bo))
> + xe_sriov_vf_ccs_detach_bo(bo);
> +
> /*
> * Object is idle and about to be destroyed. Release the
> * dma-buf attachment.
> diff --git a/drivers/gpu/drm/xe/xe_bo_types.h b/drivers/gpu/drm/xe/xe_bo_types.h
> index eb5e83c5f233..642e519fcfd1 100644
> --- a/drivers/gpu/drm/xe/xe_bo_types.h
> +++ b/drivers/gpu/drm/xe/xe_bo_types.h
> @@ -78,6 +78,9 @@ struct xe_bo {
> /** @ccs_cleared */
> bool ccs_cleared;
>
> + /** @bb_ccs_rw: BB instructions of CCS read/write. Valid only for VF */
> + struct xe_bb *bb_ccs[XE_SRIOV_VF_CCS_CTX_COUNT];
> +
> /**
> * @cpu_caching: CPU caching mode. Currently only used for userspace
> * objects. Exceptions are system memory on DGFX, which is always
> diff --git a/drivers/gpu/drm/xe/xe_migrate.c b/drivers/gpu/drm/xe/xe_migrate.c
> index 8f8e9fdfb2a8..c730b34071ad 100644
> --- a/drivers/gpu/drm/xe/xe_migrate.c
> +++ b/drivers/gpu/drm/xe/xe_migrate.c
> @@ -940,6 +940,136 @@ struct dma_fence *xe_migrate_copy(struct xe_migrate *m,
> return fence;
> }
>
> +/**
> + * xe_migrate_ccs_rw_copy() - Copy content of TTM resources.
> + * @m: The migration context.
> + * @src_bo: The buffer object @src is currently bound to.
> + * @read_write : Creates BB commands for CCS read/write.
> + *
> + * Creates batch buffer instructions to copy CCS metadata from CCS pool to
> + * memory and vice versa.
> + *
> + * This function should only be called for IGPU.
> + *
> + * Return: 0 if successful, negative error code on failure.
> + */
> +int xe_migrate_ccs_rw_copy(struct xe_migrate *m,
> + struct xe_bo *src_bo,
> + enum xe_sriov_vf_ccs_rw_ctxs read_write)
> +
> +{
> + bool src_is_pltt = read_write == XE_SRIOV_VF_CCS_WRITE_CTX;
> + bool dst_is_pltt = read_write == XE_SRIOV_VF_CCS_READ_CTX;
> + struct ttm_resource *src = src_bo->ttm.resource;
> + struct xe_gt *gt = m->tile->primary_gt;
> + u32 batch_size, batch_size_allocated;
> + struct xe_device *xe = gt_to_xe(gt);
> + struct xe_res_cursor src_it, ccs_it;
> + u64 size = src_bo->size;
> + struct xe_bb *bb = NULL;
> + u64 src_L0, src_L0_ofs;
> + u32 src_L0_pt;
> + int err;
> +
> + xe_res_first_sg(xe_bo_sg(src_bo), 0, size, &src_it);
> +
> + xe_res_first_sg(xe_bo_sg(src_bo), xe_bo_ccs_pages_start(src_bo),
> + PAGE_ALIGN(xe_device_ccs_bytes(xe, size)),
> + &ccs_it);
> +
> + /* Calculate Batch buffer size */
> + batch_size = 0;
> + while (size) {
> + batch_size += 6; /* Flush + 2 NOP */
> + u64 ccs_ofs, ccs_size;
> + u32 ccs_pt;
> +
> + u32 avail_pts = max_mem_transfer_per_pass(xe) / LEVEL0_PAGE_TABLE_ENCODE_SIZE;
> +
> + src_L0 = min_t(u64, max_mem_transfer_per_pass(xe), size);
> +
> + batch_size += pte_update_size(m, false, src, &src_it, &src_L0,
> + &src_L0_ofs, &src_L0_pt, 0, 0,
> + avail_pts);
> +
> + ccs_size = xe_device_ccs_bytes(xe, src_L0);
> + batch_size += pte_update_size(m, 0, NULL, &ccs_it, &ccs_size, &ccs_ofs,
> + &ccs_pt, 0, avail_pts, avail_pts);
> + xe_assert(xe, IS_ALIGNED(ccs_it.start, PAGE_SIZE));
> +
> + /* Add copy commands size here */
> + batch_size += EMIT_COPY_CCS_DW;
> +
> + size -= src_L0;
> + }
> +
> + bb = xe_bb_ccs_new(gt, batch_size, read_write);
> + if (IS_ERR(bb)) {
> + drm_err(&xe->drm, "BB allocation failed.\n");
> + err = PTR_ERR(bb);
> + goto err_ret;
> + }
> +
> + batch_size_allocated = batch_size;
> + size = src_bo->size;
> + batch_size = 0;
> +
> + /*
> + * Emit PTE and copy commands here.
> + * The CCS copy command can only support limited size. If the size to be
> + * copied is more than the limit, divide copy into chunks. So, calculate
> + * sizes here again before copy command is emitted.
> + */
> + while (size) {
> + batch_size += 6; /* Flush + 2 NOP */
> + u32 flush_flags = 0;
> + u64 ccs_ofs, ccs_size;
> + u32 ccs_pt;
> +
> + u32 avail_pts = max_mem_transfer_per_pass(xe) / LEVEL0_PAGE_TABLE_ENCODE_SIZE;
> +
> + src_L0 = xe_migrate_res_sizes(m, &src_it);
> +
> + batch_size += pte_update_size(m, false, src, &src_it, &src_L0,
> + &src_L0_ofs, &src_L0_pt, 0, 0,
> + avail_pts);
> +
> + ccs_size = xe_device_ccs_bytes(xe, src_L0);
> + batch_size += pte_update_size(m, 0, NULL, &ccs_it, &ccs_size, &ccs_ofs,
> + &ccs_pt, 0, avail_pts, avail_pts);
> + xe_assert(xe, IS_ALIGNED(ccs_it.start, PAGE_SIZE));
> + batch_size += EMIT_COPY_CCS_DW;
> +
> + emit_pte(m, bb, src_L0_pt, false, true, &src_it, src_L0, src);
> +
> + emit_pte(m, bb, ccs_pt, false, false, &ccs_it, ccs_size, src);
> +
> + bb->cs[bb->len++] = MI_FLUSH_DW | MI_INVALIDATE_TLB | MI_FLUSH_DW_OP_STOREDW |
> + MI_FLUSH_IMM_DW;
> + bb->cs[bb->len++] = MI_NOOP;
> + bb->cs[bb->len++] = MI_NOOP;
> +
> + flush_flags = xe_migrate_ccs_copy(m, bb, src_L0_ofs, src_is_pltt,
> + src_L0_ofs, dst_is_pltt,
> + src_L0, ccs_ofs, true);
> +
> + bb->cs[bb->len++] = MI_FLUSH_DW | MI_INVALIDATE_TLB | MI_FLUSH_DW_OP_STOREDW |
> + MI_FLUSH_IMM_DW | flush_flags;
> + bb->cs[bb->len++] = MI_NOOP;
> + bb->cs[bb->len++] = MI_NOOP;
> +
> + size -= src_L0;
> + }
> +
> + xe_assert(xe, (batch_size_allocated == bb->len));
> + src_bo->bb_ccs[read_write] = bb;
> +
> + return 0;
> +
> +err_ret:
> + return err;
> +}
> +
> static void emit_clear_link_copy(struct xe_gt *gt, struct xe_bb *bb, u64 src_ofs,
> u32 size, u32 pitch)
> {
> diff --git a/drivers/gpu/drm/xe/xe_migrate.h b/drivers/gpu/drm/xe/xe_migrate.h
> index fb9839c1bae0..96b0449e7edb 100644
> --- a/drivers/gpu/drm/xe/xe_migrate.h
> +++ b/drivers/gpu/drm/xe/xe_migrate.h
> @@ -24,6 +24,8 @@ struct xe_vm;
> struct xe_vm_pgtable_update;
> struct xe_vma;
>
> +enum xe_sriov_vf_ccs_rw_ctxs;
> +
> /**
> * struct xe_migrate_pt_update_ops - Callbacks for the
> * xe_migrate_update_pgtables() function.
> @@ -112,6 +114,10 @@ struct dma_fence *xe_migrate_copy(struct xe_migrate *m,
> struct ttm_resource *dst,
> bool copy_only_ccs);
>
> +int xe_migrate_ccs_rw_copy(struct xe_migrate *m,
> + struct xe_bo *src_bo,
> + enum xe_sriov_vf_ccs_rw_ctxs read_write);
> +
> int xe_migrate_access_memory(struct xe_migrate *m, struct xe_bo *bo,
> unsigned long offset, void *buf, int len,
> int write);
> diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
> index ff5ad472eb96..242a3da1ef27 100644
> --- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
> +++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
> @@ -5,6 +5,7 @@
>
> #include "instructions/xe_mi_commands.h"
> #include "instructions/xe_gpu_commands.h"
> +#include "xe_bb.h"
> #include "xe_bo.h"
> #include "xe_device.h"
> #include "xe_migrate.h"
> @@ -208,3 +209,74 @@ int xe_sriov_vf_ccs_init(struct xe_device *xe)
> err_ret:
> return err;
> }
> +
> +/**
> + * xe_sriov_vf_ccs_attach_bo - Insert CCS read write commands in the BO.
> + * @bo: the &buffer object to which batch buffer commands will be added.
> + *
> + * This function shall be called only by VF. It inserts the PTEs and copy
> + * command instructions in the BO by calling xe_migrate_ccs_rw_copy()
> + * function.
> + *
> + * Returns: 0 if successful, negative error code on failure.
> + */
> +int xe_sriov_vf_ccs_attach_bo(struct xe_bo *bo)
> +{
> + struct xe_device *xe = xe_bo_device(bo);
> + enum xe_sriov_vf_ccs_rw_ctxs ctx_id;
> + struct xe_migrate *migrate;
> + struct xe_tile *tile;
> + struct xe_bb *bb;
> + int tile_id;
> + int err = 0;
> +
> + if (!IS_VF_CCS_READY(xe))
> + return 0;
> +
> + for_each_tile(tile, xe, tile_id) {
Same comment as patch 1, I'd avoid for_each_tile and rather use
xe_device_get_root_tile.
> + for_each_ccs_rw_ctx(ctx_id) {
> + bb = bo->bb_ccs[ctx_id];
> + /* bb should be NULL here. Assert if not NULL */
> + xe_assert(xe, !bb);
> +
> + migrate = tile->sriov.vf.ccs[ctx_id].migrate;
> + err = xe_migrate_ccs_rw_copy(migrate, bo, ctx_id);
> + }
> + }
> + return err;
> +}
> +
> +/**
> + * xe_sriov_vf_ccs_detach_bo - Remove CCS read write commands from the BO.
> + * @bo: the &buffer object from which batch buffer commands will be removed.
> + *
> + * This function shall be called only by VF. It removes the PTEs and copy
> + * command instructions from the BO. Make sure to update the BB with MI_NOOP
> + * before freeing.
> + *
> + * Returns: 0 if successful.
> + */
> +int xe_sriov_vf_ccs_detach_bo(struct xe_bo *bo)
> +{
> + struct xe_device *xe = xe_bo_device(bo);
> + enum xe_sriov_vf_ccs_rw_ctxs ctx_id;
> + struct xe_bb *bb;
> + struct xe_tile *tile;
> + int tile_id;
> +
> + if (!IS_VF_CCS_READY(xe))
> + return 0;
> +
> + for_each_tile(tile, xe, tile_id) {
Same here.
Matt
> + for_each_ccs_rw_ctx(ctx_id) {
> + bb = bo->bb_ccs[ctx_id];
> + if (!bb)
> + continue;
> +
> + memset(bb->cs, MI_NOOP, bb->len * sizeof(u32));
> + xe_bb_free(bb, NULL);
> + bo->bb_ccs[ctx_id] = NULL;
> + }
> + }
> + return 0;
> +}
> diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
> index 5df9ba028d14..5d5e4bd25904 100644
> --- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
> +++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
> @@ -7,7 +7,10 @@
> #define _XE_SRIOV_VF_CCS_H_
>
> struct xe_device;
> +struct xe_bo;
>
> int xe_sriov_vf_ccs_init(struct xe_device *xe);
> +int xe_sriov_vf_ccs_attach_bo(struct xe_bo *bo);
> +int xe_sriov_vf_ccs_detach_bo(struct xe_bo *bo);
>
> #endif
> diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h b/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
> index 6dc279d206ec..e240f3fd18af 100644
> --- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
> +++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
> @@ -27,6 +27,14 @@ enum xe_sriov_vf_ccs_rw_ctxs {
> XE_SRIOV_VF_CCS_CTX_COUNT
> };
>
> +#define IS_VF_CCS_BB_VALID(xe, bo) ({ \
> + struct xe_device *___xe = (xe); \
> + struct xe_bo *___bo = (bo); \
> + IS_SRIOV_VF(___xe) && \
> + ___bo->bb_ccs[XE_SRIOV_VF_CCS_READ_CTX] && \
> + ___bo->bb_ccs[XE_SRIOV_VF_CCS_WRITE_CTX]; \
> + })
> +
> struct xe_migrate;
> struct xe_sa_manager;
>
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 17+ messages in thread* Re: [PATCH v8 2/3] drm/xe/vf: Attach and detach CCS copy commands with BO
2025-06-20 16:25 ` Matthew Brost
@ 2025-06-23 21:41 ` Matthew Brost
2025-06-24 4:58 ` K V P, Satyanarayana
0 siblings, 1 reply; 17+ messages in thread
From: Matthew Brost @ 2025-06-23 21:41 UTC (permalink / raw)
To: Satyanarayana K V P
Cc: intel-xe, Michal Wajdeczko, Matthew Auld, Michał Winiarski,
Tomasz Lis
On Fri, Jun 20, 2025 at 09:25:18AM -0700, Matthew Brost wrote:
> On Thu, Jun 19, 2025 at 01:34:58PM +0530, Satyanarayana K V P wrote:
> > Attach CCS read/write copy commands to BO for old and new mem types as
> > NULL -> tt or system -> tt.
> > Detach the CCS read/write copy commands from BO while deleting ttm bo
> > from xe_ttm_bo_delete_mem_notify().
> >
> > Signed-off-by: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
> > Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> > Cc: Matthew Brost <matthew.brost@intel.com>
> > Cc: Matthew Auld <matthew.auld@intel.com>
> > Cc: Michał Winiarski <michal.winiarski@intel.com>
> > ---
> > Cc: Tomasz Lis <tomasz.lis@intel.com>
> >
> > V7 -> V8:
> > - Removed xe_bb_ccs_realloc() and created a single BB by calculating the
> > BB size first and then emitting the commands. (Matthew Brost)
> > - Added xe_assert() if BB is not NULL in xe_sriov_vf_ccs_attach_bo().
> >
> > V6 -> V7:
> > - Created xe_bb_ccs_realloc() to create a single BB instead of maintaining
> > a list. (Matthew Brost)
> >
> > V5 -> V6:
> > - Removed dead code from xe_migrate_ccs_rw_copy() function. (Matthew Brost)
> >
> > V4 -> V5:
> > - Create a list of BBs for the given BO and fixed memory leak while
> > detaching BOs. (Matthew Brost).
> > - Fixed review comments (Matthew Brost & Matthew Auld).
> > - Yet to cleanup xe_migrate_ccs_rw_copy() function.
> >
> > V3 -> V4:
> > - Fixed issues reported by patchworks.
> >
> > V2 -> V3:
> > - Attach and detach functions check for IS_VF_CCS_READY().
> >
> > V1 -> V2:
> > - Fixed review comments.
> > ---
> > drivers/gpu/drm/xe/xe_bb.c | 35 ++++++
> > drivers/gpu/drm/xe/xe_bb.h | 3 +
> > drivers/gpu/drm/xe/xe_bo.c | 23 ++++
> > drivers/gpu/drm/xe/xe_bo_types.h | 3 +
> > drivers/gpu/drm/xe/xe_migrate.c | 130 +++++++++++++++++++++
> > drivers/gpu/drm/xe/xe_migrate.h | 6 +
> > drivers/gpu/drm/xe/xe_sriov_vf_ccs.c | 72 ++++++++++++
> > drivers/gpu/drm/xe/xe_sriov_vf_ccs.h | 3 +
> > drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h | 8 ++
> > 9 files changed, 283 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/xe/xe_bb.c b/drivers/gpu/drm/xe/xe_bb.c
> > index 9570672fce33..533352dc892f 100644
> > --- a/drivers/gpu/drm/xe/xe_bb.c
> > +++ b/drivers/gpu/drm/xe/xe_bb.c
> > @@ -60,6 +60,41 @@ struct xe_bb *xe_bb_new(struct xe_gt *gt, u32 dwords, bool usm)
> > return ERR_PTR(err);
> > }
> >
> > +struct xe_bb *xe_bb_ccs_new(struct xe_gt *gt, u32 dwords,
> > + enum xe_sriov_vf_ccs_rw_ctxs ctx_id)
> > +{
> > + struct xe_bb *bb = kmalloc(sizeof(*bb), GFP_KERNEL);
> > + struct xe_tile *tile = gt_to_tile(gt);
> > + struct xe_sa_manager *bb_pool;
> > + int err;
> > +
> > + if (!bb)
> > + return ERR_PTR(-ENOMEM);
> > + /*
> > + * We need to allocate space for the requested number of dwords &
> > + * one additional MI_BATCH_BUFFER_END dword. Since the whole SA
> > + * is submitted to HW, we need to make sure that the last instruction
> > + * is not over written when the last chunk of SA is allocated for BB.
> > + * So, this extra DW acts as a guard here.
> > + */
> > +
> > + bb_pool = tile->sriov.vf.ccs[ctx_id].mem.ccs_bb_pool;
> > + bb->bo = xe_sa_bo_new(bb_pool, 4 * (dwords + 1));
> > +
> > + if (IS_ERR(bb->bo)) {
> > + err = PTR_ERR(bb->bo);
> > + goto err;
> > + }
> > +
> > + bb->cs = xe_sa_bo_cpu_addr(bb->bo);
> > + bb->len = 0;
> > +
> > + return bb;
> > +err:
> > + kfree(bb);
> > + return ERR_PTR(err);
> > +}
> > +
> > static struct xe_sched_job *
> > __xe_bb_create_job(struct xe_exec_queue *q, struct xe_bb *bb, u64 *addr)
> > {
> > diff --git a/drivers/gpu/drm/xe/xe_bb.h b/drivers/gpu/drm/xe/xe_bb.h
> > index fafacd73dcc3..32c9c4c5d2be 100644
> > --- a/drivers/gpu/drm/xe/xe_bb.h
> > +++ b/drivers/gpu/drm/xe/xe_bb.h
> > @@ -13,8 +13,11 @@ struct dma_fence;
> > struct xe_gt;
> > struct xe_exec_queue;
> > struct xe_sched_job;
> > +enum xe_sriov_vf_ccs_rw_ctxs;
> >
> > struct xe_bb *xe_bb_new(struct xe_gt *gt, u32 size, bool usm);
> > +struct xe_bb *xe_bb_ccs_new(struct xe_gt *gt, u32 dwords,
> > + enum xe_sriov_vf_ccs_rw_ctxs ctx_id);
> > struct xe_sched_job *xe_bb_create_job(struct xe_exec_queue *q,
> > struct xe_bb *bb);
> > struct xe_sched_job *xe_bb_create_migration_job(struct xe_exec_queue *q,
> > diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
> > index 4e39188a021a..beaf8544bf08 100644
> > --- a/drivers/gpu/drm/xe/xe_bo.c
> > +++ b/drivers/gpu/drm/xe/xe_bo.c
> > @@ -31,6 +31,7 @@
> > #include "xe_pxp.h"
> > #include "xe_res_cursor.h"
> > #include "xe_shrinker.h"
> > +#include "xe_sriov_vf_ccs.h"
> > #include "xe_trace_bo.h"
> > #include "xe_ttm_stolen_mgr.h"
> > #include "xe_vm.h"
> > @@ -947,6 +948,20 @@ static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool evict,
> > dma_fence_put(fence);
> > xe_pm_runtime_put(xe);
> >
> > + /*
> > + * CCS meta data is migrated from TT -> SMEM. So, let us detach the
> > + * BBs from BO as it is no longer needed.
> > + */
> > + if (IS_VF_CCS_BB_VALID(xe, bo) && old_mem_type == XE_PL_TT &&
> > + new_mem->mem_type == XE_PL_SYSTEM)
> > + xe_sriov_vf_ccs_detach_bo(bo);
> > +
> > + if (IS_SRIOV_VF(xe) &&
> > + ((move_lacks_source && new_mem->mem_type == XE_PL_TT) ||
> > + (old_mem_type == XE_PL_SYSTEM && new_mem->mem_type == XE_PL_TT)) &&
> > + handle_system_ccs)
> > + ret = xe_sriov_vf_ccs_attach_bo(bo);
> > +
>
> You don't check the 'ret' value of xe_sriov_vf_ccs_attach_bo. That seems be an oversight.
>
> > out:
> > if ((!ttm_bo->resource || ttm_bo->resource->mem_type == XE_PL_SYSTEM) &&
> > ttm_bo->ttm) {
> > @@ -957,6 +972,9 @@ static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool evict,
> > if (timeout < 0)
> > ret = timeout;
> >
> > + if (IS_VF_CCS_BB_VALID(xe, bo))
> > + xe_sriov_vf_ccs_detach_bo(bo);
> > +
> > xe_tt_unmap_sg(xe, ttm_bo->ttm);
> > }
> >
> > @@ -1483,9 +1501,14 @@ static void xe_ttm_bo_release_notify(struct ttm_buffer_object *ttm_bo)
> >
> > static void xe_ttm_bo_delete_mem_notify(struct ttm_buffer_object *ttm_bo)
> > {
> > + struct xe_bo *bo = ttm_to_xe_bo(ttm_bo);
> > +
> > if (!xe_bo_is_xe_bo(ttm_bo))
> > return;
> >
> > + if (IS_VF_CCS_BB_VALID(ttm_to_xe_device(ttm_bo->bdev), bo))
> > + xe_sriov_vf_ccs_detach_bo(bo);
> > +
> > /*
> > * Object is idle and about to be destroyed. Release the
> > * dma-buf attachment.
> > diff --git a/drivers/gpu/drm/xe/xe_bo_types.h b/drivers/gpu/drm/xe/xe_bo_types.h
> > index eb5e83c5f233..642e519fcfd1 100644
> > --- a/drivers/gpu/drm/xe/xe_bo_types.h
> > +++ b/drivers/gpu/drm/xe/xe_bo_types.h
> > @@ -78,6 +78,9 @@ struct xe_bo {
> > /** @ccs_cleared */
> > bool ccs_cleared;
> >
> > + /** @bb_ccs_rw: BB instructions of CCS read/write. Valid only for VF */
> > + struct xe_bb *bb_ccs[XE_SRIOV_VF_CCS_CTX_COUNT];
> > +
> > /**
> > * @cpu_caching: CPU caching mode. Currently only used for userspace
> > * objects. Exceptions are system memory on DGFX, which is always
> > diff --git a/drivers/gpu/drm/xe/xe_migrate.c b/drivers/gpu/drm/xe/xe_migrate.c
> > index 8f8e9fdfb2a8..c730b34071ad 100644
> > --- a/drivers/gpu/drm/xe/xe_migrate.c
> > +++ b/drivers/gpu/drm/xe/xe_migrate.c
> > @@ -940,6 +940,136 @@ struct dma_fence *xe_migrate_copy(struct xe_migrate *m,
> > return fence;
> > }
> >
> > +/**
> > + * xe_migrate_ccs_rw_copy() - Copy content of TTM resources.
> > + * @m: The migration context.
> > + * @src_bo: The buffer object @src is currently bound to.
> > + * @read_write : Creates BB commands for CCS read/write.
> > + *
> > + * Creates batch buffer instructions to copy CCS metadata from CCS pool to
> > + * memory and vice versa.
> > + *
> > + * This function should only be called for IGPU.
> > + *
> > + * Return: 0 if successful, negative error code on failure.
> > + */
> > +int xe_migrate_ccs_rw_copy(struct xe_migrate *m,
> > + struct xe_bo *src_bo,
> > + enum xe_sriov_vf_ccs_rw_ctxs read_write)
> > +
> > +{
> > + bool src_is_pltt = read_write == XE_SRIOV_VF_CCS_WRITE_CTX;
> > + bool dst_is_pltt = read_write == XE_SRIOV_VF_CCS_READ_CTX;
> > + struct ttm_resource *src = src_bo->ttm.resource;
> > + struct xe_gt *gt = m->tile->primary_gt;
> > + u32 batch_size, batch_size_allocated;
> > + struct xe_device *xe = gt_to_xe(gt);
> > + struct xe_res_cursor src_it, ccs_it;
> > + u64 size = src_bo->size;
> > + struct xe_bb *bb = NULL;
> > + u64 src_L0, src_L0_ofs;
> > + u32 src_L0_pt;
> > + int err;
> > +
> > + xe_res_first_sg(xe_bo_sg(src_bo), 0, size, &src_it);
> > +
> > + xe_res_first_sg(xe_bo_sg(src_bo), xe_bo_ccs_pages_start(src_bo),
> > + PAGE_ALIGN(xe_device_ccs_bytes(xe, size)),
> > + &ccs_it);
> > +
> > + /* Calculate Batch buffer size */
> > + batch_size = 0;
> > + while (size) {
> > + batch_size += 6; /* Flush + 2 NOP */
> > + u64 ccs_ofs, ccs_size;
> > + u32 ccs_pt;
> > +
> > + u32 avail_pts = max_mem_transfer_per_pass(xe) / LEVEL0_PAGE_TABLE_ENCODE_SIZE;
> > +
> > + src_L0 = min_t(u64, max_mem_transfer_per_pass(xe), size);
> > +
> > + batch_size += pte_update_size(m, false, src, &src_it, &src_L0,
> > + &src_L0_ofs, &src_L0_pt, 0, 0,
> > + avail_pts);
> > +
> > + ccs_size = xe_device_ccs_bytes(xe, src_L0);
> > + batch_size += pte_update_size(m, 0, NULL, &ccs_it, &ccs_size, &ccs_ofs,
> > + &ccs_pt, 0, avail_pts, avail_pts);
> > + xe_assert(xe, IS_ALIGNED(ccs_it.start, PAGE_SIZE));
> > +
> > + /* Add copy commands size here */
> > + batch_size += EMIT_COPY_CCS_DW;
> > +
> > + size -= src_L0;
> > + }
> > +
> > + bb = xe_bb_ccs_new(gt, batch_size, read_write);
> > + if (IS_ERR(bb)) {
> > + drm_err(&xe->drm, "BB allocation failed.\n");
> > + err = PTR_ERR(bb);
> > + goto err_ret;
> > + }
> > +
> > + batch_size_allocated = batch_size;
> > + size = src_bo->size;
> > + batch_size = 0;
> > +
> > + /*
> > + * Emit PTE and copy commands here.
> > + * The CCS copy command can only support limited size. If the size to be
> > + * copied is more than the limit, divide copy into chunks. So, calculate
> > + * sizes here again before copy command is emitted.
> > + */
> > + while (size) {
> > + batch_size += 6; /* Flush + 2 NOP */
> > + u32 flush_flags = 0;
> > + u64 ccs_ofs, ccs_size;
> > + u32 ccs_pt;
> > +
> > + u32 avail_pts = max_mem_transfer_per_pass(xe) / LEVEL0_PAGE_TABLE_ENCODE_SIZE;
> > +
> > + src_L0 = xe_migrate_res_sizes(m, &src_it);
> > +
> > + batch_size += pte_update_size(m, false, src, &src_it, &src_L0,
> > + &src_L0_ofs, &src_L0_pt, 0, 0,
> > + avail_pts);
> > +
> > + ccs_size = xe_device_ccs_bytes(xe, src_L0);
> > + batch_size += pte_update_size(m, 0, NULL, &ccs_it, &ccs_size, &ccs_ofs,
> > + &ccs_pt, 0, avail_pts, avail_pts);
> > + xe_assert(xe, IS_ALIGNED(ccs_it.start, PAGE_SIZE));
> > + batch_size += EMIT_COPY_CCS_DW;
> > +
> > + emit_pte(m, bb, src_L0_pt, false, true, &src_it, src_L0, src);
> > +
> > + emit_pte(m, bb, ccs_pt, false, false, &ccs_it, ccs_size, src);
> > +
> > + bb->cs[bb->len++] = MI_FLUSH_DW | MI_INVALIDATE_TLB | MI_FLUSH_DW_OP_STOREDW |
> > + MI_FLUSH_IMM_DW;
> > + bb->cs[bb->len++] = MI_NOOP;
> > + bb->cs[bb->len++] = MI_NOOP;
> > +
> > + flush_flags = xe_migrate_ccs_copy(m, bb, src_L0_ofs, src_is_pltt,
> > + src_L0_ofs, dst_is_pltt,
> > + src_L0, ccs_ofs, true);
> > +
> > + bb->cs[bb->len++] = MI_FLUSH_DW | MI_INVALIDATE_TLB | MI_FLUSH_DW_OP_STOREDW |
> > + MI_FLUSH_IMM_DW | flush_flags;
Missed this - you don't need MI_INVALIDATE_TLB here, just after emitting
the PTEs. I believe that should speedup this copy a little too.
This also looks wrong in emit_migration_job_gen12 too. Going to follow
up on this now.
Matt
> > + bb->cs[bb->len++] = MI_NOOP;
> > + bb->cs[bb->len++] = MI_NOOP;
> > +
> > + size -= src_L0;
> > + }
> > +
> > + xe_assert(xe, (batch_size_allocated == bb->len));
> > + src_bo->bb_ccs[read_write] = bb;
> > +
> > + return 0;
> > +
> > +err_ret:
> > + return err;
> > +}
> > +
> > static void emit_clear_link_copy(struct xe_gt *gt, struct xe_bb *bb, u64 src_ofs,
> > u32 size, u32 pitch)
> > {
> > diff --git a/drivers/gpu/drm/xe/xe_migrate.h b/drivers/gpu/drm/xe/xe_migrate.h
> > index fb9839c1bae0..96b0449e7edb 100644
> > --- a/drivers/gpu/drm/xe/xe_migrate.h
> > +++ b/drivers/gpu/drm/xe/xe_migrate.h
> > @@ -24,6 +24,8 @@ struct xe_vm;
> > struct xe_vm_pgtable_update;
> > struct xe_vma;
> >
> > +enum xe_sriov_vf_ccs_rw_ctxs;
> > +
> > /**
> > * struct xe_migrate_pt_update_ops - Callbacks for the
> > * xe_migrate_update_pgtables() function.
> > @@ -112,6 +114,10 @@ struct dma_fence *xe_migrate_copy(struct xe_migrate *m,
> > struct ttm_resource *dst,
> > bool copy_only_ccs);
> >
> > +int xe_migrate_ccs_rw_copy(struct xe_migrate *m,
> > + struct xe_bo *src_bo,
> > + enum xe_sriov_vf_ccs_rw_ctxs read_write);
> > +
> > int xe_migrate_access_memory(struct xe_migrate *m, struct xe_bo *bo,
> > unsigned long offset, void *buf, int len,
> > int write);
> > diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
> > index ff5ad472eb96..242a3da1ef27 100644
> > --- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
> > +++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
> > @@ -5,6 +5,7 @@
> >
> > #include "instructions/xe_mi_commands.h"
> > #include "instructions/xe_gpu_commands.h"
> > +#include "xe_bb.h"
> > #include "xe_bo.h"
> > #include "xe_device.h"
> > #include "xe_migrate.h"
> > @@ -208,3 +209,74 @@ int xe_sriov_vf_ccs_init(struct xe_device *xe)
> > err_ret:
> > return err;
> > }
> > +
> > +/**
> > + * xe_sriov_vf_ccs_attach_bo - Insert CCS read write commands in the BO.
> > + * @bo: the &buffer object to which batch buffer commands will be added.
> > + *
> > + * This function shall be called only by VF. It inserts the PTEs and copy
> > + * command instructions in the BO by calling xe_migrate_ccs_rw_copy()
> > + * function.
> > + *
> > + * Returns: 0 if successful, negative error code on failure.
> > + */
> > +int xe_sriov_vf_ccs_attach_bo(struct xe_bo *bo)
> > +{
> > + struct xe_device *xe = xe_bo_device(bo);
> > + enum xe_sriov_vf_ccs_rw_ctxs ctx_id;
> > + struct xe_migrate *migrate;
> > + struct xe_tile *tile;
> > + struct xe_bb *bb;
> > + int tile_id;
> > + int err = 0;
> > +
> > + if (!IS_VF_CCS_READY(xe))
> > + return 0;
> > +
> > + for_each_tile(tile, xe, tile_id) {
>
> Same comment as patch 1, I'd avoid for_each_tile and rather use
> xe_device_get_root_tile.
>
> > + for_each_ccs_rw_ctx(ctx_id) {
> > + bb = bo->bb_ccs[ctx_id];
> > + /* bb should be NULL here. Assert if not NULL */
> > + xe_assert(xe, !bb);
> > +
> > + migrate = tile->sriov.vf.ccs[ctx_id].migrate;
> > + err = xe_migrate_ccs_rw_copy(migrate, bo, ctx_id);
> > + }
> > + }
> > + return err;
> > +}
> > +
> > +/**
> > + * xe_sriov_vf_ccs_detach_bo - Remove CCS read write commands from the BO.
> > + * @bo: the &buffer object from which batch buffer commands will be removed.
> > + *
> > + * This function shall be called only by VF. It removes the PTEs and copy
> > + * command instructions from the BO. Make sure to update the BB with MI_NOOP
> > + * before freeing.
> > + *
> > + * Returns: 0 if successful.
> > + */
> > +int xe_sriov_vf_ccs_detach_bo(struct xe_bo *bo)
> > +{
> > + struct xe_device *xe = xe_bo_device(bo);
> > + enum xe_sriov_vf_ccs_rw_ctxs ctx_id;
> > + struct xe_bb *bb;
> > + struct xe_tile *tile;
> > + int tile_id;
> > +
> > + if (!IS_VF_CCS_READY(xe))
> > + return 0;
> > +
> > + for_each_tile(tile, xe, tile_id) {
>
> Same here.
>
> Matt
>
> > + for_each_ccs_rw_ctx(ctx_id) {
> > + bb = bo->bb_ccs[ctx_id];
> > + if (!bb)
> > + continue;
> > +
> > + memset(bb->cs, MI_NOOP, bb->len * sizeof(u32));
> > + xe_bb_free(bb, NULL);
> > + bo->bb_ccs[ctx_id] = NULL;
> > + }
> > + }
> > + return 0;
> > +}
> > diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
> > index 5df9ba028d14..5d5e4bd25904 100644
> > --- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
> > +++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
> > @@ -7,7 +7,10 @@
> > #define _XE_SRIOV_VF_CCS_H_
> >
> > struct xe_device;
> > +struct xe_bo;
> >
> > int xe_sriov_vf_ccs_init(struct xe_device *xe);
> > +int xe_sriov_vf_ccs_attach_bo(struct xe_bo *bo);
> > +int xe_sriov_vf_ccs_detach_bo(struct xe_bo *bo);
> >
> > #endif
> > diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h b/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
> > index 6dc279d206ec..e240f3fd18af 100644
> > --- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
> > +++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
> > @@ -27,6 +27,14 @@ enum xe_sriov_vf_ccs_rw_ctxs {
> > XE_SRIOV_VF_CCS_CTX_COUNT
> > };
> >
> > +#define IS_VF_CCS_BB_VALID(xe, bo) ({ \
> > + struct xe_device *___xe = (xe); \
> > + struct xe_bo *___bo = (bo); \
> > + IS_SRIOV_VF(___xe) && \
> > + ___bo->bb_ccs[XE_SRIOV_VF_CCS_READ_CTX] && \
> > + ___bo->bb_ccs[XE_SRIOV_VF_CCS_WRITE_CTX]; \
> > + })
> > +
> > struct xe_migrate;
> > struct xe_sa_manager;
> >
> > --
> > 2.43.0
> >
^ permalink raw reply [flat|nested] 17+ messages in thread* RE: [PATCH v8 2/3] drm/xe/vf: Attach and detach CCS copy commands with BO
2025-06-23 21:41 ` Matthew Brost
@ 2025-06-24 4:58 ` K V P, Satyanarayana
2025-06-24 9:37 ` K V P, Satyanarayana
0 siblings, 1 reply; 17+ messages in thread
From: K V P, Satyanarayana @ 2025-06-24 4:58 UTC (permalink / raw)
To: Brost, Matthew
Cc: intel-xe@lists.freedesktop.org, Wajdeczko, Michal, Auld, Matthew,
Winiarski, Michal, Lis, Tomasz, K V P, Satyanarayana
Hi.
> -----Original Message-----
> From: Brost, Matthew <matthew.brost@intel.com>
> Sent: Tuesday, June 24, 2025 3:12 AM
> To: K V P, Satyanarayana <satyanarayana.k.v.p@intel.com>
> Cc: intel-xe@lists.freedesktop.org; Wajdeczko, Michal
> <Michal.Wajdeczko@intel.com>; Auld, Matthew <matthew.auld@intel.com>;
> Winiarski, Michal <michal.winiarski@intel.com>; Lis, Tomasz
> <tomasz.lis@intel.com>
> Subject: Re: [PATCH v8 2/3] drm/xe/vf: Attach and detach CCS copy
> commands with BO
>
> On Fri, Jun 20, 2025 at 09:25:18AM -0700, Matthew Brost wrote:
> > On Thu, Jun 19, 2025 at 01:34:58PM +0530, Satyanarayana K V P wrote:
> > > Attach CCS read/write copy commands to BO for old and new mem types
> as
> > > NULL -> tt or system -> tt.
> > > Detach the CCS read/write copy commands from BO while deleting ttm bo
> > > from xe_ttm_bo_delete_mem_notify().
> > >
> > > Signed-off-by: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
> > > Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> > > Cc: Matthew Brost <matthew.brost@intel.com>
> > > Cc: Matthew Auld <matthew.auld@intel.com>
> > > Cc: Michał Winiarski <michal.winiarski@intel.com>
> > > ---
> > > Cc: Tomasz Lis <tomasz.lis@intel.com>
> > >
> > > V7 -> V8:
> > > - Removed xe_bb_ccs_realloc() and created a single BB by calculating the
> > > BB size first and then emitting the commands. (Matthew Brost)
> > > - Added xe_assert() if BB is not NULL in xe_sriov_vf_ccs_attach_bo().
> > >
> > > V6 -> V7:
> > > - Created xe_bb_ccs_realloc() to create a single BB instead of maintaining
> > > a list. (Matthew Brost)
> > >
> > > V5 -> V6:
> > > - Removed dead code from xe_migrate_ccs_rw_copy() function. (Matthew
> Brost)
> > >
> > > V4 -> V5:
> > > - Create a list of BBs for the given BO and fixed memory leak while
> > > detaching BOs. (Matthew Brost).
> > > - Fixed review comments (Matthew Brost & Matthew Auld).
> > > - Yet to cleanup xe_migrate_ccs_rw_copy() function.
> > >
> > > V3 -> V4:
> > > - Fixed issues reported by patchworks.
> > >
> > > V2 -> V3:
> > > - Attach and detach functions check for IS_VF_CCS_READY().
> > >
> > > V1 -> V2:
> > > - Fixed review comments.
> > > ---
> > > drivers/gpu/drm/xe/xe_bb.c | 35 ++++++
> > > drivers/gpu/drm/xe/xe_bb.h | 3 +
> > > drivers/gpu/drm/xe/xe_bo.c | 23 ++++
> > > drivers/gpu/drm/xe/xe_bo_types.h | 3 +
> > > drivers/gpu/drm/xe/xe_migrate.c | 130 +++++++++++++++++++++
> > > drivers/gpu/drm/xe/xe_migrate.h | 6 +
> > > drivers/gpu/drm/xe/xe_sriov_vf_ccs.c | 72 ++++++++++++
> > > drivers/gpu/drm/xe/xe_sriov_vf_ccs.h | 3 +
> > > drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h | 8 ++
> > > 9 files changed, 283 insertions(+)
> > >
> > > diff --git a/drivers/gpu/drm/xe/xe_bb.c b/drivers/gpu/drm/xe/xe_bb.c
> > > index 9570672fce33..533352dc892f 100644
> > > --- a/drivers/gpu/drm/xe/xe_bb.c
> > > +++ b/drivers/gpu/drm/xe/xe_bb.c
> > > @@ -60,6 +60,41 @@ struct xe_bb *xe_bb_new(struct xe_gt *gt, u32
> dwords, bool usm)
> > > return ERR_PTR(err);
> > > }
> > >
> > > +struct xe_bb *xe_bb_ccs_new(struct xe_gt *gt, u32 dwords,
> > > + enum xe_sriov_vf_ccs_rw_ctxs ctx_id)
> > > +{
> > > + struct xe_bb *bb = kmalloc(sizeof(*bb), GFP_KERNEL);
> > > + struct xe_tile *tile = gt_to_tile(gt);
> > > + struct xe_sa_manager *bb_pool;
> > > + int err;
> > > +
> > > + if (!bb)
> > > + return ERR_PTR(-ENOMEM);
> > > + /*
> > > + * We need to allocate space for the requested number of dwords &
> > > + * one additional MI_BATCH_BUFFER_END dword. Since the whole SA
> > > + * is submitted to HW, we need to make sure that the last instruction
> > > + * is not over written when the last chunk of SA is allocated for BB.
> > > + * So, this extra DW acts as a guard here.
> > > + */
> > > +
> > > + bb_pool = tile->sriov.vf.ccs[ctx_id].mem.ccs_bb_pool;
> > > + bb->bo = xe_sa_bo_new(bb_pool, 4 * (dwords + 1));
> > > +
> > > + if (IS_ERR(bb->bo)) {
> > > + err = PTR_ERR(bb->bo);
> > > + goto err;
> > > + }
> > > +
> > > + bb->cs = xe_sa_bo_cpu_addr(bb->bo);
> > > + bb->len = 0;
> > > +
> > > + return bb;
> > > +err:
> > > + kfree(bb);
> > > + return ERR_PTR(err);
> > > +}
> > > +
> > > static struct xe_sched_job *
> > > __xe_bb_create_job(struct xe_exec_queue *q, struct xe_bb *bb, u64
> *addr)
> > > {
> > > diff --git a/drivers/gpu/drm/xe/xe_bb.h b/drivers/gpu/drm/xe/xe_bb.h
> > > index fafacd73dcc3..32c9c4c5d2be 100644
> > > --- a/drivers/gpu/drm/xe/xe_bb.h
> > > +++ b/drivers/gpu/drm/xe/xe_bb.h
> > > @@ -13,8 +13,11 @@ struct dma_fence;
> > > struct xe_gt;
> > > struct xe_exec_queue;
> > > struct xe_sched_job;
> > > +enum xe_sriov_vf_ccs_rw_ctxs;
> > >
> > > struct xe_bb *xe_bb_new(struct xe_gt *gt, u32 size, bool usm);
> > > +struct xe_bb *xe_bb_ccs_new(struct xe_gt *gt, u32 dwords,
> > > + enum xe_sriov_vf_ccs_rw_ctxs ctx_id);
> > > struct xe_sched_job *xe_bb_create_job(struct xe_exec_queue *q,
> > > struct xe_bb *bb);
> > > struct xe_sched_job *xe_bb_create_migration_job(struct xe_exec_queue
> *q,
> > > diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
> > > index 4e39188a021a..beaf8544bf08 100644
> > > --- a/drivers/gpu/drm/xe/xe_bo.c
> > > +++ b/drivers/gpu/drm/xe/xe_bo.c
> > > @@ -31,6 +31,7 @@
> > > #include "xe_pxp.h"
> > > #include "xe_res_cursor.h"
> > > #include "xe_shrinker.h"
> > > +#include "xe_sriov_vf_ccs.h"
> > > #include "xe_trace_bo.h"
> > > #include "xe_ttm_stolen_mgr.h"
> > > #include "xe_vm.h"
> > > @@ -947,6 +948,20 @@ static int xe_bo_move(struct ttm_buffer_object
> *ttm_bo, bool evict,
> > > dma_fence_put(fence);
> > > xe_pm_runtime_put(xe);
> > >
> > > + /*
> > > + * CCS meta data is migrated from TT -> SMEM. So, let us detach the
> > > + * BBs from BO as it is no longer needed.
> > > + */
> > > + if (IS_VF_CCS_BB_VALID(xe, bo) && old_mem_type == XE_PL_TT &&
> > > + new_mem->mem_type == XE_PL_SYSTEM)
> > > + xe_sriov_vf_ccs_detach_bo(bo);
> > > +
> > > + if (IS_SRIOV_VF(xe) &&
> > > + ((move_lacks_source && new_mem->mem_type == XE_PL_TT) ||
> > > + (old_mem_type == XE_PL_SYSTEM && new_mem->mem_type ==
> XE_PL_TT)) &&
> > > + handle_system_ccs)
> > > + ret = xe_sriov_vf_ccs_attach_bo(bo);
> > > +
> >
> > You don't check the 'ret' value of xe_sriov_vf_ccs_attach_bo. That seems be
> an oversight.
> >
> > > out:
> > > if ((!ttm_bo->resource || ttm_bo->resource->mem_type ==
> XE_PL_SYSTEM) &&
> > > ttm_bo->ttm) {
> > > @@ -957,6 +972,9 @@ static int xe_bo_move(struct ttm_buffer_object
> *ttm_bo, bool evict,
> > > if (timeout < 0)
> > > ret = timeout;
> > >
> > > + if (IS_VF_CCS_BB_VALID(xe, bo))
> > > + xe_sriov_vf_ccs_detach_bo(bo);
> > > +
> > > xe_tt_unmap_sg(xe, ttm_bo->ttm);
> > > }
> > >
> > > @@ -1483,9 +1501,14 @@ static void xe_ttm_bo_release_notify(struct
> ttm_buffer_object *ttm_bo)
> > >
> > > static void xe_ttm_bo_delete_mem_notify(struct ttm_buffer_object
> *ttm_bo)
> > > {
> > > + struct xe_bo *bo = ttm_to_xe_bo(ttm_bo);
> > > +
> > > if (!xe_bo_is_xe_bo(ttm_bo))
> > > return;
> > >
> > > + if (IS_VF_CCS_BB_VALID(ttm_to_xe_device(ttm_bo->bdev), bo))
> > > + xe_sriov_vf_ccs_detach_bo(bo);
> > > +
> > > /*
> > > * Object is idle and about to be destroyed. Release the
> > > * dma-buf attachment.
> > > diff --git a/drivers/gpu/drm/xe/xe_bo_types.h
> b/drivers/gpu/drm/xe/xe_bo_types.h
> > > index eb5e83c5f233..642e519fcfd1 100644
> > > --- a/drivers/gpu/drm/xe/xe_bo_types.h
> > > +++ b/drivers/gpu/drm/xe/xe_bo_types.h
> > > @@ -78,6 +78,9 @@ struct xe_bo {
> > > /** @ccs_cleared */
> > > bool ccs_cleared;
> > >
> > > + /** @bb_ccs_rw: BB instructions of CCS read/write. Valid only for VF
> */
> > > + struct xe_bb *bb_ccs[XE_SRIOV_VF_CCS_CTX_COUNT];
> > > +
> > > /**
> > > * @cpu_caching: CPU caching mode. Currently only used for
> userspace
> > > * objects. Exceptions are system memory on DGFX, which is always
> > > diff --git a/drivers/gpu/drm/xe/xe_migrate.c
> b/drivers/gpu/drm/xe/xe_migrate.c
> > > index 8f8e9fdfb2a8..c730b34071ad 100644
> > > --- a/drivers/gpu/drm/xe/xe_migrate.c
> > > +++ b/drivers/gpu/drm/xe/xe_migrate.c
> > > @@ -940,6 +940,136 @@ struct dma_fence *xe_migrate_copy(struct
> xe_migrate *m,
> > > return fence;
> > > }
> > >
> > > +/**
> > > + * xe_migrate_ccs_rw_copy() - Copy content of TTM resources.
> > > + * @m: The migration context.
> > > + * @src_bo: The buffer object @src is currently bound to.
> > > + * @read_write : Creates BB commands for CCS read/write.
> > > + *
> > > + * Creates batch buffer instructions to copy CCS metadata from CCS pool
> to
> > > + * memory and vice versa.
> > > + *
> > > + * This function should only be called for IGPU.
> > > + *
> > > + * Return: 0 if successful, negative error code on failure.
> > > + */
> > > +int xe_migrate_ccs_rw_copy(struct xe_migrate *m,
> > > + struct xe_bo *src_bo,
> > > + enum xe_sriov_vf_ccs_rw_ctxs read_write)
> > > +
> > > +{
> > > + bool src_is_pltt = read_write == XE_SRIOV_VF_CCS_WRITE_CTX;
> > > + bool dst_is_pltt = read_write == XE_SRIOV_VF_CCS_READ_CTX;
> > > + struct ttm_resource *src = src_bo->ttm.resource;
> > > + struct xe_gt *gt = m->tile->primary_gt;
> > > + u32 batch_size, batch_size_allocated;
> > > + struct xe_device *xe = gt_to_xe(gt);
> > > + struct xe_res_cursor src_it, ccs_it;
> > > + u64 size = src_bo->size;
> > > + struct xe_bb *bb = NULL;
> > > + u64 src_L0, src_L0_ofs;
> > > + u32 src_L0_pt;
> > > + int err;
> > > +
> > > + xe_res_first_sg(xe_bo_sg(src_bo), 0, size, &src_it);
> > > +
> > > + xe_res_first_sg(xe_bo_sg(src_bo), xe_bo_ccs_pages_start(src_bo),
> > > + PAGE_ALIGN(xe_device_ccs_bytes(xe, size)),
> > > + &ccs_it);
> > > +
> > > + /* Calculate Batch buffer size */
> > > + batch_size = 0;
> > > + while (size) {
> > > + batch_size += 6; /* Flush + 2 NOP */
> > > + u64 ccs_ofs, ccs_size;
> > > + u32 ccs_pt;
> > > +
> > > + u32 avail_pts = max_mem_transfer_per_pass(xe) /
> LEVEL0_PAGE_TABLE_ENCODE_SIZE;
> > > +
> > > + src_L0 = min_t(u64, max_mem_transfer_per_pass(xe), size);
> > > +
> > > + batch_size += pte_update_size(m, false, src, &src_it, &src_L0,
> > > + &src_L0_ofs, &src_L0_pt, 0, 0,
> > > + avail_pts);
> > > +
> > > + ccs_size = xe_device_ccs_bytes(xe, src_L0);
> > > + batch_size += pte_update_size(m, 0, NULL, &ccs_it, &ccs_size,
> &ccs_ofs,
> > > + &ccs_pt, 0, avail_pts, avail_pts);
> > > + xe_assert(xe, IS_ALIGNED(ccs_it.start, PAGE_SIZE));
> > > +
> > > + /* Add copy commands size here */
> > > + batch_size += EMIT_COPY_CCS_DW;
> > > +
> > > + size -= src_L0;
> > > + }
> > > +
> > > + bb = xe_bb_ccs_new(gt, batch_size, read_write);
> > > + if (IS_ERR(bb)) {
> > > + drm_err(&xe->drm, "BB allocation failed.\n");
> > > + err = PTR_ERR(bb);
> > > + goto err_ret;
> > > + }
> > > +
> > > + batch_size_allocated = batch_size;
> > > + size = src_bo->size;
> > > + batch_size = 0;
> > > +
> > > + /*
> > > + * Emit PTE and copy commands here.
> > > + * The CCS copy command can only support limited size. If the size to
> be
> > > + * copied is more than the limit, divide copy into chunks. So, calculate
> > > + * sizes here again before copy command is emitted.
> > > + */
> > > + while (size) {
> > > + batch_size += 6; /* Flush + 2 NOP */
> > > + u32 flush_flags = 0;
> > > + u64 ccs_ofs, ccs_size;
> > > + u32 ccs_pt;
> > > +
> > > + u32 avail_pts = max_mem_transfer_per_pass(xe) /
> LEVEL0_PAGE_TABLE_ENCODE_SIZE;
> > > +
> > > + src_L0 = xe_migrate_res_sizes(m, &src_it);
> > > +
> > > + batch_size += pte_update_size(m, false, src, &src_it, &src_L0,
> > > + &src_L0_ofs, &src_L0_pt, 0, 0,
> > > + avail_pts);
> > > +
> > > + ccs_size = xe_device_ccs_bytes(xe, src_L0);
> > > + batch_size += pte_update_size(m, 0, NULL, &ccs_it, &ccs_size,
> &ccs_ofs,
> > > + &ccs_pt, 0, avail_pts, avail_pts);
> > > + xe_assert(xe, IS_ALIGNED(ccs_it.start, PAGE_SIZE));
> > > + batch_size += EMIT_COPY_CCS_DW;
> > > +
> > > + emit_pte(m, bb, src_L0_pt, false, true, &src_it, src_L0, src);
> > > +
> > > + emit_pte(m, bb, ccs_pt, false, false, &ccs_it, ccs_size, src);
> > > +
> > > + bb->cs[bb->len++] = MI_FLUSH_DW | MI_INVALIDATE_TLB |
> MI_FLUSH_DW_OP_STOREDW |
> > > + MI_FLUSH_IMM_DW;
> > > + bb->cs[bb->len++] = MI_NOOP;
> > > + bb->cs[bb->len++] = MI_NOOP;
> > > +
> > > + flush_flags = xe_migrate_ccs_copy(m, bb, src_L0_ofs,
> src_is_pltt,
> > > + src_L0_ofs, dst_is_pltt,
> > > + src_L0, ccs_ofs, true);
> > > +
> > > + bb->cs[bb->len++] = MI_FLUSH_DW | MI_INVALIDATE_TLB |
> MI_FLUSH_DW_OP_STOREDW |
> > > + MI_FLUSH_IMM_DW | flush_flags;
>
> Missed this - you don't need MI_INVALIDATE_TLB here, just after emitting
> the PTEs. I believe that should speedup this copy a little too.
>
This works out if we are using different VMs. Since we are using same VM for all BOs, I was suggested
To add MI_INVALIDATE_TLB after each BB to avoid any caching issues.
Correct me if I am wrong.
- Satya.
> This also looks wrong in emit_migration_job_gen12 too. Going to follow
> up on this now.
>
> Matt
>
> > > + bb->cs[bb->len++] = MI_NOOP;
> > > + bb->cs[bb->len++] = MI_NOOP;
> > > +
> > > + size -= src_L0;
> > > + }
> > > +
> > > + xe_assert(xe, (batch_size_allocated == bb->len));
> > > + src_bo->bb_ccs[read_write] = bb;
> > > +
> > > + return 0;
> > > +
> > > +err_ret:
> > > + return err;
> > > +}
> > > +
> > > static void emit_clear_link_copy(struct xe_gt *gt, struct xe_bb *bb, u64
> src_ofs,
> > > u32 size, u32 pitch)
> > > {
> > > diff --git a/drivers/gpu/drm/xe/xe_migrate.h
> b/drivers/gpu/drm/xe/xe_migrate.h
> > > index fb9839c1bae0..96b0449e7edb 100644
> > > --- a/drivers/gpu/drm/xe/xe_migrate.h
> > > +++ b/drivers/gpu/drm/xe/xe_migrate.h
> > > @@ -24,6 +24,8 @@ struct xe_vm;
> > > struct xe_vm_pgtable_update;
> > > struct xe_vma;
> > >
> > > +enum xe_sriov_vf_ccs_rw_ctxs;
> > > +
> > > /**
> > > * struct xe_migrate_pt_update_ops - Callbacks for the
> > > * xe_migrate_update_pgtables() function.
> > > @@ -112,6 +114,10 @@ struct dma_fence *xe_migrate_copy(struct
> xe_migrate *m,
> > > struct ttm_resource *dst,
> > > bool copy_only_ccs);
> > >
> > > +int xe_migrate_ccs_rw_copy(struct xe_migrate *m,
> > > + struct xe_bo *src_bo,
> > > + enum xe_sriov_vf_ccs_rw_ctxs read_write);
> > > +
> > > int xe_migrate_access_memory(struct xe_migrate *m, struct xe_bo *bo,
> > > unsigned long offset, void *buf, int len,
> > > int write);
> > > diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
> b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
> > > index ff5ad472eb96..242a3da1ef27 100644
> > > --- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
> > > +++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
> > > @@ -5,6 +5,7 @@
> > >
> > > #include "instructions/xe_mi_commands.h"
> > > #include "instructions/xe_gpu_commands.h"
> > > +#include "xe_bb.h"
> > > #include "xe_bo.h"
> > > #include "xe_device.h"
> > > #include "xe_migrate.h"
> > > @@ -208,3 +209,74 @@ int xe_sriov_vf_ccs_init(struct xe_device *xe)
> > > err_ret:
> > > return err;
> > > }
> > > +
> > > +/**
> > > + * xe_sriov_vf_ccs_attach_bo - Insert CCS read write commands in the BO.
> > > + * @bo: the &buffer object to which batch buffer commands will be
> added.
> > > + *
> > > + * This function shall be called only by VF. It inserts the PTEs and copy
> > > + * command instructions in the BO by calling xe_migrate_ccs_rw_copy()
> > > + * function.
> > > + *
> > > + * Returns: 0 if successful, negative error code on failure.
> > > + */
> > > +int xe_sriov_vf_ccs_attach_bo(struct xe_bo *bo)
> > > +{
> > > + struct xe_device *xe = xe_bo_device(bo);
> > > + enum xe_sriov_vf_ccs_rw_ctxs ctx_id;
> > > + struct xe_migrate *migrate;
> > > + struct xe_tile *tile;
> > > + struct xe_bb *bb;
> > > + int tile_id;
> > > + int err = 0;
> > > +
> > > + if (!IS_VF_CCS_READY(xe))
> > > + return 0;
> > > +
> > > + for_each_tile(tile, xe, tile_id) {
> >
> > Same comment as patch 1, I'd avoid for_each_tile and rather use
> > xe_device_get_root_tile.
> >
> > > + for_each_ccs_rw_ctx(ctx_id) {
> > > + bb = bo->bb_ccs[ctx_id];
> > > + /* bb should be NULL here. Assert if not NULL */
> > > + xe_assert(xe, !bb);
> > > +
> > > + migrate = tile->sriov.vf.ccs[ctx_id].migrate;
> > > + err = xe_migrate_ccs_rw_copy(migrate, bo, ctx_id);
> > > + }
> > > + }
> > > + return err;
> > > +}
> > > +
> > > +/**
> > > + * xe_sriov_vf_ccs_detach_bo - Remove CCS read write commands from
> the BO.
> > > + * @bo: the &buffer object from which batch buffer commands will be
> removed.
> > > + *
> > > + * This function shall be called only by VF. It removes the PTEs and copy
> > > + * command instructions from the BO. Make sure to update the BB with
> MI_NOOP
> > > + * before freeing.
> > > + *
> > > + * Returns: 0 if successful.
> > > + */
> > > +int xe_sriov_vf_ccs_detach_bo(struct xe_bo *bo)
> > > +{
> > > + struct xe_device *xe = xe_bo_device(bo);
> > > + enum xe_sriov_vf_ccs_rw_ctxs ctx_id;
> > > + struct xe_bb *bb;
> > > + struct xe_tile *tile;
> > > + int tile_id;
> > > +
> > > + if (!IS_VF_CCS_READY(xe))
> > > + return 0;
> > > +
> > > + for_each_tile(tile, xe, tile_id) {
> >
> > Same here.
> >
> > Matt
> >
> > > + for_each_ccs_rw_ctx(ctx_id) {
> > > + bb = bo->bb_ccs[ctx_id];
> > > + if (!bb)
> > > + continue;
> > > +
> > > + memset(bb->cs, MI_NOOP, bb->len * sizeof(u32));
> > > + xe_bb_free(bb, NULL);
> > > + bo->bb_ccs[ctx_id] = NULL;
> > > + }
> > > + }
> > > + return 0;
> > > +}
> > > diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
> b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
> > > index 5df9ba028d14..5d5e4bd25904 100644
> > > --- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
> > > +++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
> > > @@ -7,7 +7,10 @@
> > > #define _XE_SRIOV_VF_CCS_H_
> > >
> > > struct xe_device;
> > > +struct xe_bo;
> > >
> > > int xe_sriov_vf_ccs_init(struct xe_device *xe);
> > > +int xe_sriov_vf_ccs_attach_bo(struct xe_bo *bo);
> > > +int xe_sriov_vf_ccs_detach_bo(struct xe_bo *bo);
> > >
> > > #endif
> > > diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
> b/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
> > > index 6dc279d206ec..e240f3fd18af 100644
> > > --- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
> > > +++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
> > > @@ -27,6 +27,14 @@ enum xe_sriov_vf_ccs_rw_ctxs {
> > > XE_SRIOV_VF_CCS_CTX_COUNT
> > > };
> > >
> > > +#define IS_VF_CCS_BB_VALID(xe, bo) ({ \
> > > + struct xe_device *___xe = (xe); \
> > > + struct xe_bo *___bo = (bo); \
> > > + IS_SRIOV_VF(___xe) && \
> > > + ___bo->bb_ccs[XE_SRIOV_VF_CCS_READ_CTX] && \
> > > + ___bo->bb_ccs[XE_SRIOV_VF_CCS_WRITE_CTX]; \
> > > + })
> > > +
> > > struct xe_migrate;
> > > struct xe_sa_manager;
> > >
> > > --
> > > 2.43.0
> > >
^ permalink raw reply [flat|nested] 17+ messages in thread* Re: [PATCH v8 2/3] drm/xe/vf: Attach and detach CCS copy commands with BO
2025-06-24 4:58 ` K V P, Satyanarayana
@ 2025-06-24 9:37 ` K V P, Satyanarayana
2025-06-24 15:48 ` Matthew Brost
0 siblings, 1 reply; 17+ messages in thread
From: K V P, Satyanarayana @ 2025-06-24 9:37 UTC (permalink / raw)
To: Brost, Matthew
Cc: intel-xe@lists.freedesktop.org, Wajdeczko, Michal, Auld, Matthew,
Winiarski, Michal, Lis, Tomasz
[-- Attachment #1: Type: text/plain, Size: 18767 bytes --]
On 24-06-2025 10:28, K V P, Satyanarayana wrote:
> Hi.
>> -----Original Message-----
>> From: Brost, Matthew<matthew.brost@intel.com>
>> Sent: Tuesday, June 24, 2025 3:12 AM
>> To: K V P, Satyanarayana<satyanarayana.k.v.p@intel.com>
>> Cc:intel-xe@lists.freedesktop.org; Wajdeczko, Michal
>> <Michal.Wajdeczko@intel.com>; Auld, Matthew<matthew.auld@intel.com>;
>> Winiarski, Michal<michal.winiarski@intel.com>; Lis, Tomasz
>> <tomasz.lis@intel.com>
>> Subject: Re: [PATCH v8 2/3] drm/xe/vf: Attach and detach CCS copy
>> commands with BO
>>
>> On Fri, Jun 20, 2025 at 09:25:18AM -0700, Matthew Brost wrote:
>>> On Thu, Jun 19, 2025 at 01:34:58PM +0530, Satyanarayana K V P wrote:
>>>> Attach CCS read/write copy commands to BO for old and new mem types
>> as
>>>> NULL -> tt or system -> tt.
>>>> Detach the CCS read/write copy commands from BO while deleting ttm bo
>>>> from xe_ttm_bo_delete_mem_notify().
>>>>
>>>> Signed-off-by: Satyanarayana K V P<satyanarayana.k.v.p@intel.com>
>>>> Cc: Michal Wajdeczko<michal.wajdeczko@intel.com>
>>>> Cc: Matthew Brost<matthew.brost@intel.com>
>>>> Cc: Matthew Auld<matthew.auld@intel.com>
>>>> Cc: Michał Winiarski<michal.winiarski@intel.com>
>>>> ---
>>>> Cc: Tomasz Lis<tomasz.lis@intel.com>
>>>>
>>>> V7 -> V8:
>>>> - Removed xe_bb_ccs_realloc() and created a single BB by calculating the
>>>> BB size first and then emitting the commands. (Matthew Brost)
>>>> - Added xe_assert() if BB is not NULL in xe_sriov_vf_ccs_attach_bo().
>>>>
>>>> V6 -> V7:
>>>> - Created xe_bb_ccs_realloc() to create a single BB instead of maintaining
>>>> a list. (Matthew Brost)
>>>>
>>>> V5 -> V6:
>>>> - Removed dead code from xe_migrate_ccs_rw_copy() function. (Matthew
>> Brost)
>>>> V4 -> V5:
>>>> - Create a list of BBs for the given BO and fixed memory leak while
>>>> detaching BOs. (Matthew Brost).
>>>> - Fixed review comments (Matthew Brost & Matthew Auld).
>>>> - Yet to cleanup xe_migrate_ccs_rw_copy() function.
>>>>
>>>> V3 -> V4:
>>>> - Fixed issues reported by patchworks.
>>>>
>>>> V2 -> V3:
>>>> - Attach and detach functions check for IS_VF_CCS_READY().
>>>>
>>>> V1 -> V2:
>>>> - Fixed review comments.
>>>> ---
>>>> drivers/gpu/drm/xe/xe_bb.c | 35 ++++++
>>>> drivers/gpu/drm/xe/xe_bb.h | 3 +
>>>> drivers/gpu/drm/xe/xe_bo.c | 23 ++++
>>>> drivers/gpu/drm/xe/xe_bo_types.h | 3 +
>>>> drivers/gpu/drm/xe/xe_migrate.c | 130 +++++++++++++++++++++
>>>> drivers/gpu/drm/xe/xe_migrate.h | 6 +
>>>> drivers/gpu/drm/xe/xe_sriov_vf_ccs.c | 72 ++++++++++++
>>>> drivers/gpu/drm/xe/xe_sriov_vf_ccs.h | 3 +
>>>> drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h | 8 ++
>>>> 9 files changed, 283 insertions(+)
>>>>
>>>> diff --git a/drivers/gpu/drm/xe/xe_bb.c b/drivers/gpu/drm/xe/xe_bb.c
>>>> index 9570672fce33..533352dc892f 100644
>>>> --- a/drivers/gpu/drm/xe/xe_bb.c
>>>> +++ b/drivers/gpu/drm/xe/xe_bb.c
>>>> @@ -60,6 +60,41 @@ struct xe_bb *xe_bb_new(struct xe_gt *gt, u32
>> dwords, bool usm)
>>>> return ERR_PTR(err);
>>>> }
>>>>
>>>> +struct xe_bb *xe_bb_ccs_new(struct xe_gt *gt, u32 dwords,
>>>> + enum xe_sriov_vf_ccs_rw_ctxs ctx_id)
>>>> +{
>>>> + struct xe_bb *bb = kmalloc(sizeof(*bb), GFP_KERNEL);
>>>> + struct xe_tile *tile = gt_to_tile(gt);
>>>> + struct xe_sa_manager *bb_pool;
>>>> + int err;
>>>> +
>>>> + if (!bb)
>>>> + return ERR_PTR(-ENOMEM);
>>>> + /*
>>>> + * We need to allocate space for the requested number of dwords &
>>>> + * one additional MI_BATCH_BUFFER_END dword. Since the whole SA
>>>> + * is submitted to HW, we need to make sure that the last instruction
>>>> + * is not over written when the last chunk of SA is allocated for BB.
>>>> + * So, this extra DW acts as a guard here.
>>>> + */
>>>> +
>>>> + bb_pool = tile->sriov.vf.ccs[ctx_id].mem.ccs_bb_pool;
>>>> + bb->bo = xe_sa_bo_new(bb_pool, 4 * (dwords + 1));
>>>> +
>>>> + if (IS_ERR(bb->bo)) {
>>>> + err = PTR_ERR(bb->bo);
>>>> + goto err;
>>>> + }
>>>> +
>>>> + bb->cs = xe_sa_bo_cpu_addr(bb->bo);
>>>> + bb->len = 0;
>>>> +
>>>> + return bb;
>>>> +err:
>>>> + kfree(bb);
>>>> + return ERR_PTR(err);
>>>> +}
>>>> +
>>>> static struct xe_sched_job *
>>>> __xe_bb_create_job(struct xe_exec_queue *q, struct xe_bb *bb, u64
>> *addr)
>>>> {
>>>> diff --git a/drivers/gpu/drm/xe/xe_bb.h b/drivers/gpu/drm/xe/xe_bb.h
>>>> index fafacd73dcc3..32c9c4c5d2be 100644
>>>> --- a/drivers/gpu/drm/xe/xe_bb.h
>>>> +++ b/drivers/gpu/drm/xe/xe_bb.h
>>>> @@ -13,8 +13,11 @@ struct dma_fence;
>>>> struct xe_gt;
>>>> struct xe_exec_queue;
>>>> struct xe_sched_job;
>>>> +enum xe_sriov_vf_ccs_rw_ctxs;
>>>>
>>>> struct xe_bb *xe_bb_new(struct xe_gt *gt, u32 size, bool usm);
>>>> +struct xe_bb *xe_bb_ccs_new(struct xe_gt *gt, u32 dwords,
>>>> + enum xe_sriov_vf_ccs_rw_ctxs ctx_id);
>>>> struct xe_sched_job *xe_bb_create_job(struct xe_exec_queue *q,
>>>> struct xe_bb *bb);
>>>> struct xe_sched_job *xe_bb_create_migration_job(struct xe_exec_queue
>> *q,
>>>> diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
>>>> index 4e39188a021a..beaf8544bf08 100644
>>>> --- a/drivers/gpu/drm/xe/xe_bo.c
>>>> +++ b/drivers/gpu/drm/xe/xe_bo.c
>>>> @@ -31,6 +31,7 @@
>>>> #include "xe_pxp.h"
>>>> #include "xe_res_cursor.h"
>>>> #include "xe_shrinker.h"
>>>> +#include "xe_sriov_vf_ccs.h"
>>>> #include "xe_trace_bo.h"
>>>> #include "xe_ttm_stolen_mgr.h"
>>>> #include "xe_vm.h"
>>>> @@ -947,6 +948,20 @@ static int xe_bo_move(struct ttm_buffer_object
>> *ttm_bo, bool evict,
>>>> dma_fence_put(fence);
>>>> xe_pm_runtime_put(xe);
>>>>
>>>> + /*
>>>> + * CCS meta data is migrated from TT -> SMEM. So, let us detach the
>>>> + * BBs from BO as it is no longer needed.
>>>> + */
>>>> + if (IS_VF_CCS_BB_VALID(xe, bo) && old_mem_type == XE_PL_TT &&
>>>> + new_mem->mem_type == XE_PL_SYSTEM)
>>>> + xe_sriov_vf_ccs_detach_bo(bo);
>>>> +
>>>> + if (IS_SRIOV_VF(xe) &&
>>>> + ((move_lacks_source && new_mem->mem_type == XE_PL_TT) ||
>>>> + (old_mem_type == XE_PL_SYSTEM && new_mem->mem_type ==
>> XE_PL_TT)) &&
>>>> + handle_system_ccs)
>>>> + ret = xe_sriov_vf_ccs_attach_bo(bo);
>>>> +
>>> You don't check the 'ret' value of xe_sriov_vf_ccs_attach_bo. That seems be
>> an oversight.
The error is returned to the caller after this. So, not checked explicitly.
>>>> out:
>>>> if ((!ttm_bo->resource || ttm_bo->resource->mem_type ==
>> XE_PL_SYSTEM) &&
>>>> ttm_bo->ttm) {
>>>> @@ -957,6 +972,9 @@ static int xe_bo_move(struct ttm_buffer_object
>> *ttm_bo, bool evict,
>>>> if (timeout < 0)
>>>> ret = timeout;
>>>>
>>>> + if (IS_VF_CCS_BB_VALID(xe, bo))
>>>> + xe_sriov_vf_ccs_detach_bo(bo);
>>>> +
>>>> xe_tt_unmap_sg(xe, ttm_bo->ttm);
>>>> }
>>>>
>>>> @@ -1483,9 +1501,14 @@ static void xe_ttm_bo_release_notify(struct
>> ttm_buffer_object *ttm_bo)
>>>> static void xe_ttm_bo_delete_mem_notify(struct ttm_buffer_object
>> *ttm_bo)
>>>> {
>>>> + struct xe_bo *bo = ttm_to_xe_bo(ttm_bo);
>>>> +
>>>> if (!xe_bo_is_xe_bo(ttm_bo))
>>>> return;
>>>>
>>>> + if (IS_VF_CCS_BB_VALID(ttm_to_xe_device(ttm_bo->bdev), bo))
>>>> + xe_sriov_vf_ccs_detach_bo(bo);
>>>> +
>>>> /*
>>>> * Object is idle and about to be destroyed. Release the
>>>> * dma-buf attachment.
>>>> diff --git a/drivers/gpu/drm/xe/xe_bo_types.h
>> b/drivers/gpu/drm/xe/xe_bo_types.h
>>>> index eb5e83c5f233..642e519fcfd1 100644
>>>> --- a/drivers/gpu/drm/xe/xe_bo_types.h
>>>> +++ b/drivers/gpu/drm/xe/xe_bo_types.h
>>>> @@ -78,6 +78,9 @@ struct xe_bo {
>>>> /** @ccs_cleared */
>>>> bool ccs_cleared;
>>>>
>>>> + /** @bb_ccs_rw: BB instructions of CCS read/write. Valid only for VF
>> */
>>>> + struct xe_bb *bb_ccs[XE_SRIOV_VF_CCS_CTX_COUNT];
>>>> +
>>>> /**
>>>> * @cpu_caching: CPU caching mode. Currently only used for
>> userspace
>>>> * objects. Exceptions are system memory on DGFX, which is always
>>>> diff --git a/drivers/gpu/drm/xe/xe_migrate.c
>> b/drivers/gpu/drm/xe/xe_migrate.c
>>>> index 8f8e9fdfb2a8..c730b34071ad 100644
>>>> --- a/drivers/gpu/drm/xe/xe_migrate.c
>>>> +++ b/drivers/gpu/drm/xe/xe_migrate.c
>>>> @@ -940,6 +940,136 @@ struct dma_fence *xe_migrate_copy(struct
>> xe_migrate *m,
>>>> return fence;
>>>> }
>>>>
>>>> +/**
>>>> + * xe_migrate_ccs_rw_copy() - Copy content of TTM resources.
>>>> + * @m: The migration context.
>>>> + * @src_bo: The buffer object @src is currently bound to.
>>>> + * @read_write : Creates BB commands for CCS read/write.
>>>> + *
>>>> + * Creates batch buffer instructions to copy CCS metadata from CCS pool
>> to
>>>> + * memory and vice versa.
>>>> + *
>>>> + * This function should only be called for IGPU.
>>>> + *
>>>> + * Return: 0 if successful, negative error code on failure.
>>>> + */
>>>> +int xe_migrate_ccs_rw_copy(struct xe_migrate *m,
>>>> + struct xe_bo *src_bo,
>>>> + enum xe_sriov_vf_ccs_rw_ctxs read_write)
>>>> +
>>>> +{
>>>> + bool src_is_pltt = read_write == XE_SRIOV_VF_CCS_WRITE_CTX;
>>>> + bool dst_is_pltt = read_write == XE_SRIOV_VF_CCS_READ_CTX;
>>>> + struct ttm_resource *src = src_bo->ttm.resource;
>>>> + struct xe_gt *gt = m->tile->primary_gt;
>>>> + u32 batch_size, batch_size_allocated;
>>>> + struct xe_device *xe = gt_to_xe(gt);
>>>> + struct xe_res_cursor src_it, ccs_it;
>>>> + u64 size = src_bo->size;
>>>> + struct xe_bb *bb = NULL;
>>>> + u64 src_L0, src_L0_ofs;
>>>> + u32 src_L0_pt;
>>>> + int err;
>>>> +
>>>> + xe_res_first_sg(xe_bo_sg(src_bo), 0, size, &src_it);
>>>> +
>>>> + xe_res_first_sg(xe_bo_sg(src_bo), xe_bo_ccs_pages_start(src_bo),
>>>> + PAGE_ALIGN(xe_device_ccs_bytes(xe, size)),
>>>> + &ccs_it);
>>>> +
>>>> + /* Calculate Batch buffer size */
>>>> + batch_size = 0;
>>>> + while (size) {
>>>> + batch_size += 6; /* Flush + 2 NOP */
>>>> + u64 ccs_ofs, ccs_size;
>>>> + u32 ccs_pt;
>>>> +
>>>> + u32 avail_pts = max_mem_transfer_per_pass(xe) /
>> LEVEL0_PAGE_TABLE_ENCODE_SIZE;
>>>> +
>>>> + src_L0 = min_t(u64, max_mem_transfer_per_pass(xe), size);
>>>> +
>>>> + batch_size += pte_update_size(m, false, src, &src_it, &src_L0,
>>>> + &src_L0_ofs, &src_L0_pt, 0, 0,
>>>> + avail_pts);
>>>> +
>>>> + ccs_size = xe_device_ccs_bytes(xe, src_L0);
>>>> + batch_size += pte_update_size(m, 0, NULL, &ccs_it, &ccs_size,
>> &ccs_ofs,
>>>> + &ccs_pt, 0, avail_pts, avail_pts);
>>>> + xe_assert(xe, IS_ALIGNED(ccs_it.start, PAGE_SIZE));
>>>> +
>>>> + /* Add copy commands size here */
>>>> + batch_size += EMIT_COPY_CCS_DW;
>>>> +
>>>> + size -= src_L0;
>>>> + }
>>>> +
>>>> + bb = xe_bb_ccs_new(gt, batch_size, read_write);
>>>> + if (IS_ERR(bb)) {
>>>> + drm_err(&xe->drm, "BB allocation failed.\n");
>>>> + err = PTR_ERR(bb);
>>>> + goto err_ret;
>>>> + }
>>>> +
>>>> + batch_size_allocated = batch_size;
>>>> + size = src_bo->size;
>>>> + batch_size = 0;
>>>> +
>>>> + /*
>>>> + * Emit PTE and copy commands here.
>>>> + * The CCS copy command can only support limited size. If the size to
>> be
>>>> + * copied is more than the limit, divide copy into chunks. So, calculate
>>>> + * sizes here again before copy command is emitted.
>>>> + */
>>>> + while (size) {
>>>> + batch_size += 6; /* Flush + 2 NOP */
>>>> + u32 flush_flags = 0;
>>>> + u64 ccs_ofs, ccs_size;
>>>> + u32 ccs_pt;
>>>> +
>>>> + u32 avail_pts = max_mem_transfer_per_pass(xe) /
>> LEVEL0_PAGE_TABLE_ENCODE_SIZE;
>>>> +
>>>> + src_L0 = xe_migrate_res_sizes(m, &src_it);
>>>> +
>>>> + batch_size += pte_update_size(m, false, src, &src_it, &src_L0,
>>>> + &src_L0_ofs, &src_L0_pt, 0, 0,
>>>> + avail_pts);
>>>> +
>>>> + ccs_size = xe_device_ccs_bytes(xe, src_L0);
>>>> + batch_size += pte_update_size(m, 0, NULL, &ccs_it, &ccs_size,
>> &ccs_ofs,
>>>> + &ccs_pt, 0, avail_pts, avail_pts);
>>>> + xe_assert(xe, IS_ALIGNED(ccs_it.start, PAGE_SIZE));
>>>> + batch_size += EMIT_COPY_CCS_DW;
>>>> +
>>>> + emit_pte(m, bb, src_L0_pt, false, true, &src_it, src_L0, src);
>>>> +
>>>> + emit_pte(m, bb, ccs_pt, false, false, &ccs_it, ccs_size, src);
>>>> +
>>>> + bb->cs[bb->len++] = MI_FLUSH_DW | MI_INVALIDATE_TLB |
>> MI_FLUSH_DW_OP_STOREDW |
>>>> + MI_FLUSH_IMM_DW;
>>>> + bb->cs[bb->len++] = MI_NOOP;
>>>> + bb->cs[bb->len++] = MI_NOOP;
>>>> +
>>>> + flush_flags = xe_migrate_ccs_copy(m, bb, src_L0_ofs,
>> src_is_pltt,
>>>> + src_L0_ofs, dst_is_pltt,
>>>> + src_L0, ccs_ofs, true);
>>>> +
>>>> + bb->cs[bb->len++] = MI_FLUSH_DW | MI_INVALIDATE_TLB |
>> MI_FLUSH_DW_OP_STOREDW |
>>>> + MI_FLUSH_IMM_DW | flush_flags;
>> Missed this - you don't need MI_INVALIDATE_TLB here, just after emitting
>> the PTEs. I believe that should speedup this copy a little too.
>>
> This works out if we are using different VMs. Since we are using same VM for all BOs, I was suggested
> To add MI_INVALIDATE_TLB after each BB to avoid any caching issues.
> Correct me if I am wrong.
> - Satya.
>> This also looks wrong in emit_migration_job_gen12 too. Going to follow
>> up on this now.
>>
>> Matt
Removed MI_INVALIDATE_TLB after emitting PTEs and kept after copy command.
>>
>>>> + bb->cs[bb->len++] = MI_NOOP;
>>>> + bb->cs[bb->len++] = MI_NOOP;
>>>> +
>>>> + size -= src_L0;
>>>> + }
>>>> +
>>>> + xe_assert(xe, (batch_size_allocated == bb->len));
>>>> + src_bo->bb_ccs[read_write] = bb;
>>>> +
>>>> + return 0;
>>>> +
>>>> +err_ret:
>>>> + return err;
>>>> +}
>>>> +
>>>> static void emit_clear_link_copy(struct xe_gt *gt, struct xe_bb *bb, u64
>> src_ofs,
>>>> u32 size, u32 pitch)
>>>> {
>>>> diff --git a/drivers/gpu/drm/xe/xe_migrate.h
>> b/drivers/gpu/drm/xe/xe_migrate.h
>>>> index fb9839c1bae0..96b0449e7edb 100644
>>>> --- a/drivers/gpu/drm/xe/xe_migrate.h
>>>> +++ b/drivers/gpu/drm/xe/xe_migrate.h
>>>> @@ -24,6 +24,8 @@ struct xe_vm;
>>>> struct xe_vm_pgtable_update;
>>>> struct xe_vma;
>>>>
>>>> +enum xe_sriov_vf_ccs_rw_ctxs;
>>>> +
>>>> /**
>>>> * struct xe_migrate_pt_update_ops - Callbacks for the
>>>> * xe_migrate_update_pgtables() function.
>>>> @@ -112,6 +114,10 @@ struct dma_fence *xe_migrate_copy(struct
>> xe_migrate *m,
>>>> struct ttm_resource *dst,
>>>> bool copy_only_ccs);
>>>>
>>>> +int xe_migrate_ccs_rw_copy(struct xe_migrate *m,
>>>> + struct xe_bo *src_bo,
>>>> + enum xe_sriov_vf_ccs_rw_ctxs read_write);
>>>> +
>>>> int xe_migrate_access_memory(struct xe_migrate *m, struct xe_bo *bo,
>>>> unsigned long offset, void *buf, int len,
>>>> int write);
>>>> diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
>> b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
>>>> index ff5ad472eb96..242a3da1ef27 100644
>>>> --- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
>>>> +++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
>>>> @@ -5,6 +5,7 @@
>>>>
>>>> #include "instructions/xe_mi_commands.h"
>>>> #include "instructions/xe_gpu_commands.h"
>>>> +#include "xe_bb.h"
>>>> #include "xe_bo.h"
>>>> #include "xe_device.h"
>>>> #include "xe_migrate.h"
>>>> @@ -208,3 +209,74 @@ int xe_sriov_vf_ccs_init(struct xe_device *xe)
>>>> err_ret:
>>>> return err;
>>>> }
>>>> +
>>>> +/**
>>>> + * xe_sriov_vf_ccs_attach_bo - Insert CCS read write commands in the BO.
>>>> + * @bo: the &buffer object to which batch buffer commands will be
>> added.
>>>> + *
>>>> + * This function shall be called only by VF. It inserts the PTEs and copy
>>>> + * command instructions in the BO by calling xe_migrate_ccs_rw_copy()
>>>> + * function.
>>>> + *
>>>> + * Returns: 0 if successful, negative error code on failure.
>>>> + */
>>>> +int xe_sriov_vf_ccs_attach_bo(struct xe_bo *bo)
>>>> +{
>>>> + struct xe_device *xe = xe_bo_device(bo);
>>>> + enum xe_sriov_vf_ccs_rw_ctxs ctx_id;
>>>> + struct xe_migrate *migrate;
>>>> + struct xe_tile *tile;
>>>> + struct xe_bb *bb;
>>>> + int tile_id;
>>>> + int err = 0;
>>>> +
>>>> + if (!IS_VF_CCS_READY(xe))
>>>> + return 0;
>>>> +
>>>> + for_each_tile(tile, xe, tile_id) {
>>> Same comment as patch 1, I'd avoid for_each_tile and rather use
>>> xe_device_get_root_tile.
>>>
>>>> + for_each_ccs_rw_ctx(ctx_id) {
>>>> + bb = bo->bb_ccs[ctx_id];
>>>> + /* bb should be NULL here. Assert if not NULL */
>>>> + xe_assert(xe, !bb);
>>>> +
>>>> + migrate = tile->sriov.vf.ccs[ctx_id].migrate;
>>>> + err = xe_migrate_ccs_rw_copy(migrate, bo, ctx_id);
>>>> + }
>>>> + }
>>>> + return err;
>>>> +}
>>>> +
>>>> +/**
>>>> + * xe_sriov_vf_ccs_detach_bo - Remove CCS read write commands from
>> the BO.
>>>> + * @bo: the &buffer object from which batch buffer commands will be
>> removed.
>>>> + *
>>>> + * This function shall be called only by VF. It removes the PTEs and copy
>>>> + * command instructions from the BO. Make sure to update the BB with
>> MI_NOOP
>>>> + * before freeing.
>>>> + *
>>>> + * Returns: 0 if successful.
>>>> + */
>>>> +int xe_sriov_vf_ccs_detach_bo(struct xe_bo *bo)
>>>> +{
>>>> + struct xe_device *xe = xe_bo_device(bo);
>>>> + enum xe_sriov_vf_ccs_rw_ctxs ctx_id;
>>>> + struct xe_bb *bb;
>>>> + struct xe_tile *tile;
>>>> + int tile_id;
>>>> +
>>>> + if (!IS_VF_CCS_READY(xe))
>>>> + return 0;
>>>> +
>>>> + for_each_tile(tile, xe, tile_id) {
>>> Same here.
>>>
>>> Matt
Fixed in new version.
>>>> + for_each_ccs_rw_ctx(ctx_id) {
>>>> + bb = bo->bb_ccs[ctx_id];
>>>> + if (!bb)
>>>> + continue;
>>>> +
>>>> + memset(bb->cs, MI_NOOP, bb->len * sizeof(u32));
>>>> + xe_bb_free(bb, NULL);
>>>> + bo->bb_ccs[ctx_id] = NULL;
>>>> + }
>>>> + }
>>>> + return 0;
>>>> +}
>>>> diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
>> b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
>>>> index 5df9ba028d14..5d5e4bd25904 100644
>>>> --- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
>>>> +++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
>>>> @@ -7,7 +7,10 @@
>>>> #define _XE_SRIOV_VF_CCS_H_
>>>>
>>>> struct xe_device;
>>>> +struct xe_bo;
>>>>
>>>> int xe_sriov_vf_ccs_init(struct xe_device *xe);
>>>> +int xe_sriov_vf_ccs_attach_bo(struct xe_bo *bo);
>>>> +int xe_sriov_vf_ccs_detach_bo(struct xe_bo *bo);
>>>>
>>>> #endif
>>>> diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
>> b/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
>>>> index 6dc279d206ec..e240f3fd18af 100644
>>>> --- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
>>>> +++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
>>>> @@ -27,6 +27,14 @@ enum xe_sriov_vf_ccs_rw_ctxs {
>>>> XE_SRIOV_VF_CCS_CTX_COUNT
>>>> };
>>>>
>>>> +#define IS_VF_CCS_BB_VALID(xe, bo) ({ \
>>>> + struct xe_device *___xe = (xe); \
>>>> + struct xe_bo *___bo = (bo); \
>>>> + IS_SRIOV_VF(___xe) && \
>>>> + ___bo->bb_ccs[XE_SRIOV_VF_CCS_READ_CTX] && \
>>>> + ___bo->bb_ccs[XE_SRIOV_VF_CCS_WRITE_CTX]; \
>>>> + })
>>>> +
>>>> struct xe_migrate;
>>>> struct xe_sa_manager;
>>>>
>>>> --
>>>> 2.43.0
>>>>
[-- Attachment #2: Type: text/html, Size: 27933 bytes --]
^ permalink raw reply [flat|nested] 17+ messages in thread* Re: [PATCH v8 2/3] drm/xe/vf: Attach and detach CCS copy commands with BO
2025-06-24 9:37 ` K V P, Satyanarayana
@ 2025-06-24 15:48 ` Matthew Brost
0 siblings, 0 replies; 17+ messages in thread
From: Matthew Brost @ 2025-06-24 15:48 UTC (permalink / raw)
To: K V P, Satyanarayana
Cc: intel-xe@lists.freedesktop.org, Wajdeczko, Michal, Auld, Matthew,
Winiarski, Michal, Lis, Tomasz
On Tue, Jun 24, 2025 at 03:07:24PM +0530, K V P, Satyanarayana wrote:
>
> On 24-06-2025 10:28, K V P, Satyanarayana wrote:
> > Hi.
> > > -----Original Message-----
> > > From: Brost, Matthew<matthew.brost@intel.com>
> > > Sent: Tuesday, June 24, 2025 3:12 AM
> > > To: K V P, Satyanarayana<satyanarayana.k.v.p@intel.com>
> > > Cc:intel-xe@lists.freedesktop.org; Wajdeczko, Michal
> > > <Michal.Wajdeczko@intel.com>; Auld, Matthew<matthew.auld@intel.com>;
> > > Winiarski, Michal<michal.winiarski@intel.com>; Lis, Tomasz
> > > <tomasz.lis@intel.com>
> > > Subject: Re: [PATCH v8 2/3] drm/xe/vf: Attach and detach CCS copy
> > > commands with BO
> > >
> > > On Fri, Jun 20, 2025 at 09:25:18AM -0700, Matthew Brost wrote:
> > > > On Thu, Jun 19, 2025 at 01:34:58PM +0530, Satyanarayana K V P wrote:
> > > > > Attach CCS read/write copy commands to BO for old and new mem types
> > > as
> > > > > NULL -> tt or system -> tt.
> > > > > Detach the CCS read/write copy commands from BO while deleting ttm bo
> > > > > from xe_ttm_bo_delete_mem_notify().
> > > > >
> > > > > Signed-off-by: Satyanarayana K V P<satyanarayana.k.v.p@intel.com>
> > > > > Cc: Michal Wajdeczko<michal.wajdeczko@intel.com>
> > > > > Cc: Matthew Brost<matthew.brost@intel.com>
> > > > > Cc: Matthew Auld<matthew.auld@intel.com>
> > > > > Cc: Michał Winiarski<michal.winiarski@intel.com>
> > > > > ---
> > > > > Cc: Tomasz Lis<tomasz.lis@intel.com>
> > > > >
> > > > > V7 -> V8:
> > > > > - Removed xe_bb_ccs_realloc() and created a single BB by calculating the
> > > > > BB size first and then emitting the commands. (Matthew Brost)
> > > > > - Added xe_assert() if BB is not NULL in xe_sriov_vf_ccs_attach_bo().
> > > > >
> > > > > V6 -> V7:
> > > > > - Created xe_bb_ccs_realloc() to create a single BB instead of maintaining
> > > > > a list. (Matthew Brost)
> > > > >
> > > > > V5 -> V6:
> > > > > - Removed dead code from xe_migrate_ccs_rw_copy() function. (Matthew
> > > Brost)
> > > > > V4 -> V5:
> > > > > - Create a list of BBs for the given BO and fixed memory leak while
> > > > > detaching BOs. (Matthew Brost).
> > > > > - Fixed review comments (Matthew Brost & Matthew Auld).
> > > > > - Yet to cleanup xe_migrate_ccs_rw_copy() function.
> > > > >
> > > > > V3 -> V4:
> > > > > - Fixed issues reported by patchworks.
> > > > >
> > > > > V2 -> V3:
> > > > > - Attach and detach functions check for IS_VF_CCS_READY().
> > > > >
> > > > > V1 -> V2:
> > > > > - Fixed review comments.
> > > > > ---
> > > > > drivers/gpu/drm/xe/xe_bb.c | 35 ++++++
> > > > > drivers/gpu/drm/xe/xe_bb.h | 3 +
> > > > > drivers/gpu/drm/xe/xe_bo.c | 23 ++++
> > > > > drivers/gpu/drm/xe/xe_bo_types.h | 3 +
> > > > > drivers/gpu/drm/xe/xe_migrate.c | 130 +++++++++++++++++++++
> > > > > drivers/gpu/drm/xe/xe_migrate.h | 6 +
> > > > > drivers/gpu/drm/xe/xe_sriov_vf_ccs.c | 72 ++++++++++++
> > > > > drivers/gpu/drm/xe/xe_sriov_vf_ccs.h | 3 +
> > > > > drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h | 8 ++
> > > > > 9 files changed, 283 insertions(+)
> > > > >
> > > > > diff --git a/drivers/gpu/drm/xe/xe_bb.c b/drivers/gpu/drm/xe/xe_bb.c
> > > > > index 9570672fce33..533352dc892f 100644
> > > > > --- a/drivers/gpu/drm/xe/xe_bb.c
> > > > > +++ b/drivers/gpu/drm/xe/xe_bb.c
> > > > > @@ -60,6 +60,41 @@ struct xe_bb *xe_bb_new(struct xe_gt *gt, u32
> > > dwords, bool usm)
> > > > > return ERR_PTR(err);
> > > > > }
> > > > >
> > > > > +struct xe_bb *xe_bb_ccs_new(struct xe_gt *gt, u32 dwords,
> > > > > + enum xe_sriov_vf_ccs_rw_ctxs ctx_id)
> > > > > +{
> > > > > + struct xe_bb *bb = kmalloc(sizeof(*bb), GFP_KERNEL);
> > > > > + struct xe_tile *tile = gt_to_tile(gt);
> > > > > + struct xe_sa_manager *bb_pool;
> > > > > + int err;
> > > > > +
> > > > > + if (!bb)
> > > > > + return ERR_PTR(-ENOMEM);
> > > > > + /*
> > > > > + * We need to allocate space for the requested number of dwords &
> > > > > + * one additional MI_BATCH_BUFFER_END dword. Since the whole SA
> > > > > + * is submitted to HW, we need to make sure that the last instruction
> > > > > + * is not over written when the last chunk of SA is allocated for BB.
> > > > > + * So, this extra DW acts as a guard here.
> > > > > + */
> > > > > +
> > > > > + bb_pool = tile->sriov.vf.ccs[ctx_id].mem.ccs_bb_pool;
> > > > > + bb->bo = xe_sa_bo_new(bb_pool, 4 * (dwords + 1));
> > > > > +
> > > > > + if (IS_ERR(bb->bo)) {
> > > > > + err = PTR_ERR(bb->bo);
> > > > > + goto err;
> > > > > + }
> > > > > +
> > > > > + bb->cs = xe_sa_bo_cpu_addr(bb->bo);
> > > > > + bb->len = 0;
> > > > > +
> > > > > + return bb;
> > > > > +err:
> > > > > + kfree(bb);
> > > > > + return ERR_PTR(err);
> > > > > +}
> > > > > +
> > > > > static struct xe_sched_job *
> > > > > __xe_bb_create_job(struct xe_exec_queue *q, struct xe_bb *bb, u64
> > > *addr)
> > > > > {
> > > > > diff --git a/drivers/gpu/drm/xe/xe_bb.h b/drivers/gpu/drm/xe/xe_bb.h
> > > > > index fafacd73dcc3..32c9c4c5d2be 100644
> > > > > --- a/drivers/gpu/drm/xe/xe_bb.h
> > > > > +++ b/drivers/gpu/drm/xe/xe_bb.h
> > > > > @@ -13,8 +13,11 @@ struct dma_fence;
> > > > > struct xe_gt;
> > > > > struct xe_exec_queue;
> > > > > struct xe_sched_job;
> > > > > +enum xe_sriov_vf_ccs_rw_ctxs;
> > > > >
> > > > > struct xe_bb *xe_bb_new(struct xe_gt *gt, u32 size, bool usm);
> > > > > +struct xe_bb *xe_bb_ccs_new(struct xe_gt *gt, u32 dwords,
> > > > > + enum xe_sriov_vf_ccs_rw_ctxs ctx_id);
> > > > > struct xe_sched_job *xe_bb_create_job(struct xe_exec_queue *q,
> > > > > struct xe_bb *bb);
> > > > > struct xe_sched_job *xe_bb_create_migration_job(struct xe_exec_queue
> > > *q,
> > > > > diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
> > > > > index 4e39188a021a..beaf8544bf08 100644
> > > > > --- a/drivers/gpu/drm/xe/xe_bo.c
> > > > > +++ b/drivers/gpu/drm/xe/xe_bo.c
> > > > > @@ -31,6 +31,7 @@
> > > > > #include "xe_pxp.h"
> > > > > #include "xe_res_cursor.h"
> > > > > #include "xe_shrinker.h"
> > > > > +#include "xe_sriov_vf_ccs.h"
> > > > > #include "xe_trace_bo.h"
> > > > > #include "xe_ttm_stolen_mgr.h"
> > > > > #include "xe_vm.h"
> > > > > @@ -947,6 +948,20 @@ static int xe_bo_move(struct ttm_buffer_object
> > > *ttm_bo, bool evict,
> > > > > dma_fence_put(fence);
> > > > > xe_pm_runtime_put(xe);
> > > > >
> > > > > + /*
> > > > > + * CCS meta data is migrated from TT -> SMEM. So, let us detach the
> > > > > + * BBs from BO as it is no longer needed.
> > > > > + */
> > > > > + if (IS_VF_CCS_BB_VALID(xe, bo) && old_mem_type == XE_PL_TT &&
> > > > > + new_mem->mem_type == XE_PL_SYSTEM)
> > > > > + xe_sriov_vf_ccs_detach_bo(bo);
> > > > > +
> > > > > + if (IS_SRIOV_VF(xe) &&
> > > > > + ((move_lacks_source && new_mem->mem_type == XE_PL_TT) ||
> > > > > + (old_mem_type == XE_PL_SYSTEM && new_mem->mem_type ==
> > > XE_PL_TT)) &&
> > > > > + handle_system_ccs)
> > > > > + ret = xe_sriov_vf_ccs_attach_bo(bo);
> > > > > +
> > > > You don't check the 'ret' value of xe_sriov_vf_ccs_attach_bo. That seems be
> > > an oversight.
>
> The error is returned to the caller after this. So, not checked explicitly.
>
Right, this is directly above the 'out' label for handling errors.
Matt
> > > > > out:
> > > > > if ((!ttm_bo->resource || ttm_bo->resource->mem_type ==
> > > XE_PL_SYSTEM) &&
> > > > > ttm_bo->ttm) {
> > > > > @@ -957,6 +972,9 @@ static int xe_bo_move(struct ttm_buffer_object
> > > *ttm_bo, bool evict,
> > > > > if (timeout < 0)
> > > > > ret = timeout;
> > > > >
> > > > > + if (IS_VF_CCS_BB_VALID(xe, bo))
> > > > > + xe_sriov_vf_ccs_detach_bo(bo);
> > > > > +
> > > > > xe_tt_unmap_sg(xe, ttm_bo->ttm);
> > > > > }
> > > > >
> > > > > @@ -1483,9 +1501,14 @@ static void xe_ttm_bo_release_notify(struct
> > > ttm_buffer_object *ttm_bo)
> > > > > static void xe_ttm_bo_delete_mem_notify(struct ttm_buffer_object
> > > *ttm_bo)
> > > > > {
> > > > > + struct xe_bo *bo = ttm_to_xe_bo(ttm_bo);
> > > > > +
> > > > > if (!xe_bo_is_xe_bo(ttm_bo))
> > > > > return;
> > > > >
> > > > > + if (IS_VF_CCS_BB_VALID(ttm_to_xe_device(ttm_bo->bdev), bo))
> > > > > + xe_sriov_vf_ccs_detach_bo(bo);
> > > > > +
> > > > > /*
> > > > > * Object is idle and about to be destroyed. Release the
> > > > > * dma-buf attachment.
> > > > > diff --git a/drivers/gpu/drm/xe/xe_bo_types.h
> > > b/drivers/gpu/drm/xe/xe_bo_types.h
> > > > > index eb5e83c5f233..642e519fcfd1 100644
> > > > > --- a/drivers/gpu/drm/xe/xe_bo_types.h
> > > > > +++ b/drivers/gpu/drm/xe/xe_bo_types.h
> > > > > @@ -78,6 +78,9 @@ struct xe_bo {
> > > > > /** @ccs_cleared */
> > > > > bool ccs_cleared;
> > > > >
> > > > > + /** @bb_ccs_rw: BB instructions of CCS read/write. Valid only for VF
> > > */
> > > > > + struct xe_bb *bb_ccs[XE_SRIOV_VF_CCS_CTX_COUNT];
> > > > > +
> > > > > /**
> > > > > * @cpu_caching: CPU caching mode. Currently only used for
> > > userspace
> > > > > * objects. Exceptions are system memory on DGFX, which is always
> > > > > diff --git a/drivers/gpu/drm/xe/xe_migrate.c
> > > b/drivers/gpu/drm/xe/xe_migrate.c
> > > > > index 8f8e9fdfb2a8..c730b34071ad 100644
> > > > > --- a/drivers/gpu/drm/xe/xe_migrate.c
> > > > > +++ b/drivers/gpu/drm/xe/xe_migrate.c
> > > > > @@ -940,6 +940,136 @@ struct dma_fence *xe_migrate_copy(struct
> > > xe_migrate *m,
> > > > > return fence;
> > > > > }
> > > > >
> > > > > +/**
> > > > > + * xe_migrate_ccs_rw_copy() - Copy content of TTM resources.
> > > > > + * @m: The migration context.
> > > > > + * @src_bo: The buffer object @src is currently bound to.
> > > > > + * @read_write : Creates BB commands for CCS read/write.
> > > > > + *
> > > > > + * Creates batch buffer instructions to copy CCS metadata from CCS pool
> > > to
> > > > > + * memory and vice versa.
> > > > > + *
> > > > > + * This function should only be called for IGPU.
> > > > > + *
> > > > > + * Return: 0 if successful, negative error code on failure.
> > > > > + */
> > > > > +int xe_migrate_ccs_rw_copy(struct xe_migrate *m,
> > > > > + struct xe_bo *src_bo,
> > > > > + enum xe_sriov_vf_ccs_rw_ctxs read_write)
> > > > > +
> > > > > +{
> > > > > + bool src_is_pltt = read_write == XE_SRIOV_VF_CCS_WRITE_CTX;
> > > > > + bool dst_is_pltt = read_write == XE_SRIOV_VF_CCS_READ_CTX;
> > > > > + struct ttm_resource *src = src_bo->ttm.resource;
> > > > > + struct xe_gt *gt = m->tile->primary_gt;
> > > > > + u32 batch_size, batch_size_allocated;
> > > > > + struct xe_device *xe = gt_to_xe(gt);
> > > > > + struct xe_res_cursor src_it, ccs_it;
> > > > > + u64 size = src_bo->size;
> > > > > + struct xe_bb *bb = NULL;
> > > > > + u64 src_L0, src_L0_ofs;
> > > > > + u32 src_L0_pt;
> > > > > + int err;
> > > > > +
> > > > > + xe_res_first_sg(xe_bo_sg(src_bo), 0, size, &src_it);
> > > > > +
> > > > > + xe_res_first_sg(xe_bo_sg(src_bo), xe_bo_ccs_pages_start(src_bo),
> > > > > + PAGE_ALIGN(xe_device_ccs_bytes(xe, size)),
> > > > > + &ccs_it);
> > > > > +
> > > > > + /* Calculate Batch buffer size */
> > > > > + batch_size = 0;
> > > > > + while (size) {
> > > > > + batch_size += 6; /* Flush + 2 NOP */
> > > > > + u64 ccs_ofs, ccs_size;
> > > > > + u32 ccs_pt;
> > > > > +
> > > > > + u32 avail_pts = max_mem_transfer_per_pass(xe) /
> > > LEVEL0_PAGE_TABLE_ENCODE_SIZE;
> > > > > +
> > > > > + src_L0 = min_t(u64, max_mem_transfer_per_pass(xe), size);
> > > > > +
> > > > > + batch_size += pte_update_size(m, false, src, &src_it, &src_L0,
> > > > > + &src_L0_ofs, &src_L0_pt, 0, 0,
> > > > > + avail_pts);
> > > > > +
> > > > > + ccs_size = xe_device_ccs_bytes(xe, src_L0);
> > > > > + batch_size += pte_update_size(m, 0, NULL, &ccs_it, &ccs_size,
> > > &ccs_ofs,
> > > > > + &ccs_pt, 0, avail_pts, avail_pts);
> > > > > + xe_assert(xe, IS_ALIGNED(ccs_it.start, PAGE_SIZE));
> > > > > +
> > > > > + /* Add copy commands size here */
> > > > > + batch_size += EMIT_COPY_CCS_DW;
> > > > > +
> > > > > + size -= src_L0;
> > > > > + }
> > > > > +
> > > > > + bb = xe_bb_ccs_new(gt, batch_size, read_write);
> > > > > + if (IS_ERR(bb)) {
> > > > > + drm_err(&xe->drm, "BB allocation failed.\n");
> > > > > + err = PTR_ERR(bb);
> > > > > + goto err_ret;
> > > > > + }
> > > > > +
> > > > > + batch_size_allocated = batch_size;
> > > > > + size = src_bo->size;
> > > > > + batch_size = 0;
> > > > > +
> > > > > + /*
> > > > > + * Emit PTE and copy commands here.
> > > > > + * The CCS copy command can only support limited size. If the size to
> > > be
> > > > > + * copied is more than the limit, divide copy into chunks. So, calculate
> > > > > + * sizes here again before copy command is emitted.
> > > > > + */
> > > > > + while (size) {
> > > > > + batch_size += 6; /* Flush + 2 NOP */
> > > > > + u32 flush_flags = 0;
> > > > > + u64 ccs_ofs, ccs_size;
> > > > > + u32 ccs_pt;
> > > > > +
> > > > > + u32 avail_pts = max_mem_transfer_per_pass(xe) /
> > > LEVEL0_PAGE_TABLE_ENCODE_SIZE;
> > > > > +
> > > > > + src_L0 = xe_migrate_res_sizes(m, &src_it);
> > > > > +
> > > > > + batch_size += pte_update_size(m, false, src, &src_it, &src_L0,
> > > > > + &src_L0_ofs, &src_L0_pt, 0, 0,
> > > > > + avail_pts);
> > > > > +
> > > > > + ccs_size = xe_device_ccs_bytes(xe, src_L0);
> > > > > + batch_size += pte_update_size(m, 0, NULL, &ccs_it, &ccs_size,
> > > &ccs_ofs,
> > > > > + &ccs_pt, 0, avail_pts, avail_pts);
> > > > > + xe_assert(xe, IS_ALIGNED(ccs_it.start, PAGE_SIZE));
> > > > > + batch_size += EMIT_COPY_CCS_DW;
> > > > > +
> > > > > + emit_pte(m, bb, src_L0_pt, false, true, &src_it, src_L0, src);
> > > > > +
> > > > > + emit_pte(m, bb, ccs_pt, false, false, &ccs_it, ccs_size, src);
> > > > > +
> > > > > + bb->cs[bb->len++] = MI_FLUSH_DW | MI_INVALIDATE_TLB |
> > > MI_FLUSH_DW_OP_STOREDW |
> > > > > + MI_FLUSH_IMM_DW;
> > > > > + bb->cs[bb->len++] = MI_NOOP;
> > > > > + bb->cs[bb->len++] = MI_NOOP;
> > > > > +
> > > > > + flush_flags = xe_migrate_ccs_copy(m, bb, src_L0_ofs,
> > > src_is_pltt,
> > > > > + src_L0_ofs, dst_is_pltt,
> > > > > + src_L0, ccs_ofs, true);
> > > > > +
> > > > > + bb->cs[bb->len++] = MI_FLUSH_DW | MI_INVALIDATE_TLB |
> > > MI_FLUSH_DW_OP_STOREDW |
> > > > > + MI_FLUSH_IMM_DW | flush_flags;
> > > Missed this - you don't need MI_INVALIDATE_TLB here, just after emitting
> > > the PTEs. I believe that should speedup this copy a little too.
> > >
> > This works out if we are using different VMs. Since we are using same VM for all BOs, I was suggested
> > To add MI_INVALIDATE_TLB after each BB to avoid any caching issues.
> > Correct me if I am wrong.
> > - Satya.
> > > This also looks wrong in emit_migration_job_gen12 too. Going to follow
> > > up on this now.
> > >
> > > Matt
>
> Removed MI_INVALIDATE_TLB after emitting PTEs and kept after copy command.
>
> > >
> > > > > + bb->cs[bb->len++] = MI_NOOP;
> > > > > + bb->cs[bb->len++] = MI_NOOP;
> > > > > +
> > > > > + size -= src_L0;
> > > > > + }
> > > > > +
> > > > > + xe_assert(xe, (batch_size_allocated == bb->len));
> > > > > + src_bo->bb_ccs[read_write] = bb;
> > > > > +
> > > > > + return 0;
> > > > > +
> > > > > +err_ret:
> > > > > + return err;
> > > > > +}
> > > > > +
> > > > > static void emit_clear_link_copy(struct xe_gt *gt, struct xe_bb *bb, u64
> > > src_ofs,
> > > > > u32 size, u32 pitch)
> > > > > {
> > > > > diff --git a/drivers/gpu/drm/xe/xe_migrate.h
> > > b/drivers/gpu/drm/xe/xe_migrate.h
> > > > > index fb9839c1bae0..96b0449e7edb 100644
> > > > > --- a/drivers/gpu/drm/xe/xe_migrate.h
> > > > > +++ b/drivers/gpu/drm/xe/xe_migrate.h
> > > > > @@ -24,6 +24,8 @@ struct xe_vm;
> > > > > struct xe_vm_pgtable_update;
> > > > > struct xe_vma;
> > > > >
> > > > > +enum xe_sriov_vf_ccs_rw_ctxs;
> > > > > +
> > > > > /**
> > > > > * struct xe_migrate_pt_update_ops - Callbacks for the
> > > > > * xe_migrate_update_pgtables() function.
> > > > > @@ -112,6 +114,10 @@ struct dma_fence *xe_migrate_copy(struct
> > > xe_migrate *m,
> > > > > struct ttm_resource *dst,
> > > > > bool copy_only_ccs);
> > > > >
> > > > > +int xe_migrate_ccs_rw_copy(struct xe_migrate *m,
> > > > > + struct xe_bo *src_bo,
> > > > > + enum xe_sriov_vf_ccs_rw_ctxs read_write);
> > > > > +
> > > > > int xe_migrate_access_memory(struct xe_migrate *m, struct xe_bo *bo,
> > > > > unsigned long offset, void *buf, int len,
> > > > > int write);
> > > > > diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
> > > b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
> > > > > index ff5ad472eb96..242a3da1ef27 100644
> > > > > --- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
> > > > > +++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
> > > > > @@ -5,6 +5,7 @@
> > > > >
> > > > > #include "instructions/xe_mi_commands.h"
> > > > > #include "instructions/xe_gpu_commands.h"
> > > > > +#include "xe_bb.h"
> > > > > #include "xe_bo.h"
> > > > > #include "xe_device.h"
> > > > > #include "xe_migrate.h"
> > > > > @@ -208,3 +209,74 @@ int xe_sriov_vf_ccs_init(struct xe_device *xe)
> > > > > err_ret:
> > > > > return err;
> > > > > }
> > > > > +
> > > > > +/**
> > > > > + * xe_sriov_vf_ccs_attach_bo - Insert CCS read write commands in the BO.
> > > > > + * @bo: the &buffer object to which batch buffer commands will be
> > > added.
> > > > > + *
> > > > > + * This function shall be called only by VF. It inserts the PTEs and copy
> > > > > + * command instructions in the BO by calling xe_migrate_ccs_rw_copy()
> > > > > + * function.
> > > > > + *
> > > > > + * Returns: 0 if successful, negative error code on failure.
> > > > > + */
> > > > > +int xe_sriov_vf_ccs_attach_bo(struct xe_bo *bo)
> > > > > +{
> > > > > + struct xe_device *xe = xe_bo_device(bo);
> > > > > + enum xe_sriov_vf_ccs_rw_ctxs ctx_id;
> > > > > + struct xe_migrate *migrate;
> > > > > + struct xe_tile *tile;
> > > > > + struct xe_bb *bb;
> > > > > + int tile_id;
> > > > > + int err = 0;
> > > > > +
> > > > > + if (!IS_VF_CCS_READY(xe))
> > > > > + return 0;
> > > > > +
> > > > > + for_each_tile(tile, xe, tile_id) {
> > > > Same comment as patch 1, I'd avoid for_each_tile and rather use
> > > > xe_device_get_root_tile.
> > > >
> > > > > + for_each_ccs_rw_ctx(ctx_id) {
> > > > > + bb = bo->bb_ccs[ctx_id];
> > > > > + /* bb should be NULL here. Assert if not NULL */
> > > > > + xe_assert(xe, !bb);
> > > > > +
> > > > > + migrate = tile->sriov.vf.ccs[ctx_id].migrate;
> > > > > + err = xe_migrate_ccs_rw_copy(migrate, bo, ctx_id);
> > > > > + }
> > > > > + }
> > > > > + return err;
> > > > > +}
> > > > > +
> > > > > +/**
> > > > > + * xe_sriov_vf_ccs_detach_bo - Remove CCS read write commands from
> > > the BO.
> > > > > + * @bo: the &buffer object from which batch buffer commands will be
> > > removed.
> > > > > + *
> > > > > + * This function shall be called only by VF. It removes the PTEs and copy
> > > > > + * command instructions from the BO. Make sure to update the BB with
> > > MI_NOOP
> > > > > + * before freeing.
> > > > > + *
> > > > > + * Returns: 0 if successful.
> > > > > + */
> > > > > +int xe_sriov_vf_ccs_detach_bo(struct xe_bo *bo)
> > > > > +{
> > > > > + struct xe_device *xe = xe_bo_device(bo);
> > > > > + enum xe_sriov_vf_ccs_rw_ctxs ctx_id;
> > > > > + struct xe_bb *bb;
> > > > > + struct xe_tile *tile;
> > > > > + int tile_id;
> > > > > +
> > > > > + if (!IS_VF_CCS_READY(xe))
> > > > > + return 0;
> > > > > +
> > > > > + for_each_tile(tile, xe, tile_id) {
> > > > Same here.
> > > >
> > > > Matt
> Fixed in new version.
> > > > > + for_each_ccs_rw_ctx(ctx_id) {
> > > > > + bb = bo->bb_ccs[ctx_id];
> > > > > + if (!bb)
> > > > > + continue;
> > > > > +
> > > > > + memset(bb->cs, MI_NOOP, bb->len * sizeof(u32));
> > > > > + xe_bb_free(bb, NULL);
> > > > > + bo->bb_ccs[ctx_id] = NULL;
> > > > > + }
> > > > > + }
> > > > > + return 0;
> > > > > +}
> > > > > diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
> > > b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
> > > > > index 5df9ba028d14..5d5e4bd25904 100644
> > > > > --- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
> > > > > +++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
> > > > > @@ -7,7 +7,10 @@
> > > > > #define _XE_SRIOV_VF_CCS_H_
> > > > >
> > > > > struct xe_device;
> > > > > +struct xe_bo;
> > > > >
> > > > > int xe_sriov_vf_ccs_init(struct xe_device *xe);
> > > > > +int xe_sriov_vf_ccs_attach_bo(struct xe_bo *bo);
> > > > > +int xe_sriov_vf_ccs_detach_bo(struct xe_bo *bo);
> > > > >
> > > > > #endif
> > > > > diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
> > > b/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
> > > > > index 6dc279d206ec..e240f3fd18af 100644
> > > > > --- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
> > > > > +++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs_types.h
> > > > > @@ -27,6 +27,14 @@ enum xe_sriov_vf_ccs_rw_ctxs {
> > > > > XE_SRIOV_VF_CCS_CTX_COUNT
> > > > > };
> > > > >
> > > > > +#define IS_VF_CCS_BB_VALID(xe, bo) ({ \
> > > > > + struct xe_device *___xe = (xe); \
> > > > > + struct xe_bo *___bo = (bo); \
> > > > > + IS_SRIOV_VF(___xe) && \
> > > > > + ___bo->bb_ccs[XE_SRIOV_VF_CCS_READ_CTX] && \
> > > > > + ___bo->bb_ccs[XE_SRIOV_VF_CCS_WRITE_CTX]; \
> > > > > + })
> > > > > +
> > > > > struct xe_migrate;
> > > > > struct xe_sa_manager;
> > > > >
> > > > > --
> > > > > 2.43.0
> > > > >
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v8 3/3] drm/xe/vf: Register CCS read/write contexts with Guc
2025-06-19 8:04 [PATCH v8 0/3] CCS save restore for IGPU Satyanarayana K V P
` (3 preceding siblings ...)
2025-06-19 8:04 ` [PATCH v8 2/3] drm/xe/vf: Attach and detach CCS copy commands with BO Satyanarayana K V P
@ 2025-06-19 8:04 ` Satyanarayana K V P
2025-06-20 16:30 ` Matthew Brost
2025-06-19 8:36 ` ✓ Xe.CI.BAT: success for CCS save restore for IGPU (rev8) Patchwork
2025-06-19 19:33 ` ✗ Xe.CI.Full: failure " Patchwork
6 siblings, 1 reply; 17+ messages in thread
From: Satyanarayana K V P @ 2025-06-19 8:04 UTC (permalink / raw)
To: intel-xe
Cc: Satyanarayana K V P, Michal Wajdeczko, Matthew Brost,
Maarten Lankhorst, Michał Winiarski, Tomasz Lis,
Matthew Auld
Register read write contexts with newly added flags with GUC and
enable the context immediately after registration.
Re-register the context with Guc when resuming from runtime suspend as
soft reset is applied to Guc during xe_pm_runtime_resume().
Make Ring head=tail while unbinding device to avoid issues with VF pause
after device is unbinded.
Signed-off-by: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
---
Cc: Michał Winiarski <michal.winiarski@intel.com>
Cc: Tomasz Lis <tomasz.lis@intel.com>
Cc: Matthew Auld <matthew.auld@intel.com>
V7 -> V8:
-None.
V6 -> V7:
- Fixed review comments (Matthew Brost).
- Replaced xe_tile_migrate_exec_queue() with xe_migrate_exec_queue() as per
review comments (Matthew Brost).
V5 -> V6:
- None
V4 -> V5:
- Fixed review comments (Matthew Brost).
V3 -> V4:
- Fixed issues reported by patchworks.
V2 -> V3:
- Made xe_migrate structure private as per review comments.
- Created new xe_migrate functions to get lrc and exec_queue.
V1 -> V2:
- Fixed review comments.
---
drivers/gpu/drm/xe/xe_guc_fwif.h | 5 ++
drivers/gpu/drm/xe/xe_guc_submit.c | 34 +++++++++-
drivers/gpu/drm/xe/xe_guc_submit.h | 1 +
drivers/gpu/drm/xe/xe_migrate.c | 35 +++++++----
drivers/gpu/drm/xe/xe_migrate.h | 4 +-
drivers/gpu/drm/xe/xe_pm.c | 4 ++
drivers/gpu/drm/xe/xe_sriov_vf_ccs.c | 93 ++++++++++++++++++++++++++++
drivers/gpu/drm/xe/xe_sriov_vf_ccs.h | 1 +
drivers/gpu/drm/xe/xe_vm.c | 6 +-
9 files changed, 163 insertions(+), 20 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_guc_fwif.h b/drivers/gpu/drm/xe/xe_guc_fwif.h
index 6f57578b07cb..ca9f999d38d1 100644
--- a/drivers/gpu/drm/xe/xe_guc_fwif.h
+++ b/drivers/gpu/drm/xe/xe_guc_fwif.h
@@ -45,6 +45,11 @@
#define GUC_MAX_ENGINE_CLASSES 16
#define GUC_MAX_INSTANCES_PER_CLASS 32
+#define GUC_CONTEXT_NORMAL 0
+#define GUC_CONTEXT_COMPRESSION_SAVE 1
+#define GUC_CONTEXT_COMPRESSION_RESTORE 2
+#define GUC_CONTEXT_COUNT (GUC_CONTEXT_COMPRESSION_RESTORE + 1)
+
/* Helper for context registration H2G */
struct guc_ctxt_registration_info {
u32 flags;
diff --git a/drivers/gpu/drm/xe/xe_guc_submit.c b/drivers/gpu/drm/xe/xe_guc_submit.c
index df7a5a4eec74..f17a63ea06e9 100644
--- a/drivers/gpu/drm/xe/xe_guc_submit.c
+++ b/drivers/gpu/drm/xe/xe_guc_submit.c
@@ -542,7 +542,7 @@ static void __register_exec_queue(struct xe_guc *guc,
xe_guc_ct_send(&guc->ct, action, ARRAY_SIZE(action), 0, 0);
}
-static void register_exec_queue(struct xe_exec_queue *q)
+static void register_exec_queue(struct xe_exec_queue *q, int ctx_type)
{
struct xe_guc *guc = exec_queue_to_guc(q);
struct xe_device *xe = guc_to_xe(guc);
@@ -550,6 +550,7 @@ static void register_exec_queue(struct xe_exec_queue *q)
struct guc_ctxt_registration_info info;
xe_gt_assert(guc_to_gt(guc), !exec_queue_registered(q));
+ xe_gt_assert(guc_to_gt(guc), ctx_type < GUC_CONTEXT_COUNT);
memset(&info, 0, sizeof(info));
info.context_idx = q->guc->id;
@@ -559,6 +560,9 @@ static void register_exec_queue(struct xe_exec_queue *q)
info.hwlrca_hi = upper_32_bits(xe_lrc_descriptor(lrc));
info.flags = CONTEXT_REGISTRATION_FLAG_KMD;
+ if (ctx_type != GUC_CONTEXT_NORMAL)
+ info.flags |= BIT(ctx_type);
+
if (xe_exec_queue_is_parallel(q)) {
u64 ggtt_addr = xe_lrc_parallel_ggtt_addr(lrc);
struct iosys_map map = xe_lrc_parallel_map(lrc);
@@ -761,7 +765,7 @@ guc_exec_queue_run_job(struct drm_sched_job *drm_job)
if (!exec_queue_killed_or_banned_or_wedged(q) && !xe_sched_job_is_error(job)) {
if (!exec_queue_registered(q))
- register_exec_queue(q);
+ register_exec_queue(q, GUC_CONTEXT_NORMAL);
if (!lr) /* LR jobs are emitted in the exec IOCTL */
q->ring_ops->emit_job(job);
submit_exec_queue(q);
@@ -2366,6 +2370,32 @@ static void guc_exec_queue_print(struct xe_exec_queue *q, struct drm_printer *p)
xe_guc_exec_queue_snapshot_free(snapshot);
}
+/**
+ * xe_guc_register_exec_queue - Register exec queue for a given context type.
+ * @q - Execution queue
+ * @ctx_type - Type of the context
+ *
+ * This function registers the execution queue with the guc. Special context
+ * types like GUC_CONTEXT_COMPRESSION_SAVE and GUC_CONTEXT_COMPRESSION_RESTORE
+ * are only applicable for IGPU and in the VF.
+ * Submits the execution queue to GUC after registering it.
+ *
+ * Returns - None.
+ */
+void xe_guc_register_exec_queue(struct xe_exec_queue *q, int ctx_type)
+{
+ struct xe_guc *guc = exec_queue_to_guc(q);
+ struct xe_device *xe = guc_to_xe(guc);
+
+ xe_assert(xe, IS_SRIOV_VF(xe));
+ xe_assert(xe, !IS_DGFX(xe));
+ xe_assert(xe, (ctx_type > GUC_CONTEXT_NORMAL &&
+ ctx_type < GUC_CONTEXT_COUNT));
+
+ register_exec_queue(q, ctx_type);
+ enable_scheduling(q);
+}
+
/**
* xe_guc_submit_print - GuC Submit Print.
* @guc: GuC.
diff --git a/drivers/gpu/drm/xe/xe_guc_submit.h b/drivers/gpu/drm/xe/xe_guc_submit.h
index 9b71a986c6ca..8f64e799283b 100644
--- a/drivers/gpu/drm/xe/xe_guc_submit.h
+++ b/drivers/gpu/drm/xe/xe_guc_submit.h
@@ -39,5 +39,6 @@ xe_guc_exec_queue_snapshot_print(struct xe_guc_submit_exec_queue_snapshot *snaps
void
xe_guc_exec_queue_snapshot_free(struct xe_guc_submit_exec_queue_snapshot *snapshot);
void xe_guc_submit_print(struct xe_guc *guc, struct drm_printer *p);
+void xe_guc_register_exec_queue(struct xe_exec_queue *q, int ctx_type);
#endif
diff --git a/drivers/gpu/drm/xe/xe_migrate.c b/drivers/gpu/drm/xe/xe_migrate.c
index c730b34071ad..a90c5ecbd8c0 100644
--- a/drivers/gpu/drm/xe/xe_migrate.c
+++ b/drivers/gpu/drm/xe/xe_migrate.c
@@ -84,19 +84,6 @@ struct xe_migrate {
*/
#define MAX_PTE_PER_SDI 0x1FE
-/**
- * xe_tile_migrate_exec_queue() - Get this tile's migrate exec queue.
- * @tile: The tile.
- *
- * Returns the default migrate exec queue of this tile.
- *
- * Return: The default migrate exec queue
- */
-struct xe_exec_queue *xe_tile_migrate_exec_queue(struct xe_tile *tile)
-{
- return tile->migrate->q;
-}
-
static void xe_migrate_fini(void *arg)
{
struct xe_migrate *m = arg;
@@ -1070,6 +1057,28 @@ int xe_migrate_ccs_rw_copy(struct xe_migrate *m,
return err;
}
+/**
+ * xe_get_migrate_lrc() - Get the LRC from migrate context.
+ * @migrate: Migrate context.
+ *
+ * Return: Pointer to LRC on success, error on failure
+ */
+struct xe_lrc *xe_migrate_lrc(struct xe_migrate *migrate)
+{
+ return migrate->q->lrc[0];
+}
+
+/**
+ * xe_get_migrate_exec_queue() - Get the execution queue from migrate context.
+ * @migrate: Migrate context.
+ *
+ * Return: Pointer to execution queue on success, error on failure
+ */
+struct xe_exec_queue *xe_migrate_exec_queue(struct xe_migrate *migrate)
+{
+ return migrate->q;
+}
+
static void emit_clear_link_copy(struct xe_gt *gt, struct xe_bb *bb, u64 src_ofs,
u32 size, u32 pitch)
{
diff --git a/drivers/gpu/drm/xe/xe_migrate.h b/drivers/gpu/drm/xe/xe_migrate.h
index 96b0449e7edb..3754d9e6150f 100644
--- a/drivers/gpu/drm/xe/xe_migrate.h
+++ b/drivers/gpu/drm/xe/xe_migrate.h
@@ -118,6 +118,8 @@ int xe_migrate_ccs_rw_copy(struct xe_migrate *m,
struct xe_bo *src_bo,
enum xe_sriov_vf_ccs_rw_ctxs read_write);
+struct xe_lrc *xe_migrate_lrc(struct xe_migrate *migrate);
+struct xe_exec_queue *xe_migrate_exec_queue(struct xe_migrate *migrate);
int xe_migrate_access_memory(struct xe_migrate *m, struct xe_bo *bo,
unsigned long offset, void *buf, int len,
int write);
@@ -138,6 +140,4 @@ xe_migrate_update_pgtables(struct xe_migrate *m,
struct xe_migrate_pt_update *pt_update);
void xe_migrate_wait(struct xe_migrate *m);
-
-struct xe_exec_queue *xe_tile_migrate_exec_queue(struct xe_tile *tile);
#endif
diff --git a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c
index 26e95460af87..6c32412126d7 100644
--- a/drivers/gpu/drm/xe/xe_pm.c
+++ b/drivers/gpu/drm/xe/xe_pm.c
@@ -22,6 +22,7 @@
#include "xe_irq.h"
#include "xe_pcode.h"
#include "xe_pxp.h"
+#include "xe_sriov_vf_ccs.h"
#include "xe_trace.h"
#include "xe_wa.h"
@@ -546,6 +547,9 @@ int xe_pm_runtime_resume(struct xe_device *xe)
xe_pxp_pm_resume(xe->pxp);
+ if (IS_SRIOV_VF(xe))
+ xe_sriov_vf_ccs_register_context(xe);
+
out:
xe_rpm_lockmap_release(xe);
xe_pm_write_callback_task(xe, NULL);
diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
index 242a3da1ef27..e4ca34af05fa 100644
--- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
+++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
@@ -8,6 +8,9 @@
#include "xe_bb.h"
#include "xe_bo.h"
#include "xe_device.h"
+#include "xe_exec_queue_types.h"
+#include "xe_guc_submit.h"
+#include "xe_lrc.h"
#include "xe_migrate.h"
#include "xe_sa.h"
#include "xe_sriov_printk.h"
@@ -163,6 +166,86 @@ static int alloc_bb_pool(struct xe_tile *tile, struct xe_tile_vf_ccs *ctx)
return 0;
}
+static void ccs_rw_update_ring(struct xe_tile_vf_ccs *ctx)
+{
+ struct xe_lrc *lrc = xe_migrate_lrc(ctx->migrate);
+ u32 addr = ctx->mem.ccs_bb_pool->gpu_addr;
+ u32 dw[10], i = 0;
+
+ dw[i++] = MI_ARB_ON_OFF | MI_ARB_DISABLE;
+ dw[i++] = MI_BATCH_BUFFER_START | XE_INSTR_NUM_DW(3);
+ dw[i++] = addr;
+ dw[i++] = 0;
+ dw[i++] = MI_NOOP;
+
+ xe_lrc_write_ring(lrc, dw, i * sizeof(u32));
+}
+
+static int register_save_restore_context(struct xe_migrate *m,
+ enum xe_sriov_vf_ccs_rw_ctxs ctx_id)
+{
+ int err = -EINVAL;
+ int ctx_type;
+
+ switch (ctx_id) {
+ case XE_SRIOV_VF_CCS_READ_CTX:
+ ctx_type = GUC_CONTEXT_COMPRESSION_SAVE;
+ break;
+ case XE_SRIOV_VF_CCS_WRITE_CTX:
+ ctx_type = GUC_CONTEXT_COMPRESSION_RESTORE;
+ break;
+ default:
+ return err;
+ }
+
+ xe_guc_register_exec_queue(xe_migrate_exec_queue(m), ctx_type);
+ return 0;
+}
+
+/**
+ * xe_sriov_vf_ccs_register_context - Register read/write contexts with guc.
+ * @xe: the &xe_device to register contexts on.
+ *
+ * This function registers read and write contexts with Guc. Re-registration
+ * is needed whenever resuming from pm runtime suspend.
+ *
+ * Return: 0 on success. Negative error code on failure.
+ */
+int xe_sriov_vf_ccs_register_context(struct xe_device *xe)
+{
+ enum xe_sriov_vf_ccs_rw_ctxs ctx_id;
+ struct xe_tile_vf_ccs *ctx;
+ struct xe_tile *tile;
+ int tile_id;
+ int err;
+
+ if (!IS_VF_CCS_READY(xe))
+ return 0;
+
+ for_each_tile(tile, xe, tile_id) {
+ for_each_ccs_rw_ctx(ctx_id) {
+ ctx = &tile->sriov.vf.ccs[ctx_id];
+ err = register_save_restore_context(ctx->migrate, ctx_id);
+ if (err)
+ return err;
+ }
+ }
+
+ return err;
+}
+
+static void xe_sriov_vf_ccs_fini(void *arg)
+{
+ struct xe_tile_vf_ccs *ctx = arg;
+ struct xe_lrc *lrc = xe_migrate_lrc(ctx->migrate);
+
+ /*
+ * Make TAIL = HEAD in the ring so that no issues are seen if Guc
+ * submits this context to HW on VF pause after unbinding device.
+ */
+ xe_lrc_set_ring_tail(lrc, xe_lrc_ring_head(lrc));
+}
+
/**
* xe_sriov_vf_ccs_init - Setup LRCA for save & restore.
* @xe: the &xe_device to start recovery on
@@ -199,6 +282,16 @@ int xe_sriov_vf_ccs_init(struct xe_device *xe)
err = alloc_bb_pool(tile, ctx);
if (err)
goto err_ret;
+
+ ccs_rw_update_ring(ctx);
+
+ err = register_save_restore_context(ctx->migrate, ctx_id);
+ if (err)
+ goto err_ret;
+
+ err = devm_add_action_or_reset(xe->drm.dev,
+ xe_sriov_vf_ccs_fini,
+ ctx);
}
}
diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
index 5d5e4bd25904..1f1baf685fec 100644
--- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
+++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
@@ -12,5 +12,6 @@ struct xe_bo;
int xe_sriov_vf_ccs_init(struct xe_device *xe);
int xe_sriov_vf_ccs_attach_bo(struct xe_bo *bo);
int xe_sriov_vf_ccs_detach_bo(struct xe_bo *bo);
+int xe_sriov_vf_ccs_register_context(struct xe_device *xe);
#endif
diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
index 04d1a43b81e3..8f1a258912ea 100644
--- a/drivers/gpu/drm/xe/xe_vm.c
+++ b/drivers/gpu/drm/xe/xe_vm.c
@@ -953,7 +953,7 @@ struct dma_fence *xe_vma_rebind(struct xe_vm *vm, struct xe_vma *vma, u8 tile_ma
for_each_tile(tile, vm->xe, id) {
vops.pt_update_ops[id].wait_vm_bookkeep = true;
vops.pt_update_ops[tile->id].q =
- xe_tile_migrate_exec_queue(tile);
+ xe_migrate_exec_queue(tile->migrate);
}
err = xe_vm_ops_add_rebind(&vops, vma, tile_mask);
@@ -1043,7 +1043,7 @@ struct dma_fence *xe_vm_range_rebind(struct xe_vm *vm,
for_each_tile(tile, vm->xe, id) {
vops.pt_update_ops[id].wait_vm_bookkeep = true;
vops.pt_update_ops[tile->id].q =
- xe_tile_migrate_exec_queue(tile);
+ xe_migrate_exec_queue(tile->migrate);
}
err = xe_vm_ops_add_range_rebind(&vops, vma, range, tile_mask);
@@ -1126,7 +1126,7 @@ struct dma_fence *xe_vm_range_unbind(struct xe_vm *vm,
for_each_tile(tile, vm->xe, id) {
vops.pt_update_ops[id].wait_vm_bookkeep = true;
vops.pt_update_ops[tile->id].q =
- xe_tile_migrate_exec_queue(tile);
+ xe_migrate_exec_queue(tile->migrate);
}
err = xe_vm_ops_add_range_unbind(&vops, range);
--
2.43.0
^ permalink raw reply related [flat|nested] 17+ messages in thread* Re: [PATCH v8 3/3] drm/xe/vf: Register CCS read/write contexts with Guc
2025-06-19 8:04 ` [PATCH v8 3/3] drm/xe/vf: Register CCS read/write contexts with Guc Satyanarayana K V P
@ 2025-06-20 16:30 ` Matthew Brost
2025-06-24 9:39 ` K V P, Satyanarayana
0 siblings, 1 reply; 17+ messages in thread
From: Matthew Brost @ 2025-06-20 16:30 UTC (permalink / raw)
To: Satyanarayana K V P
Cc: intel-xe, Michal Wajdeczko, Maarten Lankhorst,
Michał Winiarski, Tomasz Lis, Matthew Auld
On Thu, Jun 19, 2025 at 01:34:59PM +0530, Satyanarayana K V P wrote:
> Register read write contexts with newly added flags with GUC and
> enable the context immediately after registration.
> Re-register the context with Guc when resuming from runtime suspend as
> soft reset is applied to Guc during xe_pm_runtime_resume().
> Make Ring head=tail while unbinding device to avoid issues with VF pause
> after device is unbinded.
>
> Signed-off-by: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> Cc: Matthew Brost <matthew.brost@intel.com>
> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> ---
> Cc: Michał Winiarski <michal.winiarski@intel.com>
> Cc: Tomasz Lis <tomasz.lis@intel.com>
> Cc: Matthew Auld <matthew.auld@intel.com>
>
> V7 -> V8:
> -None.
>
> V6 -> V7:
> - Fixed review comments (Matthew Brost).
> - Replaced xe_tile_migrate_exec_queue() with xe_migrate_exec_queue() as per
> review comments (Matthew Brost).
>
> V5 -> V6:
> - None
>
> V4 -> V5:
> - Fixed review comments (Matthew Brost).
>
> V3 -> V4:
> - Fixed issues reported by patchworks.
>
> V2 -> V3:
> - Made xe_migrate structure private as per review comments.
> - Created new xe_migrate functions to get lrc and exec_queue.
>
> V1 -> V2:
> - Fixed review comments.
> ---
> drivers/gpu/drm/xe/xe_guc_fwif.h | 5 ++
> drivers/gpu/drm/xe/xe_guc_submit.c | 34 +++++++++-
> drivers/gpu/drm/xe/xe_guc_submit.h | 1 +
> drivers/gpu/drm/xe/xe_migrate.c | 35 +++++++----
> drivers/gpu/drm/xe/xe_migrate.h | 4 +-
> drivers/gpu/drm/xe/xe_pm.c | 4 ++
> drivers/gpu/drm/xe/xe_sriov_vf_ccs.c | 93 ++++++++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_sriov_vf_ccs.h | 1 +
> drivers/gpu/drm/xe/xe_vm.c | 6 +-
> 9 files changed, 163 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_guc_fwif.h b/drivers/gpu/drm/xe/xe_guc_fwif.h
> index 6f57578b07cb..ca9f999d38d1 100644
> --- a/drivers/gpu/drm/xe/xe_guc_fwif.h
> +++ b/drivers/gpu/drm/xe/xe_guc_fwif.h
> @@ -45,6 +45,11 @@
> #define GUC_MAX_ENGINE_CLASSES 16
> #define GUC_MAX_INSTANCES_PER_CLASS 32
>
> +#define GUC_CONTEXT_NORMAL 0
> +#define GUC_CONTEXT_COMPRESSION_SAVE 1
> +#define GUC_CONTEXT_COMPRESSION_RESTORE 2
> +#define GUC_CONTEXT_COUNT (GUC_CONTEXT_COMPRESSION_RESTORE + 1)
> +
> /* Helper for context registration H2G */
> struct guc_ctxt_registration_info {
> u32 flags;
> diff --git a/drivers/gpu/drm/xe/xe_guc_submit.c b/drivers/gpu/drm/xe/xe_guc_submit.c
> index df7a5a4eec74..f17a63ea06e9 100644
> --- a/drivers/gpu/drm/xe/xe_guc_submit.c
> +++ b/drivers/gpu/drm/xe/xe_guc_submit.c
> @@ -542,7 +542,7 @@ static void __register_exec_queue(struct xe_guc *guc,
> xe_guc_ct_send(&guc->ct, action, ARRAY_SIZE(action), 0, 0);
> }
>
> -static void register_exec_queue(struct xe_exec_queue *q)
> +static void register_exec_queue(struct xe_exec_queue *q, int ctx_type)
> {
> struct xe_guc *guc = exec_queue_to_guc(q);
> struct xe_device *xe = guc_to_xe(guc);
> @@ -550,6 +550,7 @@ static void register_exec_queue(struct xe_exec_queue *q)
> struct guc_ctxt_registration_info info;
>
> xe_gt_assert(guc_to_gt(guc), !exec_queue_registered(q));
> + xe_gt_assert(guc_to_gt(guc), ctx_type < GUC_CONTEXT_COUNT);
>
> memset(&info, 0, sizeof(info));
> info.context_idx = q->guc->id;
> @@ -559,6 +560,9 @@ static void register_exec_queue(struct xe_exec_queue *q)
> info.hwlrca_hi = upper_32_bits(xe_lrc_descriptor(lrc));
> info.flags = CONTEXT_REGISTRATION_FLAG_KMD;
>
> + if (ctx_type != GUC_CONTEXT_NORMAL)
> + info.flags |= BIT(ctx_type);
> +
> if (xe_exec_queue_is_parallel(q)) {
> u64 ggtt_addr = xe_lrc_parallel_ggtt_addr(lrc);
> struct iosys_map map = xe_lrc_parallel_map(lrc);
> @@ -761,7 +765,7 @@ guc_exec_queue_run_job(struct drm_sched_job *drm_job)
>
> if (!exec_queue_killed_or_banned_or_wedged(q) && !xe_sched_job_is_error(job)) {
> if (!exec_queue_registered(q))
> - register_exec_queue(q);
> + register_exec_queue(q, GUC_CONTEXT_NORMAL);
> if (!lr) /* LR jobs are emitted in the exec IOCTL */
> q->ring_ops->emit_job(job);
> submit_exec_queue(q);
> @@ -2366,6 +2370,32 @@ static void guc_exec_queue_print(struct xe_exec_queue *q, struct drm_printer *p)
> xe_guc_exec_queue_snapshot_free(snapshot);
> }
>
> +/**
> + * xe_guc_register_exec_queue - Register exec queue for a given context type.
> + * @q - Execution queue
> + * @ctx_type - Type of the context
> + *
> + * This function registers the execution queue with the guc. Special context
> + * types like GUC_CONTEXT_COMPRESSION_SAVE and GUC_CONTEXT_COMPRESSION_RESTORE
> + * are only applicable for IGPU and in the VF.
> + * Submits the execution queue to GUC after registering it.
> + *
> + * Returns - None.
> + */
> +void xe_guc_register_exec_queue(struct xe_exec_queue *q, int ctx_type)
> +{
> + struct xe_guc *guc = exec_queue_to_guc(q);
> + struct xe_device *xe = guc_to_xe(guc);
> +
> + xe_assert(xe, IS_SRIOV_VF(xe));
> + xe_assert(xe, !IS_DGFX(xe));
> + xe_assert(xe, (ctx_type > GUC_CONTEXT_NORMAL &&
> + ctx_type < GUC_CONTEXT_COUNT));
> +
> + register_exec_queue(q, ctx_type);
> + enable_scheduling(q);
> +}
> +
> /**
> * xe_guc_submit_print - GuC Submit Print.
> * @guc: GuC.
> diff --git a/drivers/gpu/drm/xe/xe_guc_submit.h b/drivers/gpu/drm/xe/xe_guc_submit.h
> index 9b71a986c6ca..8f64e799283b 100644
> --- a/drivers/gpu/drm/xe/xe_guc_submit.h
> +++ b/drivers/gpu/drm/xe/xe_guc_submit.h
> @@ -39,5 +39,6 @@ xe_guc_exec_queue_snapshot_print(struct xe_guc_submit_exec_queue_snapshot *snaps
> void
> xe_guc_exec_queue_snapshot_free(struct xe_guc_submit_exec_queue_snapshot *snapshot);
> void xe_guc_submit_print(struct xe_guc *guc, struct drm_printer *p);
> +void xe_guc_register_exec_queue(struct xe_exec_queue *q, int ctx_type);
>
> #endif
> diff --git a/drivers/gpu/drm/xe/xe_migrate.c b/drivers/gpu/drm/xe/xe_migrate.c
> index c730b34071ad..a90c5ecbd8c0 100644
> --- a/drivers/gpu/drm/xe/xe_migrate.c
> +++ b/drivers/gpu/drm/xe/xe_migrate.c
> @@ -84,19 +84,6 @@ struct xe_migrate {
> */
> #define MAX_PTE_PER_SDI 0x1FE
>
> -/**
> - * xe_tile_migrate_exec_queue() - Get this tile's migrate exec queue.
> - * @tile: The tile.
> - *
> - * Returns the default migrate exec queue of this tile.
> - *
> - * Return: The default migrate exec queue
> - */
> -struct xe_exec_queue *xe_tile_migrate_exec_queue(struct xe_tile *tile)
> -{
> - return tile->migrate->q;
> -}
> -
> static void xe_migrate_fini(void *arg)
> {
> struct xe_migrate *m = arg;
> @@ -1070,6 +1057,28 @@ int xe_migrate_ccs_rw_copy(struct xe_migrate *m,
> return err;
> }
>
> +/**
> + * xe_get_migrate_lrc() - Get the LRC from migrate context.
> + * @migrate: Migrate context.
> + *
> + * Return: Pointer to LRC on success, error on failure
> + */
> +struct xe_lrc *xe_migrate_lrc(struct xe_migrate *migrate)
> +{
> + return migrate->q->lrc[0];
> +}
> +
> +/**
> + * xe_get_migrate_exec_queue() - Get the execution queue from migrate context.
> + * @migrate: Migrate context.
> + *
> + * Return: Pointer to execution queue on success, error on failure
> + */
> +struct xe_exec_queue *xe_migrate_exec_queue(struct xe_migrate *migrate)
> +{
> + return migrate->q;
> +}
> +
> static void emit_clear_link_copy(struct xe_gt *gt, struct xe_bb *bb, u64 src_ofs,
> u32 size, u32 pitch)
> {
> diff --git a/drivers/gpu/drm/xe/xe_migrate.h b/drivers/gpu/drm/xe/xe_migrate.h
> index 96b0449e7edb..3754d9e6150f 100644
> --- a/drivers/gpu/drm/xe/xe_migrate.h
> +++ b/drivers/gpu/drm/xe/xe_migrate.h
> @@ -118,6 +118,8 @@ int xe_migrate_ccs_rw_copy(struct xe_migrate *m,
> struct xe_bo *src_bo,
> enum xe_sriov_vf_ccs_rw_ctxs read_write);
>
> +struct xe_lrc *xe_migrate_lrc(struct xe_migrate *migrate);
> +struct xe_exec_queue *xe_migrate_exec_queue(struct xe_migrate *migrate);
> int xe_migrate_access_memory(struct xe_migrate *m, struct xe_bo *bo,
> unsigned long offset, void *buf, int len,
> int write);
> @@ -138,6 +140,4 @@ xe_migrate_update_pgtables(struct xe_migrate *m,
> struct xe_migrate_pt_update *pt_update);
>
> void xe_migrate_wait(struct xe_migrate *m);
> -
> -struct xe_exec_queue *xe_tile_migrate_exec_queue(struct xe_tile *tile);
> #endif
> diff --git a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c
> index 26e95460af87..6c32412126d7 100644
> --- a/drivers/gpu/drm/xe/xe_pm.c
> +++ b/drivers/gpu/drm/xe/xe_pm.c
> @@ -22,6 +22,7 @@
> #include "xe_irq.h"
> #include "xe_pcode.h"
> #include "xe_pxp.h"
> +#include "xe_sriov_vf_ccs.h"
> #include "xe_trace.h"
> #include "xe_wa.h"
>
> @@ -546,6 +547,9 @@ int xe_pm_runtime_resume(struct xe_device *xe)
>
> xe_pxp_pm_resume(xe->pxp);
>
> + if (IS_SRIOV_VF(xe))
> + xe_sriov_vf_ccs_register_context(xe);
> +
> out:
> xe_rpm_lockmap_release(xe);
> xe_pm_write_callback_task(xe, NULL);
> diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
> index 242a3da1ef27..e4ca34af05fa 100644
> --- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
> +++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
> @@ -8,6 +8,9 @@
> #include "xe_bb.h"
> #include "xe_bo.h"
> #include "xe_device.h"
> +#include "xe_exec_queue_types.h"
> +#include "xe_guc_submit.h"
> +#include "xe_lrc.h"
> #include "xe_migrate.h"
> #include "xe_sa.h"
> #include "xe_sriov_printk.h"
> @@ -163,6 +166,86 @@ static int alloc_bb_pool(struct xe_tile *tile, struct xe_tile_vf_ccs *ctx)
> return 0;
> }
>
> +static void ccs_rw_update_ring(struct xe_tile_vf_ccs *ctx)
> +{
> + struct xe_lrc *lrc = xe_migrate_lrc(ctx->migrate);
> + u32 addr = ctx->mem.ccs_bb_pool->gpu_addr;
> + u32 dw[10], i = 0;
> +
> + dw[i++] = MI_ARB_ON_OFF | MI_ARB_DISABLE;
> + dw[i++] = MI_BATCH_BUFFER_START | XE_INSTR_NUM_DW(3);
> + dw[i++] = addr;
> + dw[i++] = 0;
> + dw[i++] = MI_NOOP;
You can drop this NOOP or you need to add another one. The LRC tail must
QW aligned per bspec 46043.
> +
> + xe_lrc_write_ring(lrc, dw, i * sizeof(u32));
> +}
> +
> +static int register_save_restore_context(struct xe_migrate *m,
> + enum xe_sriov_vf_ccs_rw_ctxs ctx_id)
> +{
> + int err = -EINVAL;
> + int ctx_type;
> +
> + switch (ctx_id) {
> + case XE_SRIOV_VF_CCS_READ_CTX:
> + ctx_type = GUC_CONTEXT_COMPRESSION_SAVE;
> + break;
> + case XE_SRIOV_VF_CCS_WRITE_CTX:
> + ctx_type = GUC_CONTEXT_COMPRESSION_RESTORE;
> + break;
> + default:
> + return err;
> + }
> +
> + xe_guc_register_exec_queue(xe_migrate_exec_queue(m), ctx_type);
> + return 0;
> +}
> +
> +/**
> + * xe_sriov_vf_ccs_register_context - Register read/write contexts with guc.
> + * @xe: the &xe_device to register contexts on.
> + *
> + * This function registers read and write contexts with Guc. Re-registration
> + * is needed whenever resuming from pm runtime suspend.
> + *
> + * Return: 0 on success. Negative error code on failure.
> + */
> +int xe_sriov_vf_ccs_register_context(struct xe_device *xe)
> +{
> + enum xe_sriov_vf_ccs_rw_ctxs ctx_id;
> + struct xe_tile_vf_ccs *ctx;
> + struct xe_tile *tile;
> + int tile_id;
> + int err;
> +
> + if (!IS_VF_CCS_READY(xe))
> + return 0;
> +
> + for_each_tile(tile, xe, tile_id) {
Again prefer xe_device_get_root_tile over loop as mentioned in patch 1,
2.
Matt
> + for_each_ccs_rw_ctx(ctx_id) {
> + ctx = &tile->sriov.vf.ccs[ctx_id];
> + err = register_save_restore_context(ctx->migrate, ctx_id);
> + if (err)
> + return err;
> + }
> + }
> +
> + return err;
> +}
> +
> +static void xe_sriov_vf_ccs_fini(void *arg)
> +{
> + struct xe_tile_vf_ccs *ctx = arg;
> + struct xe_lrc *lrc = xe_migrate_lrc(ctx->migrate);
> +
> + /*
> + * Make TAIL = HEAD in the ring so that no issues are seen if Guc
> + * submits this context to HW on VF pause after unbinding device.
> + */
> + xe_lrc_set_ring_tail(lrc, xe_lrc_ring_head(lrc));
> +}
> +
> /**
> * xe_sriov_vf_ccs_init - Setup LRCA for save & restore.
> * @xe: the &xe_device to start recovery on
> @@ -199,6 +282,16 @@ int xe_sriov_vf_ccs_init(struct xe_device *xe)
> err = alloc_bb_pool(tile, ctx);
> if (err)
> goto err_ret;
> +
> + ccs_rw_update_ring(ctx);
> +
> + err = register_save_restore_context(ctx->migrate, ctx_id);
> + if (err)
> + goto err_ret;
> +
> + err = devm_add_action_or_reset(xe->drm.dev,
> + xe_sriov_vf_ccs_fini,
> + ctx);
> }
> }
>
> diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
> index 5d5e4bd25904..1f1baf685fec 100644
> --- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
> +++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
> @@ -12,5 +12,6 @@ struct xe_bo;
> int xe_sriov_vf_ccs_init(struct xe_device *xe);
> int xe_sriov_vf_ccs_attach_bo(struct xe_bo *bo);
> int xe_sriov_vf_ccs_detach_bo(struct xe_bo *bo);
> +int xe_sriov_vf_ccs_register_context(struct xe_device *xe);
>
> #endif
> diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
> index 04d1a43b81e3..8f1a258912ea 100644
> --- a/drivers/gpu/drm/xe/xe_vm.c
> +++ b/drivers/gpu/drm/xe/xe_vm.c
> @@ -953,7 +953,7 @@ struct dma_fence *xe_vma_rebind(struct xe_vm *vm, struct xe_vma *vma, u8 tile_ma
> for_each_tile(tile, vm->xe, id) {
> vops.pt_update_ops[id].wait_vm_bookkeep = true;
> vops.pt_update_ops[tile->id].q =
> - xe_tile_migrate_exec_queue(tile);
> + xe_migrate_exec_queue(tile->migrate);
> }
>
> err = xe_vm_ops_add_rebind(&vops, vma, tile_mask);
> @@ -1043,7 +1043,7 @@ struct dma_fence *xe_vm_range_rebind(struct xe_vm *vm,
> for_each_tile(tile, vm->xe, id) {
> vops.pt_update_ops[id].wait_vm_bookkeep = true;
> vops.pt_update_ops[tile->id].q =
> - xe_tile_migrate_exec_queue(tile);
> + xe_migrate_exec_queue(tile->migrate);
> }
>
> err = xe_vm_ops_add_range_rebind(&vops, vma, range, tile_mask);
> @@ -1126,7 +1126,7 @@ struct dma_fence *xe_vm_range_unbind(struct xe_vm *vm,
> for_each_tile(tile, vm->xe, id) {
> vops.pt_update_ops[id].wait_vm_bookkeep = true;
> vops.pt_update_ops[tile->id].q =
> - xe_tile_migrate_exec_queue(tile);
> + xe_migrate_exec_queue(tile->migrate);
> }
>
> err = xe_vm_ops_add_range_unbind(&vops, range);
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 17+ messages in thread* Re: [PATCH v8 3/3] drm/xe/vf: Register CCS read/write contexts with Guc
2025-06-20 16:30 ` Matthew Brost
@ 2025-06-24 9:39 ` K V P, Satyanarayana
0 siblings, 0 replies; 17+ messages in thread
From: K V P, Satyanarayana @ 2025-06-24 9:39 UTC (permalink / raw)
To: Matthew Brost
Cc: intel-xe, Michal Wajdeczko, Maarten Lankhorst,
Michał Winiarski, Tomasz Lis, Matthew Auld
On 20-06-2025 22:00, Matthew Brost wrote:
> On Thu, Jun 19, 2025 at 01:34:59PM +0530, Satyanarayana K V P wrote:
>> Register read write contexts with newly added flags with GUC and
>> enable the context immediately after registration.
>> Re-register the context with Guc when resuming from runtime suspend as
>> soft reset is applied to Guc during xe_pm_runtime_resume().
>> Make Ring head=tail while unbinding device to avoid issues with VF pause
>> after device is unbinded.
>>
>> Signed-off-by: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
>> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
>> Cc: Matthew Brost <matthew.brost@intel.com>
>> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
>> ---
>> Cc: Michał Winiarski <michal.winiarski@intel.com>
>> Cc: Tomasz Lis <tomasz.lis@intel.com>
>> Cc: Matthew Auld <matthew.auld@intel.com>
>>
>> V7 -> V8:
>> -None.
>>
>> V6 -> V7:
>> - Fixed review comments (Matthew Brost).
>> - Replaced xe_tile_migrate_exec_queue() with xe_migrate_exec_queue() as per
>> review comments (Matthew Brost).
>>
>> V5 -> V6:
>> - None
>>
>> V4 -> V5:
>> - Fixed review comments (Matthew Brost).
>>
>> V3 -> V4:
>> - Fixed issues reported by patchworks.
>>
>> V2 -> V3:
>> - Made xe_migrate structure private as per review comments.
>> - Created new xe_migrate functions to get lrc and exec_queue.
>>
>> V1 -> V2:
>> - Fixed review comments.
>> ---
>> drivers/gpu/drm/xe/xe_guc_fwif.h | 5 ++
>> drivers/gpu/drm/xe/xe_guc_submit.c | 34 +++++++++-
>> drivers/gpu/drm/xe/xe_guc_submit.h | 1 +
>> drivers/gpu/drm/xe/xe_migrate.c | 35 +++++++----
>> drivers/gpu/drm/xe/xe_migrate.h | 4 +-
>> drivers/gpu/drm/xe/xe_pm.c | 4 ++
>> drivers/gpu/drm/xe/xe_sriov_vf_ccs.c | 93 ++++++++++++++++++++++++++++
>> drivers/gpu/drm/xe/xe_sriov_vf_ccs.h | 1 +
>> drivers/gpu/drm/xe/xe_vm.c | 6 +-
>> 9 files changed, 163 insertions(+), 20 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/xe/xe_guc_fwif.h b/drivers/gpu/drm/xe/xe_guc_fwif.h
>> index 6f57578b07cb..ca9f999d38d1 100644
>> --- a/drivers/gpu/drm/xe/xe_guc_fwif.h
>> +++ b/drivers/gpu/drm/xe/xe_guc_fwif.h
>> @@ -45,6 +45,11 @@
>> #define GUC_MAX_ENGINE_CLASSES 16
>> #define GUC_MAX_INSTANCES_PER_CLASS 32
>>
>> +#define GUC_CONTEXT_NORMAL 0
>> +#define GUC_CONTEXT_COMPRESSION_SAVE 1
>> +#define GUC_CONTEXT_COMPRESSION_RESTORE 2
>> +#define GUC_CONTEXT_COUNT (GUC_CONTEXT_COMPRESSION_RESTORE + 1)
>> +
>> /* Helper for context registration H2G */
>> struct guc_ctxt_registration_info {
>> u32 flags;
>> diff --git a/drivers/gpu/drm/xe/xe_guc_submit.c b/drivers/gpu/drm/xe/xe_guc_submit.c
>> index df7a5a4eec74..f17a63ea06e9 100644
>> --- a/drivers/gpu/drm/xe/xe_guc_submit.c
>> +++ b/drivers/gpu/drm/xe/xe_guc_submit.c
>> @@ -542,7 +542,7 @@ static void __register_exec_queue(struct xe_guc *guc,
>> xe_guc_ct_send(&guc->ct, action, ARRAY_SIZE(action), 0, 0);
>> }
>>
>> -static void register_exec_queue(struct xe_exec_queue *q)
>> +static void register_exec_queue(struct xe_exec_queue *q, int ctx_type)
>> {
>> struct xe_guc *guc = exec_queue_to_guc(q);
>> struct xe_device *xe = guc_to_xe(guc);
>> @@ -550,6 +550,7 @@ static void register_exec_queue(struct xe_exec_queue *q)
>> struct guc_ctxt_registration_info info;
>>
>> xe_gt_assert(guc_to_gt(guc), !exec_queue_registered(q));
>> + xe_gt_assert(guc_to_gt(guc), ctx_type < GUC_CONTEXT_COUNT);
>>
>> memset(&info, 0, sizeof(info));
>> info.context_idx = q->guc->id;
>> @@ -559,6 +560,9 @@ static void register_exec_queue(struct xe_exec_queue *q)
>> info.hwlrca_hi = upper_32_bits(xe_lrc_descriptor(lrc));
>> info.flags = CONTEXT_REGISTRATION_FLAG_KMD;
>>
>> + if (ctx_type != GUC_CONTEXT_NORMAL)
>> + info.flags |= BIT(ctx_type);
>> +
>> if (xe_exec_queue_is_parallel(q)) {
>> u64 ggtt_addr = xe_lrc_parallel_ggtt_addr(lrc);
>> struct iosys_map map = xe_lrc_parallel_map(lrc);
>> @@ -761,7 +765,7 @@ guc_exec_queue_run_job(struct drm_sched_job *drm_job)
>>
>> if (!exec_queue_killed_or_banned_or_wedged(q) && !xe_sched_job_is_error(job)) {
>> if (!exec_queue_registered(q))
>> - register_exec_queue(q);
>> + register_exec_queue(q, GUC_CONTEXT_NORMAL);
>> if (!lr) /* LR jobs are emitted in the exec IOCTL */
>> q->ring_ops->emit_job(job);
>> submit_exec_queue(q);
>> @@ -2366,6 +2370,32 @@ static void guc_exec_queue_print(struct xe_exec_queue *q, struct drm_printer *p)
>> xe_guc_exec_queue_snapshot_free(snapshot);
>> }
>>
>> +/**
>> + * xe_guc_register_exec_queue - Register exec queue for a given context type.
>> + * @q - Execution queue
>> + * @ctx_type - Type of the context
>> + *
>> + * This function registers the execution queue with the guc. Special context
>> + * types like GUC_CONTEXT_COMPRESSION_SAVE and GUC_CONTEXT_COMPRESSION_RESTORE
>> + * are only applicable for IGPU and in the VF.
>> + * Submits the execution queue to GUC after registering it.
>> + *
>> + * Returns - None.
>> + */
>> +void xe_guc_register_exec_queue(struct xe_exec_queue *q, int ctx_type)
>> +{
>> + struct xe_guc *guc = exec_queue_to_guc(q);
>> + struct xe_device *xe = guc_to_xe(guc);
>> +
>> + xe_assert(xe, IS_SRIOV_VF(xe));
>> + xe_assert(xe, !IS_DGFX(xe));
>> + xe_assert(xe, (ctx_type > GUC_CONTEXT_NORMAL &&
>> + ctx_type < GUC_CONTEXT_COUNT));
>> +
>> + register_exec_queue(q, ctx_type);
>> + enable_scheduling(q);
>> +}
>> +
>> /**
>> * xe_guc_submit_print - GuC Submit Print.
>> * @guc: GuC.
>> diff --git a/drivers/gpu/drm/xe/xe_guc_submit.h b/drivers/gpu/drm/xe/xe_guc_submit.h
>> index 9b71a986c6ca..8f64e799283b 100644
>> --- a/drivers/gpu/drm/xe/xe_guc_submit.h
>> +++ b/drivers/gpu/drm/xe/xe_guc_submit.h
>> @@ -39,5 +39,6 @@ xe_guc_exec_queue_snapshot_print(struct xe_guc_submit_exec_queue_snapshot *snaps
>> void
>> xe_guc_exec_queue_snapshot_free(struct xe_guc_submit_exec_queue_snapshot *snapshot);
>> void xe_guc_submit_print(struct xe_guc *guc, struct drm_printer *p);
>> +void xe_guc_register_exec_queue(struct xe_exec_queue *q, int ctx_type);
>>
>> #endif
>> diff --git a/drivers/gpu/drm/xe/xe_migrate.c b/drivers/gpu/drm/xe/xe_migrate.c
>> index c730b34071ad..a90c5ecbd8c0 100644
>> --- a/drivers/gpu/drm/xe/xe_migrate.c
>> +++ b/drivers/gpu/drm/xe/xe_migrate.c
>> @@ -84,19 +84,6 @@ struct xe_migrate {
>> */
>> #define MAX_PTE_PER_SDI 0x1FE
>>
>> -/**
>> - * xe_tile_migrate_exec_queue() - Get this tile's migrate exec queue.
>> - * @tile: The tile.
>> - *
>> - * Returns the default migrate exec queue of this tile.
>> - *
>> - * Return: The default migrate exec queue
>> - */
>> -struct xe_exec_queue *xe_tile_migrate_exec_queue(struct xe_tile *tile)
>> -{
>> - return tile->migrate->q;
>> -}
>> -
>> static void xe_migrate_fini(void *arg)
>> {
>> struct xe_migrate *m = arg;
>> @@ -1070,6 +1057,28 @@ int xe_migrate_ccs_rw_copy(struct xe_migrate *m,
>> return err;
>> }
>>
>> +/**
>> + * xe_get_migrate_lrc() - Get the LRC from migrate context.
>> + * @migrate: Migrate context.
>> + *
>> + * Return: Pointer to LRC on success, error on failure
>> + */
>> +struct xe_lrc *xe_migrate_lrc(struct xe_migrate *migrate)
>> +{
>> + return migrate->q->lrc[0];
>> +}
>> +
>> +/**
>> + * xe_get_migrate_exec_queue() - Get the execution queue from migrate context.
>> + * @migrate: Migrate context.
>> + *
>> + * Return: Pointer to execution queue on success, error on failure
>> + */
>> +struct xe_exec_queue *xe_migrate_exec_queue(struct xe_migrate *migrate)
>> +{
>> + return migrate->q;
>> +}
>> +
>> static void emit_clear_link_copy(struct xe_gt *gt, struct xe_bb *bb, u64 src_ofs,
>> u32 size, u32 pitch)
>> {
>> diff --git a/drivers/gpu/drm/xe/xe_migrate.h b/drivers/gpu/drm/xe/xe_migrate.h
>> index 96b0449e7edb..3754d9e6150f 100644
>> --- a/drivers/gpu/drm/xe/xe_migrate.h
>> +++ b/drivers/gpu/drm/xe/xe_migrate.h
>> @@ -118,6 +118,8 @@ int xe_migrate_ccs_rw_copy(struct xe_migrate *m,
>> struct xe_bo *src_bo,
>> enum xe_sriov_vf_ccs_rw_ctxs read_write);
>>
>> +struct xe_lrc *xe_migrate_lrc(struct xe_migrate *migrate);
>> +struct xe_exec_queue *xe_migrate_exec_queue(struct xe_migrate *migrate);
>> int xe_migrate_access_memory(struct xe_migrate *m, struct xe_bo *bo,
>> unsigned long offset, void *buf, int len,
>> int write);
>> @@ -138,6 +140,4 @@ xe_migrate_update_pgtables(struct xe_migrate *m,
>> struct xe_migrate_pt_update *pt_update);
>>
>> void xe_migrate_wait(struct xe_migrate *m);
>> -
>> -struct xe_exec_queue *xe_tile_migrate_exec_queue(struct xe_tile *tile);
>> #endif
>> diff --git a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c
>> index 26e95460af87..6c32412126d7 100644
>> --- a/drivers/gpu/drm/xe/xe_pm.c
>> +++ b/drivers/gpu/drm/xe/xe_pm.c
>> @@ -22,6 +22,7 @@
>> #include "xe_irq.h"
>> #include "xe_pcode.h"
>> #include "xe_pxp.h"
>> +#include "xe_sriov_vf_ccs.h"
>> #include "xe_trace.h"
>> #include "xe_wa.h"
>>
>> @@ -546,6 +547,9 @@ int xe_pm_runtime_resume(struct xe_device *xe)
>>
>> xe_pxp_pm_resume(xe->pxp);
>>
>> + if (IS_SRIOV_VF(xe))
>> + xe_sriov_vf_ccs_register_context(xe);
>> +
>> out:
>> xe_rpm_lockmap_release(xe);
>> xe_pm_write_callback_task(xe, NULL);
>> diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
>> index 242a3da1ef27..e4ca34af05fa 100644
>> --- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
>> +++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
>> @@ -8,6 +8,9 @@
>> #include "xe_bb.h"
>> #include "xe_bo.h"
>> #include "xe_device.h"
>> +#include "xe_exec_queue_types.h"
>> +#include "xe_guc_submit.h"
>> +#include "xe_lrc.h"
>> #include "xe_migrate.h"
>> #include "xe_sa.h"
>> #include "xe_sriov_printk.h"
>> @@ -163,6 +166,86 @@ static int alloc_bb_pool(struct xe_tile *tile, struct xe_tile_vf_ccs *ctx)
>> return 0;
>> }
>>
>> +static void ccs_rw_update_ring(struct xe_tile_vf_ccs *ctx)
>> +{
>> + struct xe_lrc *lrc = xe_migrate_lrc(ctx->migrate);
>> + u32 addr = ctx->mem.ccs_bb_pool->gpu_addr;
>> + u32 dw[10], i = 0;
>> +
>> + dw[i++] = MI_ARB_ON_OFF | MI_ARB_DISABLE;
>> + dw[i++] = MI_BATCH_BUFFER_START | XE_INSTR_NUM_DW(3);
>> + dw[i++] = addr;
>> + dw[i++] = 0;
>> + dw[i++] = MI_NOOP;
> You can drop this NOOP or you need to add another one. The LRC tail must
> QW aligned per bspec 46043.
Added another NOOP.
>> +
>> + xe_lrc_write_ring(lrc, dw, i * sizeof(u32));
>> +}
>> +
>> +static int register_save_restore_context(struct xe_migrate *m,
>> + enum xe_sriov_vf_ccs_rw_ctxs ctx_id)
>> +{
>> + int err = -EINVAL;
>> + int ctx_type;
>> +
>> + switch (ctx_id) {
>> + case XE_SRIOV_VF_CCS_READ_CTX:
>> + ctx_type = GUC_CONTEXT_COMPRESSION_SAVE;
>> + break;
>> + case XE_SRIOV_VF_CCS_WRITE_CTX:
>> + ctx_type = GUC_CONTEXT_COMPRESSION_RESTORE;
>> + break;
>> + default:
>> + return err;
>> + }
>> +
>> + xe_guc_register_exec_queue(xe_migrate_exec_queue(m), ctx_type);
>> + return 0;
>> +}
>> +
>> +/**
>> + * xe_sriov_vf_ccs_register_context - Register read/write contexts with guc.
>> + * @xe: the &xe_device to register contexts on.
>> + *
>> + * This function registers read and write contexts with Guc. Re-registration
>> + * is needed whenever resuming from pm runtime suspend.
>> + *
>> + * Return: 0 on success. Negative error code on failure.
>> + */
>> +int xe_sriov_vf_ccs_register_context(struct xe_device *xe)
>> +{
>> + enum xe_sriov_vf_ccs_rw_ctxs ctx_id;
>> + struct xe_tile_vf_ccs *ctx;
>> + struct xe_tile *tile;
>> + int tile_id;
>> + int err;
>> +
>> + if (!IS_VF_CCS_READY(xe))
>> + return 0;
>> +
>> + for_each_tile(tile, xe, tile_id) {
> Again prefer xe_device_get_root_tile over loop as mentioned in patch 1,
> 2.
>
> Matt
Fixed in new version.
-Satya.
>> + for_each_ccs_rw_ctx(ctx_id) {
>> + ctx = &tile->sriov.vf.ccs[ctx_id];
>> + err = register_save_restore_context(ctx->migrate, ctx_id);
>> + if (err)
>> + return err;
>> + }
>> + }
>> +
>> + return err;
>> +}
>> +
>> +static void xe_sriov_vf_ccs_fini(void *arg)
>> +{
>> + struct xe_tile_vf_ccs *ctx = arg;
>> + struct xe_lrc *lrc = xe_migrate_lrc(ctx->migrate);
>> +
>> + /*
>> + * Make TAIL = HEAD in the ring so that no issues are seen if Guc
>> + * submits this context to HW on VF pause after unbinding device.
>> + */
>> + xe_lrc_set_ring_tail(lrc, xe_lrc_ring_head(lrc));
>> +}
>> +
>> /**
>> * xe_sriov_vf_ccs_init - Setup LRCA for save & restore.
>> * @xe: the &xe_device to start recovery on
>> @@ -199,6 +282,16 @@ int xe_sriov_vf_ccs_init(struct xe_device *xe)
>> err = alloc_bb_pool(tile, ctx);
>> if (err)
>> goto err_ret;
>> +
>> + ccs_rw_update_ring(ctx);
>> +
>> + err = register_save_restore_context(ctx->migrate, ctx_id);
>> + if (err)
>> + goto err_ret;
>> +
>> + err = devm_add_action_or_reset(xe->drm.dev,
>> + xe_sriov_vf_ccs_fini,
>> + ctx);
>> }
>> }
>>
>> diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
>> index 5d5e4bd25904..1f1baf685fec 100644
>> --- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
>> +++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.h
>> @@ -12,5 +12,6 @@ struct xe_bo;
>> int xe_sriov_vf_ccs_init(struct xe_device *xe);
>> int xe_sriov_vf_ccs_attach_bo(struct xe_bo *bo);
>> int xe_sriov_vf_ccs_detach_bo(struct xe_bo *bo);
>> +int xe_sriov_vf_ccs_register_context(struct xe_device *xe);
>>
>> #endif
>> diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
>> index 04d1a43b81e3..8f1a258912ea 100644
>> --- a/drivers/gpu/drm/xe/xe_vm.c
>> +++ b/drivers/gpu/drm/xe/xe_vm.c
>> @@ -953,7 +953,7 @@ struct dma_fence *xe_vma_rebind(struct xe_vm *vm, struct xe_vma *vma, u8 tile_ma
>> for_each_tile(tile, vm->xe, id) {
>> vops.pt_update_ops[id].wait_vm_bookkeep = true;
>> vops.pt_update_ops[tile->id].q =
>> - xe_tile_migrate_exec_queue(tile);
>> + xe_migrate_exec_queue(tile->migrate);
>> }
>>
>> err = xe_vm_ops_add_rebind(&vops, vma, tile_mask);
>> @@ -1043,7 +1043,7 @@ struct dma_fence *xe_vm_range_rebind(struct xe_vm *vm,
>> for_each_tile(tile, vm->xe, id) {
>> vops.pt_update_ops[id].wait_vm_bookkeep = true;
>> vops.pt_update_ops[tile->id].q =
>> - xe_tile_migrate_exec_queue(tile);
>> + xe_migrate_exec_queue(tile->migrate);
>> }
>>
>> err = xe_vm_ops_add_range_rebind(&vops, vma, range, tile_mask);
>> @@ -1126,7 +1126,7 @@ struct dma_fence *xe_vm_range_unbind(struct xe_vm *vm,
>> for_each_tile(tile, vm->xe, id) {
>> vops.pt_update_ops[id].wait_vm_bookkeep = true;
>> vops.pt_update_ops[tile->id].q =
>> - xe_tile_migrate_exec_queue(tile);
>> + xe_migrate_exec_queue(tile->migrate);
>> }
>>
>> err = xe_vm_ops_add_range_unbind(&vops, range);
>> --
>> 2.43.0
>>
^ permalink raw reply [flat|nested] 17+ messages in thread
* ✓ Xe.CI.BAT: success for CCS save restore for IGPU (rev8)
2025-06-19 8:04 [PATCH v8 0/3] CCS save restore for IGPU Satyanarayana K V P
` (4 preceding siblings ...)
2025-06-19 8:04 ` [PATCH v8 3/3] drm/xe/vf: Register CCS read/write contexts with Guc Satyanarayana K V P
@ 2025-06-19 8:36 ` Patchwork
2025-06-19 19:33 ` ✗ Xe.CI.Full: failure " Patchwork
6 siblings, 0 replies; 17+ messages in thread
From: Patchwork @ 2025-06-19 8:36 UTC (permalink / raw)
To: K V P, Satyanarayana; +Cc: intel-xe
[-- Attachment #1: Type: text/plain, Size: 848 bytes --]
== Series Details ==
Series: CCS save restore for IGPU (rev8)
URL : https://patchwork.freedesktop.org/series/149108/
State : success
== Summary ==
CI Bug Log - changes from xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58_BAT -> xe-pw-149108v8_BAT
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (9 -> 8)
------------------------------
Missing (1): bat-adlp-vm
Changes
-------
No changes found
Build changes
-------------
* Linux: xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58 -> xe-pw-149108v8
IGT_8418: 8418
xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58: 0cd8ffca03164a8a9686dbab2a21fae671161e58
xe-pw-149108v8: 149108v8
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/index.html
[-- Attachment #2: Type: text/html, Size: 1396 bytes --]
^ permalink raw reply [flat|nested] 17+ messages in thread* ✗ Xe.CI.Full: failure for CCS save restore for IGPU (rev8)
2025-06-19 8:04 [PATCH v8 0/3] CCS save restore for IGPU Satyanarayana K V P
` (5 preceding siblings ...)
2025-06-19 8:36 ` ✓ Xe.CI.BAT: success for CCS save restore for IGPU (rev8) Patchwork
@ 2025-06-19 19:33 ` Patchwork
6 siblings, 0 replies; 17+ messages in thread
From: Patchwork @ 2025-06-19 19:33 UTC (permalink / raw)
To: K V P, Satyanarayana; +Cc: intel-xe
[-- Attachment #1: Type: text/plain, Size: 61448 bytes --]
== Series Details ==
Series: CCS save restore for IGPU (rev8)
URL : https://patchwork.freedesktop.org/series/149108/
State : failure
== Summary ==
CI Bug Log - changes from xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58_FULL -> xe-pw-149108v8_FULL
====================================================
Summary
-------
**FAILURE**
Serious unknown changes coming with xe-pw-149108v8_FULL absolutely need to be
verified manually.
If you think the reported changes have nothing to do with the changes
introduced in xe-pw-149108v8_FULL, please notify your bug team (I915-ci-infra@lists.freedesktop.org) to allow them
to document this new failure mode, which will reduce false positives in CI.
Participating hosts (4 -> 4)
------------------------------
No changes in participating hosts
Possible new issues
-------------------
Here are the unknown changes that may have been introduced in xe-pw-149108v8_FULL:
### IGT changes ###
#### Possible regressions ####
* igt@xe_eu_stall@invalid-event-report-count:
- shard-dg2-set2: NOTRUN -> [SKIP][1]
[1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-434/igt@xe_eu_stall@invalid-event-report-count.html
Known issues
------------
Here are the changes found in xe-pw-149108v8_FULL that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@kms_big_fb@4-tiled-64bpp-rotate-90:
- shard-adlp: NOTRUN -> [SKIP][2] ([Intel XE#1124])
[2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-1/igt@kms_big_fb@4-tiled-64bpp-rotate-90.html
* igt@kms_big_fb@x-tiled-8bpp-rotate-90:
- shard-dg2-set2: NOTRUN -> [SKIP][3] ([Intel XE#316]) +2 other tests skip
[3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@kms_big_fb@x-tiled-8bpp-rotate-90.html
* igt@kms_big_fb@y-tiled-8bpp-rotate-270:
- shard-adlp: NOTRUN -> [SKIP][4] ([Intel XE#316]) +1 other test skip
[4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-1/igt@kms_big_fb@y-tiled-8bpp-rotate-270.html
* igt@kms_big_fb@yf-tiled-32bpp-rotate-180:
- shard-dg2-set2: NOTRUN -> [SKIP][5] ([Intel XE#1124]) +9 other tests skip
[5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-466/igt@kms_big_fb@yf-tiled-32bpp-rotate-180.html
* igt@kms_big_fb@yf-tiled-addfb:
- shard-dg2-set2: NOTRUN -> [SKIP][6] ([Intel XE#619])
[6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@kms_big_fb@yf-tiled-addfb.html
* igt@kms_big_fb@yf-tiled-addfb-size-overflow:
- shard-dg2-set2: NOTRUN -> [SKIP][7] ([Intel XE#610])
[7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-466/igt@kms_big_fb@yf-tiled-addfb-size-overflow.html
* igt@kms_bw@connected-linear-tiling-2-displays-2160x1440p:
- shard-bmg: [PASS][8] -> [SKIP][9] ([Intel XE#2314] / [Intel XE#2894]) +1 other test skip
[8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-bmg-1/igt@kms_bw@connected-linear-tiling-2-displays-2160x1440p.html
[9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-6/igt@kms_bw@connected-linear-tiling-2-displays-2160x1440p.html
* igt@kms_bw@connected-linear-tiling-4-displays-1920x1080p:
- shard-dg2-set2: NOTRUN -> [SKIP][10] ([Intel XE#2191]) +1 other test skip
[10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@kms_bw@connected-linear-tiling-4-displays-1920x1080p.html
* igt@kms_bw@linear-tiling-3-displays-1920x1080p:
- shard-adlp: NOTRUN -> [SKIP][11] ([Intel XE#367]) +1 other test skip
[11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-1/igt@kms_bw@linear-tiling-3-displays-1920x1080p.html
* igt@kms_bw@linear-tiling-3-displays-3840x2160p:
- shard-dg2-set2: NOTRUN -> [SKIP][12] ([Intel XE#367]) +2 other tests skip
[12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-466/igt@kms_bw@linear-tiling-3-displays-3840x2160p.html
* igt@kms_ccs@bad-rotation-90-y-tiled-gen12-rc-ccs-cc@pipe-a-hdmi-a-1:
- shard-adlp: NOTRUN -> [SKIP][13] ([Intel XE#787]) +17 other tests skip
[13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-6/igt@kms_ccs@bad-rotation-90-y-tiled-gen12-rc-ccs-cc@pipe-a-hdmi-a-1.html
* igt@kms_ccs@crc-primary-basic-4-tiled-mtl-rc-ccs@pipe-b-hdmi-a-6:
- shard-dg2-set2: NOTRUN -> [SKIP][14] ([Intel XE#787]) +111 other tests skip
[14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@kms_ccs@crc-primary-basic-4-tiled-mtl-rc-ccs@pipe-b-hdmi-a-6.html
* igt@kms_ccs@crc-sprite-planes-basic-4-tiled-bmg-ccs:
- shard-dg2-set2: NOTRUN -> [SKIP][15] ([Intel XE#2907]) +1 other test skip
[15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-466/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-bmg-ccs.html
* igt@kms_ccs@crc-sprite-planes-basic-4-tiled-lnl-ccs@pipe-b-dp-2:
- shard-bmg: NOTRUN -> [SKIP][16] ([Intel XE#2652] / [Intel XE#787]) +7 other tests skip
[16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-7/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-lnl-ccs@pipe-b-dp-2.html
* igt@kms_ccs@missing-ccs-buffer-4-tiled-mtl-mc-ccs@pipe-d-dp-4:
- shard-dg2-set2: NOTRUN -> [SKIP][17] ([Intel XE#455] / [Intel XE#787]) +31 other tests skip
[17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@kms_ccs@missing-ccs-buffer-4-tiled-mtl-mc-ccs@pipe-d-dp-4.html
* igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-a-hdmi-a-6:
- shard-dg2-set2: [PASS][18] -> [INCOMPLETE][19] ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#3124])
[18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-dg2-466/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-a-hdmi-a-6.html
[19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-a-hdmi-a-6.html
* igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc:
- shard-adlp: NOTRUN -> [SKIP][20] ([Intel XE#455] / [Intel XE#787]) +9 other tests skip
[20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-1/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc.html
* igt@kms_cdclk@plane-scaling@pipe-b-dp-4:
- shard-dg2-set2: NOTRUN -> [SKIP][21] ([Intel XE#4416]) +3 other tests skip
[21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@kms_cdclk@plane-scaling@pipe-b-dp-4.html
* igt@kms_chamelium_color@ctm-red-to-blue:
- shard-dg2-set2: NOTRUN -> [SKIP][22] ([Intel XE#306])
[22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-466/igt@kms_chamelium_color@ctm-red-to-blue.html
* igt@kms_chamelium_color@degamma:
- shard-adlp: NOTRUN -> [SKIP][23] ([Intel XE#306])
[23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-6/igt@kms_chamelium_color@degamma.html
* igt@kms_chamelium_edid@hdmi-edid-stress-resolution-4k:
- shard-dg2-set2: NOTRUN -> [SKIP][24] ([Intel XE#373]) +9 other tests skip
[24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@kms_chamelium_edid@hdmi-edid-stress-resolution-4k.html
* igt@kms_content_protection@dp-mst-type-1:
- shard-dg2-set2: NOTRUN -> [SKIP][25] ([Intel XE#307])
[25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@kms_content_protection@dp-mst-type-1.html
* igt@kms_content_protection@lic-type-0@pipe-a-dp-2:
- shard-bmg: NOTRUN -> [FAIL][26] ([Intel XE#1178])
[26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-1/igt@kms_content_protection@lic-type-0@pipe-a-dp-2.html
* igt@kms_cursor_crc@cursor-offscreen-512x512:
- shard-dg2-set2: NOTRUN -> [SKIP][27] ([Intel XE#308]) +1 other test skip
[27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@kms_cursor_crc@cursor-offscreen-512x512.html
* igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size:
- shard-bmg: [PASS][28] -> [SKIP][29] ([Intel XE#2291]) +3 other tests skip
[28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-bmg-4/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size.html
[29]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-6/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size.html
* igt@kms_cursor_legacy@flip-vs-cursor-legacy:
- shard-bmg: [PASS][30] -> [FAIL][31] ([Intel XE#4633])
[30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-bmg-7/igt@kms_cursor_legacy@flip-vs-cursor-legacy.html
[31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-8/igt@kms_cursor_legacy@flip-vs-cursor-legacy.html
* igt@kms_dither@fb-8bpc-vs-panel-6bpc:
- shard-bmg: [PASS][32] -> [SKIP][33] ([Intel XE#1340])
[32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-bmg-1/igt@kms_dither@fb-8bpc-vs-panel-6bpc.html
[33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-6/igt@kms_dither@fb-8bpc-vs-panel-6bpc.html
* igt@kms_dp_link_training@non-uhbr-mst:
- shard-adlp: NOTRUN -> [SKIP][34] ([Intel XE#4354])
[34]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-1/igt@kms_dp_link_training@non-uhbr-mst.html
* igt@kms_dp_linktrain_fallback@dsc-fallback:
- shard-dg2-set2: NOTRUN -> [SKIP][35] ([Intel XE#4331])
[35]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-435/igt@kms_dp_linktrain_fallback@dsc-fallback.html
* igt@kms_dsc@dsc-with-bpc-formats:
- shard-dg2-set2: NOTRUN -> [SKIP][36] ([Intel XE#455]) +17 other tests skip
[36]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-434/igt@kms_dsc@dsc-with-bpc-formats.html
* igt@kms_feature_discovery@psr2:
- shard-dg2-set2: NOTRUN -> [SKIP][37] ([Intel XE#1135])
[37]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-434/igt@kms_feature_discovery@psr2.html
* igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset-interruptible:
- shard-bmg: [PASS][38] -> [SKIP][39] ([Intel XE#2316]) +6 other tests skip
[38]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-bmg-1/igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset-interruptible.html
[39]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-6/igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset-interruptible.html
* igt@kms_flip@2x-flip-vs-dpms-on-nop-interruptible:
- shard-adlp: NOTRUN -> [SKIP][40] ([Intel XE#310])
[40]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-6/igt@kms_flip@2x-flip-vs-dpms-on-nop-interruptible.html
* igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a6-dp4:
- shard-dg2-set2: [PASS][41] -> [FAIL][42] ([Intel XE#301] / [Intel XE#3321]) +1 other test fail
[41]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-dg2-435/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a6-dp4.html
[42]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-434/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a6-dp4.html
* igt@kms_flip@flip-vs-absolute-wf_vblank:
- shard-lnl: [PASS][43] -> [FAIL][44] ([Intel XE#886]) +6 other tests fail
[43]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-lnl-4/igt@kms_flip@flip-vs-absolute-wf_vblank.html
[44]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-lnl-2/igt@kms_flip@flip-vs-absolute-wf_vblank.html
* igt@kms_flip@flip-vs-expired-vblank@a-hdmi-a6:
- shard-dg2-set2: [PASS][45] -> [FAIL][46] ([Intel XE#301]) +1 other test fail
[45]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-dg2-434/igt@kms_flip@flip-vs-expired-vblank@a-hdmi-a6.html
[46]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-435/igt@kms_flip@flip-vs-expired-vblank@a-hdmi-a6.html
* igt@kms_flip@wf_vblank-ts-check@a-hdmi-a1:
- shard-adlp: [PASS][47] -> [FAIL][48] ([Intel XE#886]) +2 other tests fail
[47]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-1/igt@kms_flip@wf_vblank-ts-check@a-hdmi-a1.html
[48]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-2/igt@kms_flip@wf_vblank-ts-check@a-hdmi-a1.html
* igt@kms_flip@wf_vblank-ts-check@b-dp2:
- shard-bmg: [PASS][49] -> [FAIL][50] ([Intel XE#2882]) +2 other tests fail
[49]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-bmg-2/igt@kms_flip@wf_vblank-ts-check@b-dp2.html
[50]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-4/igt@kms_flip@wf_vblank-ts-check@b-dp2.html
* igt@kms_flip_tiling@flip-change-tiling@pipe-b-hdmi-a-1-y-to-y:
- shard-adlp: [PASS][51] -> [DMESG-FAIL][52] ([Intel XE#4543]) +1 other test dmesg-fail
[51]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-3/igt@kms_flip_tiling@flip-change-tiling@pipe-b-hdmi-a-1-y-to-y.html
[52]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-3/igt@kms_flip_tiling@flip-change-tiling@pipe-b-hdmi-a-1-y-to-y.html
* igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-cur-indfb-onoff:
- shard-dg2-set2: NOTRUN -> [SKIP][53] ([Intel XE#651]) +30 other tests skip
[53]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-466/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-cur-indfb-onoff.html
* igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-render:
- shard-adlp: NOTRUN -> [SKIP][54] ([Intel XE#656]) +6 other tests skip
[54]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-1/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-render.html
* igt@kms_frontbuffer_tracking@fbcdrrs-rgb101010-draw-render:
- shard-adlp: NOTRUN -> [SKIP][55] ([Intel XE#651]) +2 other tests skip
[55]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-1/igt@kms_frontbuffer_tracking@fbcdrrs-rgb101010-draw-render.html
* igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-shrfb-msflip-blt:
- shard-adlp: NOTRUN -> [SKIP][56] ([Intel XE#653]) +2 other tests skip
[56]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-1/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-shrfb-msflip-blt.html
* igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-indfb-draw-blt:
- shard-dg2-set2: NOTRUN -> [SKIP][57] ([Intel XE#653]) +29 other tests skip
[57]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-indfb-draw-blt.html
* igt@kms_hdr@static-swap:
- shard-bmg: [PASS][58] -> [SKIP][59] ([Intel XE#1503]) +3 other tests skip
[58]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-bmg-1/igt@kms_hdr@static-swap.html
[59]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-6/igt@kms_hdr@static-swap.html
* igt@kms_joiner@basic-big-joiner:
- shard-dg2-set2: NOTRUN -> [SKIP][60] ([Intel XE#346])
[60]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-434/igt@kms_joiner@basic-big-joiner.html
* igt@kms_joiner@switch-modeset-ultra-joiner-big-joiner:
- shard-dg2-set2: NOTRUN -> [SKIP][61] ([Intel XE#2925])
[61]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@kms_joiner@switch-modeset-ultra-joiner-big-joiner.html
* igt@kms_plane_multiple@2x-tiling-none:
- shard-bmg: [PASS][62] -> [SKIP][63] ([Intel XE#4596])
[62]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-bmg-1/igt@kms_plane_multiple@2x-tiling-none.html
[63]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-6/igt@kms_plane_multiple@2x-tiling-none.html
* igt@kms_pm_backlight@bad-brightness:
- shard-dg2-set2: NOTRUN -> [SKIP][64] ([Intel XE#870])
[64]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-434/igt@kms_pm_backlight@bad-brightness.html
* igt@kms_pm_dc@dc5-psr:
- shard-dg2-set2: NOTRUN -> [SKIP][65] ([Intel XE#1129])
[65]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-434/igt@kms_pm_dc@dc5-psr.html
* igt@kms_pm_dc@dc6-psr:
- shard-lnl: [PASS][66] -> [FAIL][67] ([Intel XE#718])
[66]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-lnl-7/igt@kms_pm_dc@dc6-psr.html
[67]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-lnl-1/igt@kms_pm_dc@dc6-psr.html
* igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-fully-sf:
- shard-dg2-set2: NOTRUN -> [SKIP][68] ([Intel XE#1489]) +7 other tests skip
[68]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-fully-sf.html
* igt@kms_psr2_sf@pr-primary-plane-update-sf-dmg-area-big-fb:
- shard-adlp: NOTRUN -> [SKIP][69] ([Intel XE#1489]) +1 other test skip
[69]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-6/igt@kms_psr2_sf@pr-primary-plane-update-sf-dmg-area-big-fb.html
* igt@kms_psr2_su@frontbuffer-xrgb8888:
- shard-dg2-set2: NOTRUN -> [SKIP][70] ([Intel XE#1122])
[70]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-466/igt@kms_psr2_su@frontbuffer-xrgb8888.html
* igt@kms_psr@fbc-psr2-sprite-plane-move:
- shard-dg2-set2: NOTRUN -> [SKIP][71] ([Intel XE#2850] / [Intel XE#929]) +15 other tests skip
[71]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-466/igt@kms_psr@fbc-psr2-sprite-plane-move.html
* igt@kms_psr@fbc-psr2-sprite-plane-onoff:
- shard-adlp: NOTRUN -> [SKIP][72] ([Intel XE#2850] / [Intel XE#929]) +1 other test skip
[72]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-1/igt@kms_psr@fbc-psr2-sprite-plane-onoff.html
* igt@kms_rotation_crc@primary-rotation-270:
- shard-adlp: NOTRUN -> [SKIP][73] ([Intel XE#3414])
[73]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-1/igt@kms_rotation_crc@primary-rotation-270.html
* igt@kms_setmode@invalid-clone-single-crtc-stealing:
- shard-adlp: NOTRUN -> [SKIP][74] ([Intel XE#455]) +3 other tests skip
[74]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-1/igt@kms_setmode@invalid-clone-single-crtc-stealing.html
* igt@kms_tiled_display@basic-test-pattern:
- shard-dg2-set2: NOTRUN -> [FAIL][75] ([Intel XE#1729])
[75]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-434/igt@kms_tiled_display@basic-test-pattern.html
* igt@kms_vblank@wait-busy-hang@pipe-a-hdmi-a-1:
- shard-adlp: [PASS][76] -> [DMESG-WARN][77] ([Intel XE#2953] / [Intel XE#4173]) +1 other test dmesg-warn
[76]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-3/igt@kms_vblank@wait-busy-hang@pipe-a-hdmi-a-1.html
[77]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-3/igt@kms_vblank@wait-busy-hang@pipe-a-hdmi-a-1.html
* igt@sriov_basic@enable-vfs-bind-unbind-each-numvfs-all:
- shard-dg2-set2: NOTRUN -> [SKIP][78] ([Intel XE#1091] / [Intel XE#2849])
[78]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-434/igt@sriov_basic@enable-vfs-bind-unbind-each-numvfs-all.html
* igt@xe_copy_basic@mem-copy-linear-0x369:
- shard-dg2-set2: NOTRUN -> [SKIP][79] ([Intel XE#1123])
[79]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@xe_copy_basic@mem-copy-linear-0x369.html
* igt@xe_copy_basic@mem-set-linear-0xfffe:
- shard-dg2-set2: NOTRUN -> [SKIP][80] ([Intel XE#1126])
[80]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@xe_copy_basic@mem-set-linear-0xfffe.html
* igt@xe_eudebug@basic-vm-bind-extended:
- shard-adlp: NOTRUN -> [SKIP][81] ([Intel XE#4837])
[81]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-1/igt@xe_eudebug@basic-vm-bind-extended.html
* igt@xe_eudebug_online@debugger-reopen:
- shard-dg2-set2: NOTRUN -> [SKIP][82] ([Intel XE#4837]) +9 other tests skip
[82]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@xe_eudebug_online@debugger-reopen.html
* igt@xe_exec_basic@multigpu-once-userptr-invalidate:
- shard-adlp: NOTRUN -> [SKIP][83] ([Intel XE#1392])
[83]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-1/igt@xe_exec_basic@multigpu-once-userptr-invalidate.html
* igt@xe_exec_fault_mode@many-execqueues-bindexecqueue:
- shard-adlp: NOTRUN -> [SKIP][84] ([Intel XE#288]) +3 other tests skip
[84]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-1/igt@xe_exec_fault_mode@many-execqueues-bindexecqueue.html
* igt@xe_exec_fault_mode@many-execqueues-bindexecqueue-rebind-imm:
- shard-dg2-set2: NOTRUN -> [SKIP][85] ([Intel XE#288]) +23 other tests skip
[85]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-435/igt@xe_exec_fault_mode@many-execqueues-bindexecqueue-rebind-imm.html
* igt@xe_exec_mix_modes@exec-spinner-interrupted-lr:
- shard-dg2-set2: NOTRUN -> [SKIP][86] ([Intel XE#2360])
[86]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@xe_exec_mix_modes@exec-spinner-interrupted-lr.html
* igt@xe_exec_system_allocator@partial-middle-remap-no-cpu-fault:
- shard-bmg: [PASS][87] -> [FAIL][88] ([Intel XE#4937])
[87]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-bmg-4/igt@xe_exec_system_allocator@partial-middle-remap-no-cpu-fault.html
[88]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-4/igt@xe_exec_system_allocator@partial-middle-remap-no-cpu-fault.html
* igt@xe_exec_system_allocator@process-many-execqueues-new-race-nomemset:
- shard-bmg: [PASS][89] -> [INCOMPLETE][90] ([Intel XE#4842])
[89]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-bmg-2/igt@xe_exec_system_allocator@process-many-execqueues-new-race-nomemset.html
[90]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-5/igt@xe_exec_system_allocator@process-many-execqueues-new-race-nomemset.html
* igt@xe_exec_system_allocator@threads-many-large-execqueues-malloc-multi-fault:
- shard-dg2-set2: NOTRUN -> [SKIP][91] ([Intel XE#4915]) +240 other tests skip
[91]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@xe_exec_system_allocator@threads-many-large-execqueues-malloc-multi-fault.html
* igt@xe_exec_system_allocator@threads-many-large-mmap-shared-remap:
- shard-adlp: NOTRUN -> [SKIP][92] ([Intel XE#4915]) +32 other tests skip
[92]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-6/igt@xe_exec_system_allocator@threads-many-large-mmap-shared-remap.html
* igt@xe_huc_copy@huc_copy:
- shard-dg2-set2: NOTRUN -> [SKIP][93] ([Intel XE#255])
[93]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-434/igt@xe_huc_copy@huc_copy.html
* igt@xe_oa@oa-unit-exclusive-stream-sample-oa:
- shard-dg2-set2: NOTRUN -> [SKIP][94] ([Intel XE#2541] / [Intel XE#3573]) +7 other tests skip
[94]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-434/igt@xe_oa@oa-unit-exclusive-stream-sample-oa.html
* igt@xe_oa@privileged-forked-access-vaddr:
- shard-adlp: NOTRUN -> [SKIP][95] ([Intel XE#2541] / [Intel XE#3573])
[95]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-1/igt@xe_oa@privileged-forked-access-vaddr.html
* igt@xe_pm@d3cold-mmap-vram:
- shard-dg2-set2: NOTRUN -> [SKIP][96] ([Intel XE#2284] / [Intel XE#366]) +1 other test skip
[96]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-466/igt@xe_pm@d3cold-mmap-vram.html
* igt@xe_pm@d3cold-mocs:
- shard-dg2-set2: NOTRUN -> [SKIP][97] ([Intel XE#2284])
[97]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@xe_pm@d3cold-mocs.html
* igt@xe_pm@s4-multiple-execs:
- shard-adlp: [PASS][98] -> [ABORT][99] ([Intel XE#1794])
[98]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-2/igt@xe_pm@s4-multiple-execs.html
[99]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-9/igt@xe_pm@s4-multiple-execs.html
* igt@xe_pmu@fn-engine-activity-sched-if-idle:
- shard-dg2-set2: NOTRUN -> [SKIP][100] ([Intel XE#4650])
[100]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-434/igt@xe_pmu@fn-engine-activity-sched-if-idle.html
* igt@xe_pxp@pxp-stale-bo-bind-post-rpm:
- shard-dg2-set2: NOTRUN -> [SKIP][101] ([Intel XE#4733]) +3 other tests skip
[101]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-434/igt@xe_pxp@pxp-stale-bo-bind-post-rpm.html
* igt@xe_pxp@pxp-termination-key-update-post-rpm:
- shard-adlp: NOTRUN -> [SKIP][102] ([Intel XE#4733]) +1 other test skip
[102]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-6/igt@xe_pxp@pxp-termination-key-update-post-rpm.html
* igt@xe_query@multigpu-query-engines:
- shard-dg2-set2: NOTRUN -> [SKIP][103] ([Intel XE#944]) +3 other tests skip
[103]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-435/igt@xe_query@multigpu-query-engines.html
* igt@xe_render_copy@render-stress-1-copies:
- shard-adlp: NOTRUN -> [SKIP][104] ([Intel XE#4814])
[104]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-6/igt@xe_render_copy@render-stress-1-copies.html
* igt@xe_render_copy@render-stress-4-copies:
- shard-dg2-set2: NOTRUN -> [SKIP][105] ([Intel XE#4814])
[105]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@xe_render_copy@render-stress-4-copies.html
* igt@xe_sriov_auto_provisioning@exclusive-ranges:
- shard-dg2-set2: NOTRUN -> [SKIP][106] ([Intel XE#4130])
[106]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-466/igt@xe_sriov_auto_provisioning@exclusive-ranges.html
#### Possible fixes ####
* igt@core_hotunplug@hotreplug-lateclose:
- shard-adlp: [SKIP][107] ([Intel XE#4963]) -> [PASS][108]
[107]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-8/igt@core_hotunplug@hotreplug-lateclose.html
[108]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-4/igt@core_hotunplug@hotreplug-lateclose.html
- shard-dg2-set2: [INCOMPLETE][109] ([Intel XE#4842]) -> [PASS][110]
[109]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-dg2-435/igt@core_hotunplug@hotreplug-lateclose.html
[110]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-435/igt@core_hotunplug@hotreplug-lateclose.html
* igt@kms_atomic_transition@plane-all-modeset-transition@pipe-a-hdmi-a-1:
- shard-adlp: [FAIL][111] ([Intel XE#3908]) -> [PASS][112] +1 other test pass
[111]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-2/igt@kms_atomic_transition@plane-all-modeset-transition@pipe-a-hdmi-a-1.html
[112]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-1/igt@kms_atomic_transition@plane-all-modeset-transition@pipe-a-hdmi-a-1.html
* igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-hflip:
- shard-adlp: [SKIP][113] ([Intel XE#4947]) -> [PASS][114] +1 other test pass
[113]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-8/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-hflip.html
[114]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-4/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-hflip.html
* igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip:
- shard-adlp: [DMESG-FAIL][115] ([Intel XE#4543]) -> [PASS][116]
[115]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-9/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip.html
[116]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-6/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip.html
* igt@kms_cursor_legacy@2x-flip-vs-cursor-legacy:
- shard-bmg: [SKIP][117] ([Intel XE#2291]) -> [PASS][118] +7 other tests pass
[117]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-bmg-5/igt@kms_cursor_legacy@2x-flip-vs-cursor-legacy.html
[118]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-7/igt@kms_cursor_legacy@2x-flip-vs-cursor-legacy.html
* igt@kms_display_modes@extended-mode-basic:
- shard-bmg: [SKIP][119] ([Intel XE#4302]) -> [PASS][120]
[119]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-bmg-6/igt@kms_display_modes@extended-mode-basic.html
[120]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-4/igt@kms_display_modes@extended-mode-basic.html
* igt@kms_flip@2x-flip-vs-dpms-on-nop:
- shard-bmg: [SKIP][121] ([Intel XE#2316]) -> [PASS][122] +8 other tests pass
[121]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-bmg-5/igt@kms_flip@2x-flip-vs-dpms-on-nop.html
[122]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-7/igt@kms_flip@2x-flip-vs-dpms-on-nop.html
* igt@kms_flip@flip-vs-expired-vblank@d-dp4:
- shard-dg2-set2: [FAIL][123] ([Intel XE#301] / [Intel XE#3321]) -> [PASS][124]
[123]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-dg2-434/igt@kms_flip@flip-vs-expired-vblank@d-dp4.html
[124]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-435/igt@kms_flip@flip-vs-expired-vblank@d-dp4.html
* igt@kms_flip@plain-flip-ts-check@a-hdmi-a3:
- shard-bmg: [FAIL][125] ([Intel XE#2882]) -> [PASS][126] +1 other test pass
[125]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-bmg-5/igt@kms_flip@plain-flip-ts-check@a-hdmi-a3.html
[126]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-7/igt@kms_flip@plain-flip-ts-check@a-hdmi-a3.html
* igt@kms_flip_event_leak@basic:
- shard-adlp: [SKIP][127] ([Intel XE#4950]) -> [PASS][128] +4 other tests pass
[127]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-8/igt@kms_flip_event_leak@basic.html
[128]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-4/igt@kms_flip_event_leak@basic.html
* igt@kms_flip_tiling@flip-change-tiling@pipe-d-hdmi-a-1-y-to-y:
- shard-adlp: [FAIL][129] ([Intel XE#1874]) -> [PASS][130]
[129]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-3/igt@kms_flip_tiling@flip-change-tiling@pipe-d-hdmi-a-1-y-to-y.html
[130]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-3/igt@kms_flip_tiling@flip-change-tiling@pipe-d-hdmi-a-1-y-to-y.html
* igt@kms_hdr@invalid-hdr:
- shard-bmg: [SKIP][131] ([Intel XE#1503]) -> [PASS][132]
[131]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-bmg-5/igt@kms_hdr@invalid-hdr.html
[132]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-7/igt@kms_hdr@invalid-hdr.html
* igt@kms_plane@plane-panning-bottom-right-suspend:
- shard-adlp: [DMESG-WARN][133] ([Intel XE#2953] / [Intel XE#4173]) -> [PASS][134] +1 other test pass
[133]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-2/igt@kms_plane@plane-panning-bottom-right-suspend.html
[134]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-6/igt@kms_plane@plane-panning-bottom-right-suspend.html
* igt@kms_setmode@invalid-clone-single-crtc-stealing:
- shard-bmg: [SKIP][135] ([Intel XE#1435]) -> [PASS][136]
[135]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-bmg-5/igt@kms_setmode@invalid-clone-single-crtc-stealing.html
[136]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-1/igt@kms_setmode@invalid-clone-single-crtc-stealing.html
* igt@kms_vrr@cmrr@pipe-a-edp-1:
- shard-lnl: [FAIL][137] ([Intel XE#4459]) -> [PASS][138] +1 other test pass
[137]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-lnl-1/igt@kms_vrr@cmrr@pipe-a-edp-1.html
[138]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-lnl-3/igt@kms_vrr@cmrr@pipe-a-edp-1.html
* igt@xe_mmap@bad-flags:
- shard-adlp: [SKIP][139] ([Intel XE#4945]) -> [PASS][140] +14 other tests pass
[139]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-8/igt@xe_mmap@bad-flags.html
[140]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-4/igt@xe_mmap@bad-flags.html
* igt@xe_module_load@load:
- shard-dg2-set2: ([PASS][141], [PASS][142], [PASS][143], [PASS][144], [PASS][145], [PASS][146], [PASS][147], [SKIP][148], [PASS][149], [PASS][150], [PASS][151], [PASS][152], [PASS][153], [PASS][154], [PASS][155], [PASS][156], [PASS][157], [PASS][158], [PASS][159]) ([Intel XE#378]) -> ([PASS][160], [PASS][161], [PASS][162], [PASS][163], [PASS][164], [PASS][165], [PASS][166], [PASS][167], [PASS][168], [PASS][169], [PASS][170], [PASS][171], [PASS][172], [PASS][173], [PASS][174], [PASS][175], [PASS][176], [PASS][177])
[141]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-dg2-466/igt@xe_module_load@load.html
[142]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-dg2-434/igt@xe_module_load@load.html
[143]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-dg2-436/igt@xe_module_load@load.html
[144]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-dg2-436/igt@xe_module_load@load.html
[145]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-dg2-434/igt@xe_module_load@load.html
[146]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-dg2-435/igt@xe_module_load@load.html
[147]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-dg2-436/igt@xe_module_load@load.html
[148]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-dg2-436/igt@xe_module_load@load.html
[149]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-dg2-435/igt@xe_module_load@load.html
[150]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-dg2-435/igt@xe_module_load@load.html
[151]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-dg2-435/igt@xe_module_load@load.html
[152]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-dg2-434/igt@xe_module_load@load.html
[153]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-dg2-436/igt@xe_module_load@load.html
[154]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-dg2-466/igt@xe_module_load@load.html
[155]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-dg2-466/igt@xe_module_load@load.html
[156]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-dg2-466/igt@xe_module_load@load.html
[157]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-dg2-434/igt@xe_module_load@load.html
[158]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-dg2-434/igt@xe_module_load@load.html
[159]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-dg2-466/igt@xe_module_load@load.html
[160]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@xe_module_load@load.html
[161]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@xe_module_load@load.html
[162]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@xe_module_load@load.html
[163]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@xe_module_load@load.html
[164]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-435/igt@xe_module_load@load.html
[165]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-434/igt@xe_module_load@load.html
[166]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-434/igt@xe_module_load@load.html
[167]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-435/igt@xe_module_load@load.html
[168]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-435/igt@xe_module_load@load.html
[169]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-435/igt@xe_module_load@load.html
[170]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-435/igt@xe_module_load@load.html
[171]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-466/igt@xe_module_load@load.html
[172]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-466/igt@xe_module_load@load.html
[173]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-434/igt@xe_module_load@load.html
[174]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-466/igt@xe_module_load@load.html
[175]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-434/igt@xe_module_load@load.html
[176]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-434/igt@xe_module_load@load.html
[177]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@xe_module_load@load.html
* igt@xe_pm@s4-d3hot-basic-exec:
- shard-adlp: [ABORT][178] ([Intel XE#1794]) -> [PASS][179] +1 other test pass
[178]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-9/igt@xe_pm@s4-d3hot-basic-exec.html
[179]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-6/igt@xe_pm@s4-d3hot-basic-exec.html
* igt@xe_pmu@gt-frequency:
- shard-lnl: [FAIL][180] ([Intel XE#4835]) -> [PASS][181] +1 other test pass
[180]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-lnl-6/igt@xe_pmu@gt-frequency.html
[181]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-lnl-4/igt@xe_pmu@gt-frequency.html
#### Warnings ####
* igt@kms_big_fb@y-tiled-32bpp-rotate-90:
- shard-adlp: [SKIP][182] ([Intel XE#2351] / [Intel XE#4947]) -> [SKIP][183] ([Intel XE#316])
[182]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-8/igt@kms_big_fb@y-tiled-32bpp-rotate-90.html
[183]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-4/igt@kms_big_fb@y-tiled-32bpp-rotate-90.html
* igt@kms_ccs@bad-pixel-format-4-tiled-mtl-mc-ccs:
- shard-adlp: [SKIP][184] ([Intel XE#4947]) -> [SKIP][185] ([Intel XE#455] / [Intel XE#787]) +1 other test skip
[184]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-8/igt@kms_ccs@bad-pixel-format-4-tiled-mtl-mc-ccs.html
[185]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-4/igt@kms_ccs@bad-pixel-format-4-tiled-mtl-mc-ccs.html
* igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs:
- shard-dg2-set2: [INCOMPLETE][186] ([Intel XE#1727] / [Intel XE#2705] / [Intel XE#3113] / [Intel XE#4212] / [Intel XE#4345] / [Intel XE#4522]) -> [INCOMPLETE][187] ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#3124] / [Intel XE#4345])
[186]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-dg2-466/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs.html
[187]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-dg2-436/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs.html
* igt@kms_content_protection@lic-type-0:
- shard-bmg: [SKIP][188] ([Intel XE#2341]) -> [FAIL][189] ([Intel XE#1178])
[188]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-bmg-5/igt@kms_content_protection@lic-type-0.html
[189]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-1/igt@kms_content_protection@lic-type-0.html
* igt@kms_content_protection@srm:
- shard-bmg: [FAIL][190] ([Intel XE#1178]) -> [SKIP][191] ([Intel XE#2341])
[190]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-bmg-1/igt@kms_content_protection@srm.html
[191]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-6/igt@kms_content_protection@srm.html
* igt@kms_content_protection@uevent:
- shard-bmg: [FAIL][192] ([Intel XE#1188]) -> [SKIP][193] ([Intel XE#2341])
[192]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-bmg-4/igt@kms_content_protection@uevent.html
[193]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-6/igt@kms_content_protection@uevent.html
* igt@kms_cursor_legacy@2x-nonblocking-modeset-vs-cursor-atomic:
- shard-adlp: [SKIP][194] ([Intel XE#4950]) -> [SKIP][195] ([Intel XE#309])
[194]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-8/igt@kms_cursor_legacy@2x-nonblocking-modeset-vs-cursor-atomic.html
[195]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-4/igt@kms_cursor_legacy@2x-nonblocking-modeset-vs-cursor-atomic.html
* igt@kms_dp_linktrain_fallback@dsc-fallback:
- shard-adlp: [SKIP][196] ([Intel XE#4947]) -> [SKIP][197] ([Intel XE#4331])
[196]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-8/igt@kms_dp_linktrain_fallback@dsc-fallback.html
[197]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-4/igt@kms_dp_linktrain_fallback@dsc-fallback.html
* igt@kms_flip@wf_vblank-ts-check:
- shard-lnl: [FAIL][198] ([Intel XE#886]) -> [FAIL][199] ([Intel XE#3098] / [Intel XE#3149] / [Intel XE#886])
[198]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-lnl-7/igt@kms_flip@wf_vblank-ts-check.html
[199]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-lnl-1/igt@kms_flip@wf_vblank-ts-check.html
* igt@kms_flip@wf_vblank-ts-check@a-edp1:
- shard-lnl: [FAIL][200] ([Intel XE#886]) -> [FAIL][201] ([Intel XE#3098])
[200]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-lnl-7/igt@kms_flip@wf_vblank-ts-check@a-edp1.html
[201]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-lnl-1/igt@kms_flip@wf_vblank-ts-check@a-edp1.html
* igt@kms_flip_tiling@flip-change-tiling@pipe-c-hdmi-a-1-x-to-y:
- shard-adlp: [DMESG-FAIL][202] ([Intel XE#4543]) -> [FAIL][203] ([Intel XE#1874])
[202]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-3/igt@kms_flip_tiling@flip-change-tiling@pipe-c-hdmi-a-1-x-to-y.html
[203]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-3/igt@kms_flip_tiling@flip-change-tiling@pipe-c-hdmi-a-1-x-to-y.html
* igt@kms_frontbuffer_tracking@drrs-1p-offscren-pri-shrfb-draw-render:
- shard-adlp: [SKIP][204] ([Intel XE#4947]) -> [SKIP][205] ([Intel XE#651])
[204]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-8/igt@kms_frontbuffer_tracking@drrs-1p-offscren-pri-shrfb-draw-render.html
[205]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-4/igt@kms_frontbuffer_tracking@drrs-1p-offscren-pri-shrfb-draw-render.html
* igt@kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-pgflip-blt:
- shard-bmg: [SKIP][206] ([Intel XE#2312]) -> [SKIP][207] ([Intel XE#2311]) +15 other tests skip
[206]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-bmg-5/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-pgflip-blt.html
[207]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-7/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-pgflip-blt.html
* igt@kms_frontbuffer_tracking@drrs-2p-primscrn-pri-indfb-draw-blt:
- shard-adlp: [SKIP][208] ([Intel XE#2351] / [Intel XE#4947]) -> [SKIP][209] ([Intel XE#656])
[208]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-8/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-pri-indfb-draw-blt.html
[209]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-4/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-pri-indfb-draw-blt.html
* igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-render:
- shard-bmg: [SKIP][210] ([Intel XE#2312]) -> [SKIP][211] ([Intel XE#4141]) +7 other tests skip
[210]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-bmg-5/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-render.html
[211]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-1/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-render.html
* igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-mmap-wc:
- shard-bmg: [SKIP][212] ([Intel XE#4141]) -> [SKIP][213] ([Intel XE#2312]) +7 other tests skip
[212]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-bmg-1/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-mmap-wc.html
[213]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-mmap-wc.html
* igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-mmap-wc:
- shard-bmg: [SKIP][214] ([Intel XE#2311]) -> [SKIP][215] ([Intel XE#2312]) +22 other tests skip
[214]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-bmg-2/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-mmap-wc.html
[215]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-5/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-mmap-wc.html
* igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-blt:
- shard-bmg: [SKIP][216] ([Intel XE#2312]) -> [SKIP][217] ([Intel XE#2313]) +18 other tests skip
[216]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-blt.html
[217]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-4/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-blt.html
* igt@kms_frontbuffer_tracking@psr-2p-primscrn-pri-indfb-draw-render:
- shard-adlp: [SKIP][218] ([Intel XE#4947]) -> [SKIP][219] ([Intel XE#656]) +3 other tests skip
[218]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-8/igt@kms_frontbuffer_tracking@psr-2p-primscrn-pri-indfb-draw-render.html
[219]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-4/igt@kms_frontbuffer_tracking@psr-2p-primscrn-pri-indfb-draw-render.html
* igt@kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-fullscreen:
- shard-bmg: [SKIP][220] ([Intel XE#2313]) -> [SKIP][221] ([Intel XE#2312]) +16 other tests skip
[220]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-bmg-4/igt@kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-fullscreen.html
[221]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-bmg-6/igt@kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-fullscreen.html
* igt@kms_psr2_sf@fbc-pr-overlay-plane-move-continuous-exceed-fully-sf:
- shard-adlp: [SKIP][222] ([Intel XE#4947]) -> [SKIP][223] ([Intel XE#1489]) +1 other test skip
[222]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-8/igt@kms_psr2_sf@fbc-pr-overlay-plane-move-continuous-exceed-fully-sf.html
[223]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-4/igt@kms_psr2_sf@fbc-pr-overlay-plane-move-continuous-exceed-fully-sf.html
* igt@kms_psr@pr-sprite-plane-onoff:
- shard-adlp: [SKIP][224] ([Intel XE#2351] / [Intel XE#4947]) -> [SKIP][225] ([Intel XE#2850] / [Intel XE#929])
[224]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-8/igt@kms_psr@pr-sprite-plane-onoff.html
[225]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-4/igt@kms_psr@pr-sprite-plane-onoff.html
* igt@kms_vrr@seamless-rr-switch-virtual:
- shard-adlp: [SKIP][226] ([Intel XE#4950]) -> [SKIP][227] ([Intel XE#455])
[226]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-8/igt@kms_vrr@seamless-rr-switch-virtual.html
[227]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-4/igt@kms_vrr@seamless-rr-switch-virtual.html
* igt@xe_exec_fault_mode@once-userptr-invalidate-race-prefetch:
- shard-adlp: [SKIP][228] ([Intel XE#4945]) -> [SKIP][229] ([Intel XE#288]) +2 other tests skip
[228]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-8/igt@xe_exec_fault_mode@once-userptr-invalidate-race-prefetch.html
[229]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-4/igt@xe_exec_fault_mode@once-userptr-invalidate-race-prefetch.html
* igt@xe_exec_system_allocator@once-mmap-remap-ro-dontunmap:
- shard-adlp: [SKIP][230] ([Intel XE#4945]) -> [SKIP][231] ([Intel XE#4915]) +20 other tests skip
[230]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-8/igt@xe_exec_system_allocator@once-mmap-remap-ro-dontunmap.html
[231]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-4/igt@xe_exec_system_allocator@once-mmap-remap-ro-dontunmap.html
* igt@xe_oa@unprivileged-single-ctx-counters:
- shard-adlp: [SKIP][232] ([Intel XE#4945]) -> [SKIP][233] ([Intel XE#2541] / [Intel XE#3573]) +1 other test skip
[232]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-8/igt@xe_oa@unprivileged-single-ctx-counters.html
[233]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-4/igt@xe_oa@unprivileged-single-ctx-counters.html
* igt@xe_query@multigpu-query-uc-fw-version-huc:
- shard-adlp: [SKIP][234] ([Intel XE#4945]) -> [SKIP][235] ([Intel XE#944]) +1 other test skip
[234]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58/shard-adlp-8/igt@xe_query@multigpu-query-uc-fw-version-huc.html
[235]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/shard-adlp-4/igt@xe_query@multigpu-query-uc-fw-version-huc.html
{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).
[Intel XE#1091]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1091
[Intel XE#1122]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1122
[Intel XE#1123]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1123
[Intel XE#1124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1124
[Intel XE#1126]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1126
[Intel XE#1129]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1129
[Intel XE#1135]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1135
[Intel XE#1178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1178
[Intel XE#1188]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1188
[Intel XE#1340]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1340
[Intel XE#1392]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1392
[Intel XE#1435]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1435
[Intel XE#1489]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1489
[Intel XE#1503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1503
[Intel XE#1727]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1727
[Intel XE#1729]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1729
[Intel XE#1794]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1794
[Intel XE#1874]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1874
[Intel XE#2191]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2191
[Intel XE#2284]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2284
[Intel XE#2291]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2291
[Intel XE#2311]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2311
[Intel XE#2312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2312
[Intel XE#2313]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2313
[Intel XE#2314]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2314
[Intel XE#2316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2316
[Intel XE#2341]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2341
[Intel XE#2351]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2351
[Intel XE#2360]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2360
[Intel XE#2541]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2541
[Intel XE#255]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/255
[Intel XE#2652]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2652
[Intel XE#2705]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2705
[Intel XE#2849]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2849
[Intel XE#2850]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2850
[Intel XE#288]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/288
[Intel XE#2882]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2882
[Intel XE#2894]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2894
[Intel XE#2907]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2907
[Intel XE#2925]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2925
[Intel XE#2953]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2953
[Intel XE#301]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/301
[Intel XE#306]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/306
[Intel XE#307]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/307
[Intel XE#308]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/308
[Intel XE#309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/309
[Intel XE#3098]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3098
[Intel XE#310]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/310
[Intel XE#3113]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3113
[Intel XE#3124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3124
[Intel XE#3149]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3149
[Intel XE#316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/316
[Intel XE#3321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3321
[Intel XE#3414]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3414
[Intel XE#346]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/346
[Intel XE#3573]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3573
[Intel XE#366]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/366
[Intel XE#367]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/367
[Intel XE#373]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/373
[Intel XE#378]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/378
[Intel XE#3908]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3908
[Intel XE#4130]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4130
[Intel XE#4141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4141
[Intel XE#4173]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4173
[Intel XE#4212]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4212
[Intel XE#4302]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4302
[Intel XE#4331]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4331
[Intel XE#4345]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4345
[Intel XE#4354]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4354
[Intel XE#4416]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4416
[Intel XE#4459]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4459
[Intel XE#4522]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4522
[Intel XE#4543]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4543
[Intel XE#455]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/455
[Intel XE#4596]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4596
[Intel XE#4633]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4633
[Intel XE#4650]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4650
[Intel XE#4733]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4733
[Intel XE#4814]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4814
[Intel XE#4835]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4835
[Intel XE#4837]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4837
[Intel XE#4842]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4842
[Intel XE#4915]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4915
[Intel XE#4937]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4937
[Intel XE#4945]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4945
[Intel XE#4947]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4947
[Intel XE#4950]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4950
[Intel XE#4963]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4963
[Intel XE#5301]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5301
[Intel XE#610]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/610
[Intel XE#619]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/619
[Intel XE#651]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/651
[Intel XE#653]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/653
[Intel XE#656]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/656
[Intel XE#718]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/718
[Intel XE#787]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/787
[Intel XE#870]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/870
[Intel XE#886]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/886
[Intel XE#929]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/929
[Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944
Build changes
-------------
* Linux: xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58 -> xe-pw-149108v8
IGT_8418: 8418
xe-3274-0cd8ffca03164a8a9686dbab2a21fae671161e58: 0cd8ffca03164a8a9686dbab2a21fae671161e58
xe-pw-149108v8: 149108v8
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149108v8/index.html
[-- Attachment #2: Type: text/html, Size: 72040 bytes --]
^ permalink raw reply [flat|nested] 17+ messages in thread