[PATCH i-g-t 1/4] lib/xe/xe_sriov_provisioning: Add scheduling attributes accessors
Laguna, Lukasz
lukasz.laguna at intel.com
Wed Jan 29 14:07:26 UTC 2025
On 1/20/2025 21:34, Marcin Bernatowicz wrote:
> Add helper functions to get and set SR-IOV provisioning scheduling
> attributes. These functions provide an interface for accessing
> provisioning attributes such as execution quantum, preemption timeout,
> schedule if idle policy, schedule priority, and engine reset policy.
>
> Include both returning and asserting versions to handle errors
> appropriately.
>
> Signed-off-by: Marcin Bernatowicz<marcin.bernatowicz at linux.intel.com>
> Cc: Adam Miszczak<adam.miszczak at linux.intel.com>
> Cc: Jakub Kolakowski<jakub1.kolakowski at intel.com>
> Cc: Lukasz Laguna<lukasz.laguna at intel.com>
> Cc: Michał Wajdeczko<michal.wajdeczko at intel.com>
> Cc: Michał Winiarski<michal.winiarski at intel.com>
> Cc: Narasimha C V<narasimha.c.v at intel.com>
> Cc: Piotr Piórkowski<piotr.piorkowski at intel.com>
> Cc: Satyanarayana K V P<satyanarayana.k.v.p at intel.com>
> Cc: Tomasz Lis<tomasz.lis at intel.com>
> ---
> lib/xe/xe_sriov_provisioning.c | 369 ++++++++++++++++++++++++++++++++-
> lib/xe/xe_sriov_provisioning.h | 53 +++++
> 2 files changed, 421 insertions(+), 1 deletion(-)
>
> diff --git a/lib/xe/xe_sriov_provisioning.c b/lib/xe/xe_sriov_provisioning.c
> index 22035ffd8..4e3fbaae2 100644
> --- a/lib/xe/xe_sriov_provisioning.c
> +++ b/lib/xe/xe_sriov_provisioning.c
> @@ -6,10 +6,11 @@
> #include <errno.h>
>
> #include "igt_core.h"
> +#include "igt_sriov_device.h"
> #include "intel_chipset.h"
> #include "linux_scaffold.h"
> -#include "xe/xe_mmio.h"
> #include "xe/xe_query.h"
> +#include "xe/xe_mmio.h"
> #include "xe/xe_sriov_debugfs.h"
> #include "xe/xe_sriov_provisioning.h"
>
> @@ -296,3 +297,369 @@ bool xe_sriov_is_shared_res_provisionable(int pf, enum xe_sriov_shared_res res,
>
> return true;
> }
> +
> +/**
> + * __xe_sriov_get_exec_quantum_ms - Read the execution quantum in milliseconds for a given VF
> + * @pf: PF device file descriptor
> + * @vf_num: VF number (1-based) or 0 for PF
> + * @gt_num: GT number
> + * @value: Pointer to store the read value
> + *
> + * Reads the execution quantum in milliseconds for the given PF device @pf,
> + * VF number @vf_num on GT @gt_num.
> + *
> + * Return: 0 on success, negative error code on failure.
> + */
> +int __xe_sriov_get_exec_quantum_ms(int pf, unsigned int vf_num,
> + unsigned int gt_num, uint32_t *value)
> +{
> + return __xe_sriov_pf_debugfs_get_u32(pf, vf_num, gt_num, "exec_quantum_ms", value);
> +}
> +
> +/**
> + * xe_sriov_get_exec_quantum_ms - Get the execution quantum in milliseconds for a given VF
> + * @pf: PF device file descriptor
> + * @vf_num: VF number (1-based) or 0 for PF
> + * @gt_num: GT number
> + *
> + * A throwing version of __xe_sriov_get_exec_quantum_ms().
> + * Instead of returning an error code, it returns the value read and
> + * asserts in case of an error.
> + *
> + * Return: Execution quantum in milliseconds assigned to a given VF. Asserts in case of failure.
> + */
> +uint32_t xe_sriov_get_exec_quantum_ms(int pf, unsigned int vf_num,
> + unsigned int gt_num)
> +{
> + uint32_t value;
> +
> + igt_fail_on(__xe_sriov_get_exec_quantum_ms(pf, vf_num, gt_num, &value));
> +
> + return value;
> +}
> +
> +/**
> + * __xe_sriov_set_exec_quantum_ms - Set the execution quantum in milliseconds for a given VF
> + * @pf: PF device file descriptor
> + * @vf_num: VF number (1-based) or 0 for PF
> + * @gt_num: GT number
> + * @value: Value to set
> + *
> + * Sets the execution quantum in milliseconds for the given PF device @pf,
> + * VF number @vf_num on GT @gt_num.
> + *
> + * Return: 0 on success, negative error code on failure.
> + */
> +int __xe_sriov_set_exec_quantum_ms(int pf, unsigned int vf_num,
> + unsigned int gt_num, uint32_t value)
> +{
> + return __xe_sriov_pf_debugfs_set_u32(pf, vf_num, gt_num, "exec_quantum_ms", value);
> +}
> +
> +/**
> + * xe_sriov_set_exec_quantum_ms - Set the execution quantum in milliseconds for a given VF
> + * @pf: PF device file descriptor
> + * @vf_num: VF number (1-based) or 0 for PF
> + * @gt_num: GT number
> + * @value: Value to set
> + *
> + * A throwing version of __xe_sriov_set_exec_quantum_ms().
> + * Instead of returning an error code, it asserts in case of an error.
> + */
> +void xe_sriov_set_exec_quantum_ms(int pf, unsigned int vf_num,
> + unsigned int gt_num, uint32_t value)
> +{
> + igt_fail_on(__xe_sriov_set_exec_quantum_ms(pf, vf_num, gt_num, value));
> +}
> +
> +/**
> + * __xe_sriov_get_preempt_timeout_us - Get the preemption timeout in microseconds for a given VF
> + * @pf: PF device file descriptor
> + * @vf_num: VF number (1-based) or 0 for PF
> + * @gt_num: GT number
> + * @value: Pointer to store the read value
> + *
> + * Reads the preemption timeout in microseconds for the given PF device @pf,
> + * VF number @vf_num on GT @gt_num.
> + *
> + * Return: 0 on success, negative error code on failure.
> + */
> +int __xe_sriov_get_preempt_timeout_us(int pf, unsigned int vf_num,
> + unsigned int gt_num, uint32_t *value)
> +{
> + return __xe_sriov_pf_debugfs_get_u32(pf, vf_num, gt_num, "preempt_timeout_us", value);
> +}
> +
> +/**
> + * xe_sriov_get_preempt_timeout_us - Get the preemption timeout in microseconds for a given VF
> + * @pf: PF device file descriptor
> + * @vf_num: VF number (1-based) or 0 for PF
> + * @gt_num: GT number
> + *
> + * A throwing version of __xe_sriov_get_preempt_timeout_us().
> + * Instead of returning an error code, it returns the value read and
> + * asserts in case of an error.
> + *
> + * Return: Preemption timeout in microseconds assigned to a given VF.
> + * Asserts in case of failure.
> + */
> +uint32_t xe_sriov_get_preempt_timeout_us(int pf, unsigned int vf_num,
> + unsigned int gt_num)
> +{
> + uint32_t value;
> +
> + igt_fail_on(__xe_sriov_get_preempt_timeout_us(pf, vf_num, gt_num, &value));
> +
> + return value;
> +}
> +
> +/**
> + * __xe_sriov_set_preempt_timeout_us - Set the preemption timeout in microseconds for a given VF
> + * @pf: PF device file descriptor
> + * @vf_num: VF number (1-based) or 0 for PF
> + * @gt_num: GT number
> + * @value: Value to set
> + *
> + * Sets the preemption timeout in microseconds for the given PF device @pf,
> + * VF number @vf_num on GT @gt_num.
> + *
> + * Return: 0 on success, negative error code on failure.
> + */
> +int __xe_sriov_set_preempt_timeout_us(int pf, unsigned int vf_num,
> + unsigned int gt_num, uint32_t value)
> +{
> + return __xe_sriov_pf_debugfs_set_u32(pf, vf_num, gt_num, "preempt_timeout_us", value);
> +}
> +
> +/**
> + * xe_sriov_set_preempt_timeout_us - Set the preemption timeout in microseconds for a given VF
> + * @pf: PF device file descriptor
> + * @vf_num: VF number (1-based) or 0 for PF
> + * @gt_num: GT number
> + * @value: Value to set
> + *
> + * A throwing version of __xe_sriov_set_preempt_timeout_us().
> + * Instead of returning an error code, it asserts in case of an error.
> + */
> +void xe_sriov_set_preempt_timeout_us(int pf, unsigned int vf_num,
> + unsigned int gt_num, uint32_t value)
> +{
> + igt_fail_on(__xe_sriov_set_preempt_timeout_us(pf, vf_num, gt_num, value));
> +}
> +
> +/**
> + * __xe_sriov_get_engine_reset - Get the engine reset policy status for a given GT
> + * @pf: PF device file descriptor
> + * @gt_num: GT number
> + * @value: Pointer to store the read engine reset policy status
> + *
> + * Reads the engine reset status for the given PF device @pf on GT @gt_num.
> + *
> + * Return: 0 on success, negative error code on failure.
> + */
> +int __xe_sriov_get_engine_reset(int pf, unsigned int gt_num, bool *value)
> +{
> + return __xe_sriov_pf_debugfs_get_boolean(pf, 0, gt_num, "reset_engine", value);
> +}
> +
> +/**
> + * xe_sriov_get_engine_reset - Get the engine reset policy status for a given GT
> + * @pf: PF device file descriptor
> + * @gt_num: GT number
> + *
> + * A throwing version of __xe_sriov_get_engine_reset().
> + * Instead of returning an error code, it returns the engine reset status
> + * and asserts in case of an error.
> + *
> + * Return: The engine reset status for the given GT.
> + * Asserts in case of failure.
> + */
> +bool xe_sriov_get_engine_reset(int pf, unsigned int gt_num)
> +{
> + bool value;
> +
> + igt_fail_on(__xe_sriov_get_engine_reset(pf, gt_num, &value));
> +
> + return value;
> +}
> +
> +/**
> + * __xe_sriov_set_engine_reset - Set the engine reset policy for a given GT
> + * @pf: PF device file descriptor
> + * @gt_num: GT number
> + * @value: Engine reset policy status to set
> + *
> + * Sets the engine reset policy for the given PF device @pf on GT @gt_num.
> + *
> + * Return: 0 on success, negative error code on failure.
> + */
> +int __xe_sriov_set_engine_reset(int pf, unsigned int gt_num, bool value)
> +{
> + return __xe_sriov_pf_debugfs_set_boolean(pf, 0, gt_num, "reset_engine", value);
> +}
> +
> +/**
> + * xe_sriov_set_engine_reset - Set the engine reset policy for a given GT
> + * @pf: PF device file descriptor
> + * @gt_num: GT number
> + * @value: Engine reset policy status to set
> + *
> + * A throwing version of __xe_sriov_set_engine_reset().
> + * Instead of returning an error code, it asserts in case of an error.
> + */
> +void xe_sriov_set_engine_reset(int pf, unsigned int gt_num, bool value)
> +{
> + igt_fail_on(__xe_sriov_set_engine_reset(pf, gt_num, value));
> +}
> +
> +/**
> + * __xe_sriov_get_sched_if_idle - Get the scheduling if idle policy for a given GT
> + * @pf: PF device file descriptor
> + * @gt_num: GT number
> + * @value: Pointer to store the read scheduling if idle policy status
> + *
> + * Reads the scheduling if idle policy status for the given PF device @pf on GT @gt_num.
> + *
> + * Return: 0 on success, negative error code on failure.
> + */
> +int __xe_sriov_get_sched_if_idle(int pf, unsigned int gt_num, bool *value)
> +{
> + return __xe_sriov_pf_debugfs_get_boolean(pf, 0, gt_num, "sched_if_idle", value);
> +}
> +
> +/**
> + * xe_sriov_get_sched_if_idle - Get the scheduling if idle policy for a given GT
> + * @pf: PF device file descriptor
> + * @gt_num: GT number
> + *
> + * A throwing version of __xe_sriov_get_sched_if_idle().
> + * Instead of returning an error code, it returns the scheduling if idle policy status
> + * and asserts in case of an error.
> + *
> + * Return: The scheduling if idle status for the given GT.
> + * Asserts in case of failure.
> + */
> +bool xe_sriov_get_sched_if_idle(int pf, unsigned int gt_num)
> +{
> + bool value;
> +
> + igt_fail_on(__xe_sriov_get_sched_if_idle(pf, gt_num, &value));
> +
> + return value;
> +}
> +
> +/**
> + * __xe_sriov_set_sched_if_idle - Set the scheduling if idle policy status for a given GT
> + * @pf: PF device file descriptor
> + * @gt_num: GT number
> + * @value: Scheduling if idle policy status to set
> + *
> + * Sets the scheduling if idle policy status for the given PF device @pf on GT @gt_num.
> + *
> + * Return: 0 on success, negative error code on failure.
> + */
> +int __xe_sriov_set_sched_if_idle(int pf, unsigned int gt_num, bool value)
> +{
> + return __xe_sriov_pf_debugfs_set_boolean(pf, 0, gt_num, "sched_if_idle", value);
> +}
> +
> +/**
> + * xe_sriov_set_sched_if_idle - Set the scheduling if idle status policy for a given GT
> + * @pf: PF device file descriptor
> + * @gt_num: GT number
> + * @value: Scheduling if idle policy status to set
> + *
> + * A throwing version of __xe_sriov_set_sched_if_idle().
> + * Instead of returning an error code, it asserts in case of an error.
> + */
> +void xe_sriov_set_sched_if_idle(int pf, unsigned int gt_num, bool value)
> +{
> + igt_fail_on(__xe_sriov_set_sched_if_idle(pf, gt_num, value));
> +}
> +
> +/**
> + * __xe_sriov_get_sched_priority - Get the scheduling priority for a given VF
> + * @pf: PF device file descriptor
> + * @vf_num: VF number (1-based) or 0 for PF
> + * @gt_num: GT number
> + * @value: Pointer to store the read scheduling priority
> + *
> + * Reads the scheduling priority for the given PF device @pf,
> + * VF number @vf_num on GT @gt_num.
> + *
> + * Return: 0 on success, negative error code on failure.
> + */
> +int __xe_sriov_get_sched_priority(int pf, unsigned int vf_num,
> + unsigned int gt_num,
> + enum xe_sriov_sched_priority *value)
> +{
> + uint32_t priority;
> + int ret;
> +
> + ret = __xe_sriov_pf_debugfs_get_u32(pf, vf_num, gt_num, "sched_priority", &priority);
> + if (igt_debug_on_f(ret, "Failed to read sched_priority attribute for GT%u\n", gt_num))
nit: no info about VF number? btw. what is so special about this one
that you decided to add debug message?
> + return ret;
> +
> + if (priority <= XE_SRIOV_SCHED_PRIORITY_HIGH) {
> + *value = (enum xe_sriov_sched_priority)priority;
> + return 0;
> + }
> +
> + return -ERANGE;
> +}
> +
> +/**
> + * xe_sriov_get_sched_priority - Get the scheduling priority for a given VF
> + * @pf: PF device file descriptor
> + * @vf_num: VF number (1-based) or 0 for PF
> + * @gt_num: GT number
> + *
> + * A throwing version of __xe_sriov_get_sched_priority().
> + * Instead of returning an error code, it returns the scheduling priority
> + * and asserts in case of an error.
> + *
> + * Return: The scheduling priority for the given VF and GT.
> + * Asserts in case of failure.
> + */
> +enum xe_sriov_sched_priority
> +xe_sriov_get_sched_priority(int pf, unsigned int vf_num, unsigned int gt_num)
> +{
> + enum xe_sriov_sched_priority priority;
> +
> + igt_fail_on(__xe_sriov_get_sched_priority(pf, vf_num, gt_num, &priority));
> +
> + return priority;
> +}
> +
> +/**
> + * __xe_sriov_set_sched_priority - Set the scheduling priority for a given VF
> + * @pf: PF device file descriptor
> + * @vf_num: VF number (1-based) or 0 for PF
> + * @gt_num: GT number
> + * @value: Scheduling priority to set (enum xe_sriov_sched_priority)
> + *
> + * Sets the scheduling priority for the given PF device @pf, VF number @vf_num on GT @gt_num.
> + *
> + * Return: 0 on success, negative error code on failure.
> + */
> +int __xe_sriov_set_sched_priority(int pf, unsigned int vf_num, unsigned int gt_num,
> + enum xe_sriov_sched_priority value)
> +{
> + return __xe_sriov_pf_debugfs_set_u32(pf, vf_num, gt_num, "sched_priority", value);
> +}
> +
> +/**
> + * xe_sriov_set_sched_priority - Set the scheduling priority for a given VF
> + * @pf: PF device file descriptor
> + * @vf_num: VF number (1-based) or 0 for PF
> + * @gt_num: GT number
> + * @value: Scheduling priority to set (enum xe_sriov_sched_priority)
> + *
> + * A throwing version of __xe_sriov_set_sched_priority().
> + * Instead of returning an error code, it asserts in case of an error.
> + */
> +void xe_sriov_set_sched_priority(int pf, unsigned int vf_num, unsigned int gt_num,
> + enum xe_sriov_sched_priority value)
> +{
> + igt_fail_on(__xe_sriov_set_sched_priority(pf, vf_num, gt_num, value));
> +}
> diff --git a/lib/xe/xe_sriov_provisioning.h b/lib/xe/xe_sriov_provisioning.h
> index b4300ec2e..b22f96d88 100644
> --- a/lib/xe/xe_sriov_provisioning.h
> +++ b/lib/xe/xe_sriov_provisioning.h
> @@ -55,6 +55,26 @@ enum xe_sriov_shared_res {
> for ((res) = 0; (res) < XE_SRIOV_SHARED_RES_NUM; (res)++) \
> for_if(xe_sriov_is_shared_res_provisionable((pf), (res), (gt)))
>
> +/**
> + * enum xe_sriov_sched_priority - SR-IOV scheduling priorities
> + * @XE_SRIOV_SCHED_PRIORITY_LOW: Schedule VF only if it has active work and
> + * VF-State is VF_STATE_RUNNING. This is the
> + * default value.
> + * @XE_SRIOV_SCHED_PRIORITY_NORMAL: Schedule VF always, irrespective of whether
> + * it has work or not, as long as VF-State is
> + * not VF_STATE_DISABLED. Once scheduled, VF
> + * will run for its entire execution quantum.
> + * @XE_SRIOV_SCHED_PRIORITY_HIGH: Schedule VF in the next time-slice after the
> + * current active time-slice completes. VF is
> + * scheduled only if it has work and VF-State is
> + * VF_STATE_RUNNING.
> + */
> +enum xe_sriov_sched_priority {
> + XE_SRIOV_SCHED_PRIORITY_LOW,
> + XE_SRIOV_SCHED_PRIORITY_NORMAL,
> + XE_SRIOV_SCHED_PRIORITY_HIGH
> +};
> +
> /**
> * struct xe_sriov_provisioned_range - Provisioned range for a Virtual Function (VF)
> * @vf_id: The ID of the VF
> @@ -89,5 +109,38 @@ int __xe_sriov_pf_set_shared_res_attr(int pf, enum xe_sriov_shared_res res,
> void xe_sriov_pf_set_shared_res_attr(int pf, enum xe_sriov_shared_res res,
> unsigned int vf_num, unsigned int gt_num,
> uint64_t value);
> +int __xe_sriov_get_exec_quantum_ms(int pf, unsigned int vf_num,
> + unsigned int gt_num, uint32_t *value);
> +uint32_t xe_sriov_get_exec_quantum_ms(int pf, unsigned int vf_num,
> + unsigned int gt_num);
> +int __xe_sriov_set_exec_quantum_ms(int pf, unsigned int vf_num,
> + unsigned int gt_num, uint32_t value);
> +void xe_sriov_set_exec_quantum_ms(int pf, unsigned int vf_num,
> + unsigned int gt_num, uint32_t value);
> +int __xe_sriov_get_preempt_timeout_us(int pf, unsigned int vf_num,
> + unsigned int gt_num, uint32_t *value);
> +uint32_t xe_sriov_get_preempt_timeout_us(int pf, unsigned int vf_num,
> + unsigned int gt_num);
> +int __xe_sriov_set_preempt_timeout_us(int pf, unsigned int vf_num,
> + unsigned int gt_num, uint32_t value);
> +void xe_sriov_set_preempt_timeout_us(int pf, unsigned int vf_num,
> + unsigned int gt_num, uint32_t value);
> +int __xe_sriov_get_engine_reset(int pf, unsigned int gt_num, bool *value);
> +bool xe_sriov_get_engine_reset(int pf, unsigned int gt_num);
> +int __xe_sriov_set_engine_reset(int pf, unsigned int gt_num, bool value);
> +void xe_sriov_set_engine_reset(int pf, unsigned int gt_num, bool value);
> +int __xe_sriov_get_sched_if_idle(int pf, unsigned int gt_num, bool *value);
> +bool xe_sriov_get_sched_if_idle(int pf, unsigned int gt_num);
> +int __xe_sriov_set_sched_if_idle(int pf, unsigned int gt_num, bool value);
> +void xe_sriov_set_sched_if_idle(int pf, unsigned int gt_num, bool value);
> +int __xe_sriov_get_sched_priority(int pf, unsigned int vf_num,
> + unsigned int gt_num,
> + enum xe_sriov_sched_priority *value);
> +enum xe_sriov_sched_priority xe_sriov_get_sched_priority(int pf, unsigned int vf_num,
> + unsigned int gt_num);
> +int __xe_sriov_set_sched_priority(int pf, unsigned int vf_num, unsigned int gt_num,
> + enum xe_sriov_sched_priority value);
> +void xe_sriov_set_sched_priority(int pf, unsigned int vf_num, unsigned int gt_num,
> + enum xe_sriov_sched_priority value);
>
> #endif /* __XE_SRIOV_PROVISIONING_H__ */
One nit, but overall looks good:
Reviewed-by: Lukasz Laguna <lukasz.laguna at intel.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/igt-dev/attachments/20250129/a4ec22c1/attachment-0001.htm>
More information about the igt-dev
mailing list