On Thu, Jun 19, 2025 at 12:21:10PM +0530, Nilawar, Badal wrote: > > On 19-06-2025 02:49, Daniele Ceraolo Spurio wrote: > > > > > > On 6/18/2025 12:00 PM, Badal Nilawar wrote: > > > 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. > > > > You haven't replied to my question on the previous rev in regards to the > > expected use-case here. > > Is this for testing only, or something an actual user might want to do? > > If we only need this for testing, please specify so. > > Apologies for the oversight. Yes, this is only necessary for testing the > binary before releasing it for up-streaming. There is internal > tool which uses IGSC lib to download the binary. To avoid clash between the > binaries, this debug fs node is provided. > > > > > Also, what happens if we suspend with a user-loaded binary? userspace > > doesn't have visibility to know that they have to re-load their binary. > > If the device enters D3 cold state, the binary needs to be reloaded. > However, the kernel mode driver (KMD) does not have control over binaries > downloaded via the IGSC library. > If needed D3 cold can be disabled from BIOS or by setting up vram_threshold > = 0.
Acked-by: Rodrigo Vivi <rodrigo.v...@intel.com> > > Regards, > Badal > > > Daniele > > > > > > > > v2: > > > -s/(uval == 1) ? true : false/!!uval/ (Daniele) > > > > > > Signed-off-by: Badal Nilawar <badal.nila...@intel.com> > > > --- > > > 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 | 3 ++ > > > 3 files changed, 47 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 c0be9611c73b..001e526e569a 100644 > > > --- a/drivers/gpu/drm/xe/xe_late_bind_fw.c > > > +++ b/drivers/gpu/drm/xe/xe_late_bind_fw.c > > > @@ -129,6 +129,9 @@ int xe_late_bind_fw_load(struct xe_late_bind > > > *late_bind) > > > if (!late_bind->component_added) > > > return -EINVAL; > > > + if (late_bind->disable) > > > + return 0; > > > + > > > for (fw_id = 0; fw_id < MAX_FW_ID; fw_id++) { > > > lbfw = &late_bind->late_bind_fw[fw_id]; > > > if (lbfw->valid) > > > 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 d256f53d59e6..f79f0c0b2c4a 100644 > > > --- a/drivers/gpu/drm/xe/xe_late_bind_fw_types.h > > > +++ b/drivers/gpu/drm/xe/xe_late_bind_fw_types.h > > > @@ -71,6 +71,9 @@ struct xe_late_bind { > > > struct xe_late_bind_fw late_bind_fw[MAX_FW_ID]; > > > /** @late_bind.wq: workqueue to submit request to download > > > late bind blob */ > > > struct workqueue_struct *wq; > > > + > > > + /** @late_bind.disable to block late binding reload during pm > > > resume flow*/ > > > + bool disable; > > > }; > > > #endif > >