scsi: ufs: Customize flush threshold for WriteBooster
authorStanley Chu <stanley.chu@mediatek.com>
Sat, 9 May 2020 09:37:15 +0000 (17:37 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 15 May 2020 01:02:22 +0000 (21:02 -0400)
Allow flush threshold for WriteBooster to be customizable by vendors. To
achieve this, make the value a variable in struct ufs_hba_variant_params.

Also introduce UFS_WB_BUF_REMAIN_PERCENT() macro to provide a more flexible
way to specify WriteBooster available buffer values.

Link: https://lore.kernel.org/r/20200509093716.21010-4-stanley.chu@mediatek.com
Reviewed-by: Asutosh Das <asutoshd@codeaurora.org>
Signed-off-by: Stanley Chu <stanley.chu@mediatek.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/ufs/ufs.h
drivers/scsi/ufs/ufshcd.c
drivers/scsi/ufs/ufshcd.h

index b3135344ab3f54064c156b80bada91677b094427..fadba3a3bbcd30b909c22f3f73962bb018666a09 100644 (file)
@@ -478,10 +478,7 @@ enum ufs_dev_pwr_mode {
        UFS_POWERDOWN_PWR_MODE  = 3,
 };
 
-enum ufs_dev_wb_buf_avail_size {
-       UFS_WB_10_PERCENT_BUF_REMAIN = 0x1,
-       UFS_WB_40_PERCENT_BUF_REMAIN = 0x4,
-};
+#define UFS_WB_BUF_REMAIN_PERCENT(val) ((val) / 10)
 
 /**
  * struct utp_cmd_rsp - Response UPIU structure
index cdacbe6378a17d516a194bb96065608fb4e9def1..aca50ed39844d4ffcdd46ceb2d568eedc38fbadb 100644 (file)
@@ -5301,8 +5301,8 @@ static bool ufshcd_wb_presrv_usrspc_keep_vcc_on(struct ufs_hba *hba,
                         cur_buf);
                return false;
        }
-       /* Let it continue to flush when >60% full */
-       if (avail_buf < UFS_WB_40_PERCENT_BUF_REMAIN)
+       /* Let it continue to flush when available buffer exceeds threshold */
+       if (avail_buf < hba->vps->wb_flush_threshold)
                return true;
 
        return false;
@@ -5336,7 +5336,7 @@ static bool ufshcd_wb_keep_vcc_on(struct ufs_hba *hba)
        }
 
        if (!hba->dev_info.b_presrv_uspc_en) {
-               if (avail_buf <= UFS_WB_10_PERCENT_BUF_REMAIN)
+               if (avail_buf <= UFS_WB_BUF_REMAIN_PERCENT(10))
                        return true;
                return false;
        }
@@ -7462,6 +7462,7 @@ static const struct attribute_group *ufshcd_driver_groups[] = {
 
 static struct ufs_hba_variant_params ufs_hba_vps = {
        .hba_enable_delay_us            = 1000,
+       .wb_flush_threshold             = UFS_WB_BUF_REMAIN_PERCENT(40),
        .devfreq_profile.polling_ms     = 100,
        .devfreq_profile.target         = ufshcd_devfreq_target,
        .devfreq_profile.get_dev_status = ufshcd_devfreq_get_dev_status,
index f7bdf52ba8b0d2bcb35a3c30b74d547d7a897e04..e3dfb48e669e3f7302ceee8fdc63e1b1b05cd23e 100644 (file)
@@ -570,6 +570,7 @@ struct ufs_hba_variant_params {
        struct devfreq_dev_profile devfreq_profile;
        struct devfreq_simple_ondemand_data ondemand_data;
        u16 hba_enable_delay_us;
+       u32 wb_flush_threshold;
 };
 
 /**