Re: [PATCH v8 1/2] scsi: ufs: Enable power management for wlun
From: Adrian Hunter <adrian.hunter@intel.com>
Date: 2021-03-02 02:29:29
Also in:
linux-arm-kernel, linux-arm-msm, linux-mediatek, linux-samsung-soc, lkml
Subsystem:
scsi subsystem, the rest · Maintainers:
"James E.J. Bottomley", "Martin K. Petersen", Linus Torvalds
On 1/03/21 8:10 pm, Asutosh Das wrote:
On Mon, Mar 01 2021 at 05:23 -0800, Adrian Hunter wrote:quoted
On 26/02/21 1:37 am, Asutosh Das wrote:quoted
@@ -8901,43 +9125,14 @@ static int ufshcd_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op)goto vendor_suspend; }The ufshcd_reset_and_restore() in ufshcd_resume() will also change the power mode of the UFS device to active. Until the UFS device is also resumed and then suspended, it will not return to a low power mode.Umm, sorry, I didn't understand this comment. Say, the UFS device was reset in ufshcd_reset_and_restore() it'd be a hardware reset and the UFS device would move to Powered On mode and then to Active power mode, when it is ready to begin initialization. And from this state it should move to all other legal states. Before entering system suspend ufshcd_system_suspend(), the ufs device is runtime resumed in ufshcd_suspend_prepare(). Please can you explain a bit more on this issue that you see?
Say you runtime resume the host controller, and ufshcd_reset_and_restore() makes the UFS device active, but the UFS device is still runtime suspended. Example: Add a debugfs file to show the current power mode:
diff --git a/drivers/scsi/ufs/ufs-debugfs.c b/drivers/scsi/ufs/ufs-debugfs.c
index dee98dc72d29..700b88df0866 100644
--- a/drivers/scsi/ufs/ufs-debugfs.c
+++ b/drivers/scsi/ufs/ufs-debugfs.c@@ -48,6 +48,7 @@ void ufs_debugfs_hba_init(struct ufs_hba *hba) { hba->debugfs_root = debugfs_create_dir(dev_name(hba->dev), ufs_debugfs_root); debugfs_create_file("stats", 0400, hba->debugfs_root, hba, &ufs_debugfs_stats_fops); + debugfs_create_u32("curr_dev_pwr_mode", 0400, hba->debugfs_root, (u32 *)&hba->curr_dev_pwr_mode); } void ufs_debugfs_hba_exit(struct ufs_hba *hba)
# grep -H . /sys/bus/pci/drivers/ufshcd/0000\:00\:12.5/rpm* /sys/bus/pci/drivers/ufshcd/0000:00:12.5/rpm_lvl:6 /sys/bus/pci/drivers/ufshcd/0000:00:12.5/rpm_target_dev_state:DEEPSLEEP /sys/bus/pci/drivers/ufshcd/0000:00:12.5/rpm_target_link_state:OFF # cat /sys/kernel/debug/ufshcd/0000\:00\:12.5/curr_dev_pwr_mode 4 # echo on > /sys/devices/pci0000:00/0000:00:12.5/power/control # cat /sys/kernel/debug/ufshcd/0000\:00\:12.5/curr_dev_pwr_mode 1 # grep -H . /sys/bus/pci/drivers/ufshcd/0000\:00\:12.5/host*/target*/*/power/runtime_status /sys/bus/pci/drivers/ufshcd/0000:00:12.5/host1/target1:0:0/1:0:0:0/power/runtime_status:suspended /sys/bus/pci/drivers/ufshcd/0000:00:12.5/host1/target1:0:0/1:0:0:49456/power/runtime_status:suspended /sys/bus/pci/drivers/ufshcd/0000:00:12.5/host1/target1:0:0/1:0:0:49476/power/runtime_status:suspended /sys/bus/pci/drivers/ufshcd/0000:00:12.5/host1/target1:0:0/1:0:0:49488/power/runtime_status:suspended So UFS devices is runtime suspended and should in DeepSleep, but it is active.