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

From: Arthur Simchaev
Date: Sun Mar 19 2023 - 11:43:42 EST


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