Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 114c1aa2 authored by Stanislav Nijnikov's avatar Stanislav Nijnikov Committed by Martin K. Petersen
Browse files

scsi: ufs: sysfs: reworking of the rpm_lvl and spm_lvl entries



Read from these files will return the integer value of the chosen power
management level now. Separate entries were added to show the target UFS
device and UIC link states. The description of the possible power
managements levels was added to the ABI file. The on-write behaviour of
these entries wasn't changed.

[mkp: typo]

Signed-off-by: default avatarStanislav Nijnikov <stanislav.nijnikov@wdc.com>
Acked-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 61c187e4
Loading
Loading
Loading
Loading
+67 −0
Original line number Diff line number Diff line
@@ -802,3 +802,70 @@ Description: This file shows the The amount of physical memory needed
		the particular logical unit. The full information about
		the attribute could be found at UFS specifications 2.1.
		The file is read only.


What:		/sys/bus/platform/drivers/ufshcd/*/rpm_lvl
Date:		September 2014
Contact:	Subhash Jadavani <subhashj@codeaurora.org>
Description:	This entry could be used to set or show the UFS device
		runtime power management level. The current driver
		implementation supports 6 levels with next target states:
		0 - an UFS device will stay active, an UIC link will
		stay active
		1 - an UFS device will stay active, an UIC link will
		hibernate
		2 - an UFS device will moved to sleep, an UIC link will
		stay active
		3 - an UFS device will moved to sleep, an UIC link will
		hibernate
		4 - an UFS device will be powered off, an UIC link will
		hibernate
		5 - an UFS device will be powered off, an UIC link will
		be powered off

What:		/sys/bus/platform/drivers/ufshcd/*/rpm_target_dev_state
Date:		February 2018
Contact:	Subhash Jadavani <subhashj@codeaurora.org>
Description:	This entry shows the target power mode of an UFS device
		for the chosen runtime power management level.
		The file is read only.

What:		/sys/bus/platform/drivers/ufshcd/*/rpm_target_link_state
Date:		February 2018
Contact:	Subhash Jadavani <subhashj@codeaurora.org>
Description:	This entry shows the target state of an UFS UIC link
		for the chosen runtime power management level.
		The file is read only.

What:		/sys/bus/platform/drivers/ufshcd/*/spm_lvl
Date:		September 2014
Contact:	Subhash Jadavani <subhashj@codeaurora.org>
Description:	This entry could be used to set or show the UFS device
		system power management level. The current driver
		implementation supports 6 levels with next target states:
		0 - an UFS device will stay active, an UIC link will
		stay active
		1 - an UFS device will stay active, an UIC link will
		hibernate
		2 - an UFS device will moved to sleep, an UIC link will
		stay active
		3 - an UFS device will moved to sleep, an UIC link will
		hibernate
		4 - an UFS device will be powered off, an UIC link will
		hibernate
		5 - an UFS device will be powered off, an UIC link will
		be powered off

What:		/sys/bus/platform/drivers/ufshcd/*/spm_target_dev_state
Date:		February 2018
Contact:	Subhash Jadavani <subhashj@codeaurora.org>
Description:	This entry shows the target power mode of an UFS device
		for the chosen system power management level.
		The file is read only.

What:		/sys/bus/platform/drivers/ufshcd/*/spm_target_link_state
Date:		February 2018
Contact:	Subhash Jadavani <subhashj@codeaurora.org>
Description:	This entry shows the target state of an UFS UIC link
		for the chosen system power management level.
		The file is read only.
+47 −45
Original line number Diff line number Diff line
@@ -57,29 +57,8 @@ static ssize_t rpm_lvl_show(struct device *dev,
		struct device_attribute *attr, char *buf)
{
	struct ufs_hba *hba = dev_get_drvdata(dev);
	int curr_len;
	u8 lvl;

	curr_len = snprintf(buf, PAGE_SIZE,
			    "\nCurrent Runtime PM level [%d] => dev_state [%s] link_state [%s]\n",
			    hba->rpm_lvl,
			    ufschd_ufs_dev_pwr_mode_to_string(
				ufs_pm_lvl_states[hba->rpm_lvl].dev_state),
			    ufschd_uic_link_state_to_string(
				ufs_pm_lvl_states[hba->rpm_lvl].link_state));

	curr_len += snprintf((buf + curr_len), (PAGE_SIZE - curr_len),
			     "\nAll available Runtime PM levels info:\n");
	for (lvl = UFS_PM_LVL_0; lvl < UFS_PM_LVL_MAX; lvl++)
		curr_len += snprintf((buf + curr_len), (PAGE_SIZE - curr_len),
				     "\tRuntime PM level [%d] => dev_state [%s] link_state [%s]\n",
				    lvl,
				    ufschd_ufs_dev_pwr_mode_to_string(
					ufs_pm_lvl_states[lvl].dev_state),
				    ufschd_uic_link_state_to_string(
					ufs_pm_lvl_states[lvl].link_state));

	return curr_len;
	return sprintf(buf, "%d\n", hba->rpm_lvl);
}

static ssize_t rpm_lvl_store(struct device *dev,
@@ -88,33 +67,30 @@ static ssize_t rpm_lvl_store(struct device *dev,
	return ufs_sysfs_pm_lvl_store(dev, attr, buf, count, true);
}

static ssize_t rpm_target_dev_state_show(struct device *dev,
		struct device_attribute *attr, char *buf)
{
	struct ufs_hba *hba = dev_get_drvdata(dev);

	return sprintf(buf, "%s\n", ufschd_ufs_dev_pwr_mode_to_string(
			ufs_pm_lvl_states[hba->rpm_lvl].dev_state));
}

static ssize_t rpm_target_link_state_show(struct device *dev,
		struct device_attribute *attr, char *buf)
{
	struct ufs_hba *hba = dev_get_drvdata(dev);

	return sprintf(buf, "%s\n", ufschd_uic_link_state_to_string(
			ufs_pm_lvl_states[hba->rpm_lvl].link_state));
}

static ssize_t spm_lvl_show(struct device *dev,
		struct device_attribute *attr, char *buf)
{
	struct ufs_hba *hba = dev_get_drvdata(dev);
	int curr_len;
	u8 lvl;

	curr_len = snprintf(buf, PAGE_SIZE,
			    "\nCurrent System PM level [%d] => dev_state [%s] link_state [%s]\n",
			    hba->spm_lvl,
			    ufschd_ufs_dev_pwr_mode_to_string(
				ufs_pm_lvl_states[hba->spm_lvl].dev_state),
			    ufschd_uic_link_state_to_string(
				ufs_pm_lvl_states[hba->spm_lvl].link_state));

	curr_len += snprintf((buf + curr_len), (PAGE_SIZE - curr_len),
			     "\nAll available System PM levels info:\n");
	for (lvl = UFS_PM_LVL_0; lvl < UFS_PM_LVL_MAX; lvl++)
		curr_len += snprintf((buf + curr_len), (PAGE_SIZE - curr_len),
				     "\tSystem PM level [%d] => dev_state [%s] link_state [%s]\n",
				    lvl,
				    ufschd_ufs_dev_pwr_mode_to_string(
					ufs_pm_lvl_states[lvl].dev_state),
				    ufschd_uic_link_state_to_string(
					ufs_pm_lvl_states[lvl].link_state));

	return curr_len;
	return sprintf(buf, "%d\n", hba->spm_lvl);
}

static ssize_t spm_lvl_store(struct device *dev,
@@ -123,12 +99,38 @@ static ssize_t spm_lvl_store(struct device *dev,
	return ufs_sysfs_pm_lvl_store(dev, attr, buf, count, false);
}

static ssize_t spm_target_dev_state_show(struct device *dev,
		struct device_attribute *attr, char *buf)
{
	struct ufs_hba *hba = dev_get_drvdata(dev);

	return sprintf(buf, "%s\n", ufschd_ufs_dev_pwr_mode_to_string(
				ufs_pm_lvl_states[hba->spm_lvl].dev_state));
}

static ssize_t spm_target_link_state_show(struct device *dev,
		struct device_attribute *attr, char *buf)
{
	struct ufs_hba *hba = dev_get_drvdata(dev);

	return sprintf(buf, "%s\n", ufschd_uic_link_state_to_string(
				ufs_pm_lvl_states[hba->spm_lvl].link_state));
}

static DEVICE_ATTR_RW(rpm_lvl);
static DEVICE_ATTR_RO(rpm_target_dev_state);
static DEVICE_ATTR_RO(rpm_target_link_state);
static DEVICE_ATTR_RW(spm_lvl);
static DEVICE_ATTR_RO(spm_target_dev_state);
static DEVICE_ATTR_RO(spm_target_link_state);

static struct attribute *ufs_sysfs_ufshcd_attrs[] = {
	&dev_attr_rpm_lvl.attr,
	&dev_attr_rpm_target_dev_state.attr,
	&dev_attr_rpm_target_link_state.attr,
	&dev_attr_spm_lvl.attr,
	&dev_attr_spm_target_dev_state.attr,
	&dev_attr_spm_target_link_state.attr,
	NULL
};