From nobody Sat Apr 11 14:30:00 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 357F4C678D5 for ; Tue, 7 Mar 2023 16:08:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229840AbjCGQIK (ORCPT ); Tue, 7 Mar 2023 11:08:10 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59684 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230019AbjCGQHr (ORCPT ); Tue, 7 Mar 2023 11:07:47 -0500 Received: from esa4.hgst.iphmx.com (esa4.hgst.iphmx.com [216.71.154.42]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A761094F72; Tue, 7 Mar 2023 08:06:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1678205188; x=1709741188; h=from:to:cc:subject:date:message-id; bh=d5GAJhIsi3DI0tkGTO78oNl30k1j8FBMs55HQWPy1d4=; b=AZJkiTBRUHFE8J5quYt/4q5Zo7EjSdm0/oEbvWwVcNEZe24CqDxcI2PX uGNKfhAlJMz2e6XItq7xMzWRPe2FBVSdh2fX6pZsRPxIjBLsdxXhJ30XQ /HQjsDHr3+AiI41mhrCfqn/vBwdk1zN1Muf2MnGlbHBXXn4P4VgFNWVhT kuQ1eoq9I1b/Dn9H+EMRq8c7vPiGHDQiH7dk8Oy4xcCgtdE0v5BHMtIVT 3xh4Biow/LDl26888Fg9K+K3OX61rve437QCVPOPlqiIqvXgVZ3jvNKqL i3uethYxLCAJ7shWPtJVP0kpH7kUJXL1HBqKIVzcKe7HVHYmscjj2V6UR g==; X-IronPort-AV: E=Sophos;i="5.98,241,1673884800"; d="scan'208";a="223307386" Received: from h199-255-45-14.hgst.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 08 Mar 2023 00:06:27 +0800 IronPort-SDR: ZypTryLPrxJVs9u7A5yNXY7ea+aLwtW5Gijc6QgdUWNkczze+JcRalZCbj2bpCYCBrZedET53U JmVwzITWMtF1rkqV6opRkiLy7Gy4rY4ISkubTSIoM9enFBrh2BN3/a96U6dR8FV4709Tk7uK79 B5N1KF8/YkMmJ35iCtgJnd+WwJuIzYPztA123rZWORQqEj6tN8jaHbEpLQNsbEsufFTvpjm/ua NKAgzGKntsRbsVP2Sq8iSZUt0dCvGDeFfasjZ0r/nNEUFEEhC2f6a1ZmVAWoA1wj/5UXvpPmsY CcA= Received: from uls-op-cesaip01.wdc.com ([10.248.3.36]) by uls-op-cesaep01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 07 Mar 2023 07:23:07 -0800 IronPort-SDR: Yf+ZyGK4UmlJoIelPxc38vMDhF/EuR/c3yLmswPnh5DD7lxon1FltAbOuGy8honcZ3ouhuMYPX VwVNrU1GGIR+iT++5DkfU5QIqePemln3OpZWCHqYJCR4/CcLLPqkDOUTSIkqoUh21BnrB+kj/k U2lNrFXgVw7qRJKkj1TSxkUpBSpvd0hfZpPYmxWNZF3HW/COiOhdFexAgofA8emp4mqmfOg+Tp tOFx98Rv+Dl3FZ/s7UbvrNKsEarNHXVJENUxpU5UUb9vNcQPG1gvFoq+rgTP1c9/tfxt3H5WWx 9aM= WDCIronportException: Internal Received: from ilb001078.ad.shared (HELO ilb001078.sdcorp.global.sandisk.com) ([10.45.31.219]) by uls-op-cesaip01.wdc.com with ESMTP; 07 Mar 2023 08:06:25 -0800 From: Arthur Simchaev To: martin.petersen@oracle.com, bvanassche@acm.org Cc: beanhuo@micron.com, linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org, Arthur Simchaev Subject: [PATCH v1] ufs: core: Add support for qTimestamp attribute Date: Tue, 7 Mar 2023 18:06:22 +0200 Message-Id: <1678205182-13943-1-git-send-email-Arthur.Simchaev@wdc.com> X-Mailer: git-send-email 2.7.4 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 -- 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; } =20 +static void ufshcd_set_timestamp_attr(struct ufs_hba *hba) +{ + int err; + struct ufs_query_req *request =3D NULL; + struct ufs_query_res *response =3D NULL; + struct ufs_dev_info *dev_info =3D &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 =3D UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST; + + upiu_data =3D (struct utp_upiu_query_v4_0 *)&request->upiu_req; + + put_unaligned_be64(ktime_get_real_ns(), &upiu_data->osf3); + + err =3D 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, bo= ol init_dev_params) ufshcd_set_ufs_dev_active(hba); ufshcd_force_reset_auto_bkops(hba); =20 + 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, en= um ufs_pm_op pm_op) ret =3D ufshcd_set_dev_pwr_mode(hba, UFS_ACTIVE_PWR_MODE); if (ret) goto set_old_link_state; + ufshcd_set_timestamp_attr(hba); } =20 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 { }; =20 /** + * struct utp_upiu_query_v4_0 - upiu request buffer structure for + * query request >=3D 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 =3D 0x1E, QUERY_ATTR_IDN_CURR_WB_BUFF_SIZE =3D 0x1F, QUERY_ATTR_IDN_EXT_IID_EN =3D 0x2A, + QUERY_ATTR_IDN_TIMESTAMP =3D 0x30 }; =20 /* Descriptor idn for Query requests */ --=20 2.7.4