Message ID | 1713928915-18229-2-git-send-email-quic_qianyu@quicinc.com (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | Add sysfs entry to EDL mode | expand |
On Wed, Apr 24, 2024 at 11:21:53AM +0800, Qiang Yu wrote: > Add sysfs entry to allow users of MHI bus force device to enter EDL. > Considering that the way to enter EDL mode varies from device to device and > some devices even do not support EDL. Hence, add a callback edl_trigger in > mhi controller as part of the sysfs entry to be invoked and MHI core will > only create EDL sysfs entry for mhi controller that provides edl_trigger > callback. All of the process a specific device required to enter EDL mode > can be placed in this callback. > > Signed-off-by: Qiang Yu <quic_qianyu@quicinc.com> > Reviewed-by: Jeffrey Hugo <quic_jhugo@quicinc.com> All 3 patches are applied to mhi-next with my reported changes! Since you are doing upstreaming for some time, you should know that the changelog _must_ be present in the patches itself or in the cover letter. - Mani > --- > Documentation/ABI/stable/sysfs-bus-mhi | 13 +++++++++++++ > drivers/bus/mhi/host/init.c | 33 +++++++++++++++++++++++++++++++++ > include/linux/mhi.h | 2 ++ > 3 files changed, 48 insertions(+) > > diff --git a/Documentation/ABI/stable/sysfs-bus-mhi b/Documentation/ABI/stable/sysfs-bus-mhi > index 1a47f9e..b44f467 100644 > --- a/Documentation/ABI/stable/sysfs-bus-mhi > +++ b/Documentation/ABI/stable/sysfs-bus-mhi > @@ -29,3 +29,16 @@ Description: Initiates a SoC reset on the MHI controller. A SoC reset is > This can be useful as a method of recovery if the device is > non-responsive, or as a means of loading new firmware as a > system administration task. > + > +What: /sys/bus/mhi/devices/.../trigger_edl > +Date: April 2024 > +KernelVersion: 6.9 > +Contact: mhi@lists.linux.dev > +Description: Writing a non-zero value to this file will force devices to > + enter EDL (Emergency Download) mode. This entry only exists for > + devices capable of entering the EDL mode using the standard EDL > + triggering mechanism defined in the MHI spec v1.2. Once in EDL > + mode, the flash programmer image can be downloaded to the > + device to enter the flash programmer execution environment. > + This can be useful if user wants to use QDL (Qualcomm Download, > + which is used to download firmware over EDL) to update firmware. > diff --git a/drivers/bus/mhi/host/init.c b/drivers/bus/mhi/host/init.c > index 44f9349..7104c18 100644 > --- a/drivers/bus/mhi/host/init.c > +++ b/drivers/bus/mhi/host/init.c > @@ -127,6 +127,30 @@ static ssize_t soc_reset_store(struct device *dev, > } > static DEVICE_ATTR_WO(soc_reset); > > +static ssize_t trigger_edl_store(struct device *dev, > + struct device_attribute *attr, > + const char *buf, size_t count) > +{ > + struct mhi_device *mhi_dev = to_mhi_device(dev); > + struct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl; > + unsigned long val; > + int ret; > + > + ret = kstrtoul(buf, 10, &val); > + if (ret < 0) > + return ret; > + > + if (!val) > + return -EINVAL; > + > + ret = mhi_cntrl->edl_trigger(mhi_cntrl); > + if (ret) > + return ret; > + > + return count; > +} > +static DEVICE_ATTR_WO(trigger_edl); > + > static struct attribute *mhi_dev_attrs[] = { > &dev_attr_serial_number.attr, > &dev_attr_oem_pk_hash.attr, > @@ -1018,6 +1042,12 @@ int mhi_register_controller(struct mhi_controller *mhi_cntrl, > if (ret) > goto err_release_dev; > > + if (mhi_cntrl->edl_trigger) { > + ret = sysfs_create_file(&mhi_dev->dev.kobj, &dev_attr_trigger_edl.attr); > + if (ret) > + goto err_release_dev; > + } > + > mhi_cntrl->mhi_dev = mhi_dev; > > mhi_create_debugfs(mhi_cntrl); > @@ -1051,6 +1081,9 @@ void mhi_unregister_controller(struct mhi_controller *mhi_cntrl) > mhi_deinit_free_irq(mhi_cntrl); > mhi_destroy_debugfs(mhi_cntrl); > > + if (mhi_cntrl->edl_trigger) > + sysfs_remove_file(&mhi_dev->dev.kobj, &dev_attr_trigger_edl.attr); > + > destroy_workqueue(mhi_cntrl->hiprio_wq); > kfree(mhi_cntrl->mhi_cmd); > kfree(mhi_cntrl->mhi_event); > diff --git a/include/linux/mhi.h b/include/linux/mhi.h > index cde01e1..d968e1a 100644 > --- a/include/linux/mhi.h > +++ b/include/linux/mhi.h > @@ -353,6 +353,7 @@ struct mhi_controller_config { > * @read_reg: Read a MHI register via the physical link (required) > * @write_reg: Write a MHI register via the physical link (required) > * @reset: Controller specific reset function (optional) > + * @edl_trigger: CB function to trigger EDL mode (optional) > * @buffer_len: Bounce buffer length > * @index: Index of the MHI controller instance > * @bounce_buf: Use of bounce buffer > @@ -435,6 +436,7 @@ struct mhi_controller { > void (*write_reg)(struct mhi_controller *mhi_cntrl, void __iomem *addr, > u32 val); > void (*reset)(struct mhi_controller *mhi_cntrl); > + int (*edl_trigger)(struct mhi_controller *mhi_cntrl); > > size_t buffer_len; > int index; > -- > 2.7.4 > >
On 4/25/2024 8:54 AM, Manivannan Sadhasivam wrote: > On Wed, Apr 24, 2024 at 11:21:53AM +0800, Qiang Yu wrote: >> Add sysfs entry to allow users of MHI bus force device to enter EDL. >> Considering that the way to enter EDL mode varies from device to device and >> some devices even do not support EDL. Hence, add a callback edl_trigger in >> mhi controller as part of the sysfs entry to be invoked and MHI core will >> only create EDL sysfs entry for mhi controller that provides edl_trigger >> callback. All of the process a specific device required to enter EDL mode >> can be placed in this callback. >> >> Signed-off-by: Qiang Yu <quic_qianyu@quicinc.com> >> Reviewed-by: Jeffrey Hugo <quic_jhugo@quicinc.com> > > All 3 patches are applied to mhi-next with my reported changes! Since you are > doing upstreaming for some time, you should know that the changelog _must_ be > present in the patches itself or in the cover letter. It is/was in the cover letter. Was the format not to your liking? -Jeff
On Thu, Apr 25, 2024 at 09:07:37AM -0600, Jeffrey Hugo wrote: > On 4/25/2024 8:54 AM, Manivannan Sadhasivam wrote: > > On Wed, Apr 24, 2024 at 11:21:53AM +0800, Qiang Yu wrote: > > > Add sysfs entry to allow users of MHI bus force device to enter EDL. > > > Considering that the way to enter EDL mode varies from device to device and > > > some devices even do not support EDL. Hence, add a callback edl_trigger in > > > mhi controller as part of the sysfs entry to be invoked and MHI core will > > > only create EDL sysfs entry for mhi controller that provides edl_trigger > > > callback. All of the process a specific device required to enter EDL mode > > > can be placed in this callback. > > > > > > Signed-off-by: Qiang Yu <quic_qianyu@quicinc.com> > > > Reviewed-by: Jeffrey Hugo <quic_jhugo@quicinc.com> > > > > All 3 patches are applied to mhi-next with my reported changes! Since you are > > doing upstreaming for some time, you should know that the changelog _must_ be > > present in the patches itself or in the cover letter. > > It is/was in the cover letter. Was the format not to your liking? > Hmm, it didn't land in my inbox. Maybe my filter did something. Apologies for the false statement. - Mani
diff --git a/Documentation/ABI/stable/sysfs-bus-mhi b/Documentation/ABI/stable/sysfs-bus-mhi index 1a47f9e..b44f467 100644 --- a/Documentation/ABI/stable/sysfs-bus-mhi +++ b/Documentation/ABI/stable/sysfs-bus-mhi @@ -29,3 +29,16 @@ Description: Initiates a SoC reset on the MHI controller. A SoC reset is This can be useful as a method of recovery if the device is non-responsive, or as a means of loading new firmware as a system administration task. + +What: /sys/bus/mhi/devices/.../trigger_edl +Date: April 2024 +KernelVersion: 6.9 +Contact: mhi@lists.linux.dev +Description: Writing a non-zero value to this file will force devices to + enter EDL (Emergency Download) mode. This entry only exists for + devices capable of entering the EDL mode using the standard EDL + triggering mechanism defined in the MHI spec v1.2. Once in EDL + mode, the flash programmer image can be downloaded to the + device to enter the flash programmer execution environment. + This can be useful if user wants to use QDL (Qualcomm Download, + which is used to download firmware over EDL) to update firmware. diff --git a/drivers/bus/mhi/host/init.c b/drivers/bus/mhi/host/init.c index 44f9349..7104c18 100644 --- a/drivers/bus/mhi/host/init.c +++ b/drivers/bus/mhi/host/init.c @@ -127,6 +127,30 @@ static ssize_t soc_reset_store(struct device *dev, } static DEVICE_ATTR_WO(soc_reset); +static ssize_t trigger_edl_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct mhi_device *mhi_dev = to_mhi_device(dev); + struct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl; + unsigned long val; + int ret; + + ret = kstrtoul(buf, 10, &val); + if (ret < 0) + return ret; + + if (!val) + return -EINVAL; + + ret = mhi_cntrl->edl_trigger(mhi_cntrl); + if (ret) + return ret; + + return count; +} +static DEVICE_ATTR_WO(trigger_edl); + static struct attribute *mhi_dev_attrs[] = { &dev_attr_serial_number.attr, &dev_attr_oem_pk_hash.attr, @@ -1018,6 +1042,12 @@ int mhi_register_controller(struct mhi_controller *mhi_cntrl, if (ret) goto err_release_dev; + if (mhi_cntrl->edl_trigger) { + ret = sysfs_create_file(&mhi_dev->dev.kobj, &dev_attr_trigger_edl.attr); + if (ret) + goto err_release_dev; + } + mhi_cntrl->mhi_dev = mhi_dev; mhi_create_debugfs(mhi_cntrl); @@ -1051,6 +1081,9 @@ void mhi_unregister_controller(struct mhi_controller *mhi_cntrl) mhi_deinit_free_irq(mhi_cntrl); mhi_destroy_debugfs(mhi_cntrl); + if (mhi_cntrl->edl_trigger) + sysfs_remove_file(&mhi_dev->dev.kobj, &dev_attr_trigger_edl.attr); + destroy_workqueue(mhi_cntrl->hiprio_wq); kfree(mhi_cntrl->mhi_cmd); kfree(mhi_cntrl->mhi_event); diff --git a/include/linux/mhi.h b/include/linux/mhi.h index cde01e1..d968e1a 100644 --- a/include/linux/mhi.h +++ b/include/linux/mhi.h @@ -353,6 +353,7 @@ struct mhi_controller_config { * @read_reg: Read a MHI register via the physical link (required) * @write_reg: Write a MHI register via the physical link (required) * @reset: Controller specific reset function (optional) + * @edl_trigger: CB function to trigger EDL mode (optional) * @buffer_len: Bounce buffer length * @index: Index of the MHI controller instance * @bounce_buf: Use of bounce buffer @@ -435,6 +436,7 @@ struct mhi_controller { void (*write_reg)(struct mhi_controller *mhi_cntrl, void __iomem *addr, u32 val); void (*reset)(struct mhi_controller *mhi_cntrl); + int (*edl_trigger)(struct mhi_controller *mhi_cntrl); size_t buffer_len; int index;