* Re: [PATCH v4 04/28] drm/xe/pf: Add save/restore control state stubs and connect to debugfs
@ 2025-11-05 23:08 kernel test robot
0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2025-11-05 23:08 UTC (permalink / raw)
To: oe-kbuild; +Cc: lkp, Dan Carpenter
BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
In-Reply-To: <20251105151027.540712-5-michal.winiarski@intel.com>
References: <20251105151027.540712-5-michal.winiarski@intel.com>
TO: "Michał Winiarski" <michal.winiarski@intel.com>
TO: Alex Williamson <alex@shazbot.org>
TO: Lucas De Marchi <lucas.demarchi@intel.com>
TO: "Thomas Hellström" <thomas.hellstrom@linux.intel.com>
TO: Rodrigo Vivi <rodrigo.vivi@intel.com>
TO: Jason Gunthorpe <jgg@ziepe.ca>
TO: Yishai Hadas <yishaih@nvidia.com>
TO: Kevin Tian <kevin.tian@intel.com>
TO: Shameer Kolothum <skolothumtho@nvidia.com>
TO: intel-xe@lists.freedesktop.org
TO: linux-kernel@vger.kernel.org
TO: kvm@vger.kernel.org
TO: Matthew Brost <matthew.brost@intel.com>
TO: Michal Wajdeczko <michal.wajdeczko@intel.com>
CC: dri-devel@lists.freedesktop.org
CC: Jani Nikula <jani.nikula@linux.intel.com>
CC: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
CC: Tvrtko Ursulin <tursulin@ursulin.net>
CC: David Airlie <airlied@gmail.com>
CC: Simona Vetter <simona@ffwll.ch>
CC: Lukasz Laguna <lukasz.laguna@intel.com>
CC: Christoph Hellwig <hch@infradead.org>
CC: "Michał Winiarski" <michal.winiarski@intel.com>
Hi Michał,
kernel test robot noticed the following build warnings:
[auto build test WARNING on drm-xe/drm-xe-next]
[also build test WARNING on next-20251105]
[cannot apply to awilliam-vfio/next awilliam-vfio/for-linus drm-i915/for-linux-next drm-i915/for-linux-next-fixes linus/master v6.18-rc4]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Micha-Winiarski/drm-xe-pf-Remove-GuC-version-check-for-migration-support/20251105-234203
base: https://gitlab.freedesktop.org/drm/xe/kernel.git drm-xe-next
patch link: https://lore.kernel.org/r/20251105151027.540712-5-michal.winiarski%40intel.com
patch subject: [PATCH v4 04/28] drm/xe/pf: Add save/restore control state stubs and connect to debugfs
:::::: branch date: 7 hours ago
:::::: commit date: 7 hours ago
config: alpha-randconfig-r072-20251106 (https://download.01.org/0day-ci/archive/20251106/202511060745.V5s5AlIB-lkp@intel.com/config)
compiler: alpha-linux-gcc (GCC) 8.5.0
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202511060745.V5s5AlIB-lkp@intel.com/
smatch warnings:
drivers/gpu/drm/xe/xe_sriov_pf_control.c:198 xe_sriov_pf_control_finish_save_vf() error: uninitialized symbol 'ret'.
drivers/gpu/drm/xe/xe_sriov_pf_control.c:222 xe_sriov_pf_control_trigger_restore_vf() error: uninitialized symbol 'ret'.
drivers/gpu/drm/xe/xe_sriov_pf_control.c:246 xe_sriov_pf_control_finish_restore_vf() error: uninitialized symbol 'ret'.
vim +/ret +198 drivers/gpu/drm/xe/xe_sriov_pf_control.c
33b59ab90959e2 Michał Winiarski 2025-11-05 176
33b59ab90959e2 Michał Winiarski 2025-11-05 177 /**
33b59ab90959e2 Michał Winiarski 2025-11-05 178 * xe_sriov_pf_control_finish_save_vf - Complete a VF migration data SAVE sequence on all GTs.
33b59ab90959e2 Michał Winiarski 2025-11-05 179 * @xe: the &xe_device
33b59ab90959e2 Michał Winiarski 2025-11-05 180 * @vfid: the VF identifier
33b59ab90959e2 Michał Winiarski 2025-11-05 181 *
33b59ab90959e2 Michał Winiarski 2025-11-05 182 * This function is for PF only.
33b59ab90959e2 Michał Winiarski 2025-11-05 183 *
33b59ab90959e2 Michał Winiarski 2025-11-05 184 * Return: 0 on success or a negative error code on failure.
33b59ab90959e2 Michał Winiarski 2025-11-05 185 */
33b59ab90959e2 Michał Winiarski 2025-11-05 186 int xe_sriov_pf_control_finish_save_vf(struct xe_device *xe, unsigned int vfid)
33b59ab90959e2 Michał Winiarski 2025-11-05 187 {
33b59ab90959e2 Michał Winiarski 2025-11-05 188 struct xe_gt *gt;
33b59ab90959e2 Michał Winiarski 2025-11-05 189 unsigned int id;
33b59ab90959e2 Michał Winiarski 2025-11-05 190 int ret;
33b59ab90959e2 Michał Winiarski 2025-11-05 191
33b59ab90959e2 Michał Winiarski 2025-11-05 192 for_each_gt(gt, xe, id) {
33b59ab90959e2 Michał Winiarski 2025-11-05 193 ret = xe_gt_sriov_pf_control_finish_save_vf(gt, vfid);
33b59ab90959e2 Michał Winiarski 2025-11-05 194 if (ret)
33b59ab90959e2 Michał Winiarski 2025-11-05 195 break;
33b59ab90959e2 Michał Winiarski 2025-11-05 196 }
33b59ab90959e2 Michał Winiarski 2025-11-05 197
33b59ab90959e2 Michał Winiarski 2025-11-05 @198 return ret;
33b59ab90959e2 Michał Winiarski 2025-11-05 199 }
33b59ab90959e2 Michał Winiarski 2025-11-05 200
33b59ab90959e2 Michał Winiarski 2025-11-05 201 /**
33b59ab90959e2 Michał Winiarski 2025-11-05 202 * xe_sriov_pf_control_trigger_restore_vf - Start a VF migration data RESTORE sequence on all GTs.
33b59ab90959e2 Michał Winiarski 2025-11-05 203 * @xe: the &xe_device
33b59ab90959e2 Michał Winiarski 2025-11-05 204 * @vfid: the VF identifier
33b59ab90959e2 Michał Winiarski 2025-11-05 205 *
33b59ab90959e2 Michał Winiarski 2025-11-05 206 * This function is for PF only.
33b59ab90959e2 Michał Winiarski 2025-11-05 207 *
33b59ab90959e2 Michał Winiarski 2025-11-05 208 * Return: 0 on success or a negative error code on failure.
33b59ab90959e2 Michał Winiarski 2025-11-05 209 */
33b59ab90959e2 Michał Winiarski 2025-11-05 210 int xe_sriov_pf_control_trigger_restore_vf(struct xe_device *xe, unsigned int vfid)
33b59ab90959e2 Michał Winiarski 2025-11-05 211 {
33b59ab90959e2 Michał Winiarski 2025-11-05 212 struct xe_gt *gt;
33b59ab90959e2 Michał Winiarski 2025-11-05 213 unsigned int id;
33b59ab90959e2 Michał Winiarski 2025-11-05 214 int ret;
33b59ab90959e2 Michał Winiarski 2025-11-05 215
33b59ab90959e2 Michał Winiarski 2025-11-05 216 for_each_gt(gt, xe, id) {
33b59ab90959e2 Michał Winiarski 2025-11-05 217 ret = xe_gt_sriov_pf_control_trigger_restore_vf(gt, vfid);
33b59ab90959e2 Michał Winiarski 2025-11-05 218 if (ret)
33b59ab90959e2 Michał Winiarski 2025-11-05 219 return ret;
33b59ab90959e2 Michał Winiarski 2025-11-05 220 }
33b59ab90959e2 Michał Winiarski 2025-11-05 221
33b59ab90959e2 Michał Winiarski 2025-11-05 @222 return ret;
33b59ab90959e2 Michał Winiarski 2025-11-05 223 }
33b59ab90959e2 Michał Winiarski 2025-11-05 224
33b59ab90959e2 Michał Winiarski 2025-11-05 225 /**
33b59ab90959e2 Michał Winiarski 2025-11-05 226 * xe_sriov_pf_control_wait_restore_vf - Complete a VF migration data RESTORE sequence in all GTs.
33b59ab90959e2 Michał Winiarski 2025-11-05 227 * @xe: the &xe_device
33b59ab90959e2 Michał Winiarski 2025-11-05 228 * @vfid: the VF identifier
33b59ab90959e2 Michał Winiarski 2025-11-05 229 *
33b59ab90959e2 Michał Winiarski 2025-11-05 230 * This function is for PF only.
33b59ab90959e2 Michał Winiarski 2025-11-05 231 *
33b59ab90959e2 Michał Winiarski 2025-11-05 232 * Return: 0 on success or a negative error code on failure.
33b59ab90959e2 Michał Winiarski 2025-11-05 233 */
33b59ab90959e2 Michał Winiarski 2025-11-05 234 int xe_sriov_pf_control_finish_restore_vf(struct xe_device *xe, unsigned int vfid)
33b59ab90959e2 Michał Winiarski 2025-11-05 235 {
33b59ab90959e2 Michał Winiarski 2025-11-05 236 struct xe_gt *gt;
33b59ab90959e2 Michał Winiarski 2025-11-05 237 unsigned int id;
33b59ab90959e2 Michał Winiarski 2025-11-05 238 int ret;
33b59ab90959e2 Michał Winiarski 2025-11-05 239
33b59ab90959e2 Michał Winiarski 2025-11-05 240 for_each_gt(gt, xe, id) {
33b59ab90959e2 Michał Winiarski 2025-11-05 241 ret = xe_gt_sriov_pf_control_finish_restore_vf(gt, vfid);
33b59ab90959e2 Michał Winiarski 2025-11-05 242 if (ret)
33b59ab90959e2 Michał Winiarski 2025-11-05 243 break;
33b59ab90959e2 Michał Winiarski 2025-11-05 244 }
33b59ab90959e2 Michał Winiarski 2025-11-05 245
33b59ab90959e2 Michał Winiarski 2025-11-05 @246 return ret;
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 2+ messages in thread* [PATCH v4 00/28] vfio/xe: Add driver variant for Xe VF migration
@ 2025-11-05 15:09 Michał Winiarski
2025-11-05 15:10 ` [PATCH v4 04/28] drm/xe/pf: Add save/restore control state stubs and connect to debugfs Michał Winiarski
0 siblings, 1 reply; 2+ messages in thread
From: Michał Winiarski @ 2025-11-05 15:09 UTC (permalink / raw)
To: Alex Williamson, Lucas De Marchi, Thomas Hellström,
Rodrigo Vivi, Jason Gunthorpe, Yishai Hadas, Kevin Tian,
Shameer Kolothum, intel-xe, linux-kernel, kvm, Matthew Brost,
Michal Wajdeczko
Cc: dri-devel, Jani Nikula, Joonas Lahtinen, Tvrtko Ursulin,
David Airlie, Simona Vetter, Lukasz Laguna, Christoph Hellwig,
Michał Winiarski
Hi,
This is a fourth round of patches introducing support for Xe SR-IOV VF
migration.
Thanks for all the review feedback.
The most impactful functional change in this revision is a small fix in
GGTT save/restore code, which fixes a regression introduced in v2.
Additionally, error handling is improved on data read/data write path.
On VFIO side, we're now using PCI_DRIVER_OVERRIDE_DEVICE_VFIO as a match
(not using PCI VGA class).
From lines-of-code changed perspective, renaming xe_sriov_migration_data
to xe_sriov_packet caused a bit of churn across multiple patches.
Full changelog can be found below.
Cover letter from the previous revision:
Xe is a DRM driver supporting Intel GPUs and for SR-IOV capable
devices, it enables the creation of SR-IOV VFs.
This series adds xe-vfio-pci driver variant that interacts with Xe
driver to control VF device state and read/write migration data,
allowing it to extend regular vfio-pci functionality with VFIO migration
capability.
The driver doesn't expose PRE_COPY support, as currently supported
hardware lacks the capability to track dirty pages.
While Xe driver already had the capability to manage VF device state,
management of migration data was something that needed to be implemented
and constitutes the majority of the series.
The migration data is processed asynchronously by the Xe driver, and is
organized into multiple migration data packet types representing the
hardware interfaces of the device (GGTT / MMIO / GuC FW / VRAM).
Since the VRAM can potentially be larger than available system memory,
it is copied in multiple chunks. The metadata needed for migration
compatibility decisions is added as part of descriptor packet (currently
limited to PCI device ID / revision).
Xe driver abstracts away the internals of packet processing and takes
care of tracking the position within individual packets.
The API exported to VFIO is similar to API exported by VFIO to
userspace, a simple .read()/.write().
Note that some of the VF resources are not virtualized (e.g. GGTT - the
GFX device global virtual address space). This means that the VF driver
needs to be aware that migration has occurred in order to properly
relocate (patching or reemiting data that contains references to GGTT
addresses) before resuming operation.
The code to handle that is already present in upstream Linux and in
production VF drivers for other OSes.
Links to previous revisions for reference.
v1:
https://lore.kernel.org/lkml/20251011193847.1836454-1-michal.winiarski@intel.com/
v2:
https://lore.kernel.org/lkml/20251021224133.577765-1-michal.winiarski@intel.com/
v3:
https://lore.kernel.org/lkml/20251030203135.337696-1-michal.winiarski@intel.com/
v3 -> v4:
* Add error handling on data_read / data_write path
* Don't match on PCI class, use PCI_DRIVER_OVERRIDE_DEVICE_VFIO helper
instead (Lucas De Marchi)
* Use proper node VMA size inside GGTT save / restore helper (Michał)
* Improve data tracking set_bit / clear_bit wrapper names (Michał)
* Improve packet dump helper (Michał)
* Use drmm for migration mutex init (Michał)
* Rename the pf_device access helper (Michał)
* Use non-interruptible sleep in VRAM copy (Matt)
* Rename xe_sriov_migration_data to xe_sriov_packet along with relevant
functions (Michał)
* Rename per-vf device-level data to xe_sriov_migration_state (Michał)
* Use struct name that matches component name instead of anonymous
struct (Michał)
* Don't add XE_GT_SRIOV_STATE_MAX to state enum, use a helper macro
instead (Michał)
* Kernel-doc fixes (Michał)
v2 -> v3:
* Bind xe-vfio-pci to specific devices instead of using vendor and
class (Christoph Hellwig / Jason Gunthorpe)
* Don't refer to the driver as "vendor specific" (Christoph)
* Use pci_iov_get_pf_drvdata and change the interface to take xe_device
(Jason)
* Update the RUNNING_P2P comment (Jason / Kevin Tian)
* Add state_mutex to protect device state transitions (Kevin)
* Implement .error_detected (Kevin)
* Drop redundant comments (Kevin)
* Explain 1-based indexing and wait_flr_done (Kevin)
* Add a missing get_file() (Kevin)
* Drop redundant state transitions when p2p is supported (Kevin)
* Update run/stop naming to match other drivers (Kevin)
* Fix error state handling (Kevin)
* Fix SAVE state diagram rendering (Michał Wajdeczko)
* Control state machine flipping PROCESS / WAIT logic (Michał Wajdeczko)
* Drop GUC / GGTT / MMIO / VRAM from SAVE control state machine
* Use devm instead of drmm for migration-related allocations (Michał)
* Use GGTT node for size calculations (Michał)
* Use mutex guards consistently (Michał)
* Fix build break on 32-bit (lkp)
* Kernel-doc updates (Michał)
* And other, more minor changes
v1 -> v2:
* Do not require debug flag to support migration on PTL/BMG
* Fix PCI class match on VFIO side
* Reorganized PF Control state machine (Michał Wajdeczko)
* Kerneldoc tidying (Michał Wajdeczko)
* Return NULL instead of -ENODATA for produce/consume (Michał Wajdeczko)
* guc_buf s/sync/sync_read (Matt Brost)
* Squash patch 03 (Matt Brost)
* Assert on PM ref instead of taking it (Matt Brost)
* Remove CCS completely (Matt Brost)
* Return ptr on guc_buf_sync_read (Michał Wajdeczko)
* Define default guc_buf size (Michał Wajdeczko)
* Drop CONFIG_PCI_IOV=n stubs where not needed (Michał Wajdeczko)
* And other, more minor changes
Lukasz Laguna (2):
drm/xe/pf: Add helper to retrieve VF's LMEM object
drm/xe/migrate: Add function to copy of VRAM data in chunks
Michał Winiarski (26):
drm/xe/pf: Remove GuC version check for migration support
drm/xe: Move migration support to device-level struct
drm/xe/pf: Convert control state to bitmap
drm/xe/pf: Add save/restore control state stubs and connect to debugfs
drm/xe/pf: Add data structures and handlers for migration rings
drm/xe/pf: Add helpers for migration data packet allocation / free
drm/xe/pf: Add support for encap/decap of bitstream to/from packet
drm/xe/pf: Add minimalistic migration descriptor
drm/xe/pf: Expose VF migration data size over debugfs
drm/xe: Add sa/guc_buf_cache sync interface
drm/xe: Allow the caller to pass guc_buf_cache size
drm/xe/pf: Increase PF GuC Buffer Cache size and use it for VF
migration
drm/xe/pf: Remove GuC migration data save/restore from GT debugfs
drm/xe/pf: Don't save GuC VF migration data on pause
drm/xe/pf: Switch VF migration GuC save/restore to struct migration
data
drm/xe/pf: Handle GuC migration data as part of PF control
drm/xe/pf: Add helpers for VF GGTT migration data handling
drm/xe/pf: Handle GGTT migration data as part of PF control
drm/xe/pf: Handle MMIO migration data as part of PF control
drm/xe/pf: Handle VRAM migration data as part of PF control
drm/xe/pf: Add wait helper for VF FLR
drm/xe/pf: Enable SR-IOV VF migration
drm/xe/pci: Introduce a helper to allow VF access to PF xe_device
drm/xe/pf: Export helpers for VFIO
drm/intel/bmg: Allow device ID usage with single-argument macros
vfio/xe: Add device specific vfio_pci driver variant for Intel
graphics
MAINTAINERS | 7 +
drivers/gpu/drm/xe/Makefile | 4 +
drivers/gpu/drm/xe/xe_ggtt.c | 104 ++
drivers/gpu/drm/xe/xe_ggtt.h | 4 +
drivers/gpu/drm/xe/xe_ggtt_types.h | 2 +
drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c | 78 ++
drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h | 6 +
drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c | 648 ++++++++++-
drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h | 10 +
.../gpu/drm/xe/xe_gt_sriov_pf_control_types.h | 34 +-
drivers/gpu/drm/xe/xe_gt_sriov_pf_debugfs.c | 47 -
drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.c | 1001 +++++++++++++----
drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.h | 48 +-
.../drm/xe/xe_gt_sriov_pf_migration_types.h | 34 +-
drivers/gpu/drm/xe/xe_gt_sriov_pf_types.h | 5 +-
drivers/gpu/drm/xe/xe_guc.c | 13 +-
drivers/gpu/drm/xe/xe_guc_buf.c | 57 +-
drivers/gpu/drm/xe/xe_guc_buf.h | 2 +
drivers/gpu/drm/xe/xe_migrate.c | 128 ++-
drivers/gpu/drm/xe/xe_migrate.h | 8 +
drivers/gpu/drm/xe/xe_pci.c | 17 +
drivers/gpu/drm/xe/xe_pci.h | 3 +
drivers/gpu/drm/xe/xe_sa.c | 21 +
drivers/gpu/drm/xe/xe_sa.h | 1 +
drivers/gpu/drm/xe/xe_sriov_packet.c | 510 +++++++++
drivers/gpu/drm/xe/xe_sriov_packet.h | 38 +
drivers/gpu/drm/xe/xe_sriov_pf.c | 5 +
drivers/gpu/drm/xe/xe_sriov_pf_control.c | 128 +++
drivers/gpu/drm/xe/xe_sriov_pf_control.h | 5 +
drivers/gpu/drm/xe/xe_sriov_pf_debugfs.c | 101 ++
drivers/gpu/drm/xe/xe_sriov_pf_migration.c | 343 ++++++
drivers/gpu/drm/xe/xe_sriov_pf_migration.h | 29 +
.../gpu/drm/xe/xe_sriov_pf_migration_types.h | 75 ++
drivers/gpu/drm/xe/xe_sriov_pf_types.h | 6 +
drivers/gpu/drm/xe/xe_sriov_vfio.c | 247 ++++
drivers/vfio/pci/Kconfig | 2 +
drivers/vfio/pci/Makefile | 2 +
drivers/vfio/pci/xe/Kconfig | 12 +
drivers/vfio/pci/xe/Makefile | 3 +
drivers/vfio/pci/xe/main.c | 556 +++++++++
include/drm/intel/pciids.h | 2 +-
include/drm/intel/xe_sriov_vfio.h | 30 +
42 files changed, 4048 insertions(+), 328 deletions(-)
create mode 100644 drivers/gpu/drm/xe/xe_sriov_packet.c
create mode 100644 drivers/gpu/drm/xe/xe_sriov_packet.h
create mode 100644 drivers/gpu/drm/xe/xe_sriov_pf_migration.c
create mode 100644 drivers/gpu/drm/xe/xe_sriov_pf_migration.h
create mode 100644 drivers/gpu/drm/xe/xe_sriov_pf_migration_types.h
create mode 100644 drivers/gpu/drm/xe/xe_sriov_vfio.c
create mode 100644 drivers/vfio/pci/xe/Kconfig
create mode 100644 drivers/vfio/pci/xe/Makefile
create mode 100644 drivers/vfio/pci/xe/main.c
create mode 100644 include/drm/intel/xe_sriov_vfio.h
--
2.51.2
^ permalink raw reply [flat|nested] 2+ messages in thread* [PATCH v4 04/28] drm/xe/pf: Add save/restore control state stubs and connect to debugfs 2025-11-05 15:09 [PATCH v4 00/28] vfio/xe: Add driver variant for Xe VF migration Michał Winiarski @ 2025-11-05 15:10 ` Michał Winiarski 0 siblings, 0 replies; 2+ messages in thread From: Michał Winiarski @ 2025-11-05 15:10 UTC (permalink / raw) To: Alex Williamson, Lucas De Marchi, Thomas Hellström, Rodrigo Vivi, Jason Gunthorpe, Yishai Hadas, Kevin Tian, Shameer Kolothum, intel-xe, linux-kernel, kvm, Matthew Brost, Michal Wajdeczko Cc: dri-devel, Jani Nikula, Joonas Lahtinen, Tvrtko Ursulin, David Airlie, Simona Vetter, Lukasz Laguna, Christoph Hellwig, Michał Winiarski The states will be used by upcoming changes to produce (in case of save) or consume (in case of resume) the VF migration data. Signed-off-by: Michał Winiarski <michal.winiarski@intel.com> Reviewed-by: Michal Wajdeczko <michal.wajdeczko@intel.com> --- drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c | 248 ++++++++++++++++++ drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h | 4 + .../gpu/drm/xe/xe_gt_sriov_pf_control_types.h | 14 + drivers/gpu/drm/xe/xe_sriov_pf_control.c | 96 +++++++ drivers/gpu/drm/xe/xe_sriov_pf_control.h | 4 + drivers/gpu/drm/xe/xe_sriov_pf_debugfs.c | 38 +++ 6 files changed, 404 insertions(+) diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c index 8a2577fda4198..a571e1c02a3b4 100644 --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c @@ -184,6 +184,12 @@ static const char *control_bit_to_string(enum xe_gt_sriov_control_bits bit) CASE2STR(PAUSE_SAVE_GUC); CASE2STR(PAUSE_FAILED); CASE2STR(PAUSED); + CASE2STR(SAVE_WIP); + CASE2STR(SAVE_FAILED); + CASE2STR(SAVED); + CASE2STR(RESTORE_WIP); + CASE2STR(RESTORE_FAILED); + CASE2STR(RESTORED); CASE2STR(RESUME_WIP); CASE2STR(RESUME_SEND_RESUME); CASE2STR(RESUME_FAILED); @@ -208,6 +214,8 @@ static unsigned long pf_get_default_timeout(enum xe_gt_sriov_control_bits bit) case XE_GT_SRIOV_STATE_FLR_WIP: case XE_GT_SRIOV_STATE_FLR_RESET_CONFIG: return 5 * HZ; + case XE_GT_SRIOV_STATE_RESTORE_WIP: + return 20 * HZ; default: return HZ; } @@ -329,6 +337,8 @@ static void pf_exit_vf_mismatch(struct xe_gt *gt, unsigned int vfid) pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSE_FAILED); pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUME_FAILED); pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_FAILED); + pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_SAVE_FAILED); + pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESTORE_FAILED); } #define pf_enter_vf_state_machine_bug(gt, vfid) ({ \ @@ -359,6 +369,8 @@ static void pf_queue_vf(struct xe_gt *gt, unsigned int vfid) static void pf_exit_vf_flr_wip(struct xe_gt *gt, unsigned int vfid); static void pf_exit_vf_stop_wip(struct xe_gt *gt, unsigned int vfid); +static void pf_exit_vf_save_wip(struct xe_gt *gt, unsigned int vfid); +static void pf_exit_vf_restore_wip(struct xe_gt *gt, unsigned int vfid); static void pf_exit_vf_pause_wip(struct xe_gt *gt, unsigned int vfid); static void pf_exit_vf_resume_wip(struct xe_gt *gt, unsigned int vfid); @@ -380,6 +392,8 @@ static void pf_exit_vf_wip(struct xe_gt *gt, unsigned int vfid) pf_exit_vf_flr_wip(gt, vfid); pf_exit_vf_stop_wip(gt, vfid); + pf_exit_vf_save_wip(gt, vfid); + pf_exit_vf_restore_wip(gt, vfid); pf_exit_vf_pause_wip(gt, vfid); pf_exit_vf_resume_wip(gt, vfid); @@ -399,6 +413,8 @@ static void pf_enter_vf_ready(struct xe_gt *gt, unsigned int vfid) pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED); pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOPPED); pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUMED); + pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_SAVED); + pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESTORED); pf_exit_vf_mismatch(gt, vfid); pf_exit_vf_wip(gt, vfid); } @@ -675,6 +691,8 @@ static void pf_enter_vf_resumed(struct xe_gt *gt, unsigned int vfid) { pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUMED); pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED); + pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_SAVED); + pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESTORED); pf_exit_vf_mismatch(gt, vfid); pf_exit_vf_wip(gt, vfid); } @@ -753,6 +771,16 @@ int xe_gt_sriov_pf_control_resume_vf(struct xe_gt *gt, unsigned int vfid) return -EPERM; } + if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_SAVE_WIP)) { + xe_gt_sriov_dbg(gt, "VF%u save is in progress!\n", vfid); + return -EBUSY; + } + + if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESTORE_WIP)) { + xe_gt_sriov_dbg(gt, "VF%u restore is in progress!\n", vfid); + return -EBUSY; + } + if (!pf_enter_vf_resume_wip(gt, vfid)) { xe_gt_sriov_dbg(gt, "VF%u resume already in progress!\n", vfid); return -EALREADY; @@ -776,6 +804,218 @@ int xe_gt_sriov_pf_control_resume_vf(struct xe_gt *gt, unsigned int vfid) return -ECANCELED; } +static void pf_exit_vf_save_wip(struct xe_gt *gt, unsigned int vfid) +{ + pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_SAVE_WIP); +} + +static void pf_enter_vf_saved(struct xe_gt *gt, unsigned int vfid) +{ + if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_SAVED)) + pf_enter_vf_state_machine_bug(gt, vfid); + + xe_gt_sriov_dbg(gt, "VF%u saved!\n", vfid); + + pf_expect_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED); + pf_exit_vf_mismatch(gt, vfid); + pf_exit_vf_wip(gt, vfid); +} + +static bool pf_handle_vf_save(struct xe_gt *gt, unsigned int vfid) +{ + if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_SAVE_WIP)) + return false; + + pf_enter_vf_saved(gt, vfid); + + return true; +} + +static bool pf_enter_vf_save_wip(struct xe_gt *gt, unsigned int vfid) +{ + if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_SAVE_WIP)) { + pf_enter_vf_wip(gt, vfid); + pf_queue_vf(gt, vfid); + return true; + } + + return false; +} + +/** + * xe_gt_sriov_pf_control_trigger_save_vf() - Start an SR-IOV VF migration data save sequence. + * @gt: the &xe_gt + * @vfid: the VF identifier + * + * This function is for PF only. + * + * Return: 0 on success or a negative error code on failure. + */ +int xe_gt_sriov_pf_control_trigger_save_vf(struct xe_gt *gt, unsigned int vfid) +{ + if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOPPED)) { + xe_gt_sriov_dbg(gt, "VF%u is stopped!\n", vfid); + return -EPERM; + } + + if (!pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED)) { + xe_gt_sriov_dbg(gt, "VF%u is not paused!\n", vfid); + return -EPERM; + } + + if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESTORE_WIP)) { + xe_gt_sriov_dbg(gt, "VF%u restore is in progress!\n", vfid); + return -EBUSY; + } + + if (!pf_enter_vf_save_wip(gt, vfid)) { + xe_gt_sriov_dbg(gt, "VF%u save already in progress!\n", vfid); + return -EALREADY; + } + + return 0; +} + +/** + * xe_gt_sriov_pf_control_finish_save_vf() - Complete a VF migration data save sequence. + * @gt: the &xe_gt + * @vfid: the VF identifier + * + * This function is for PF only. + * + * Return: 0 on success or a negative error code on failure. + */ +int xe_gt_sriov_pf_control_finish_save_vf(struct xe_gt *gt, unsigned int vfid) +{ + if (!pf_expect_vf_state(gt, vfid, XE_GT_SRIOV_STATE_SAVED)) { + pf_enter_vf_mismatch(gt, vfid); + return -EIO; + } + + pf_expect_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED); + + return 0; +} + +static void pf_exit_vf_restore_wip(struct xe_gt *gt, unsigned int vfid) +{ + pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESTORE_WIP); +} + +static void pf_enter_vf_restored(struct xe_gt *gt, unsigned int vfid) +{ + if (!pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESTORED)) + pf_enter_vf_state_machine_bug(gt, vfid); + + xe_gt_sriov_dbg(gt, "VF%u restored!\n", vfid); + + pf_expect_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED); + pf_exit_vf_mismatch(gt, vfid); + pf_exit_vf_wip(gt, vfid); +} + +static bool pf_handle_vf_restore(struct xe_gt *gt, unsigned int vfid) +{ + if (!pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESTORE_WIP)) + return false; + + pf_enter_vf_restored(gt, vfid); + + return true; +} + +static bool pf_enter_vf_restore_wip(struct xe_gt *gt, unsigned int vfid) +{ + if (pf_enter_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESTORE_WIP)) { + pf_enter_vf_wip(gt, vfid); + pf_queue_vf(gt, vfid); + return true; + } + + return false; +} + +/** + * xe_gt_sriov_pf_control_trigger restore_vf() - Start an SR-IOV VF migration data restore sequence. + * @gt: the &xe_gt + * @vfid: the VF identifier + * + * This function is for PF only. + * + * Return: 0 on success or a negative error code on failure. + */ +int xe_gt_sriov_pf_control_trigger_restore_vf(struct xe_gt *gt, unsigned int vfid) +{ + if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_STOPPED)) { + xe_gt_sriov_dbg(gt, "VF%u is stopped!\n", vfid); + return -EPERM; + } + + if (!pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED)) { + xe_gt_sriov_dbg(gt, "VF%u is not paused!\n", vfid); + return -EPERM; + } + + if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_SAVE_WIP)) { + xe_gt_sriov_dbg(gt, "VF%u save is in progress!\n", vfid); + return -EBUSY; + } + + if (!pf_enter_vf_restore_wip(gt, vfid)) { + xe_gt_sriov_dbg(gt, "VF%u restore already in progress!\n", vfid); + return -EALREADY; + } + + return 0; +} + +static int pf_wait_vf_restore_done(struct xe_gt *gt, unsigned int vfid) +{ + unsigned long timeout = pf_get_default_timeout(XE_GT_SRIOV_STATE_RESTORE_WIP); + int err; + + err = pf_wait_vf_wip_done(gt, vfid, timeout); + if (err) { + xe_gt_sriov_notice(gt, "VF%u RESTORE didn't finish in %u ms (%pe)\n", + vfid, jiffies_to_msecs(timeout), ERR_PTR(err)); + return err; + } + + if (!pf_expect_vf_not_state(gt, vfid, XE_GT_SRIOV_STATE_RESTORE_FAILED)) + return -EIO; + + return 0; +} + +/** + * xe_gt_sriov_pf_control_finish_restore_vf() - Complete a VF migration data restore sequence. + * @gt: the &xe_gt + * @vfid: the VF identifier + * + * This function is for PF only. + * + * Return: 0 on success or a negative error code on failure. + */ +int xe_gt_sriov_pf_control_finish_restore_vf(struct xe_gt *gt, unsigned int vfid) +{ + int ret; + + if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESTORE_WIP)) { + ret = pf_wait_vf_restore_done(gt, vfid); + if (ret) + return ret; + } + + if (!pf_expect_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESTORED)) { + pf_enter_vf_mismatch(gt, vfid); + return -EIO; + } + + pf_expect_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED); + + return 0; +} + /** * DOC: The VF STOP state machine * @@ -817,6 +1057,8 @@ static void pf_enter_vf_stopped(struct xe_gt *gt, unsigned int vfid) pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESUMED); pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_PAUSED); + pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_SAVED); + pf_exit_vf_state(gt, vfid, XE_GT_SRIOV_STATE_RESTORED); pf_exit_vf_mismatch(gt, vfid); pf_exit_vf_wip(gt, vfid); } @@ -1463,6 +1705,12 @@ static bool pf_process_vf_state_machine(struct xe_gt *gt, unsigned int vfid) if (pf_exit_vf_pause_save_guc(gt, vfid)) return true; + if (pf_handle_vf_save(gt, vfid)) + return true; + + if (pf_handle_vf_restore(gt, vfid)) + return true; + if (pf_exit_vf_resume_send_resume(gt, vfid)) return true; diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h index 8a72ef3778d47..0286536375d17 100644 --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h @@ -16,6 +16,10 @@ void xe_gt_sriov_pf_control_restart(struct xe_gt *gt); int xe_gt_sriov_pf_control_pause_vf(struct xe_gt *gt, unsigned int vfid); int xe_gt_sriov_pf_control_resume_vf(struct xe_gt *gt, unsigned int vfid); +int xe_gt_sriov_pf_control_trigger_save_vf(struct xe_gt *gt, unsigned int vfid); +int xe_gt_sriov_pf_control_finish_save_vf(struct xe_gt *gt, unsigned int vfid); +int xe_gt_sriov_pf_control_trigger_restore_vf(struct xe_gt *gt, unsigned int vfid); +int xe_gt_sriov_pf_control_finish_restore_vf(struct xe_gt *gt, unsigned int vfid); int xe_gt_sriov_pf_control_stop_vf(struct xe_gt *gt, unsigned int vfid); int xe_gt_sriov_pf_control_trigger_flr(struct xe_gt *gt, unsigned int vfid); int xe_gt_sriov_pf_control_sync_flr(struct xe_gt *gt, unsigned int vfid, bool sync); diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h index d9282eb259727..c0ce05818e24f 100644 --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h @@ -31,6 +31,12 @@ * @XE_GT_SRIOV_STATE_PAUSE_SAVE_GUC: indicates that the PF needs to save the VF GuC state. * @XE_GT_SRIOV_STATE_PAUSE_FAILED: indicates that a VF pause operation has failed. * @XE_GT_SRIOV_STATE_PAUSED: indicates that the VF is paused. + * @XE_GT_SRIOV_STATE_SAVE_WIP: indicates that VF save operation is in progress. + * @XE_GT_SRIOV_STATE_SAVE_FAILED: indicates that VF save operation has failed. + * @XE_GT_SRIOV_STATE_SAVED: indicates that VF data is saved. + * @XE_GT_SRIOV_STATE_RESTORE_WIP: indicates that VF restore operation is in progress. + * @XE_GT_SRIOV_STATE_RESTORE_FAILED: indicates that VF restore operation has failed. + * @XE_GT_SRIOV_STATE_RESTORED: indicates that VF data is restored. * @XE_GT_SRIOV_STATE_RESUME_WIP: indicates the a VF resume operation is in progress. * @XE_GT_SRIOV_STATE_RESUME_SEND_RESUME: indicates that the PF is about to send RESUME command. * @XE_GT_SRIOV_STATE_RESUME_FAILED: indicates that a VF resume operation has failed. @@ -63,6 +69,14 @@ enum xe_gt_sriov_control_bits { XE_GT_SRIOV_STATE_PAUSE_FAILED, XE_GT_SRIOV_STATE_PAUSED, + XE_GT_SRIOV_STATE_SAVE_WIP, + XE_GT_SRIOV_STATE_SAVE_FAILED, + XE_GT_SRIOV_STATE_SAVED, + + XE_GT_SRIOV_STATE_RESTORE_WIP, + XE_GT_SRIOV_STATE_RESTORE_FAILED, + XE_GT_SRIOV_STATE_RESTORED, + XE_GT_SRIOV_STATE_RESUME_WIP, XE_GT_SRIOV_STATE_RESUME_SEND_RESUME, XE_GT_SRIOV_STATE_RESUME_FAILED, diff --git a/drivers/gpu/drm/xe/xe_sriov_pf_control.c b/drivers/gpu/drm/xe/xe_sriov_pf_control.c index 416d00a03fbb7..8d8a01faf5291 100644 --- a/drivers/gpu/drm/xe/xe_sriov_pf_control.c +++ b/drivers/gpu/drm/xe/xe_sriov_pf_control.c @@ -149,3 +149,99 @@ int xe_sriov_pf_control_sync_flr(struct xe_device *xe, unsigned int vfid) return 0; } + +/** + * xe_sriov_pf_control_trigger_save_vf - Start a VF migration data SAVE sequence on all GTs. + * @xe: the &xe_device + * @vfid: the VF identifier + * + * This function is for PF only. + * + * Return: 0 on success or a negative error code on failure. + */ +int xe_sriov_pf_control_trigger_save_vf(struct xe_device *xe, unsigned int vfid) +{ + struct xe_gt *gt; + unsigned int id; + int ret; + + for_each_gt(gt, xe, id) { + ret = xe_gt_sriov_pf_control_trigger_save_vf(gt, vfid); + if (ret) + return ret; + } + + return 0; +} + +/** + * xe_sriov_pf_control_finish_save_vf - Complete a VF migration data SAVE sequence on all GTs. + * @xe: the &xe_device + * @vfid: the VF identifier + * + * This function is for PF only. + * + * Return: 0 on success or a negative error code on failure. + */ +int xe_sriov_pf_control_finish_save_vf(struct xe_device *xe, unsigned int vfid) +{ + struct xe_gt *gt; + unsigned int id; + int ret; + + for_each_gt(gt, xe, id) { + ret = xe_gt_sriov_pf_control_finish_save_vf(gt, vfid); + if (ret) + break; + } + + return ret; +} + +/** + * xe_sriov_pf_control_trigger_restore_vf - Start a VF migration data RESTORE sequence on all GTs. + * @xe: the &xe_device + * @vfid: the VF identifier + * + * This function is for PF only. + * + * Return: 0 on success or a negative error code on failure. + */ +int xe_sriov_pf_control_trigger_restore_vf(struct xe_device *xe, unsigned int vfid) +{ + struct xe_gt *gt; + unsigned int id; + int ret; + + for_each_gt(gt, xe, id) { + ret = xe_gt_sriov_pf_control_trigger_restore_vf(gt, vfid); + if (ret) + return ret; + } + + return ret; +} + +/** + * xe_sriov_pf_control_wait_restore_vf - Complete a VF migration data RESTORE sequence in all GTs. + * @xe: the &xe_device + * @vfid: the VF identifier + * + * This function is for PF only. + * + * Return: 0 on success or a negative error code on failure. + */ +int xe_sriov_pf_control_finish_restore_vf(struct xe_device *xe, unsigned int vfid) +{ + struct xe_gt *gt; + unsigned int id; + int ret; + + for_each_gt(gt, xe, id) { + ret = xe_gt_sriov_pf_control_finish_restore_vf(gt, vfid); + if (ret) + break; + } + + return ret; +} diff --git a/drivers/gpu/drm/xe/xe_sriov_pf_control.h b/drivers/gpu/drm/xe/xe_sriov_pf_control.h index 2d52d0ac1b28f..30318c1fba34e 100644 --- a/drivers/gpu/drm/xe/xe_sriov_pf_control.h +++ b/drivers/gpu/drm/xe/xe_sriov_pf_control.h @@ -13,5 +13,9 @@ int xe_sriov_pf_control_resume_vf(struct xe_device *xe, unsigned int vfid); int xe_sriov_pf_control_stop_vf(struct xe_device *xe, unsigned int vfid); int xe_sriov_pf_control_reset_vf(struct xe_device *xe, unsigned int vfid); int xe_sriov_pf_control_sync_flr(struct xe_device *xe, unsigned int vfid); +int xe_sriov_pf_control_trigger_save_vf(struct xe_device *xe, unsigned int vfid); +int xe_sriov_pf_control_finish_save_vf(struct xe_device *xe, unsigned int vfid); +int xe_sriov_pf_control_trigger_restore_vf(struct xe_device *xe, unsigned int vfid); +int xe_sriov_pf_control_finish_restore_vf(struct xe_device *xe, unsigned int vfid); #endif diff --git a/drivers/gpu/drm/xe/xe_sriov_pf_debugfs.c b/drivers/gpu/drm/xe/xe_sriov_pf_debugfs.c index a81aa05c55326..e0e6340c49106 100644 --- a/drivers/gpu/drm/xe/xe_sriov_pf_debugfs.c +++ b/drivers/gpu/drm/xe/xe_sriov_pf_debugfs.c @@ -136,11 +136,31 @@ static void pf_populate_pf(struct xe_device *xe, struct dentry *pfdent) * │ │ ├── reset * │ │ ├── resume * │ │ ├── stop + * │ │ ├── save + * │ │ ├── restore * │ │ : * │ ├── vf2 * │ │ ├── ... */ +static int from_file_read_to_vf_call(struct seq_file *s, + int (*call)(struct xe_device *, unsigned int)) +{ + struct dentry *dent = file_dentry(s->file)->d_parent; + struct xe_device *xe = extract_xe(dent); + unsigned int vfid = extract_vfid(dent); + int ret; + + xe_pm_runtime_get(xe); + ret = call(xe, vfid); + xe_pm_runtime_put(xe); + + if (ret < 0) + return ret; + + return 0; +} + static ssize_t from_file_write_to_vf_call(struct file *file, const char __user *userbuf, size_t count, loff_t *ppos, int (*call)(struct xe_device *, unsigned int)) @@ -179,10 +199,26 @@ static ssize_t OP##_write(struct file *file, const char __user *userbuf, \ } \ DEFINE_SHOW_STORE_ATTRIBUTE(OP) +#define DEFINE_VF_CONTROL_ATTRIBUTE_RW(OP) \ +static int OP##_show(struct seq_file *s, void *unused) \ +{ \ + return from_file_read_to_vf_call(s, \ + xe_sriov_pf_control_finish_##OP); \ +} \ +static ssize_t OP##_write(struct file *file, const char __user *userbuf, \ + size_t count, loff_t *ppos) \ +{ \ + return from_file_write_to_vf_call(file, userbuf, count, ppos, \ + xe_sriov_pf_control_trigger_##OP); \ +} \ +DEFINE_SHOW_STORE_ATTRIBUTE(OP) + DEFINE_VF_CONTROL_ATTRIBUTE(pause_vf); DEFINE_VF_CONTROL_ATTRIBUTE(resume_vf); DEFINE_VF_CONTROL_ATTRIBUTE(stop_vf); DEFINE_VF_CONTROL_ATTRIBUTE(reset_vf); +DEFINE_VF_CONTROL_ATTRIBUTE_RW(save_vf); +DEFINE_VF_CONTROL_ATTRIBUTE_RW(restore_vf); static void pf_populate_vf(struct xe_device *xe, struct dentry *vfdent) { @@ -190,6 +226,8 @@ static void pf_populate_vf(struct xe_device *xe, struct dentry *vfdent) debugfs_create_file("resume", 0200, vfdent, xe, &resume_vf_fops); debugfs_create_file("stop", 0200, vfdent, xe, &stop_vf_fops); debugfs_create_file("reset", 0200, vfdent, xe, &reset_vf_fops); + debugfs_create_file("save", 0600, vfdent, xe, &save_vf_fops); + debugfs_create_file("restore", 0600, vfdent, xe, &restore_vf_fops); } static void pf_populate_with_tiles(struct xe_device *xe, struct dentry *dent, unsigned int vfid) -- 2.51.2 ^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2025-11-05 23:14 UTC | newest] Thread overview: 2+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-11-05 23:08 [PATCH v4 04/28] drm/xe/pf: Add save/restore control state stubs and connect to debugfs kernel test robot -- strict thread matches above, loose matches on Subject: below -- 2025-11-05 15:09 [PATCH v4 00/28] vfio/xe: Add driver variant for Xe VF migration Michał Winiarski 2025-11-05 15:10 ` [PATCH v4 04/28] drm/xe/pf: Add save/restore control state stubs and connect to debugfs Michał Winiarski
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.