Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/xe/pf: Save VF GuC state when pausing VF

Since usually pausing the VF is done as a first step to migrate
that VF, immediately save VF GuC state as a final step of the VF
pausing to have that data ready to export when needed.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Michał Winiarski <michal.winiarski@intel.com>
Cc: Tomasz Lis <tomasz.lis@intel.com>
Reviewed-by: Michał Winiarski <michal.winiarski@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240912203817.1880-5-michal.wajdeczko@intel.com

+42 -1
+40 -1
drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
··· 13 13 #include "xe_gt_sriov_pf_config.h" 14 14 #include "xe_gt_sriov_pf_control.h" 15 15 #include "xe_gt_sriov_pf_helpers.h" 16 + #include "xe_gt_sriov_pf_migration.h" 16 17 #include "xe_gt_sriov_pf_monitor.h" 17 18 #include "xe_gt_sriov_pf_service.h" 18 19 #include "xe_gt_sriov_printk.h" ··· 178 177 CASE2STR(PAUSE_SEND_PAUSE); 179 178 CASE2STR(PAUSE_WAIT_GUC); 180 179 CASE2STR(PAUSE_GUC_DONE); 180 + CASE2STR(PAUSE_SAVE_GUC); 181 181 CASE2STR(PAUSE_FAILED); 182 182 CASE2STR(PAUSED); 183 183 CASE2STR(RESUME_WIP); ··· 418 416 * : | : / 419 417 * : v : / 420 418 * : PAUSE_GUC_DONE o-----restart 419 + * : | : 420 + * : | o---<--busy : 421 + * : v / / : 422 + * : PAUSE_SAVE_GUC : 421 423 * : / : 422 424 * : / : 423 425 * :....o..............o...............o...........: ··· 441 435 pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE); 442 436 pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC); 443 437 pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_GUC_DONE); 438 + pf_escape_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_SAVE_GUC); 444 439 } 445 440 } 446 441 ··· 472 465 pf_enter_vf_pause_failed(gt, vfid); 473 466 } 474 467 468 + static void pf_enter_vf_pause_save_guc(struct xe_gt *gt, unsigned int vfid) 469 + { 470 + if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_SAVE_GUC)) 471 + pf_enter_vf_state_machine_bug(gt, vfid); 472 + } 473 + 474 + static bool pf_exit_vf_pause_save_guc(struct xe_gt *gt, unsigned int vfid) 475 + { 476 + int err; 477 + 478 + if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_SAVE_GUC)) 479 + return false; 480 + 481 + err = xe_gt_sriov_pf_migration_save_guc_state(gt, vfid); 482 + if (err) { 483 + /* retry if busy */ 484 + if (err == -EBUSY) { 485 + pf_enter_vf_pause_save_guc(gt, vfid); 486 + return true; 487 + } 488 + /* give up on error */ 489 + if (err == -EIO) 490 + pf_enter_vf_mismatch(gt, vfid); 491 + } 492 + 493 + pf_enter_vf_pause_completed(gt, vfid); 494 + return true; 495 + } 496 + 475 497 static bool pf_exit_vf_pause_guc_done(struct xe_gt *gt, unsigned int vfid) 476 498 { 477 499 if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_GUC_DONE)) 478 500 return false; 479 501 480 - pf_enter_vf_pause_completed(gt, vfid); 502 + pf_enter_vf_pause_save_guc(gt, vfid); 481 503 return true; 482 504 } 483 505 ··· 1373 1337 } 1374 1338 1375 1339 if (pf_exit_vf_pause_guc_done(gt, vfid)) 1340 + return true; 1341 + 1342 + if (pf_exit_vf_pause_save_guc(gt, vfid)) 1376 1343 return true; 1377 1344 1378 1345 if (pf_exit_vf_resume_send_resume(gt, vfid))
+2
drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h
··· 27 27 * @XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE: indicates that the PF is about to send a PAUSE command. 28 28 * @XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC: indicates that the PF awaits for a response from the GuC. 29 29 * @XE_GT_SRIOV_STATE_PAUSE_GUC_DONE: indicates that the PF has received a response from the GuC. 30 + * @XE_GT_SRIOV_STATE_PAUSE_SAVE_GUC: indicates that the PF needs to save the VF GuC state. 30 31 * @XE_GT_SRIOV_STATE_PAUSE_FAILED: indicates that a VF pause operation has failed. 31 32 * @XE_GT_SRIOV_STATE_PAUSED: indicates that the VF is paused. 32 33 * @XE_GT_SRIOV_STATE_RESUME_WIP: indicates the a VF resume operation is in progress. ··· 57 56 XE_GT_SRIOV_STATE_PAUSE_SEND_PAUSE, 58 57 XE_GT_SRIOV_STATE_PAUSE_WAIT_GUC, 59 58 XE_GT_SRIOV_STATE_PAUSE_GUC_DONE, 59 + XE_GT_SRIOV_STATE_PAUSE_SAVE_GUC, 60 60 XE_GT_SRIOV_STATE_PAUSE_FAILED, 61 61 XE_GT_SRIOV_STATE_PAUSED, 62 62