Commit e3d55626 authored by Lu Hongfei's avatar Lu Hongfei Committed by Martin K. Petersen

scsi: ufs: wb: Add explicit flush_threshold sysfs attribute

There are three flags that control Write Booster Feature:

    1. WB ON/OFF
    2. WB Hibern Flush ON/OFF (implicitly)
    3. WB Flush ON/OFF (explicit)

In the case of "Hibern Flush", one of the conditions for flush WB buffer is
that avail_wb_buff < wb_flush_threshold.

As we know, different users have different requirements for power
consumption and performance. Therefore, we need the ability to manually set
wb_flush_threshold, so that users can easily and flexibly adjust the
wb_flush_threshold value, thereby achieving a balance between power
consumption and performance.

So the sysfs attribute that controls this is necessary.

wb_flush_threshold represents the threshold for flushing WB buffer, whose
value expressed in unit of 10% granularity, such as '1' representing 10%,
'2' representing 20%, and so on.
Signed-off-by: default avatarLu Hongfei <luhongfei@vivo.com>
Link: https://lore.kernel.org/r/20230613022240.16595-1-luhongfei@vivo.comReviewed-by: default avatarBart Van Assche <bvanassche@acm.org>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 56541c7c
...@@ -1426,6 +1426,17 @@ Description: This entry shows the status of WriteBooster buffer flushing ...@@ -1426,6 +1426,17 @@ Description: This entry shows the status of WriteBooster buffer flushing
If flushing is enabled, the device executes the flush If flushing is enabled, the device executes the flush
operation when the command queue is empty. operation when the command queue is empty.
What: /sys/bus/platform/drivers/ufshcd/*/wb_flush_threshold
What: /sys/bus/platform/devices/*.ufs/wb_flush_threshold
Date: June 2023
Contact: Lu Hongfei <luhongfei@vivo.com>
Description:
wb_flush_threshold represents the threshold for flushing WriteBooster buffer,
whose value expressed in unit of 10% granularity, such as '1' representing 10%,
'2' representing 20%, and so on.
If avail_wb_buff < wb_flush_threshold, it indicates that WriteBooster buffer needs to
be flushed, otherwise it is not necessary.
What: /sys/bus/platform/drivers/ufshcd/*/device_descriptor/hpb_version What: /sys/bus/platform/drivers/ufshcd/*/device_descriptor/hpb_version
What: /sys/bus/platform/devices/*.ufs/device_descriptor/hpb_version What: /sys/bus/platform/devices/*.ufs/device_descriptor/hpb_version
Date: June 2021 Date: June 2021
......
...@@ -298,6 +298,37 @@ static ssize_t enable_wb_buf_flush_store(struct device *dev, ...@@ -298,6 +298,37 @@ static ssize_t enable_wb_buf_flush_store(struct device *dev,
return res < 0 ? res : count; return res < 0 ? res : count;
} }
static ssize_t wb_flush_threshold_show(struct device *dev,
struct device_attribute *attr,
char *buf)
{
struct ufs_hba *hba = dev_get_drvdata(dev);
return sysfs_emit(buf, "%u\n", hba->vps->wb_flush_threshold);
}
static ssize_t wb_flush_threshold_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{
struct ufs_hba *hba = dev_get_drvdata(dev);
unsigned int wb_flush_threshold;
if (kstrtouint(buf, 0, &wb_flush_threshold))
return -EINVAL;
/* The range of values for wb_flush_threshold is (0,10] */
if (wb_flush_threshold > UFS_WB_BUF_REMAIN_PERCENT(100) ||
wb_flush_threshold == 0) {
dev_err(dev, "The value of wb_flush_threshold is invalid!\n");
return -EINVAL;
}
hba->vps->wb_flush_threshold = wb_flush_threshold;
return count;
}
static DEVICE_ATTR_RW(rpm_lvl); static DEVICE_ATTR_RW(rpm_lvl);
static DEVICE_ATTR_RO(rpm_target_dev_state); static DEVICE_ATTR_RO(rpm_target_dev_state);
static DEVICE_ATTR_RO(rpm_target_link_state); static DEVICE_ATTR_RO(rpm_target_link_state);
...@@ -307,6 +338,7 @@ static DEVICE_ATTR_RO(spm_target_link_state); ...@@ -307,6 +338,7 @@ static DEVICE_ATTR_RO(spm_target_link_state);
static DEVICE_ATTR_RW(auto_hibern8); static DEVICE_ATTR_RW(auto_hibern8);
static DEVICE_ATTR_RW(wb_on); static DEVICE_ATTR_RW(wb_on);
static DEVICE_ATTR_RW(enable_wb_buf_flush); static DEVICE_ATTR_RW(enable_wb_buf_flush);
static DEVICE_ATTR_RW(wb_flush_threshold);
static struct attribute *ufs_sysfs_ufshcd_attrs[] = { static struct attribute *ufs_sysfs_ufshcd_attrs[] = {
&dev_attr_rpm_lvl.attr, &dev_attr_rpm_lvl.attr,
...@@ -318,6 +350,7 @@ static struct attribute *ufs_sysfs_ufshcd_attrs[] = { ...@@ -318,6 +350,7 @@ static struct attribute *ufs_sysfs_ufshcd_attrs[] = {
&dev_attr_auto_hibern8.attr, &dev_attr_auto_hibern8.attr,
&dev_attr_wb_on.attr, &dev_attr_wb_on.attr,
&dev_attr_enable_wb_buf_flush.attr, &dev_attr_enable_wb_buf_flush.attr,
&dev_attr_wb_flush_threshold.attr,
NULL NULL
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment