On Thu, 2025-07-10 at 11:08 -0400, Rodrigo Vivi wrote: > From: Badal Nilawar <badal.nila...@intel.com> > > Introduce a debug filesystem node to disable late binding fw reload > during the system or runtime resume. This is intended for situations > where the late binding fw needs to be loaded from user mode, > perticularly for validation purpose. > Note that xe kmd doesn't participate in late binding flow from user > space. Binary loaded from the userspace will be lost upon entering to > D3 cold hence user space app need to handle this situation. > > v2: > - s/(uval == 1) ? true : false/!!uval/ (Daniele) > v3: > - Refine the commit message (Daniele) > > Acked-by: Rodrigo Vivi <rodrigo.v...@intel.com> > Signed-off-by: Badal Nilawar <badal.nila...@intel.com> > Reviewed-by: Daniele Ceraolo Spurio <daniele.ceraolospu...@intel.com> > Signed-off-by: Rodrigo Vivi <rodrigo.v...@intel.com>
Bit of a flyby comment here, but would it be better if this was configfs rather than debugfs in case we wanted to skip this on the first probe? Thanks, Stuart > --- > drivers/gpu/drm/xe/xe_debugfs.c | 41 > ++++++++++++++++++++++ > drivers/gpu/drm/xe/xe_late_bind_fw.c | 3 ++ > drivers/gpu/drm/xe/xe_late_bind_fw_types.h | 2 ++ > 3 files changed, 46 insertions(+) > > diff --git a/drivers/gpu/drm/xe/xe_debugfs.c > b/drivers/gpu/drm/xe/xe_debugfs.c > index d83cd6ed3fa8..d1f6f556efa2 100644 > --- a/drivers/gpu/drm/xe/xe_debugfs.c > +++ b/drivers/gpu/drm/xe/xe_debugfs.c > @@ -226,6 +226,44 @@ static const struct file_operations > atomic_svm_timeslice_ms_fops = { > .write = atomic_svm_timeslice_ms_set, > }; > > +static ssize_t disable_late_binding_show(struct file *f, char __user > *ubuf, > + size_t size, loff_t *pos) > +{ > + struct xe_device *xe = file_inode(f)->i_private; > + struct xe_late_bind *late_bind = &xe->late_bind; > + char buf[32]; > + int len; > + > + len = scnprintf(buf, sizeof(buf), "%d\n", late_bind- > >disable); > + > + return simple_read_from_buffer(ubuf, size, pos, buf, len); > +} > + > +static ssize_t disable_late_binding_set(struct file *f, const char > __user *ubuf, > + size_t size, loff_t *pos) > +{ > + struct xe_device *xe = file_inode(f)->i_private; > + struct xe_late_bind *late_bind = &xe->late_bind; > + u32 uval; > + ssize_t ret; > + > + ret = kstrtouint_from_user(ubuf, size, sizeof(uval), &uval); > + if (ret) > + return ret; > + > + if (uval > 1) > + return -EINVAL; > + > + late_bind->disable = !!uval; > + return size; > +} > + > +static const struct file_operations disable_late_binding_fops = { > + .owner = THIS_MODULE, > + .read = disable_late_binding_show, > + .write = disable_late_binding_set, > +}; > + > void xe_debugfs_register(struct xe_device *xe) > { > struct ttm_device *bdev = &xe->ttm; > @@ -249,6 +287,9 @@ void xe_debugfs_register(struct xe_device *xe) > debugfs_create_file("atomic_svm_timeslice_ms", 0600, root, > xe, > &atomic_svm_timeslice_ms_fops); > > + debugfs_create_file("disable_late_binding", 0600, root, xe, > + &disable_late_binding_fops); > + > for (mem_type = XE_PL_VRAM0; mem_type <= XE_PL_VRAM1; > ++mem_type) { > man = ttm_manager_type(bdev, mem_type); > > diff --git a/drivers/gpu/drm/xe/xe_late_bind_fw.c > b/drivers/gpu/drm/xe/xe_late_bind_fw.c > index df43523e9043..88355adce1d0 100644 > --- a/drivers/gpu/drm/xe/xe_late_bind_fw.c > +++ b/drivers/gpu/drm/xe/xe_late_bind_fw.c > @@ -167,6 +167,9 @@ int xe_late_bind_fw_load(struct xe_late_bind > *late_bind) > if (!late_bind->component_added) > return -ENODEV; > > + if (late_bind->disable) > + return 0; > + > for (fw_id = 0; fw_id < XE_LB_FW_MAX_ID; fw_id++) { > lbfw = &late_bind->late_bind_fw[fw_id]; > if (lbfw->payload) { > diff --git a/drivers/gpu/drm/xe/xe_late_bind_fw_types.h > b/drivers/gpu/drm/xe/xe_late_bind_fw_types.h > index 5c0574aff7b9..158dc1abe072 100644 > --- a/drivers/gpu/drm/xe/xe_late_bind_fw_types.h > +++ b/drivers/gpu/drm/xe/xe_late_bind_fw_types.h > @@ -65,6 +65,8 @@ struct xe_late_bind { > struct workqueue_struct *wq; > /** @component_added: whether the component has been added */ > bool component_added; > + /** @disable: to block late binding reload during pm resume > flow*/ > + bool disable; > }; > > #endif