[PATCH 4/8] drm/xe/pf: Introduce functions to configure VF thresholds
Michal Wajdeczko
michal.wajdeczko at intel.com
Tue May 14 16:19:37 UTC 2024
On 14.05.2024 10:31, Piotr Piórkowski wrote:
> Michal Wajdeczko <michal.wajdeczko at intel.com> wrote on pon [2024-maj-06 15:38:10 +0200]:
>> The GuC firmware monitors VF's activity and notifies the PF driver
>> once any configured threshold related to such activity is exceeded.
>> Add functions to allow configuration of these thresholds per VF.
>>
>> Signed-off-by: Michal Wajdeczko <michal.wajdeczko at intel.com>
>> ---
>> drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c | 87 +++++++++++++++++++
>> drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h | 6 ++
>> .../gpu/drm/xe/xe_gt_sriov_pf_config_types.h | 4 +
>> 3 files changed, 97 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c
>> index 7eac01e04cc5..fd35375ccd1e 100644
>> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c
>> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c
>> @@ -25,6 +25,7 @@
>> #include "xe_guc_fwif.h"
>> #include "xe_guc_id_mgr.h"
>> #include "xe_guc_klv_helpers.h"
>> +#include "xe_guc_klv_thresholds_set.h"
>> #include "xe_guc_submit.h"
>> #include "xe_lmtt.h"
>> #include "xe_map.h"
>> @@ -208,6 +209,15 @@ static int pf_push_vf_cfg_lmem(struct xe_gt *gt, unsigned int vfid, u64 size)
>> return pf_push_vf_cfg_u64(gt, vfid, GUC_KLV_VF_CFG_LMEM_SIZE_KEY, size);
>> }
>>
>> +static int pf_push_vf_cfg_threshold(struct xe_gt *gt, unsigned int vfid,
>> + enum xe_guc_klv_threshold_index index, u32 value)
>> +{
>> + u32 key = xe_guc_klv_threshold_index_to_key(index);
>> +
>> + xe_gt_assert(gt, key);
>> + return pf_push_vf_cfg_u32(gt, vfid, key, value);
>> +}
>> +
>> static struct xe_gt_sriov_config *pf_pick_vf_config(struct xe_gt *gt, unsigned int vfid)
>> {
>> xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt)));
>> @@ -1748,6 +1758,83 @@ static void pf_reset_config_sched(struct xe_gt *gt, struct xe_gt_sriov_config *c
>> config->preempt_timeout = 0;
>> }
>>
>> +static int pf_provision_threshold(struct xe_gt *gt, unsigned int vfid,
>> + enum xe_guc_klv_threshold_index index, u32 value)
>> +{
>> + struct xe_gt_sriov_config *config = pf_pick_vf_config(gt, vfid);
>> + int err;
>> +
>> + err = pf_push_vf_cfg_threshold(gt, vfid, index, value);
>> + if (unlikely(err))
>> + return err;
>> +
>> + config->thresholds[index] = value;
>> +
>> + return 0;
>> +}
>> +
>> +static int pf_get_threshold(struct xe_gt *gt, unsigned int vfid,
>> + enum xe_guc_klv_threshold_index index)
>> +{
>> + struct xe_gt_sriov_config *config = pf_pick_vf_config(gt, vfid);
>> +
>> + return config->thresholds[index];
>> +}
>> +
>> +static const char *threshold_unit(u32 threshold)
>> +{
>> + return threshold ? "" : "(disabled)";
>> +}
>> +
>> +/**
>> + * xe_gt_sriov_pf_config_set_threshold - Configure threshold for the VF.
>> + * @gt: the &xe_gt
>> + * @vfid: the VF identifier
>> + * @threshold: the threshold index
>> + * @value: requested value (0 means disabled)
>> + *
>> + * This function can only be called on PF.
>> + *
>> + * Return: 0 on success or a negative error code on failure.
>> + */
>> +int xe_gt_sriov_pf_config_set_threshold(struct xe_gt *gt, unsigned int vfid,
>> + enum xe_guc_klv_threshold_index index, u32 value)
>> +{
>> + u32 key = xe_guc_klv_threshold_index_to_key(index);
>> + const char *name = xe_guc_klv_key_to_string(key);
>> + int err;
>> +
>> + mutex_lock(xe_gt_sriov_pf_master_mutex(gt));
>> + err = pf_provision_threshold(gt, vfid, index, value);
>> + mutex_unlock(xe_gt_sriov_pf_master_mutex(gt));
>> +
>> + return pf_config_set_u32_done(gt, vfid, value,
>> + xe_gt_sriov_pf_config_get_threshold(gt, vfid, index),
>> + name, threshold_unit, err);
>> +}
>> +
>> +/**
>> + * xe_gt_sriov_pf_config_get_threshold - Get VF's preemption timeout.
>
> Wrong description.
oops, copy-paste mistake
>
>> + * @gt: the &xe_gt
>> + * @vfid: the VF identifier
>> + * @index: the threshold index
>> + *
>> + * This function can only be called on PF.
>
> If these two functions (set/get) can be called only by PF, then maybe it is worth
> to give somewhere an assert that verifies it ?
there are already few indirect asserts here, first being inside
xe_gt_sriov_pf_master_mutex, and usually I only keep explicit assert
only when accessing some data from xe.sriov.pf or gt.sriov.pf
>
>> + *
>> + * Return: value of VF's (or PF's) threshold.
>> + */
>> +u32 xe_gt_sriov_pf_config_get_threshold(struct xe_gt *gt, unsigned int vfid,
>> + enum xe_guc_klv_threshold_index index)
>> +{
>> + u32 value;
>> +
>> + mutex_lock(xe_gt_sriov_pf_master_mutex(gt));
>> + value = pf_get_threshold(gt, vfid, index);
>> + mutex_unlock(xe_gt_sriov_pf_master_mutex(gt));
>> +
>> + return value;
>> +}
>> +
>> static void pf_release_vf_config(struct xe_gt *gt, unsigned int vfid)
>> {
>> struct xe_gt_sriov_config *config = pf_pick_vf_config(gt, vfid);
>> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h
>> index 5e6b36f00b5b..e8238c1ad06a 100644
>> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h
>> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h
>> @@ -8,6 +8,7 @@
>>
>> #include <linux/types.h>
>>
>> +enum xe_guc_klv_threshold_index;
>> struct drm_printer;
>> struct xe_gt;
>>
>> @@ -43,6 +44,11 @@ u32 xe_gt_sriov_pf_config_get_preempt_timeout(struct xe_gt *gt, unsigned int vfi
>> int xe_gt_sriov_pf_config_set_preempt_timeout(struct xe_gt *gt, unsigned int vfid,
>> u32 preempt_timeout);
>>
>> +u32 xe_gt_sriov_pf_config_get_threshold(struct xe_gt *gt, unsigned int vfid,
>> + enum xe_guc_klv_threshold_index index);
>> +int xe_gt_sriov_pf_config_set_threshold(struct xe_gt *gt, unsigned int vfid,
>> + enum xe_guc_klv_threshold_index index, u32 value);
>> +
>> int xe_gt_sriov_pf_config_set_fair(struct xe_gt *gt, unsigned int vfid, unsigned int num_vfs);
>> int xe_gt_sriov_pf_config_release(struct xe_gt *gt, unsigned int vfid, bool force);
>> int xe_gt_sriov_pf_config_push(struct xe_gt *gt, unsigned int vfid, bool refresh);
>> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config_types.h b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config_types.h
>> index d3745c355957..7bc66656fcc7 100644
>> --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config_types.h
>> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config_types.h
>> @@ -8,6 +8,8 @@
>>
>> #include <drm/drm_mm.h>
>>
>> +#include "xe_guc_klv_thresholds_set_types.h"
>> +
>> struct xe_bo;
>>
>> /**
>> @@ -32,6 +34,8 @@ struct xe_gt_sriov_config {
>> u32 exec_quantum;
>> /** @preempt_timeout: preemption timeout in microseconds. */
>> u32 preempt_timeout;
>> + /** @thresholds: GuC thresholds for adverse events notifications. */
>> + u32 thresholds[XE_GUC_KLV_NUM_THRESHOLDS];
>> };
>
> With fixes:
> Reviewed-by: Piotr Piórkowski <piotr.piorkowski at intel.com>
>
>>
>> /**
>> --
>> 2.43.0
>>
>
More information about the Intel-xe
mailing list