Skip to content

Commit 2579764

Browse files
committed
drm/xe/pf: Handle GGTT migration data as part of PF control
Connect the helpers to allow save and restore of GGTT migration data in stop_copy / resume device state. Reviewed-by: Michal Wajdeczko <michal.wajdeczko@intel.com> Link: https://patch.msgid.link/20251112132220.516975-19-michal.winiarski@intel.com Signed-off-by: Michał Winiarski <michal.winiarski@intel.com>
1 parent 624ba6b commit 2579764

3 files changed

Lines changed: 130 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
@@ -868,6 +868,18 @@ static int pf_handle_vf_save_data(struct xe_gt *gt, unsigned int vfid)
868868
return -EAGAIN;
869869
}
870870

871+
if (xe_gt_sriov_pf_migration_save_data_pending(gt, vfid,
872+
XE_SRIOV_PACKET_TYPE_GGTT)) {
873+
ret = xe_gt_sriov_pf_migration_ggtt_save(gt, vfid);
874+
if (ret)
875+
return ret;
876+
877+
xe_gt_sriov_pf_migration_save_data_complete(gt, vfid,
878+
XE_SRIOV_PACKET_TYPE_GGTT);
879+
880+
return -EAGAIN;
881+
}
882+
871883
return 0;
872884
}
873885

@@ -1097,6 +1109,9 @@ static int pf_handle_vf_restore_data(struct xe_gt *gt, unsigned int vfid)
10971109
int ret = 0;
10981110

10991111
switch (data->hdr.type) {
1112+
case XE_SRIOV_PACKET_TYPE_GGTT:
1113+
ret = xe_gt_sriov_pf_migration_ggtt_restore(gt, vfid, data);
1114+
break;
11001115
case XE_SRIOV_PACKET_TYPE_GUC:
11011116
ret = xe_gt_sriov_pf_migration_guc_restore(gt, vfid, data);
11021117
break;

drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.c

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77

88
#include "abi/guc_actions_sriov_abi.h"
99
#include "xe_bo.h"
10+
#include "xe_ggtt.h"
11+
#include "xe_gt.h"
12+
#include "xe_gt_sriov_pf_config.h"
1013
#include "xe_gt_sriov_pf_control.h"
1114
#include "xe_gt_sriov_pf_helpers.h"
1215
#include "xe_gt_sriov_pf_migration.h"
@@ -42,6 +45,105 @@ static void pf_dump_mig_data(struct xe_gt *gt, unsigned int vfid,
4245
}
4346
}
4447

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+
45147
/* Return: number of dwords saved/restored/required or a negative error code on failure */
46148
static int guc_action_vf_save_restore(struct xe_guc *guc, u32 vfid, u32 opcode,
47149
u64 addr, u32 ndwords)
@@ -281,6 +383,13 @@ ssize_t xe_gt_sriov_pf_migration_size(struct xe_gt *gt, unsigned int vfid)
281383
size += sizeof(struct xe_sriov_packet_hdr);
282384
total += size;
283385

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+
284393
return total;
285394
}
286395

@@ -346,6 +455,9 @@ void xe_gt_sriov_pf_migration_save_init(struct xe_gt *gt, unsigned int vfid)
346455

347456
xe_gt_assert(gt, pf_migration_guc_size(gt, vfid) > 0);
348457
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);
349461
}
350462

351463
/**

drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ int xe_gt_sriov_pf_migration_init(struct xe_gt *gt);
1919
int xe_gt_sriov_pf_migration_guc_save(struct xe_gt *gt, unsigned int vfid);
2020
int xe_gt_sriov_pf_migration_guc_restore(struct xe_gt *gt, unsigned int vfid,
2121
struct xe_sriov_packet *data);
22+
int xe_gt_sriov_pf_migration_ggtt_save(struct xe_gt *gt, unsigned int vfid);
23+
int xe_gt_sriov_pf_migration_ggtt_restore(struct xe_gt *gt, unsigned int vfid,
24+
struct xe_sriov_packet *data);
2225

2326
ssize_t xe_gt_sriov_pf_migration_size(struct xe_gt *gt, unsigned int vfid);
2427

0 commit comments

Comments
 (0)