[PATCH 2/2] drm/xe/vf: Custom GuC initialization if VF
John Harrison
john.c.harrison at intel.com
Mon May 20 22:04:00 UTC 2024
On 5/20/2024 14:50, Michal Wajdeczko wrote:
> On 20.05.2024 23:30, John Harrison wrote:
>> On 5/20/2024 14:23, Michal Wajdeczko wrote:
>>> The GuC firmware is loaded and initialized by the PF driver. Make
>>> sure VF drivers only perform permitted operations. For submission
>>> initialization, use number of GuC context IDs from self config.
>>>
>>> Signed-off-by: Michal Wajdeczko <michal.wajdeczko at intel.com>
>>> ---
>>> drivers/gpu/drm/xe/xe_gt_sriov_vf.c | 17 ++++++++++++
>>> drivers/gpu/drm/xe/xe_gt_sriov_vf.h | 2 ++
>>> drivers/gpu/drm/xe/xe_guc.c | 40 +++++++++++++++++++++++++++++
>>> 3 files changed, 59 insertions(+)
>>>
>>> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
>>> b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
>>> index 378dde5ad4f9..bf4dfe301a71 100644
>>> --- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
>>> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
>>> @@ -408,6 +408,23 @@ int xe_gt_sriov_vf_query_config(struct xe_gt *gt)
>>> return 0;
>>> }
>>> +/**
>>> + * xe_gt_sriov_vf_guc_ids - VF GuC context IDs configuration.
>>> + * @gt: the &xe_gt
>>> + *
>>> + * This function is for VF use only.
>>> + *
>>> + * Return: number of GuC context IDs assigned to VF.
>>> + */
>>> +u16 xe_gt_sriov_vf_guc_ids(struct xe_gt *gt)
>>> +{
>>> + xe_gt_assert(gt, IS_SRIOV_VF(gt_to_xe(gt)));
>>> + xe_gt_assert(gt, gt->sriov.vf.guc_version.major ||
>>> gt->sriov.vf.guc_version.major);
>> I may be going blind but this says 'X || X'? Is the second term supposed
>> to say minor?
> oops, it's me blind (again)
>
>> Is there any need to check past the major version anyway?
>> Xe does not support legacy GuCs from before VF version 1.0.0. So if
>> major is zero, there is a problem.
> this is to make sure that we have completed the GuC handshake (and have
> negotiated major.minor != 0)
Sure, 0.0 is bad but 0.anything is also bad. And anything.0 is valid (if
major is != 0). So simply asserting major !=0 is sufficient.
John.
>
>> John.
>>
>>> + xe_gt_assert(gt, gt->sriov.vf.self_config.num_ctxs);
>>> +
>>> + return gt->sriov.vf.self_config.num_ctxs;
>>> +}
>>> +
>>> static int relay_action_handshake(struct xe_gt *gt, u32 *major, u32
>>> *minor)
>>> {
>>> u32 request[VF2PF_HANDSHAKE_REQUEST_MSG_LEN] = {
>>> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
>>> b/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
>>> index 997cb7541036..d6d37b193d17 100644
>>> --- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
>>> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
>>> @@ -16,6 +16,8 @@ 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);
>>> +u16 xe_gt_sriov_vf_guc_ids(struct xe_gt *gt);
>>> +
>>> void xe_gt_sriov_vf_print_config(struct xe_gt *gt, struct
>>> drm_printer *p);
>>> void xe_gt_sriov_vf_print_runtime(struct xe_gt *gt, struct
>>> drm_printer *p);
>>> void xe_gt_sriov_vf_print_version(struct xe_gt *gt, struct
>>> drm_printer *p);
>>> diff --git a/drivers/gpu/drm/xe/xe_guc.c b/drivers/gpu/drm/xe/xe_guc.c
>>> index 807ad53449e4..cec709a908c3 100644
>>> --- a/drivers/gpu/drm/xe/xe_guc.c
>>> +++ b/drivers/gpu/drm/xe/xe_guc.c
>>> @@ -295,6 +295,23 @@ static int xe_guc_realloc_post_hwconfig(struct
>>> xe_guc *guc)
>>> return 0;
>>> }
>>> +static int vf_guc_init(struct xe_guc *guc)
>>> +{
>>> + int err;
>>> +
>>> + xe_guc_comm_init_early(guc);
>>> +
>>> + err = xe_guc_ct_init(&guc->ct);
>>> + if (err)
>>> + return err;
>>> +
>>> + err = xe_guc_relay_init(&guc->relay);
>>> + if (err)
>>> + return err;
>>> +
>>> + return 0;
>>> +}
>>> +
>>> int xe_guc_init(struct xe_guc *guc)
>>> {
>>> struct xe_device *xe = guc_to_xe(guc);
>>> @@ -309,6 +326,13 @@ int xe_guc_init(struct xe_guc *guc)
>>> if (!xe_uc_fw_is_enabled(&guc->fw))
>>> return 0;
>>> + if (IS_SRIOV_VF(xe)) {
>>> + ret = vf_guc_init(guc);
>>> + if (ret)
>>> + goto out;
>>> + return 0;
>>> + }
>>> +
>>> ret = xe_guc_log_init(&guc->log);
>>> if (ret)
>>> goto out;
>>> @@ -342,6 +366,19 @@ int xe_guc_init(struct xe_guc *guc)
>>> return ret;
>>> }
>>> +static int vf_guc_init_post_hwconfig(struct xe_guc *guc)
>>> +{
>>> + int err;
>>> +
>>> + err = xe_guc_submit_init(guc,
>>> xe_gt_sriov_vf_guc_ids(guc_to_gt(guc)));
>>> + if (err)
>>> + return err;
>>> +
>>> + /* XXX xe_guc_db_mgr_init not needed for now */
>>> +
>>> + return 0;
>>> +}
>>> +
>>> /**
>>> * xe_guc_init_post_hwconfig - initialize GuC post hwconfig load
>>> * @guc: The GuC object
>>> @@ -352,6 +389,9 @@ int xe_guc_init_post_hwconfig(struct xe_guc *guc)
>>> {
>>> int ret;
>>> + if (IS_SRIOV_VF(guc_to_xe(guc)))
>>> + return vf_guc_init_post_hwconfig(guc);
>>> +
>>> ret = xe_guc_realloc_post_hwconfig(guc);
>>> if (ret)
>>> return ret;
More information about the Intel-xe
mailing list