Skip to content

Commit b7c1b99

Browse files
committed
drm/xe/pf: Handle MMIO migration data as part of PF control
Implement the helpers and use them for save and restore of MMIO migration data in stop_copy / resume device state. Reviewed-by: Michal Wajdeczko <michal.wajdeczko@intel.com> Link: https://patch.msgid.link/20251112132220.516975-20-michal.winiarski@intel.com Signed-off-by: Michał Winiarski <michal.winiarski@intel.com>
1 parent 2579764 commit b7c1b99

3 files changed

Lines changed: 175 additions & 0 deletions

File tree

drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -880,6 +880,18 @@ static int pf_handle_vf_save_data(struct xe_gt *gt, unsigned int vfid)
880880
return -EAGAIN;
881881
}
882882

883+
if (xe_gt_sriov_pf_migration_save_data_pending(gt, vfid,
884+
XE_SRIOV_PACKET_TYPE_MMIO)) {
885+
ret = xe_gt_sriov_pf_migration_mmio_save(gt, vfid);
886+
if (ret)
887+
return ret;
888+
889+
xe_gt_sriov_pf_migration_save_data_complete(gt, vfid,
890+
XE_SRIOV_PACKET_TYPE_MMIO);
891+
892+
return -EAGAIN;
893+
}
894+
883895
return 0;
884896
}
885897

@@ -1112,6 +1124,9 @@ static int pf_handle_vf_restore_data(struct xe_gt *gt, unsigned int vfid)
11121124
case XE_SRIOV_PACKET_TYPE_GGTT:
11131125
ret = xe_gt_sriov_pf_migration_ggtt_restore(gt, vfid, data);
11141126
break;
1127+
case XE_SRIOV_PACKET_TYPE_MMIO:
1128+
ret = xe_gt_sriov_pf_migration_mmio_restore(gt, vfid, data);
1129+
break;
11151130
case XE_SRIOV_PACKET_TYPE_GUC:
11161131
ret = xe_gt_sriov_pf_migration_guc_restore(gt, vfid, data);
11171132
break;

drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.c

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,21 @@
55

66
#include <drm/drm_managed.h>
77

8+
#include "regs/xe_guc_regs.h"
9+
810
#include "abi/guc_actions_sriov_abi.h"
911
#include "xe_bo.h"
1012
#include "xe_ggtt.h"
1113
#include "xe_gt.h"
14+
#include "xe_gt_sriov_pf.h"
1215
#include "xe_gt_sriov_pf_config.h"
1316
#include "xe_gt_sriov_pf_control.h"
1417
#include "xe_gt_sriov_pf_helpers.h"
1518
#include "xe_gt_sriov_pf_migration.h"
1619
#include "xe_gt_sriov_printk.h"
1720
#include "xe_guc_buf.h"
1821
#include "xe_guc_ct.h"
22+
#include "xe_mmio.h"
1923
#include "xe_sriov.h"
2024
#include "xe_sriov_packet.h"
2125
#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,
358362
return pf_restore_vf_guc_state(gt, vfid, data);
359363
}
360364

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, &gt->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(&gt->mmio, MED_VF_SW_FLAG(n));
387+
else
388+
for (n = 0; n < VF_SW_FLAG_COUNT; n++)
389+
regs[n] = xe_mmio_read32(&gt->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, &gt->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(&gt->mmio, MED_VF_SW_FLAG(n), regs[n]);
409+
else
410+
for (n = 0; n < VF_SW_FLAG_COUNT; n++)
411+
xe_mmio_write32(&gt->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+
361508
/**
362509
* xe_gt_sriov_pf_migration_size() - Total size of migration data from all components within a GT.
363510
* @gt: the &xe_gt
@@ -390,6 +537,13 @@ ssize_t xe_gt_sriov_pf_migration_size(struct xe_gt *gt, unsigned int vfid)
390537
size += sizeof(struct xe_sriov_packet_hdr);
391538
total += size;
392539

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+
393547
return total;
394548
}
395549

@@ -458,6 +612,9 @@ void xe_gt_sriov_pf_migration_save_init(struct xe_gt *gt, unsigned int vfid)
458612

459613
if (pf_migration_ggtt_size(gt, vfid) > 0)
460614
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);
461618
}
462619

463620
/**

drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ int xe_gt_sriov_pf_migration_guc_restore(struct xe_gt *gt, unsigned int vfid,
2222
int xe_gt_sriov_pf_migration_ggtt_save(struct xe_gt *gt, unsigned int vfid);
2323
int xe_gt_sriov_pf_migration_ggtt_restore(struct xe_gt *gt, unsigned int vfid,
2424
struct xe_sriov_packet *data);
25+
int xe_gt_sriov_pf_migration_mmio_save(struct xe_gt *gt, unsigned int vfid);
26+
int xe_gt_sriov_pf_migration_mmio_restore(struct xe_gt *gt, unsigned int vfid,
27+
struct xe_sriov_packet *data);
2528

2629
ssize_t xe_gt_sriov_pf_migration_size(struct xe_gt *gt, unsigned int vfid);
2730

0 commit comments

Comments
 (0)