[PATCH 4/8] drm/xe/pf: Introduce functions to configure VF thresholds
Piotr Piórkowski
piotr.piorkowski at intel.com
Tue May 14 08:31:23 UTC 2024
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.
> + * @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 ?
> + *
> + * 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