|
5 | 5 |
|
6 | 6 | #include <drm/drm_managed.h> |
7 | 7 |
|
| 8 | +#include "regs/xe_guc_regs.h" |
| 9 | + |
8 | 10 | #include "abi/guc_actions_sriov_abi.h" |
9 | 11 | #include "xe_bo.h" |
10 | 12 | #include "xe_ggtt.h" |
11 | 13 | #include "xe_gt.h" |
| 14 | +#include "xe_gt_sriov_pf.h" |
12 | 15 | #include "xe_gt_sriov_pf_config.h" |
13 | 16 | #include "xe_gt_sriov_pf_control.h" |
14 | 17 | #include "xe_gt_sriov_pf_helpers.h" |
15 | 18 | #include "xe_gt_sriov_pf_migration.h" |
16 | 19 | #include "xe_gt_sriov_printk.h" |
17 | 20 | #include "xe_guc_buf.h" |
18 | 21 | #include "xe_guc_ct.h" |
| 22 | +#include "xe_mmio.h" |
19 | 23 | #include "xe_sriov.h" |
20 | 24 | #include "xe_sriov_packet.h" |
21 | 25 | #include "xe_sriov_packet_types.h" |
@@ -358,6 +362,149 @@ int xe_gt_sriov_pf_migration_guc_restore(struct xe_gt *gt, unsigned int vfid, |
358 | 362 | return pf_restore_vf_guc_state(gt, vfid, data); |
359 | 363 | } |
360 | 364 |
|
| 365 | +static ssize_t pf_migration_mmio_size(struct xe_gt *gt, unsigned int vfid) |
| 366 | +{ |
| 367 | + if (xe_gt_is_media_type(gt)) |
| 368 | + return MED_VF_SW_FLAG_COUNT * sizeof(u32); |
| 369 | + else |
| 370 | + return VF_SW_FLAG_COUNT * sizeof(u32); |
| 371 | +} |
| 372 | + |
| 373 | +static int pf_migration_mmio_save(struct xe_gt *gt, unsigned int vfid, void *buf, size_t size) |
| 374 | +{ |
| 375 | + struct xe_mmio mmio; |
| 376 | + u32 *regs = buf; |
| 377 | + int n; |
| 378 | + |
| 379 | + if (size != pf_migration_mmio_size(gt, vfid)) |
| 380 | + return -EINVAL; |
| 381 | + |
| 382 | + xe_mmio_init_vf_view(&mmio, >->mmio, vfid); |
| 383 | + |
| 384 | + if (xe_gt_is_media_type(gt)) |
| 385 | + for (n = 0; n < MED_VF_SW_FLAG_COUNT; n++) |
| 386 | + regs[n] = xe_mmio_read32(>->mmio, MED_VF_SW_FLAG(n)); |
| 387 | + else |
| 388 | + for (n = 0; n < VF_SW_FLAG_COUNT; n++) |
| 389 | + regs[n] = xe_mmio_read32(>->mmio, VF_SW_FLAG(n)); |
| 390 | + |
| 391 | + return 0; |
| 392 | +} |
| 393 | + |
| 394 | +static int pf_migration_mmio_restore(struct xe_gt *gt, unsigned int vfid, |
| 395 | + const void *buf, size_t size) |
| 396 | +{ |
| 397 | + const u32 *regs = buf; |
| 398 | + struct xe_mmio mmio; |
| 399 | + int n; |
| 400 | + |
| 401 | + if (size != pf_migration_mmio_size(gt, vfid)) |
| 402 | + return -EINVAL; |
| 403 | + |
| 404 | + xe_mmio_init_vf_view(&mmio, >->mmio, vfid); |
| 405 | + |
| 406 | + if (xe_gt_is_media_type(gt)) |
| 407 | + for (n = 0; n < MED_VF_SW_FLAG_COUNT; n++) |
| 408 | + xe_mmio_write32(>->mmio, MED_VF_SW_FLAG(n), regs[n]); |
| 409 | + else |
| 410 | + for (n = 0; n < VF_SW_FLAG_COUNT; n++) |
| 411 | + xe_mmio_write32(>->mmio, VF_SW_FLAG(n), regs[n]); |
| 412 | + |
| 413 | + return 0; |
| 414 | +} |
| 415 | + |
| 416 | +static int pf_save_vf_mmio_mig_data(struct xe_gt *gt, unsigned int vfid) |
| 417 | +{ |
| 418 | + struct xe_sriov_packet *data; |
| 419 | + size_t size; |
| 420 | + int ret; |
| 421 | + |
| 422 | + size = pf_migration_mmio_size(gt, vfid); |
| 423 | + xe_gt_assert(gt, size); |
| 424 | + |
| 425 | + data = xe_sriov_packet_alloc(gt_to_xe(gt)); |
| 426 | + if (!data) |
| 427 | + return -ENOMEM; |
| 428 | + |
| 429 | + ret = xe_sriov_packet_init(data, gt->tile->id, gt->info.id, |
| 430 | + XE_SRIOV_PACKET_TYPE_MMIO, 0, size); |
| 431 | + if (ret) |
| 432 | + goto fail; |
| 433 | + |
| 434 | + ret = pf_migration_mmio_save(gt, vfid, data->vaddr, size); |
| 435 | + if (ret) |
| 436 | + goto fail; |
| 437 | + |
| 438 | + pf_dump_mig_data(gt, vfid, data, "MMIO data save"); |
| 439 | + |
| 440 | + ret = xe_gt_sriov_pf_migration_save_produce(gt, vfid, data); |
| 441 | + if (ret) |
| 442 | + goto fail; |
| 443 | + |
| 444 | + return 0; |
| 445 | + |
| 446 | +fail: |
| 447 | + xe_sriov_packet_free(data); |
| 448 | + xe_gt_sriov_err(gt, "Failed to save VF%u MMIO data (%pe)\n", vfid, ERR_PTR(ret)); |
| 449 | + return ret; |
| 450 | +} |
| 451 | + |
| 452 | +static int pf_restore_vf_mmio_mig_data(struct xe_gt *gt, unsigned int vfid, |
| 453 | + struct xe_sriov_packet *data) |
| 454 | +{ |
| 455 | + int ret; |
| 456 | + |
| 457 | + pf_dump_mig_data(gt, vfid, data, "MMIO data restore"); |
| 458 | + |
| 459 | + ret = pf_migration_mmio_restore(gt, vfid, data->vaddr, data->hdr.size); |
| 460 | + if (ret) { |
| 461 | + xe_gt_sriov_err(gt, "Failed to restore VF%u MMIO data (%pe)\n", |
| 462 | + vfid, ERR_PTR(ret)); |
| 463 | + |
| 464 | + return ret; |
| 465 | + } |
| 466 | + |
| 467 | + return 0; |
| 468 | +} |
| 469 | + |
| 470 | +/** |
| 471 | + * xe_gt_sriov_pf_migration_mmio_save() - Save VF MMIO migration data. |
| 472 | + * @gt: the &xe_gt |
| 473 | + * @vfid: the VF identifier (can't be 0) |
| 474 | + * |
| 475 | + * This function is for PF only. |
| 476 | + * |
| 477 | + * Return: 0 on success or a negative error code on failure. |
| 478 | + */ |
| 479 | +int xe_gt_sriov_pf_migration_mmio_save(struct xe_gt *gt, unsigned int vfid) |
| 480 | +{ |
| 481 | + xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt))); |
| 482 | + xe_gt_assert(gt, vfid != PFID); |
| 483 | + xe_gt_assert(gt, vfid <= xe_sriov_pf_get_totalvfs(gt_to_xe(gt))); |
| 484 | + |
| 485 | + return pf_save_vf_mmio_mig_data(gt, vfid); |
| 486 | +} |
| 487 | + |
| 488 | +/** |
| 489 | + * xe_gt_sriov_pf_migration_mmio_restore() - Restore VF MMIO migration data. |
| 490 | + * @gt: the &xe_gt |
| 491 | + * @vfid: the VF identifier (can't be 0) |
| 492 | + * @data: the &xe_sriov_packet containing migration data |
| 493 | + * |
| 494 | + * This function is for PF only. |
| 495 | + * |
| 496 | + * Return: 0 on success or a negative error code on failure. |
| 497 | + */ |
| 498 | +int xe_gt_sriov_pf_migration_mmio_restore(struct xe_gt *gt, unsigned int vfid, |
| 499 | + struct xe_sriov_packet *data) |
| 500 | +{ |
| 501 | + xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt))); |
| 502 | + xe_gt_assert(gt, vfid != PFID); |
| 503 | + xe_gt_assert(gt, vfid <= xe_sriov_pf_get_totalvfs(gt_to_xe(gt))); |
| 504 | + |
| 505 | + return pf_restore_vf_mmio_mig_data(gt, vfid, data); |
| 506 | +} |
| 507 | + |
361 | 508 | /** |
362 | 509 | * xe_gt_sriov_pf_migration_size() - Total size of migration data from all components within a GT. |
363 | 510 | * @gt: the &xe_gt |
@@ -390,6 +537,13 @@ ssize_t xe_gt_sriov_pf_migration_size(struct xe_gt *gt, unsigned int vfid) |
390 | 537 | size += sizeof(struct xe_sriov_packet_hdr); |
391 | 538 | total += size; |
392 | 539 |
|
| 540 | + size = pf_migration_mmio_size(gt, vfid); |
| 541 | + if (size < 0) |
| 542 | + return size; |
| 543 | + if (size > 0) |
| 544 | + size += sizeof(struct xe_sriov_packet_hdr); |
| 545 | + total += size; |
| 546 | + |
393 | 547 | return total; |
394 | 548 | } |
395 | 549 |
|
@@ -458,6 +612,9 @@ void xe_gt_sriov_pf_migration_save_init(struct xe_gt *gt, unsigned int vfid) |
458 | 612 |
|
459 | 613 | if (pf_migration_ggtt_size(gt, vfid) > 0) |
460 | 614 | pf_migration_save_data_todo(gt, vfid, XE_SRIOV_PACKET_TYPE_GGTT); |
| 615 | + |
| 616 | + xe_gt_assert(gt, pf_migration_mmio_size(gt, vfid) > 0); |
| 617 | + pf_migration_save_data_todo(gt, vfid, XE_SRIOV_PACKET_TYPE_MMIO); |
461 | 618 | } |
462 | 619 |
|
463 | 620 | /** |
|
0 commit comments