mirror of
https://github.com/torvalds/linux.git
synced 2026-05-21 21:37:25 +02:00
drm/xe/vf: Send RESFIX_DONE message at end of VF restore
After restore, GuC will not answer to any messages from VF KMD until fixups are applied. When that is done, VF KMD sends RESFIX_DONE message to GuC, at which point GuC resumes normal operation. This patch implements sending the RESFIX_DONE message at end of post-migration recovery. v2: keep pm ref during whole recovery, style fixes (Michal) v3: assert removal to separate patch, debug message per GuC instead of one, comments changes (Michal) v4: improve one debug message (Michal) Signed-off-by: Tomasz Lis <tomasz.lis@intel.com> Reviewed-by: Michal Wajdeczko <michal.wajdeczko@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20241104213449.1455694-4-tomasz.lis@intel.com Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
This commit is contained in:
parent
360a1f3e96
commit
1255954d9f
|
|
@ -501,6 +501,44 @@
|
|||
#define VF2GUC_VF_RESET_RESPONSE_MSG_LEN GUC_HXG_RESPONSE_MSG_MIN_LEN
|
||||
#define VF2GUC_VF_RESET_RESPONSE_MSG_0_MBZ GUC_HXG_RESPONSE_MSG_0_DATA0
|
||||
|
||||
/**
|
||||
* DOC: VF2GUC_NOTIFY_RESFIX_DONE
|
||||
*
|
||||
* This action is used by VF to notify the GuC that the VF KMD has completed
|
||||
* post-migration recovery steps.
|
||||
*
|
||||
* This message must be sent as `MMIO HXG Message`_.
|
||||
*
|
||||
* +---+-------+--------------------------------------------------------------+
|
||||
* | | Bits | Description |
|
||||
* +===+=======+==============================================================+
|
||||
* | 0 | 31 | ORIGIN = GUC_HXG_ORIGIN_HOST_ |
|
||||
* | +-------+--------------------------------------------------------------+
|
||||
* | | 30:28 | TYPE = GUC_HXG_TYPE_REQUEST_ |
|
||||
* | +-------+--------------------------------------------------------------+
|
||||
* | | 27:16 | DATA0 = MBZ |
|
||||
* | +-------+--------------------------------------------------------------+
|
||||
* | | 15:0 | ACTION = _`GUC_ACTION_VF2GUC_NOTIFY_RESFIX_DONE` = 0x5508 |
|
||||
* +---+-------+--------------------------------------------------------------+
|
||||
*
|
||||
* +---+-------+--------------------------------------------------------------+
|
||||
* | | Bits | Description |
|
||||
* +===+=======+==============================================================+
|
||||
* | 0 | 31 | ORIGIN = GUC_HXG_ORIGIN_GUC_ |
|
||||
* | +-------+--------------------------------------------------------------+
|
||||
* | | 30:28 | TYPE = GUC_HXG_TYPE_RESPONSE_SUCCESS_ |
|
||||
* | +-------+--------------------------------------------------------------+
|
||||
* | | 27:0 | DATA0 = MBZ |
|
||||
* +---+-------+--------------------------------------------------------------+
|
||||
*/
|
||||
#define GUC_ACTION_VF2GUC_NOTIFY_RESFIX_DONE 0x5508u
|
||||
|
||||
#define VF2GUC_NOTIFY_RESFIX_DONE_REQUEST_MSG_LEN GUC_HXG_REQUEST_MSG_MIN_LEN
|
||||
#define VF2GUC_NOTIFY_RESFIX_DONE_REQUEST_MSG_0_MBZ GUC_HXG_REQUEST_MSG_0_DATA0
|
||||
|
||||
#define VF2GUC_NOTIFY_RESFIX_DONE_RESPONSE_MSG_LEN GUC_HXG_RESPONSE_MSG_MIN_LEN
|
||||
#define VF2GUC_NOTIFY_RESFIX_DONE_RESPONSE_MSG_0_MBZ GUC_HXG_RESPONSE_MSG_0_DATA0
|
||||
|
||||
/**
|
||||
* DOC: VF2GUC_QUERY_SINGLE_KLV
|
||||
*
|
||||
|
|
|
|||
|
|
@ -224,6 +224,44 @@ int xe_gt_sriov_vf_bootstrap(struct xe_gt *gt)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int guc_action_vf_notify_resfix_done(struct xe_guc *guc)
|
||||
{
|
||||
u32 request[GUC_HXG_REQUEST_MSG_MIN_LEN] = {
|
||||
FIELD_PREP(GUC_HXG_MSG_0_ORIGIN, GUC_HXG_ORIGIN_HOST) |
|
||||
FIELD_PREP(GUC_HXG_MSG_0_TYPE, GUC_HXG_TYPE_REQUEST) |
|
||||
FIELD_PREP(GUC_HXG_REQUEST_MSG_0_ACTION, GUC_ACTION_VF2GUC_NOTIFY_RESFIX_DONE),
|
||||
};
|
||||
int ret;
|
||||
|
||||
ret = xe_guc_mmio_send(guc, request, ARRAY_SIZE(request));
|
||||
|
||||
return ret > 0 ? -EPROTO : ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* xe_gt_sriov_vf_notify_resfix_done - Notify GuC about resource fixups apply completed.
|
||||
* @gt: the &xe_gt struct instance linked to target GuC
|
||||
*
|
||||
* Returns: 0 if the operation completed successfully, or a negative error
|
||||
* code otherwise.
|
||||
*/
|
||||
int xe_gt_sriov_vf_notify_resfix_done(struct xe_gt *gt)
|
||||
{
|
||||
struct xe_guc *guc = >->uc.guc;
|
||||
int err;
|
||||
|
||||
xe_gt_assert(gt, IS_SRIOV_VF(gt_to_xe(gt)));
|
||||
|
||||
err = guc_action_vf_notify_resfix_done(guc);
|
||||
if (unlikely(err))
|
||||
xe_gt_sriov_err(gt, "Failed to notify GuC about resource fixup done (%pe)\n",
|
||||
ERR_PTR(err));
|
||||
else
|
||||
xe_gt_sriov_dbg_verbose(gt, "sent GuC resource fixup done\n");
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int guc_action_query_single_klv(struct xe_guc *guc, u32 key,
|
||||
u32 *value, u32 value_len)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ int xe_gt_sriov_vf_query_config(struct xe_gt *gt);
|
|||
int xe_gt_sriov_vf_connect(struct xe_gt *gt);
|
||||
int xe_gt_sriov_vf_query_runtime(struct xe_gt *gt);
|
||||
int xe_gt_sriov_vf_prepare_ggtt(struct xe_gt *gt);
|
||||
int xe_gt_sriov_vf_notify_resfix_done(struct xe_gt *gt);
|
||||
void xe_gt_sriov_vf_migrated_event_handler(struct xe_gt *gt);
|
||||
|
||||
u32 xe_gt_sriov_vf_gmdid(struct xe_gt *gt);
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@
|
|||
#include "xe_assert.h"
|
||||
#include "xe_device.h"
|
||||
#include "xe_gt_sriov_printk.h"
|
||||
#include "xe_gt_sriov_vf.h"
|
||||
#include "xe_pm.h"
|
||||
#include "xe_sriov.h"
|
||||
#include "xe_sriov_printk.h"
|
||||
#include "xe_sriov_vf.h"
|
||||
|
|
@ -130,10 +132,26 @@ void xe_sriov_vf_init_early(struct xe_device *xe)
|
|||
INIT_WORK(&xe->sriov.vf.migration.worker, migration_worker_func);
|
||||
}
|
||||
|
||||
/*
|
||||
* Notify all GuCs about resource fixups apply finished.
|
||||
*/
|
||||
static void vf_post_migration_notify_resfix_done(struct xe_device *xe)
|
||||
{
|
||||
struct xe_gt *gt;
|
||||
unsigned int id;
|
||||
|
||||
for_each_gt(gt, xe, id) {
|
||||
xe_gt_sriov_vf_notify_resfix_done(gt);
|
||||
}
|
||||
}
|
||||
|
||||
static void vf_post_migration_recovery(struct xe_device *xe)
|
||||
{
|
||||
drm_dbg(&xe->drm, "migration recovery in progress\n");
|
||||
xe_pm_runtime_get(xe);
|
||||
/* FIXME: add the recovery steps */
|
||||
vf_post_migration_notify_resfix_done(xe);
|
||||
xe_pm_runtime_put(xe);
|
||||
drm_notice(&xe->drm, "migration recovery ended\n");
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user