Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Michal Wajdeczko <michal.wajdeczko@intel.com>
To: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: intel-xe@lists.freedesktop.org
Subject: Re: [PATCH 2/3] drm/xe: Add proper detection of the SR-IOV PF mode
Date: Tue, 9 Apr 2024 20:39:36 +0200	[thread overview]
Message-ID: <e231b006-cd0c-4cd8-a401-2bca79ca13d8@intel.com> (raw)
In-Reply-To: <ZhV_KLj-fMeX2Ggc@intel.com>



On 09.04.2024 19:47, Rodrigo Vivi wrote:
> On Thu, Apr 04, 2024 at 05:44:30PM +0200, Michal Wajdeczko wrote:
>> SR-IOV PF mode detection is based on PCI capability as reported by
>> the PCI dev_is_pf() function and additionally on 'max_vfs' module
>> parameter which could be also used to disable PF capability even
>> if SR-IOV PF capability is reported by the hardware.
>>
>> Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
>> ---
>>  drivers/gpu/drm/xe/Makefile          |  3 +-
>>  drivers/gpu/drm/xe/xe_device_types.h |  4 ++
>>  drivers/gpu/drm/xe/xe_sriov.c        |  3 +
>>  drivers/gpu/drm/xe/xe_sriov_pf.c     | 89 ++++++++++++++++++++++++++++
>>  drivers/gpu/drm/xe/xe_sriov_pf.h     | 24 ++++++++
>>  drivers/gpu/drm/xe/xe_sriov_types.h  | 15 +++++
>>  6 files changed, 137 insertions(+), 1 deletion(-)
>>  create mode 100644 drivers/gpu/drm/xe/xe_sriov_pf.c
>>  create mode 100644 drivers/gpu/drm/xe/xe_sriov_pf.h
>>
>> diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
>> index e5b1715f721e..8d79df05b84f 100644
>> --- a/drivers/gpu/drm/xe/Makefile
>> +++ b/drivers/gpu/drm/xe/Makefile
>> @@ -159,7 +159,8 @@ xe-$(CONFIG_PCI_IOV) += \
>>  	xe_gt_sriov_pf_control.o \
>>  	xe_lmtt.o \
>>  	xe_lmtt_2l.o \
>> -	xe_lmtt_ml.o
>> +	xe_lmtt_ml.o \
>> +	xe_sriov_pf.o
>>  
>>  # include helpers for tests even when XE is built-in
>>  ifdef CONFIG_DRM_XE_KUNIT_TEST
>> diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h
>> index c710cec835a7..8244b177a6a3 100644
>> --- a/drivers/gpu/drm/xe/xe_device_types.h
>> +++ b/drivers/gpu/drm/xe/xe_device_types.h
>> @@ -321,6 +321,10 @@ struct xe_device {
>>  	struct {
>>  		/** @sriov.__mode: SR-IOV mode (Don't access directly!) */
>>  		enum xe_sriov_mode __mode;
>> +
>> +		/** @sriov.pf: PF specific data */
>> +		struct xe_device_pf pf;
>> +
>>  		/** @sriov.wq: workqueue used by the virtualization workers */
>>  		struct workqueue_struct *wq;
>>  	} sriov;
>> diff --git a/drivers/gpu/drm/xe/xe_sriov.c b/drivers/gpu/drm/xe/xe_sriov.c
>> index 3e103edf7174..94fa98d8206e 100644
>> --- a/drivers/gpu/drm/xe/xe_sriov.c
>> +++ b/drivers/gpu/drm/xe/xe_sriov.c
>> @@ -11,6 +11,7 @@
>>  #include "xe_device.h"
>>  #include "xe_mmio.h"
>>  #include "xe_sriov.h"
>> +#include "xe_sriov_pf.h"
>>  
>>  /**
>>   * xe_sriov_mode_to_string - Convert enum value to string.
>> @@ -58,6 +59,8 @@ void xe_sriov_probe_early(struct xe_device *xe)
>>  	if (has_sriov) {
>>  		if (test_is_vf(xe))
>>  			mode = XE_SRIOV_MODE_VF;
>> +		else if (xe_sriov_pf_readiness(xe))
>> +			mode = XE_SRIOV_MODE_PF;
>>  	}
>>  
>>  	xe_assert(xe, !xe->sriov.__mode);
>> diff --git a/drivers/gpu/drm/xe/xe_sriov_pf.c b/drivers/gpu/drm/xe/xe_sriov_pf.c
>> new file mode 100644
>> index 000000000000..030c2b69ecc4
>> --- /dev/null
>> +++ b/drivers/gpu/drm/xe/xe_sriov_pf.c
>> @@ -0,0 +1,89 @@
>> +// SPDX-License-Identifier: MIT
>> +/*
>> + * Copyright © 2023-2024 Intel Corporation
>> + */
>> +
>> +#include "xe_assert.h"
>> +#include "xe_device.h"
>> +#include "xe_module.h"
>> +#include "xe_sriov.h"
>> +#include "xe_sriov_pf.h"
>> +#include "xe_sriov_printk.h"
>> +
>> +static unsigned int wanted_max_vfs(struct xe_device *xe)
>> +{
>> +	return xe_modparam.max_vfs;
>> +}
>> +
>> +static int pf_reduce_totalvfs(struct xe_device *xe, int limit)
>> +{
>> +	struct device *dev = xe->drm.dev;
>> +	struct pci_dev *pdev = to_pci_dev(dev);
>> +	int err;
>> +
>> +	err = pci_sriov_set_totalvfs(pdev, limit);
>> +	if (err)
>> +		xe_sriov_notice(xe, "Failed to set number of VFs to %d (%pe)\n",
>> +				limit, ERR_PTR(err));
>> +	return err;
>> +}
>> +
>> +static bool pf_continue_as_native(struct xe_device *xe, const char *why)
>> +{
>> +	xe_sriov_dbg(xe, "%s, continuing as native\n", why);
>> +	pf_reduce_totalvfs(xe, 0);
>> +	return false;
>> +}
>> +
>> +/**
>> + * xe_sriov_pf_readiness - Check if PF functionality can be enabled.
>> + * @xe: the &xe_device to check
>> + *
>> + * This function is called as part of the SR-IOV probe to validate if all
>> + * PF prerequisites are satisfied and we can continue with enabling PF mode.
>> + *
>> + * Return: true if the PF mode can be turned on.
>> + */
>> +bool xe_sriov_pf_readiness(struct xe_device *xe)
>> +{
>> +	struct device *dev = xe->drm.dev;
>> +	struct pci_dev *pdev = to_pci_dev(dev);
>> +	int totalvfs = pci_sriov_get_totalvfs(pdev);
>> +	int newlimit = min_t(u16, wanted_max_vfs(xe), totalvfs);
>> +
>> +	xe_assert(xe, totalvfs <= U16_MAX);
> 
> perhaps we should do this check before the min_t?

this assert is just to express/confirm SLA with the PCI function

> 
> should we also check what we are getting from the params?

we don't care, param could be any number up to U32_MAX, as we will just
use it to limit what PCI function (and thus our HW) reports

> 
>> +
>> +	if (!dev_is_pf(dev))
>> +		return false;
>> +
>> +	if (!xe_device_uc_enabled(xe))
>> +		return pf_continue_as_native(xe, "Guc submission disabled");
>> +
>> +	if (!newlimit)
>> +		return pf_continue_as_native(xe, "all VFs disabled");
>> +
>> +	pf_reduce_totalvfs(xe, newlimit);
> 
> do we really need to always call this or only when newlimit != totalvfs?

it's harmless to call it even if there is no change as this just updates
internal data in PCI core, does not touch any HW, so one "if" spared

> 
>> +
>> +	xe->sriov.pf.device_total_vfs = totalvfs;
>> +	xe->sriov.pf.driver_max_vfs = newlimit;
>> +
>> +	return true;
>> +}
>> +
>> +/**
>> + * xe_sriov_pf_print_vfs_summary - Print SR-IOV PF information.
>> + * @xe: the &xe_device to print info from
>> + * @p: the &drm_printer
>> + *
>> + * Print SR-IOV PF related information into provided DRM printer.
>> + */
>> +void xe_sriov_pf_print_vfs_summary(struct xe_device *xe, struct drm_printer *p)
>> +{
>> +	struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
>> +
>> +	xe_assert(xe, IS_SRIOV_PF(xe));
>> +
>> +	drm_printf(p, "total: %u\n", xe->sriov.pf.device_total_vfs);
>> +	drm_printf(p, "supported: %u\n", xe->sriov.pf.driver_max_vfs);
>> +	drm_printf(p, "enabled: %u\n", pci_num_vf(pdev));
>> +}
>> diff --git a/drivers/gpu/drm/xe/xe_sriov_pf.h b/drivers/gpu/drm/xe/xe_sriov_pf.h
>> new file mode 100644
>> index 000000000000..ebef2e01838a
>> --- /dev/null
>> +++ b/drivers/gpu/drm/xe/xe_sriov_pf.h
>> @@ -0,0 +1,24 @@
>> +/* SPDX-License-Identifier: MIT */
>> +/*
>> + * Copyright © 2023-2024 Intel Corporation
>> + */
>> +
>> +#ifndef _XE_SRIOV_PF_H_
>> +#define _XE_SRIOV_PF_H_
>> +
>> +#include <linux/types.h>
>> +
>> +struct drm_printer;
>> +struct xe_device;
>> +
>> +#ifdef CONFIG_PCI_IOV
>> +bool xe_sriov_pf_readiness(struct xe_device *xe);
>> +void xe_sriov_pf_print_vfs_summary(struct xe_device *xe, struct drm_printer *p);
>> +#else
>> +static inline bool xe_sriov_pf_readiness(struct xe_device *xe)
>> +{
>> +	return false;
>> +}
> 
> missing the vfs_summary function in this block?!

only xe_sriov_pf_readiness() function will be used regardless of the
CONFIG_PCI_IOV, the other xe_sriov_pf_print_vfs_summary() function and
few more functions (coming soon) will be used only for CONFIG_PCI_IOV=y
and thus will not require empty stubs

> 
>> +#endif
>> +
>> +#endif
>> diff --git a/drivers/gpu/drm/xe/xe_sriov_types.h b/drivers/gpu/drm/xe/xe_sriov_types.h
>> index 1a138108d139..fa583e8fa0c2 100644
>> --- a/drivers/gpu/drm/xe/xe_sriov_types.h
>> +++ b/drivers/gpu/drm/xe/xe_sriov_types.h
>> @@ -7,6 +7,7 @@
>>  #define _XE_SRIOV_TYPES_H_
>>  
>>  #include <linux/build_bug.h>
>> +#include <linux/types.h>
>>  
>>  /**
>>   * VFID - Virtual Function Identifier
>> @@ -37,4 +38,18 @@ enum xe_sriov_mode {
>>  };
>>  static_assert(XE_SRIOV_MODE_NONE);
>>  
>> +/**
>> + * struct xe_device_pf - Xe PF related data
>> + *
>> + * The data in this structure is valid only if driver is running in the
>> + * @XE_SRIOV_MODE_PF mode.
>> + */
>> +struct xe_device_pf {
>> +	/** @device_total_vfs: Maximum number of VFs supported by the device. */
>> +	u16 device_total_vfs;
>> +
>> +	/** @driver_max_vfs: Maximum number of VFs supported by the driver. */
>> +	u16 driver_max_vfs;
>> +};
>> +
>>  #endif
>> -- 
>> 2.43.0
>>

  reply	other threads:[~2024-04-09 18:39 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-04 15:44 [PATCH 0/3] Add proper detection of the SR-IOV PF mode Michal Wajdeczko
2024-04-04 15:44 ` [PATCH 1/3] drm/xe: Add max_vfs module parameter Michal Wajdeczko
2024-04-09 17:47   ` Rodrigo Vivi
2024-04-04 15:44 ` [PATCH 2/3] drm/xe: Add proper detection of the SR-IOV PF mode Michal Wajdeczko
2024-04-09 17:47   ` Rodrigo Vivi
2024-04-09 18:39     ` Michal Wajdeczko [this message]
2024-04-09 18:42       ` Rodrigo Vivi
2024-04-04 15:44 ` [PATCH 3/3] drm/xe: Add SR-IOV info attribute to debugfs Michal Wajdeczko
2024-04-09 17:48   ` Rodrigo Vivi
2024-04-04 17:55 ` ✓ CI.Patch_applied: success for Add proper detection of the SR-IOV PF mode Patchwork
2024-04-04 17:55 ` ✗ CI.checkpatch: warning " Patchwork
2024-04-04 17:56 ` ✓ CI.KUnit: success " Patchwork
2024-04-04 18:08 ` ✓ CI.Build: " Patchwork
2024-04-04 18:10 ` ✓ CI.Hooks: " Patchwork
2024-04-04 18:12 ` ✓ CI.checksparse: " Patchwork
2024-04-04 18:22 ` ✗ CI.BAT: failure " Patchwork
2024-04-04 20:57 ` ✓ CI.Patch_applied: success for Add proper detection of the SR-IOV PF mode (rev2) Patchwork
2024-04-04 20:57 ` ✗ CI.checkpatch: warning " Patchwork
2024-04-04 20:59 ` ✓ CI.KUnit: success " Patchwork
2024-04-04 21:10 ` ✓ CI.Build: " Patchwork
2024-04-04 21:13 ` ✓ CI.Hooks: " Patchwork
2024-04-04 21:14 ` ✓ CI.checksparse: " Patchwork
2024-04-04 21:34 ` ✓ CI.BAT: " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e231b006-cd0c-4cd8-a401-2bca79ca13d8@intel.com \
    --to=michal.wajdeczko@intel.com \
    --cc=intel-xe@lists.freedesktop.org \
    --cc=rodrigo.vivi@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox