RE: [PATCH v1] ufs: core: Add support for qTimestamp attribute

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Gentle reminder

Regards
Arthur

> -----Original Message-----
> From: Arthur Simchaev <Arthur.Simchaev@xxxxxxx>
> Sent: Tuesday, March 7, 2023 6:06 PM
> To: martin.petersen@xxxxxxxxxx; bvanassche@xxxxxxx
> Cc: beanhuo@xxxxxxxxxx; linux-scsi@xxxxxxxxxxxxxxx; linux-
> kernel@xxxxxxxxxxxxxxx; Arthur Simchaev <Arthur.Simchaev@xxxxxxx>
> Subject: [PATCH v1] ufs: core: Add support for qTimestamp attribute
> 
> The new qTimestamp attribute was added to UFS 4.0 spec, in order to
> synchronize timestamp between device logs and the host.The spec
> recommend
> to send this attribute upon device power-on Reset/HW reset or when
> switching to Active state (using SSU command). Due to this attribute,
> the attribute's max value was extended to 8 bytes. As a result,
> the new definition of struct utp_upiu_query_v4_0 was added.
> 
> Signed-off-by: Arthur Simchaev <Arthur.Simchaev@xxxxxxx>
> 
> --
> Changes to v1:
> - Add missed response variable to ufshcd_set_timestamp_attr
> ---
>  drivers/ufs/core/ufshcd.c        | 38
> ++++++++++++++++++++++++++++++++++++++
>  include/uapi/scsi/scsi_bsg_ufs.h | 25 +++++++++++++++++++++++++
>  include/ufs/ufs.h                |  1 +
>  3 files changed, 64 insertions(+)
> 
> diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> index 172d25f..cba9ef1 100644
> --- a/drivers/ufs/core/ufshcd.c
> +++ b/drivers/ufs/core/ufshcd.c
> @@ -8386,6 +8386,41 @@ static int ufshcd_device_params_init(struct
> ufs_hba *hba)
>  	return ret;
>  }
> 
> +static void ufshcd_set_timestamp_attr(struct ufs_hba *hba)
> +{
> +	int err;
> +	struct ufs_query_req *request = NULL;
> +	struct ufs_query_res *response = NULL;
> +	struct ufs_dev_info *dev_info = &hba->dev_info;
> +	struct utp_upiu_query_v4_0 *upiu_data;
> +
> +	if (dev_info->wspecversion < 0x400)
> +		return;
> +
> +	ufshcd_hold(hba, false);
> +
> +	mutex_lock(&hba->dev_cmd.lock);
> +
> +	ufshcd_init_query(hba, &request, &response,
> +			  UPIU_QUERY_OPCODE_WRITE_ATTR,
> +			  QUERY_ATTR_IDN_TIMESTAMP, 0, 0);
> +
> +	request->query_func =
> UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST;
> +
> +	upiu_data = (struct utp_upiu_query_v4_0 *)&request->upiu_req;
> +
> +	put_unaligned_be64(ktime_get_real_ns(), &upiu_data->osf3);
> +
> +	err = ufshcd_exec_dev_cmd(hba, DEV_CMD_TYPE_QUERY,
> QUERY_REQ_TIMEOUT);
> +
> +	if (err)
> +		dev_err(hba->dev, "%s: failed to set timestamp %d\n",
> +			__func__, err);
> +
> +	mutex_unlock(&hba->dev_cmd.lock);
> +	ufshcd_release(hba);
> +}
> +
>  /**
>   * ufshcd_add_lus - probe and add UFS logical units
>   * @hba: per-adapter instance
> @@ -8555,6 +8590,8 @@ static int ufshcd_device_init(struct ufs_hba *hba,
> bool init_dev_params)
>  	ufshcd_set_ufs_dev_active(hba);
>  	ufshcd_force_reset_auto_bkops(hba);
> 
> +	ufshcd_set_timestamp_attr(hba);
> +
>  	/* Gear up to HS gear if supported */
>  	if (hba->max_pwr_info.is_valid) {
>  		/*
> @@ -9592,6 +9629,7 @@ static int __ufshcd_wl_resume(struct ufs_hba
> *hba, enum ufs_pm_op pm_op)
>  		ret = ufshcd_set_dev_pwr_mode(hba,
> UFS_ACTIVE_PWR_MODE);
>  		if (ret)
>  			goto set_old_link_state;
> +		ufshcd_set_timestamp_attr(hba);
>  	}
> 
>  	if (ufshcd_keep_autobkops_enabled_except_suspend(hba))
> diff --git a/include/uapi/scsi/scsi_bsg_ufs.h
> b/include/uapi/scsi/scsi_bsg_ufs.h
> index 2801b65..fd3f9e5e 100644
> --- a/include/uapi/scsi/scsi_bsg_ufs.h
> +++ b/include/uapi/scsi/scsi_bsg_ufs.h
> @@ -71,6 +71,31 @@ struct utp_upiu_query {
>  };
> 
>  /**
> + * struct utp_upiu_query_v4_0 - upiu request buffer structure for
> + * query request >= UFS 4.0 spec.
> + * @opcode: command to perform B-0
> + * @idn: a value that indicates the particular type of data B-1
> + * @index: Index to further identify data B-2
> + * @selector: Index to further identify data B-3
> + * @osf4: spec field B-5
> + * @osf5: spec field B 6,7
> + * @osf6: spec field DW 8,9
> + * @osf7: spec field DW 10,11
> + */
> +struct utp_upiu_query_v4_0 {
> +	__u8 opcode;
> +	__u8 idn;
> +	__u8 index;
> +	__u8 selector;
> +	__u8 osf3;
> +	__u8 osf4;
> +	__be16 osf5;
> +	__be32 osf6;
> +	__be32 osf7;
> +	__be32 reserved;
> +};
> +
> +/**
>   * struct utp_upiu_cmd - Command UPIU structure
>   * @data_transfer_len: Data Transfer Length DW-3
>   * @cdb: Command Descriptor Block CDB DW-4 to DW-7
> diff --git a/include/ufs/ufs.h b/include/ufs/ufs.h
> index 4e8d624..198cb39 100644
> --- a/include/ufs/ufs.h
> +++ b/include/ufs/ufs.h
> @@ -170,6 +170,7 @@ enum attr_idn {
>  	QUERY_ATTR_IDN_WB_BUFF_LIFE_TIME_EST    = 0x1E,
>  	QUERY_ATTR_IDN_CURR_WB_BUFF_SIZE        = 0x1F,
>  	QUERY_ATTR_IDN_EXT_IID_EN		= 0x2A,
> +	QUERY_ATTR_IDN_TIMESTAMP		= 0x30
>  };
> 
>  /* Descriptor idn for Query requests */
> --
> 2.7.4





[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux