|
7 | 7 |
|
8 | 8 | #include "abi/guc_actions_sriov_abi.h" |
9 | 9 | #include "xe_bo.h" |
| 10 | +#include "xe_ggtt.h" |
| 11 | +#include "xe_gt.h" |
| 12 | +#include "xe_gt_sriov_pf_config.h" |
10 | 13 | #include "xe_gt_sriov_pf_control.h" |
11 | 14 | #include "xe_gt_sriov_pf_helpers.h" |
12 | 15 | #include "xe_gt_sriov_pf_migration.h" |
@@ -42,6 +45,105 @@ static void pf_dump_mig_data(struct xe_gt *gt, unsigned int vfid, |
42 | 45 | } |
43 | 46 | } |
44 | 47 |
|
| 48 | +static ssize_t pf_migration_ggtt_size(struct xe_gt *gt, unsigned int vfid) |
| 49 | +{ |
| 50 | + if (!xe_gt_is_main_type(gt)) |
| 51 | + return 0; |
| 52 | + |
| 53 | + return xe_gt_sriov_pf_config_ggtt_save(gt, vfid, NULL, 0); |
| 54 | +} |
| 55 | + |
| 56 | +static int pf_save_vf_ggtt_mig_data(struct xe_gt *gt, unsigned int vfid) |
| 57 | +{ |
| 58 | + struct xe_sriov_packet *data; |
| 59 | + size_t size; |
| 60 | + int ret; |
| 61 | + |
| 62 | + size = pf_migration_ggtt_size(gt, vfid); |
| 63 | + xe_gt_assert(gt, size); |
| 64 | + |
| 65 | + data = xe_sriov_packet_alloc(gt_to_xe(gt)); |
| 66 | + if (!data) |
| 67 | + return -ENOMEM; |
| 68 | + |
| 69 | + ret = xe_sriov_packet_init(data, gt->tile->id, gt->info.id, |
| 70 | + XE_SRIOV_PACKET_TYPE_GGTT, 0, size); |
| 71 | + if (ret) |
| 72 | + goto fail; |
| 73 | + |
| 74 | + ret = xe_gt_sriov_pf_config_ggtt_save(gt, vfid, data->vaddr, size); |
| 75 | + if (ret) |
| 76 | + goto fail; |
| 77 | + |
| 78 | + pf_dump_mig_data(gt, vfid, data, "GGTT data save"); |
| 79 | + |
| 80 | + ret = xe_gt_sriov_pf_migration_save_produce(gt, vfid, data); |
| 81 | + if (ret) |
| 82 | + goto fail; |
| 83 | + |
| 84 | + return 0; |
| 85 | + |
| 86 | +fail: |
| 87 | + xe_sriov_packet_free(data); |
| 88 | + xe_gt_sriov_err(gt, "Failed to save VF%u GGTT data (%pe)\n", vfid, ERR_PTR(ret)); |
| 89 | + return ret; |
| 90 | +} |
| 91 | + |
| 92 | +static int pf_restore_vf_ggtt_mig_data(struct xe_gt *gt, unsigned int vfid, |
| 93 | + struct xe_sriov_packet *data) |
| 94 | +{ |
| 95 | + int ret; |
| 96 | + |
| 97 | + pf_dump_mig_data(gt, vfid, data, "GGTT data restore"); |
| 98 | + |
| 99 | + ret = xe_gt_sriov_pf_config_ggtt_restore(gt, vfid, data->vaddr, data->hdr.size); |
| 100 | + if (ret) { |
| 101 | + xe_gt_sriov_err(gt, "Failed to restore VF%u GGTT data (%pe)\n", |
| 102 | + vfid, ERR_PTR(ret)); |
| 103 | + return ret; |
| 104 | + } |
| 105 | + |
| 106 | + return 0; |
| 107 | +} |
| 108 | + |
| 109 | +/** |
| 110 | + * xe_gt_sriov_pf_migration_ggtt_save() - Save VF GGTT migration data. |
| 111 | + * @gt: the &xe_gt |
| 112 | + * @vfid: the VF identifier (can't be 0) |
| 113 | + * |
| 114 | + * This function is for PF only. |
| 115 | + * |
| 116 | + * Return: 0 on success or a negative error code on failure. |
| 117 | + */ |
| 118 | +int xe_gt_sriov_pf_migration_ggtt_save(struct xe_gt *gt, unsigned int vfid) |
| 119 | +{ |
| 120 | + xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt))); |
| 121 | + xe_gt_assert(gt, vfid != PFID); |
| 122 | + xe_gt_assert(gt, vfid <= xe_sriov_pf_get_totalvfs(gt_to_xe(gt))); |
| 123 | + |
| 124 | + return pf_save_vf_ggtt_mig_data(gt, vfid); |
| 125 | +} |
| 126 | + |
| 127 | +/** |
| 128 | + * xe_gt_sriov_pf_migration_ggtt_restore() - Restore VF GGTT migration data. |
| 129 | + * @gt: the &xe_gt |
| 130 | + * @vfid: the VF identifier (can't be 0) |
| 131 | + * @data: the &xe_sriov_packet containing migration data |
| 132 | + * |
| 133 | + * This function is for PF only. |
| 134 | + * |
| 135 | + * Return: 0 on success or a negative error code on failure. |
| 136 | + */ |
| 137 | +int xe_gt_sriov_pf_migration_ggtt_restore(struct xe_gt *gt, unsigned int vfid, |
| 138 | + struct xe_sriov_packet *data) |
| 139 | +{ |
| 140 | + xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt))); |
| 141 | + xe_gt_assert(gt, vfid != PFID); |
| 142 | + xe_gt_assert(gt, vfid <= xe_sriov_pf_get_totalvfs(gt_to_xe(gt))); |
| 143 | + |
| 144 | + return pf_restore_vf_ggtt_mig_data(gt, vfid, data); |
| 145 | +} |
| 146 | + |
45 | 147 | /* Return: number of dwords saved/restored/required or a negative error code on failure */ |
46 | 148 | static int guc_action_vf_save_restore(struct xe_guc *guc, u32 vfid, u32 opcode, |
47 | 149 | u64 addr, u32 ndwords) |
@@ -281,6 +383,13 @@ ssize_t xe_gt_sriov_pf_migration_size(struct xe_gt *gt, unsigned int vfid) |
281 | 383 | size += sizeof(struct xe_sriov_packet_hdr); |
282 | 384 | total += size; |
283 | 385 |
|
| 386 | + size = pf_migration_ggtt_size(gt, vfid); |
| 387 | + if (size < 0) |
| 388 | + return size; |
| 389 | + if (size > 0) |
| 390 | + size += sizeof(struct xe_sriov_packet_hdr); |
| 391 | + total += size; |
| 392 | + |
284 | 393 | return total; |
285 | 394 | } |
286 | 395 |
|
@@ -346,6 +455,9 @@ void xe_gt_sriov_pf_migration_save_init(struct xe_gt *gt, unsigned int vfid) |
346 | 455 |
|
347 | 456 | xe_gt_assert(gt, pf_migration_guc_size(gt, vfid) > 0); |
348 | 457 | pf_migration_save_data_todo(gt, vfid, XE_SRIOV_PACKET_TYPE_GUC); |
| 458 | + |
| 459 | + if (pf_migration_ggtt_size(gt, vfid) > 0) |
| 460 | + pf_migration_save_data_todo(gt, vfid, XE_SRIOV_PACKET_TYPE_GGTT); |
349 | 461 | } |
350 | 462 |
|
351 | 463 | /** |
|
0 commit comments