Skip to contentSkip to conversation

scsi: ufs: core: Reset urgent_bkops_lvl to allow runtime PM power mode

PATCH Applied Won Jung 3 participants 4 messages Feb 11 – Feb 24 1 message not in the archive

Subsystems (2)
lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): CGME20260211060105epcms2p6631646c964afae761c5d8b93db5a476d@epcms2p6

Won Jung

author
#1 lore raw

PATCH 1/1 scsi: ufs: core: Reset urgent_bkops_lvl to allow runtime PM power mode

This patch ensures that UFS Runtime PM can achieve power saving after System PM suspend by resetting hba->urgent_bkops_lvl. It also modifies ufshcd_bkops_exception_event_handler to avoid setting urgent_bkops_lvl when status is 0, which helps maintain optimal power management.

On UFS devices supporting UFSHCD_CAP_AUTO_BKOPS_SUSPEND, a BKOPS exception event can lead to a situation where UFS Runtime PM can't enter low-power mode states even after the BKOPS exception has been resolved.

BKOPS exception with bkops status 0 occurs, the driver logs:
"ufshcd_bkops_exception_event_handler:
device raised urgent BKOPS exception for bkops status 0"

When a BKOPS exception occurs, ufshcd_bkops_exception_event_handler() reads the BKOPS status and sets hba->urgent_bkops_lvl to BKOPS_STATUS_NO_OP(0). This allows the device to perform Runtime PM without changing the UFS power mode. (__ufshcd_wl_suspend(hba, UFS_RUNTIME_PM))

During system PM suspend, ufshcd_disable_auto_bkops() is called, disabling auto bkops. After UFS System PM Resume,
when runtime PM attempts to suspend again, ufshcd_urgent_bkops() is invoked. Since hba->urgent_bkops_lvl remains at BKOPS_STATUS_NO_OP(0), ufshcd_enable_auto_bkops() is triggered.

However, in ufshcd_bkops_ctrl(),
the driver compares the current BKOPS status with hba->urgent_bkops_lvl, and only enables auto bkops if curr_status >= hba->urgent_bkops_lvl. Since both values are 0, the condition is met

As a result, __ufshcd_wl_suspend(hba, UFS_RUNTIME_PM) skips power mode transitions and remains in an active state, preventing power saving even though no urgent BKOPS condition exists.

---
 drivers/ufs/core/ufshcd.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/ufs/core/ufshcd.c +2 -1
index 604043a7533d..e2d3e834ccba 100644
@@ -5959,6 +5959,7 @@ static int ufshcd_disable_auto_bkops(struct ufs_hba *hba)
 
 	hba->auto_bkops_enabled = false;
 	trace_ufshcd_auto_bkops_state(hba, "Disabled");
+	hba->urgent_bkops_lvl = BKOPS_STATUS_PERF_IMPACT;
 	hba->is_urgent_bkops_lvl_checked = false;
 out:
 	return err;
@@ -6062,7 +6063,7 @@ static void ufshcd_bkops_exception_event_handler(struct ufs_hba *hba)
 	 * impacted or critical. Handle these device by determining their urgent
 	 * bkops status at runtime.
 	 */
-	if (curr_status < BKOPS_STATUS_PERF_IMPACT) {
+	if ((curr_status > BKOPS_STATUS_NO_OP) && (curr_status < BKOPS_STATUS_PERF_IMPACT)) {
 		dev_err(hba->dev, "%s: device raised urgent BKOPS exception for bkops status %d\n",
 				__func__, curr_status);
 		/* update the current status as the urgent bkops level */
Signature · 1 line
2.17.1
Reviewed-by on v1 1/1
#2 lore raw
Quoted 21 lines · Won Jung
drivers/ufs/core/ufshcd.c +0 -0
index 604043a7533d..e2d3e834ccba 100644
@@ -5959,6 +5959,7 @@ static int ufshcd_disable_auto_bkops(struct
 ufs_hba *hba)


  hba->auto_bkops_enabled = false; trace_ufshcd_auto_bkops_state(hba, "Disabled");

drivers/ufs/core/ufshcd.c +1 -0
+	hba->urgent_bkops_lvl = BKOPS_STATUS_PERF_IMPACT;

  hba->is_urgent_bkops_lvl_checked = false;
 out:
  return err;

drivers/ufs/core/ufshcd.c +0 -0
@@ -6062,7 +6063,7 @@ static void
 ufshcd_bkops_exception_event_handler(struct ufs_hba *hba)
  	 * impacted or critical. Handle these device by determining

their urgent
  * bkops status at runtime.
  */

drivers/ufs/core/ufshcd.c +1 -1
-	if (curr_status < BKOPS_STATUS_PERF_IMPACT) {
+	if ((curr_status > BKOPS_STATUS_NO_OP) && (curr_status <
Quoted 6 lines

BKOPS_STATUS_PERF_IMPACT)) {
  dev_err(hba->dev, "%s: device raised urgent BKOPS exception for bkops status %d\n",
  __func__, curr_status); /* update the current status as the urgent bkops level */

#3 lore raw
In reply to Won Jung

Won,

Quoted 4 lines

This patch ensures that UFS Runtime PM can achieve power saving after System PM suspend by resetting hba->urgent_bkops_lvl. It also modifies ufshcd_bkops_exception_event_handler to avoid setting urgent_bkops_lvl when status is 0, which helps maintain optimal power management.

Applied to 7.0/scsi-staging, thanks!

Signature · 1 line
Martin K. Petersen
#4 lore raw
In reply to Won Jung
Quoted 6 lines · Won Jung

This patch ensures that UFS Runtime PM can achieve power saving after System PM suspend by resetting hba->urgent_bkops_lvl. It also modifies ufshcd_bkops_exception_event_handler to avoid setting urgent_bkops_lvl when status is 0, which helps maintain optimal power management.

Quoted 6 lines

On UFS devices supporting UFSHCD_CAP_AUTO_BKOPS_SUSPEND, a BKOPS exception event can lead to a situation where UFS Runtime PM can't enter low-power mode states even after the BKOPS exception has been resolved.

[...]

Applied to 7.0/scsi-fixes, thanks!

[1/1] scsi: ufs: core: Reset urgent_bkops_lvl to allow runtime PM power mode

      https://git.kernel.org/mkp/scsi/c/5b313760059c
Signature · 1 line
Martin K. Petersen