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

Commit 5fa860cf authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "ufs: sysfs: add sysfs entries for write booster"

parents b776547b 9c9da167
Loading
Loading
Loading
Loading
+39 −2
Original line number Diff line number Diff line
@@ -311,6 +311,10 @@ UFS_DEVICE_DESC_PARAM(device_version, _DEV_VER, 2);
UFS_DEVICE_DESC_PARAM(number_of_secure_wpa, _NUM_SEC_WPA, 1);
UFS_DEVICE_DESC_PARAM(psa_max_data_size, _PSA_MAX_DATA, 4);
UFS_DEVICE_DESC_PARAM(psa_state_timeout, _PSA_TMT, 1);
UFS_DEVICE_DESC_PARAM(ext_feature_sup, _EXT_UFS_FEATURE_SUP, 4);
UFS_DEVICE_DESC_PARAM(wb_presv_us_en, _WB_US_RED_EN, 1);
UFS_DEVICE_DESC_PARAM(wb_type, _WB_TYPE, 1);
UFS_DEVICE_DESC_PARAM(wb_shared_alloc_units, _WB_SHARED_ALLOC_UNITS, 4);

static struct attribute *ufs_sysfs_device_descriptor[] = {
	&dev_attr_device_type.attr,
@@ -339,6 +343,10 @@ static struct attribute *ufs_sysfs_device_descriptor[] = {
	&dev_attr_number_of_secure_wpa.attr,
	&dev_attr_psa_max_data_size.attr,
	&dev_attr_psa_state_timeout.attr,
	&dev_attr_ext_feature_sup.attr,
	&dev_attr_wb_presv_us_en.attr,
	&dev_attr_wb_type.attr,
	&dev_attr_wb_shared_alloc_units.attr,
	NULL,
};

@@ -408,6 +416,12 @@ UFS_GEOMETRY_DESC_PARAM(enh4_memory_max_alloc_units,
	_ENM4_MAX_NUM_UNITS, 4);
UFS_GEOMETRY_DESC_PARAM(enh4_memory_capacity_adjustment_factor,
	_ENM4_CAP_ADJ_FCTR, 2);
UFS_GEOMETRY_DESC_PARAM(wb_max_alloc_units, _WB_MAX_ALLOC_UNITS, 4);
UFS_GEOMETRY_DESC_PARAM(wb_max_wb_luns, _WB_MAX_WB_LUNS, 1);
UFS_GEOMETRY_DESC_PARAM(wb_buff_cap_adj, _WB_BUFF_CAP_ADJ, 1);
UFS_GEOMETRY_DESC_PARAM(wb_sup_red_type, _WB_SUP_RED_TYPE, 1);
UFS_GEOMETRY_DESC_PARAM(wb_sup_wb_type, _WB_SUP_WB_TYPE, 1);


static struct attribute *ufs_sysfs_geometry_descriptor[] = {
	&dev_attr_raw_device_capacity.attr,
@@ -439,6 +453,11 @@ static struct attribute *ufs_sysfs_geometry_descriptor[] = {
	&dev_attr_enh3_memory_capacity_adjustment_factor.attr,
	&dev_attr_enh4_memory_max_alloc_units.attr,
	&dev_attr_enh4_memory_capacity_adjustment_factor.attr,
	&dev_attr_wb_max_alloc_units.attr,
	&dev_attr_wb_max_wb_luns.attr,
	&dev_attr_wb_buff_cap_adj.attr,
	&dev_attr_wb_sup_red_type.attr,
	&dev_attr_wb_sup_wb_type.attr,
	NULL,
};

@@ -651,7 +670,7 @@ static ssize_t _name##_show(struct device *dev, \
	pm_runtime_put_sync(hba->dev);					\
	if (ret)							\
		return -EINVAL;						\
	return sprintf(buf, "%s\n", flag ? "true" : "false");		\
	return snprintf(buf, PAGE_SIZE, "%s\n", flag ? "true" : "false"); \
}									\
static DEVICE_ATTR_RO(_name)

@@ -663,6 +682,9 @@ UFS_FLAG(life_span_mode_enable, _LIFE_SPAN_MODE_ENABLE);
UFS_FLAG(phy_resource_removal, _FPHYRESOURCEREMOVAL);
UFS_FLAG(busy_rtc, _BUSY_RTC);
UFS_FLAG(disable_fw_update, _PERMANENTLY_DISABLE_FW_UPDATE);
UFS_FLAG(wb_enable, _WB_EN);
UFS_FLAG(wb_flush_en, _WB_BUFF_FLUSH_EN);
UFS_FLAG(wb_flush_during_h8, _WB_BUFF_FLUSH_DURING_HIBERN8);

static struct attribute *ufs_sysfs_device_flags[] = {
	&dev_attr_device_init.attr,
@@ -673,6 +695,9 @@ static struct attribute *ufs_sysfs_device_flags[] = {
	&dev_attr_phy_resource_removal.attr,
	&dev_attr_busy_rtc.attr,
	&dev_attr_disable_fw_update.attr,
	&dev_attr_wb_enable.attr,
	&dev_attr_wb_flush_en.attr,
	&dev_attr_wb_flush_during_h8.attr,
	NULL,
};

@@ -694,7 +719,7 @@ static ssize_t _name##_show(struct device *dev, \
	pm_runtime_put_sync(hba->dev);					\
	if (ret)							\
		return -EINVAL;						\
	return sprintf(buf, "0x%08X\n", value);				\
	return snprintf(buf, PAGE_SIZE, "0x%08X\n", value);		\
}									\
static DEVICE_ATTR_RO(_name)

@@ -714,6 +739,11 @@ UFS_ATTRIBUTE(exception_event_status, _EE_STATUS);
UFS_ATTRIBUTE(ffu_status, _FFU_STATUS);
UFS_ATTRIBUTE(psa_state, _PSA_STATE);
UFS_ATTRIBUTE(psa_data_size, _PSA_DATA_SIZE);
UFS_ATTRIBUTE(wb_flush_status, _WB_FLUSH_STATUS);
UFS_ATTRIBUTE(wb_avail_buf, _AVAIL_WB_BUFF_SIZE);
UFS_ATTRIBUTE(wb_life_time_est, _WB_BUFF_LIFE_TIME_EST);
UFS_ATTRIBUTE(wb_cur_buf, _CURR_WB_BUFF_SIZE);


static struct attribute *ufs_sysfs_attributes[] = {
	&dev_attr_boot_lun_enabled.attr,
@@ -732,6 +762,10 @@ static struct attribute *ufs_sysfs_attributes[] = {
	&dev_attr_ffu_status.attr,
	&dev_attr_psa_state.attr,
	&dev_attr_psa_data_size.attr,
	&dev_attr_wb_flush_status.attr,
	&dev_attr_wb_avail_buf.attr,
	&dev_attr_wb_life_time_est.attr,
	&dev_attr_wb_cur_buf.attr,
	NULL,
};

@@ -783,6 +817,8 @@ UFS_UNIT_DESC_PARAM(provisioning_type, _PROVISIONING_TYPE, 1);
UFS_UNIT_DESC_PARAM(physical_memory_resourse_count, _PHY_MEM_RSRC_CNT, 8);
UFS_UNIT_DESC_PARAM(context_capabilities, _CTX_CAPABILITIES, 2);
UFS_UNIT_DESC_PARAM(large_unit_granularity, _LARGE_UNIT_SIZE_M1, 1);
UFS_UNIT_DESC_PARAM(wb_buf_alloc_units, _WB_BUF_ALLOC_UNITS, 4);


static struct attribute *ufs_sysfs_unit_descriptor[] = {
	&dev_attr_boot_lun_id.attr,
@@ -798,6 +834,7 @@ static struct attribute *ufs_sysfs_unit_descriptor[] = {
	&dev_attr_physical_memory_resourse_count.attr,
	&dev_attr_context_capabilities.attr,
	&dev_attr_large_unit_granularity.attr,
	&dev_attr_wb_buf_alloc_units.attr,
	NULL,
};

+12 −0
Original line number Diff line number Diff line
@@ -165,6 +165,7 @@ enum unit_desc_param {
	UNIT_DESC_PARAM_PHY_MEM_RSRC_CNT	= 0x18,
	UNIT_DESC_PARAM_CTX_CAPABILITIES	= 0x20,
	UNIT_DESC_PARAM_LARGE_UNIT_SIZE_M1	= 0x22,
	UNIT_DESC_PARAM_WB_BUF_ALLOC_UNITS	= 0x29,
};

/* Device descriptor parameters offsets in bytes*/
@@ -205,6 +206,9 @@ enum device_desc_param {
	DEVICE_DESC_PARAM_PSA_TMT		= 0x29,
	DEVICE_DESC_PARAM_PRDCT_REV		= 0x2A,
	DEVICE_DESC_PARAM_EXT_UFS_FEATURE_SUP	= 0x4F,
	DEVICE_DESC_PARAM_WB_US_RED_EN		= 0x53,
	DEVICE_DESC_PARAM_WB_TYPE		= 0x54,
	DEVICE_DESC_PARAM_WB_SHARED_ALLOC_UNITS = 0x55,
};

/* Interconnect descriptor parameters offsets in bytes*/
@@ -249,6 +253,11 @@ enum geometry_desc_param {
	GEOMETRY_DESC_PARAM_ENM4_MAX_NUM_UNITS	= 0x3E,
	GEOMETRY_DESC_PARAM_ENM4_CAP_ADJ_FCTR	= 0x42,
	GEOMETRY_DESC_PARAM_OPT_LOG_BLK_SIZE	= 0x44,
	GEOMETRY_DESC_PARAM_WB_MAX_ALLOC_UNITS	= 0x4F,
	GEOMETRY_DESC_PARAM_WB_MAX_WB_LUNS	= 0x53,
	GEOMETRY_DESC_PARAM_WB_BUFF_CAP_ADJ	= 0x54,
	GEOMETRY_DESC_PARAM_WB_SUP_RED_TYPE	= 0x55,
	GEOMETRY_DESC_PARAM_WB_SUP_WB_TYPE	= 0x56,
};

/* Health descriptor parameters offsets in bytes*/
@@ -600,6 +609,7 @@ struct ufs_dev_info {
	u8	i_product_name;
	u16	w_spec_version;
	u32	d_ext_ufs_feature_sup;
	u8	b_wb_buffer_type;

	/* query flags */
	bool f_power_on_wp_en;
@@ -613,6 +623,8 @@ struct ufs_dev_info {
	unsigned int quirks;

	bool keep_vcc_on;

	bool wb_config_lun;
};

#define MAX_MODEL_LEN 16
+60 −4
Original line number Diff line number Diff line
@@ -6058,6 +6058,37 @@ static int ufshcd_get_lu_wp(struct ufs_hba *hba,
	return ret;
}

/*
 * ufshcd_get_wb_alloc_units - returns "dLUNumWriteBoosterBufferAllocUnits"
 * @hba: per-adapter instance
 * @lun: UFS device lun id
 * @d_lun_wbb_au: pointer to buffer to hold the LU's alloc units info
 *
 * Returns 0 in case of success and d_lun_wbb_au would be returned
 * Returns -ENOTSUPP if reading d_lun_wbb_au is not supported.
 * Returns -EINVAL in case of invalid parameters passed to this function.
 */
static int ufshcd_get_wb_alloc_units(struct ufs_hba *hba,
			    u8 lun,
			    u8 *d_lun_wbb_au)
{
	int ret;

	if (!d_lun_wbb_au)
		ret = -EINVAL;

	/* WB can be supported only from LU0..LU7 */
	else if (lun >= UFS_UPIU_MAX_GENERAL_LUN)
		ret = -ENOTSUPP;
	else
		ret = ufshcd_read_unit_desc_param(hba,
					  lun,
					  UNIT_DESC_PARAM_WB_BUF_ALLOC_UNITS,
					  d_lun_wbb_au,
					  sizeof(*d_lun_wbb_au));
	return ret;
}

/**
 * ufshcd_get_lu_power_on_wp_status - get LU's power on write protect
 * status
@@ -6847,8 +6878,10 @@ static void ufshcd_bkops_exception_event_handler(struct ufs_hba *hba)

static bool ufshcd_wb_sup(struct ufs_hba *hba)
{
	return !!(hba->dev_info.d_ext_ufs_feature_sup &
		  UFS_DEV_WRITE_BOOSTER_SUP);
	return ((hba->dev_info.d_ext_ufs_feature_sup &
		   UFS_DEV_WRITE_BOOSTER_SUP) &&
		  (hba->dev_info.b_wb_buffer_type
		   || hba->dev_info.wb_config_lun));
}

static int ufshcd_wb_ctrl(struct ufs_hba *hba, bool enable)
@@ -8435,7 +8468,8 @@ static int ufs_get_device_desc(struct ufs_hba *hba,
	int err;
	size_t buff_len;
	u8 model_index;
	u8 *desc_buf;
	u8 *desc_buf, wb_buf[4];
	u32 lun, res;

	buff_len = max_t(size_t, hba->desc_size.dev_desc,
			 QUERY_DESC_MAX_SIZE + 1);
@@ -8467,7 +8501,7 @@ static int ufs_get_device_desc(struct ufs_hba *hba,
	if ((dev_desc->wspecversion >= 0x310) ||
	    (dev_desc->wmanufacturerid == UFS_VENDOR_TOSHIBA &&
	     dev_desc->wspecversion >= 0x300 &&
	     hba->desc_size.dev_desc >= 0x59))
	     hba->desc_size.dev_desc >= 0x59)) {
		hba->dev_info.d_ext_ufs_feature_sup =
			desc_buf[DEVICE_DESC_PARAM_EXT_UFS_FEATURE_SUP]
								<< 24 |
@@ -8476,7 +8510,29 @@ static int ufs_get_device_desc(struct ufs_hba *hba,
			desc_buf[DEVICE_DESC_PARAM_EXT_UFS_FEATURE_SUP + 2]
								<< 8 |
			desc_buf[DEVICE_DESC_PARAM_EXT_UFS_FEATURE_SUP + 3];
		hba->dev_info.b_wb_buffer_type =
			desc_buf[DEVICE_DESC_PARAM_WB_TYPE];

		if (hba->dev_info.b_wb_buffer_type)
			goto skip_unit_desc;

		hba->dev_info.wb_config_lun = false;
		for (lun = 0; lun < UFS_UPIU_MAX_GENERAL_LUN; lun++) {
			memset(wb_buf, 0, sizeof(wb_buf));
			err = ufshcd_get_wb_alloc_units(hba, lun, wb_buf);
			if (err)
				break;

			res = wb_buf[0] << 24 | wb_buf[1] << 16 |
				wb_buf[2] << 8 | wb_buf[3];
			if (res) {
				hba->dev_info.wb_config_lun = true;
				break;
			}
		}
	}

skip_unit_desc:
	/* Zero-pad entire buffer for string termination. */
	memset(desc_buf, 0, buff_len);