From patchwork Thu Jul 2 02:38:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kiwoong Kim X-Patchwork-Id: 11637763 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 71ED413BD for ; Thu, 2 Jul 2020 02:46:08 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 56B4F2085B for ; Thu, 2 Jul 2020 02:46:08 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b="o7b8dPCw" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726474AbgGBCqI (ORCPT ); Wed, 1 Jul 2020 22:46:08 -0400 Received: from mailout1.samsung.com ([203.254.224.24]:39367 "EHLO mailout1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726156AbgGBCqH (ORCPT ); Wed, 1 Jul 2020 22:46:07 -0400 Received: from epcas2p1.samsung.com (unknown [182.195.41.53]) by mailout1.samsung.com (KnoxPortal) with ESMTP id 20200702024604epoutp0125e8c84738895ac1123da4f5e9de8fd0~dz3mZ_4W92941029410epoutp01H for ; Thu, 2 Jul 2020 02:46:04 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.samsung.com 20200702024604epoutp0125e8c84738895ac1123da4f5e9de8fd0~dz3mZ_4W92941029410epoutp01H DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1593657964; bh=ktfYmqyeYkaB4RbQ/mzXvx+UvUm8DhxHeF+x52POj48=; h=From:To:Cc:Subject:Date:In-Reply-To:In-Reply-To:References:From; b=o7b8dPCw+8JMpdFEp90wkf5CS2sNn9IC6EAW1HKgMw9Mrj+qrj0fZEQs4qzvMmwW9 VVuqZ5PCn1Jqp1qD1+NS9C83S8S/Izuw8QNaTvwJATwt7d6pG/OK9dihs7A6B0wBfk aWMT5m6KT23w6MqhWsHPXgIdM+uW6ewE3OqR8Kjw= Received: from epsnrtp3.localdomain (unknown [182.195.42.164]) by epcas2p1.samsung.com (KnoxPortal) with ESMTP id 20200702024603epcas2p1ae05c0c54f688ee0ab164057bb4fb2b2~dz3l9KCrR1441614416epcas2p1m; Thu, 2 Jul 2020 02:46:03 +0000 (GMT) Received: from epsmges2p1.samsung.com (unknown [182.195.40.190]) by epsnrtp3.localdomain (Postfix) with ESMTP id 49y2XT64mBzMqYkY; Thu, 2 Jul 2020 02:46:01 +0000 (GMT) Received: from epcas2p4.samsung.com ( [182.195.41.56]) by epsmges2p1.samsung.com (Symantec Messaging Gateway) with SMTP id 48.9F.19322.76A4DFE5; Thu, 2 Jul 2020 11:45:59 +0900 (KST) Received: from epsmtrp2.samsung.com (unknown [182.195.40.14]) by epcas2p3.samsung.com (KnoxPortal) with ESMTPA id 20200702024558epcas2p38e61e50755728e18dadc9d9f08dabfbd~dz3hFhO3G0472304723epcas2p35; Thu, 2 Jul 2020 02:45:58 +0000 (GMT) Received: from epsmgms1p1new.samsung.com (unknown [182.195.42.41]) by epsmtrp2.samsung.com (KnoxPortal) with ESMTP id 20200702024558epsmtrp2e9460d218801a2a1c775f01247ed88d8~dz3hEuxKc2800328003epsmtrp26; Thu, 2 Jul 2020 02:45:58 +0000 (GMT) X-AuditID: b6c32a45-797ff70000004b7a-0d-5efd4a67e3e7 Received: from epsmtip2.samsung.com ( [182.195.34.31]) by epsmgms1p1new.samsung.com (Symantec Messaging Gateway) with SMTP id 10.E0.08382.66A4DFE5; Thu, 2 Jul 2020 11:45:58 +0900 (KST) Received: from ubuntu.dsn.sec.samsung.com (unknown [12.36.155.120]) by epsmtip2.samsung.com (KnoxPortal) with ESMTPA id 20200702024558epsmtip234bb952b7043370d6e508c5e8b8cb118~dz3g6p-G40375103751epsmtip2r; Thu, 2 Jul 2020 02:45:58 +0000 (GMT) From: Kiwoong Kim To: linux-scsi@vger.kernel.org, alim.akhtar@samsung.com, avri.altman@wdc.com, jejb@linux.ibm.com, martin.petersen@oracle.com, beanhuo@micron.com, asutoshd@codeaurora.org, cang@codeaurora.org, bvanassche@acm.org Cc: Kiwoong Kim Subject: [RFC PATCH v2 1/2] ufs: introduce a callback to get info of command completion Date: Thu, 2 Jul 2020 11:38:09 +0900 Message-Id: X-Mailer: git-send-email 2.7.4 In-Reply-To: In-Reply-To: X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpnk+LIzCtJLcpLzFFi42LZdljTQjfd62+cwYQv3BYP5m1js9jbdoLd 4uXPq2wWBx92slhM+/CT2eLT+mWsFotubGOyuLnlKItF9/UdbBbLj/9jcuDyuHzF2+NyXy+T x4RFBxg9vq/vYPP4+PQWi0ffllWMHp83yXm0H+hmCuCIyrHJSE1MSS1SSM1Lzk/JzEu3VfIO jneONzUzMNQ1tLQwV1LIS8xNtVVy8QnQdcvMAbpRSaEsMacUKBSQWFyspG9nU5RfWpKqkJFf XGKrlFqQklNgaFigV5yYW1yal66XnJ9rZWhgYGQKVJmQk3HkwUuWgimCFa2/pzE1MPbxdTFy ckgImEhM2viNsYuRi0NIYAejRGP3c3YI5xOjxOrZE6Gcb4wS7V/WsMC0HN/WBJXYyyixctt3 NgjnB6PE3nk/warYBDQlnt6cygSSEBG4wSgxp/kwK0iCWUBdYteEE0wgtrBApMSVyZ3sIDaL gKpEX28j0CQODl6BaInWZqhtchI3z3Uyg9icApYS6++0MqKyuYBqfrJLrN90lxWiwUWidesl qGZhiVfHt7BD2FISn9/tZYOw6yX2TW1ghWjuYZR4uu8fI0TCWGLWs3ZGkCOYgT5Yv0sfxJQQ UJY4cosF4nw+iY7Df9khwrwSHW1CEI3KEr8mTYYaIikx8+YdqK0eEo83QWwSAtl0cvI0lgmM 8rMQFixgZFzFKJZaUJybnlpsVGCIHH2bGMEpUst1B+Pktx/0DjEycTAeYpTgYFYS4T1t8CtO iDclsbIqtSg/vqg0J7X4EKMpMBwnMkuJJucDk3ReSbyhqZGZmYGlqYWpmZGFkjhvruKFOCGB 9MSS1OzU1ILUIpg+Jg5OqQamFGcP2dN3ddZeOay+yuGlRPmiCoZWXpeubjm9+kkGGyJmPV72 ZPvOsqX7vuftyrtiEJM11Vdx9qflZalGaW8WcmzIO1ky89Hbmnu/g60u6/3PY/q1UfmIW+Op wrKbvY/eRG0ri7lZXJf7VLByRojGs4ceZtdOsyof27/Q4W6DNbtGrm4vx7xd8vwTHr64Ii5t do7zI4PSW4NJifeVW3hvGx/4FdGdJVK+zMrqVObON+tFZ8ibTfF0kgi6dnhfqfLi8E05gdmf DrKEzLOI67ogdjll00RG3YLDfhHtp46uCClYWXglIiNlmvGi+y8dVIKunC4XaNvdpnH/p0n9 7PTKLL2m1k3Ln7ywlu7Z5CanxFKckWioxVxUnAgA8kNAlhoEAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrNLMWRmVeSWpSXmKPExsWy7bCSvG6a1984g1n3FC0ezNvGZrG37QS7 xcufV9ksDj7sZLGY9uEns8Wn9ctYLRbd2MZkcXPLURaL7us72CyWH//H5MDlcfmKt8flvl4m jwmLDjB6fF/fwebx8ektFo++LasYPT5vkvNoP9DNFMARxWWTkpqTWZZapG+XwJVx5MFLloIp ghWtv6cxNTD28XUxcnJICJhIHN/WxN7FyMUhJLCbUWLRvE8sEAlJiRM7nzNC2MIS91uOsILY QgLfGCXWr0oBsdkENCWe3pzKBNIsIvCIUeL3zE52kASzgLrErgknmEBsYYFwiS0Lz4MNYhFQ lejrbWTrYuTg4BWIlmhthtolJ3HzXCcziM0pYCmx/k4rI8QuC4kdTZfYcIlPYBRYwMiwilEy taA4Nz232LDAMC+1XK84Mbe4NC9dLzk/dxMjOLy1NHcwbl/1Qe8QIxMH4yFGCQ5mJRHe0wa/ 4oR4UxIrq1KL8uOLSnNSiw8xSnOwKInz3ihcGCckkJ5YkpqdmlqQWgSTZeLglGpg2m3irbpq 8f3jfAXBWsGrdIWVdh8+bq4TlOfEMl3EkeOP70ftCp7wZ0pHpbdNsiiLj1z9SX3z0oxFdVfV mZiO3bvX1Fo9vXJ+eKRk3efdho/iLL9k7Yhpctt/MEY5+dM5rgnCr1Q4Zz7R36LXU2Op9/5C zEH3vOpUlW6+4yz1GQK1vgWv2/wbZr+13HK2Uezu0zOPGxpMfv10XhYo4m2tJilm3b/n3/7V LIExCzJPMan4XVe6yNUiJ1F5qvxf1c7HTNtZyvr09ZINPPSFI05efyPD91pq0VajJvnLn8+H TgqQ19CaYcDJ6j0n+/TaoNtLYldZ6ph0lCVeW26ae7tU/f084SXqmUdXT6mz0lZiKc5INNRi LipOBADJl7JJ3gIAAA== X-CMS-MailID: 20200702024558epcas2p38e61e50755728e18dadc9d9f08dabfbd X-Msg-Generator: CA X-Sendblock-Type: AUTO_CONFIDENTIAL CMS-TYPE: 102P DLP-Filter: Pass X-CFilter-Loop: Reflected X-CMS-RootMailID: 20200702024558epcas2p38e61e50755728e18dadc9d9f08dabfbd References: Sender: linux-scsi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org Some SoC specific might need command history for various reasons, such as stacking command contexts in system memory to check for debugging in the future or scaling some DVFS knobs to boost IO throughput. What you would do with the information could be variant per SoC vendor. Signed-off-by: Kiwoong Kim Acked-By: Stanley Chu --- drivers/scsi/ufs/ufshcd.c | 2 ++ drivers/scsi/ufs/ufshcd.h | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 52abe82..3326236 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -4882,6 +4882,7 @@ static void __ufshcd_transfer_req_compl(struct ufs_hba *hba, for_each_set_bit(index, &completed_reqs, hba->nutrs) { lrbp = &hba->lrb[index]; cmd = lrbp->cmd; + ufshcd_vops_compl_xfer_req(hba, index, (cmd) ? true : false); if (cmd) { ufshcd_add_command_trace(hba, index, "complete"); result = ufshcd_transfer_rsp_status(hba, lrbp); @@ -4890,6 +4891,7 @@ static void __ufshcd_transfer_req_compl(struct ufs_hba *hba, /* Mark completed command as NULL in LRB */ lrbp->cmd = NULL; lrbp->compl_time_stamp = ktime_get(); + /* Do not touch lrbp after scsi done */ cmd->scsi_done(cmd); __ufshcd_release(hba); diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h index c774012..6cf46bd 100644 --- a/drivers/scsi/ufs/ufshcd.h +++ b/drivers/scsi/ufs/ufshcd.h @@ -307,6 +307,7 @@ struct ufs_hba_variant_ops { void (*config_scaling_param)(struct ufs_hba *hba, struct devfreq_dev_profile *profile, void *data); + void (*compl_xfer_req)(struct ufs_hba *hba, int tag, bool is_scsi); }; /* clock gating state */ @@ -1137,6 +1138,13 @@ static inline void ufshcd_vops_config_scaling_param(struct ufs_hba *hba, hba->vops->config_scaling_param(hba, profile, data); } +static inline void ufshcd_vops_compl_xfer_req(struct ufs_hba *hba, + int tag, bool is_scsi); +{ + if (hba->vops && hba->vops->compl_xfer_req) + hba->vops->compl_xfer_req(hba, tag, is_scsi); +} + extern struct ufs_pm_lvl_states ufs_pm_lvl_states[]; /* From patchwork Thu Jul 2 02:38:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kiwoong Kim X-Patchwork-Id: 11637765 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 34E426C1 for ; Thu, 2 Jul 2020 02:46:11 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 12AEE2085B for ; Thu, 2 Jul 2020 02:46:11 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b="D6af5jBG" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726504AbgGBCqK (ORCPT ); Wed, 1 Jul 2020 22:46:10 -0400 Received: from mailout1.samsung.com ([203.254.224.24]:39383 "EHLO mailout1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726203AbgGBCqJ (ORCPT ); Wed, 1 Jul 2020 22:46:09 -0400 Received: from epcas2p4.samsung.com (unknown [182.195.41.56]) by mailout1.samsung.com (KnoxPortal) with ESMTP id 20200702024605epoutp01918fd8ed96c7e5e46cc497957b1957aa~dz3ndcfry2975929759epoutp01d for ; Thu, 2 Jul 2020 02:46:05 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.samsung.com 20200702024605epoutp01918fd8ed96c7e5e46cc497957b1957aa~dz3ndcfry2975929759epoutp01d DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1593657965; bh=sh6/i6u1vpyWSwKpgVVW9UfWYH9rMCKPo/npvmi2pFU=; h=From:To:Cc:Subject:Date:In-Reply-To:In-Reply-To:References:From; b=D6af5jBGeiZqoAV0w2p9FxwBYijaJf6+mGRUtuRKJieq+V82Vy251Q1a8n2B/Cx62 Ew1uYDpwX1Vk25cdmyjCXXKPtEx7eVttlImZoEH3h44AVgAjqx/g8CqfZ0dOD8Uvz4 13uRntc5DtfBW6yybwf6isVKs+OSC3tKoWQODKuw= Received: from epsnrtp1.localdomain (unknown [182.195.42.162]) by epcas2p3.samsung.com (KnoxPortal) with ESMTP id 20200702024604epcas2p38c09d5eeb10662d16956cff2d81b584a~dz3mliwI60243402434epcas2p3d; Thu, 2 Jul 2020 02:46:04 +0000 (GMT) Received: from epsmges2p1.samsung.com (unknown [182.195.40.182]) by epsnrtp1.localdomain (Postfix) with ESMTP id 49y2XV3RRrzMqYls; Thu, 2 Jul 2020 02:46:02 +0000 (GMT) Received: from epcas2p4.samsung.com ( [182.195.41.56]) by epsmges2p1.samsung.com (Symantec Messaging Gateway) with SMTP id 29.9F.19322.76A4DFE5; Thu, 2 Jul 2020 11:45:59 +0900 (KST) Received: from epsmtrp1.samsung.com (unknown [182.195.40.13]) by epcas2p3.samsung.com (KnoxPortal) with ESMTPA id 20200702024559epcas2p37b3f2f6c2cafd1f033d129032339ca16~dz3h7pCQK0930709307epcas2p3s; Thu, 2 Jul 2020 02:45:59 +0000 (GMT) Received: from epsmgms1p2.samsung.com (unknown [182.195.42.42]) by epsmtrp1.samsung.com (KnoxPortal) with ESMTP id 20200702024559epsmtrp1fb1833048a8054771db1b0c25df8a8a1~dz3h2lAGP2619526195epsmtrp1b; Thu, 2 Jul 2020 02:45:59 +0000 (GMT) X-AuditID: b6c32a45-797ff70000004b7a-0f-5efd4a6706cc Received: from epsmtip2.samsung.com ( [182.195.34.31]) by epsmgms1p2.samsung.com (Symantec Messaging Gateway) with SMTP id 6A.B2.08303.76A4DFE5; Thu, 2 Jul 2020 11:45:59 +0900 (KST) Received: from ubuntu.dsn.sec.samsung.com (unknown [12.36.155.120]) by epsmtip2.samsung.com (KnoxPortal) with ESMTPA id 20200702024559epsmtip21de8747dbecd94eaac4bd6ae12966d9d~dz3hpXNGk0257502575epsmtip2p; Thu, 2 Jul 2020 02:45:59 +0000 (GMT) From: Kiwoong Kim To: linux-scsi@vger.kernel.org, alim.akhtar@samsung.com, avri.altman@wdc.com, jejb@linux.ibm.com, martin.petersen@oracle.com, beanhuo@micron.com, asutoshd@codeaurora.org, cang@codeaurora.org, bvanassche@acm.org Cc: Kiwoong Kim Subject: [RFC PATCH v2 2/2] exynos-ufs: implement dbg_register_dump and compl_xfer_req Date: Thu, 2 Jul 2020 11:38:10 +0900 Message-Id: <3ff2f6a72282116a8b33d1bdd10cc89d6118aad8.1593657314.git.kwmad.kim@samsung.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: In-Reply-To: X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpjk+LIzCtJLcpLzFFi42LZdljTQjfd62+cwda/BhYP5m1js9jbdoLd 4uXPq2wWBx92slhM+/CT2eLT+mWsFotubGOyuLnlKItF9/UdbBbLj/9jcuDyuHzF2+NyXy+T x4RFBxg9vq/vYPP4+PQWi0ffllWMHp83yXm0H+hmCuCIyrHJSE1MSS1SSM1Lzk/JzEu3VfIO jneONzUzMNQ1tLQwV1LIS8xNtVVy8QnQdcvMAbpRSaEsMacUKBSQWFyspG9nU5RfWpKqkJFf XGKrlFqQklNgaFigV5yYW1yal66XnJ9rZWhgYGQKVJmQk3Fk9SWWgv7Miju/G5kbGPvDuxg5 OSQETCRm75jM2MXIxSEksINRYkLHRGYI5xOjxOT+9WwQzmcg5/48VpiWFwdmsoDYQgK7GCVe zcmFKPrBKPHkyQpGkASbgKbE05tTmUASIgI3GCXmNB8G62YWUJfYNeEEE4gtLBAh0TH3LVgD i4CqxI8t38HivALRErM6d0Ftk5O4ea6TGcTmFLCUWH+nlRGVzQVU85Vd4u2el0DNHECOi0TX 9wSIXmGJV8e3sEPYUhIv+9ug7HqJfVMbWCF6exglnu77xwiRMJaY9aydEWQOM9AH63fpQ4xU ljhyiwXifD6JjsN/2SHCvBIdbUIQjcoSvyZNhhoiKTHz5h2oTR4Ssz5fgwYi0KaLbxYyTmCU n4WwYAEj4ypGsdSC4tz01GKjAkPk2NvECE6QWq47GCe//aB3iJGJg/EQowQHs5II72mDX3FC vCmJlVWpRfnxRaU5qcWHGE2B4TiRWUo0OR+YovNK4g1NjczMDCxNLUzNjCyUxHlzFS/ECQmk J5akZqemFqQWwfQxcXBKNTA5Vd9OO7+286zdfK+b99bz7Xo/y2B9V66hzxtzToujrQVv1O8u YRLd/lFJVTvG/P4c42k/Ckxy7RIOHuMy7tbLtJE1cq0riTojMmG+5c9diZz3wrIKQnxU1rKt TFPNmrIxLaa4xlurr9vuncTT4/0S01dE/N7zO/Bm6pq/6gEFk967H5QrCPCV2/fug7K+eNTp 8NsfTNPXcEjWyWt8va5xbFl1aMnj2yvmvV2j6KB2d8mZMtt7P19u0/wk+L1/bZOF/LkT7KKr bPQaFfWC11mrymn5zWuWSXylz6c6Q/DgpEUKBqkTY43enRCL09+ptCJuIifPr+lTop99UuM4 a+KwpimrKvKy0xQ5yQXMDkosxRmJhlrMRcWJAP75AFsZBAAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrLLMWRmVeSWpSXmKPExsWy7bCSvG661984g2m7xC0ezNvGZrG37QS7 xcufV9ksDj7sZLGY9uEns8Wn9ctYLRbd2MZkcXPLURaL7us72CyWH//H5MDlcfmKt8flvl4m jwmLDjB6fF/fwebx8ektFo++LasYPT5vkvNoP9DNFMARxWWTkpqTWZZapG+XwJVxZPUlloL+ zIo7vxuZGxj7w7sYOTkkBEwkXhyYydLFyMUhJLCDUWLXinmsEAlJiRM7nzNC2MIS91uOsEIU fWOUeHP2MjNIgk1AU+LpzalMIAkRgUeMEr9ndrKDJJgF1CV2TTjBBGILC4RJfJr7GsxmEVCV +LHlO5jNKxAtMatzF9Q2OYmb5zrBhnIKWEqsv9MKtllIwEJiR9MlNlziExgFFjAyrGKUTC0o zk3PLTYsMMpLLdcrTswtLs1L10vOz93ECA5xLa0djHtWfdA7xMjEwXiIUYKDWUmE97TBrzgh 3pTEyqrUovz4otKc1OJDjNIcLErivF9nLYwTEkhPLEnNTk0tSC2CyTJxcEo1ME3d2bLrlWjn wq5HbgwM2xtlrnUEeHst68u/qr3zX0xmNJvgfwcF758yEbfnRUy4PSF4e8kq0XPvExvNb2R6 ru1PjOa6aejJrVi0b2VKcoQu+/xKqTUW2rc/5Km0Nj47nPItrmdTvNSmzzO+TPv9Y4X/9l/L PnVH//FuybnrErr3kwTjlsOvFX88+z/F8UF5ZT3jGYFX1Ub6Gh63/P1vzzIJXuJbte383jKB a+whp+4EdauZz+ixaFqUq7SS/Ybv5cr+3Zf2yOiY5PGGnuyfWTtzzvbE8/KnhAwa/ey/8r97 +/ZcqXzY7v6SF09k1uu/ma749rJP0d+Nh5NfOO+4oHM0s1Rap+KH9+KfphZ19UosxRmJhlrM RcWJAKldvqDgAgAA X-CMS-MailID: 20200702024559epcas2p37b3f2f6c2cafd1f033d129032339ca16 X-Msg-Generator: CA X-Sendblock-Type: AUTO_CONFIDENTIAL CMS-TYPE: 102P DLP-Filter: Pass X-CFilter-Loop: Reflected X-CMS-RootMailID: 20200702024559epcas2p37b3f2f6c2cafd1f033d129032339ca16 References: Sender: linux-scsi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org This patch implements callbacks dbg_register_dump and compl_xfer_req to store IO contexts or print them. This includes functions to record contexts of incoming commands in a circular queue. ufshcd.c has already some function tracer calls to get command history but ftrace would be gone when system dies before you get the information, such as panic cases. When you turn on CONFIG_SCSI_UFS_EXYNOS_CMD_LOG, information in the circular queue whenever ufshcd.c invokes a dbg_register_dump callback. Signed-off-by: Kiwoong Kim --- drivers/scsi/ufs/Kconfig | 14 +++ drivers/scsi/ufs/Makefile | 2 +- drivers/scsi/ufs/ufs-exynos-dbg.c | 202 ++++++++++++++++++++++++++++++++++++++ drivers/scsi/ufs/ufs-exynos-if.h | 17 ++++ drivers/scsi/ufs/ufs-exynos.c | 63 +++++++++++- drivers/scsi/ufs/ufs-exynos.h | 13 +++ 6 files changed, 308 insertions(+), 3 deletions(-) create mode 100644 drivers/scsi/ufs/ufs-exynos-dbg.c create mode 100644 drivers/scsi/ufs/ufs-exynos-if.h diff --git a/drivers/scsi/ufs/Kconfig b/drivers/scsi/ufs/Kconfig index 8cd9026..ebab446 100644 --- a/drivers/scsi/ufs/Kconfig +++ b/drivers/scsi/ufs/Kconfig @@ -172,3 +172,17 @@ config SCSI_UFS_EXYNOS Select this if you have UFS host controller on EXYNOS chipset. If unsure, say N. + +config SCSI_UFS_EXYNOS_CMD_LOG + bool "EXYNOS specific command log" + default n + depends on SCSI_UFS_EXYNOS + help + This selects EXYNOS specific functions to get and even print + some information to see what's happening at both command + issue time completion time. + The information may contain gerernal things as well as + EXYNOS specific, such as vendor specific hardware contexts. + + Select this if you want to get and print the information. + If unsure, say N. diff --git a/drivers/scsi/ufs/Makefile b/drivers/scsi/ufs/Makefile index f0c5b95..d9e4da7 100644 --- a/drivers/scsi/ufs/Makefile +++ b/drivers/scsi/ufs/Makefile @@ -4,7 +4,7 @@ obj-$(CONFIG_SCSI_UFS_DWC_TC_PCI) += tc-dwc-g210-pci.o ufshcd-dwc.o tc-dwc-g210. obj-$(CONFIG_SCSI_UFS_DWC_TC_PLATFORM) += tc-dwc-g210-pltfrm.o ufshcd-dwc.o tc-dwc-g210.o obj-$(CONFIG_SCSI_UFS_CDNS_PLATFORM) += cdns-pltfrm.o obj-$(CONFIG_SCSI_UFS_QCOM) += ufs-qcom.o -obj-$(CONFIG_SCSI_UFS_EXYNOS) += ufs-exynos.o +obj-$(CONFIG_SCSI_UFS_EXYNOS) += ufs-exynos.o ufs-exynos-dbg.o obj-$(CONFIG_SCSI_UFSHCD) += ufshcd-core.o ufshcd-core-y += ufshcd.o ufs-sysfs.o ufshcd-core-$(CONFIG_SCSI_UFS_BSG) += ufs_bsg.o diff --git a/drivers/scsi/ufs/ufs-exynos-dbg.c b/drivers/scsi/ufs/ufs-exynos-dbg.c new file mode 100644 index 0000000..062fb03 --- /dev/null +++ b/drivers/scsi/ufs/ufs-exynos-dbg.c @@ -0,0 +1,202 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * UFS Exynos debugging functions + * + * Copyright (C) 2020 Samsung Electronics Co., Ltd. + * Author: Kiwoong Kim + * + */ +#include +#include +#include "ufshcd.h" +#include "ufs-exynos.h" +#include "ufs-exynos-if.h" + +#define MAX_CMD_LOGS 32 + +struct cmd_data { + unsigned int tag; + unsigned int sct; + u64 lba; + u64 start_time; + u64 end_time; + u64 outstanding_reqs; + int retries; + u8 op; +}; + +struct ufs_cmd_info { + u32 total; + u32 last; + struct cmd_data data[MAX_CMD_LOGS]; + struct cmd_data *pdata[MAX_CMD_LOGS]; +}; + +/* + * This structure points out several contexts on debugging + * per one host instant. + * Now command history exists in here but later handle may + * contains some mmio base addresses including vendor specific + * regions to get hardware contexts. + */ +struct ufs_s_dbg_mgr { + struct ufs_exynos_handle *handle; + int active; + u64 first_time; + u64 time; + + /* cmd log */ + struct ufs_cmd_info cmd_info; + struct cmd_data cmd_log; /* temp buffer to put */ + spinlock_t cmd_lock; +}; + +static void ufs_s_print_cmd_log(struct ufs_s_dbg_mgr *mgr, struct device *dev) +{ + struct ufs_cmd_info *cmd_info = &mgr->cmd_info; + struct cmd_data *data = cmd_info->data; + u32 i; + u32 last; + u32 max = MAX_CMD_LOGS; + unsigned long flags; + u32 total; + + spin_lock_irqsave(&mgr->cmd_lock, flags); + total = cmd_info->total; + if (cmd_info->total < max) + max = cmd_info->total; + last = (cmd_info->last + MAX_CMD_LOGS - 1) % MAX_CMD_LOGS; + spin_unlock_irqrestore(&mgr->cmd_lock, flags); + + dev_err(dev, ":---------------------------------------------------\n"); + dev_err(dev, ":\t\tSCSI CMD(%u)\n", total - 1); + dev_err(dev, ":---------------------------------------------------\n"); + dev_err(dev, ":OP, TAG, LBA, SCT, RETRIES, STIME, ETIME, REQS\n\n"); + + for (i = 0 ; i < max ; i++, data++) { + dev_err(dev, ": 0x%02x, %02d, 0x%08lx, 0x%04x, %d, %llu, %llu, 0x%llx %s", + data->op, data->tag, data->lba, data->sct, data->retries, + data->start_time, data->end_time, data->outstanding_reqs, + ((last == i) ? "<--" : " ")); + if (last == i) + dev_err(dev, "\n"); + } +} + +static void ufs_s_put_cmd_log(struct ufs_s_dbg_mgr *mgr, + struct cmd_data *cmd_data) +{ + struct ufs_cmd_info *cmd_info = &mgr->cmd_info; + unsigned long flags; + struct cmd_data *pdata; + + spin_lock_irqsave(&mgr->cmd_lock, flags); + pdata = &cmd_info->data[cmd_info->last]; + ++cmd_info->total; + ++cmd_info->last; + cmd_info->last = cmd_info->last % MAX_CMD_LOGS; + spin_unlock_irqrestore(&mgr->cmd_lock, flags); + + pdata->op = cmd_data->op; + pdata->tag = cmd_data->tag; + pdata->lba = cmd_data->lba; + pdata->sct = cmd_data->sct; + pdata->retries = cmd_data->retries; + pdata->start_time = cmd_data->start_time; + pdata->end_time = 0; + pdata->outstanding_reqs = cmd_data->outstanding_reqs; + cmd_info->pdata[cmd_data->tag] = pdata; +} + +/* + * EXTERNAL FUNCTIONS + * + * There are two classes that are to initialize data structures for debug + * and to define actual behavior. + */ +void exynos_ufs_dump_info(struct ufs_exynos_handle *handle, struct device *dev) +{ + struct ufs_s_dbg_mgr *mgr = (struct ufs_s_dbg_mgr *)handle->private; + + if (mgr->active == 0) + goto out; + + mgr->time = cpu_clock(raw_smp_processor_id()); + +#ifdef CONFIG_SCSI_UFS_EXYNOS_CMD_LOG + ufs_s_print_cmd_log(mgr, dev); +#endif + + if (mgr->first_time == 0ULL) + mgr->first_time = mgr->time; +out: + return; +} + +void exynos_ufs_cmd_log_start(struct ufs_exynos_handle *handle, + struct ufs_hba *hba, struct scsi_cmnd *cmd) +{ + struct ufs_s_dbg_mgr *mgr = (struct ufs_s_dbg_mgr *)handle->private; + int cpu = raw_smp_processor_id(); + struct cmd_data *cmd_log = &mgr->cmd_log; /* temp buffer to put */ + u64 lba = (cmd->cmnd[2] << 24) | + (cmd->cmnd[3] << 16) | + (cmd->cmnd[4] << 8) | + (cmd->cmnd[5] << 0); + unsigned int sct = (cmd->cmnd[7] << 8) | + (cmd->cmnd[8] << 0); + + if (mgr->active == 0) + return; + + cmd_log->start_time = cpu_clock(cpu); + cmd_log->op = cmd->cmnd[0]; + cmd_log->tag = cmd->request->tag; + + /* This function runtime is protected by spinlock from outside */ + cmd_log->outstanding_reqs = hba->outstanding_reqs; + + /* unmap */ + if (cmd->cmnd[0] != UNMAP) + cmd_log->lba = lba; + + cmd_log->sct = sct; + cmd_log->retries = cmd->allowed; + + ufs_s_put_cmd_log(mgr, cmd_log); +} + +void exynos_ufs_cmd_log_end(struct ufs_exynos_handle *handle, + struct ufs_hba *hba, struct scsi_cmnd *cmd) +{ + struct ufs_s_dbg_mgr *mgr = (struct ufs_s_dbg_mgr *)handle->private; + struct ufs_cmd_info *cmd_info = &mgr->cmd_info; + int cpu = raw_smp_processor_id(); + int tag = cmd->request->tag; + + if (mgr->active == 0) + return; + + cmd_info->pdata[tag]->end_time = cpu_clock(cpu); +} + +int exynos_ufs_init_dbg(struct ufs_exynos_handle *handle, struct device *dev) +{ + struct ufs_s_dbg_mgr *mgr; + + mgr = devm_kzalloc(dev, sizeof(struct ufs_s_dbg_mgr), GFP_KERNEL); + if (!ufs) + return -ENOMEM; + handle->private = (void *)mgr; + mgr->handle = handle; + mgr->active = 1; + + /* cmd log */ + spin_lock_init(&mgr->cmd_lock); + + return 0; +} +MODULE_AUTHOR("Kiwoong Kim "); +MODULE_DESCRIPTION("Exynos UFS debug information"); +MODULE_LICENSE("GPL"); +MODULE_VERSION("0.1"); diff --git a/drivers/scsi/ufs/ufs-exynos-if.h b/drivers/scsi/ufs/ufs-exynos-if.h new file mode 100644 index 0000000..c746f59 --- /dev/null +++ b/drivers/scsi/ufs/ufs-exynos-if.h @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * UFS Exynos debugging functions + * + * Copyright (C) 2020 Samsung Electronics Co., Ltd. + * Author: Kiwoong Kim + * + */ +#ifndef _UFS_EXYNOS_IF_H_ +#define _UFS_EXYNOS_IF_H_ + +/* more members would be added in the future */ +struct ufs_exynos_handle { + void *private; +}; + +#endif /* _UFS_EXYNOS_IF_H_ */ diff --git a/drivers/scsi/ufs/ufs-exynos.c b/drivers/scsi/ufs/ufs-exynos.c index 440f2af..7f5142e 100644 --- a/drivers/scsi/ufs/ufs-exynos.c +++ b/drivers/scsi/ufs/ufs-exynos.c @@ -700,12 +700,31 @@ static int exynos_ufs_post_pwr_mode(struct ufs_hba *hba, return 0; } +#ifdef CONFIG_SCSI_UFS_EXYNOS_CMD_LOG +static void exynos_ufs_cmd_log(struct ufs_hba *hba, + struct scsi_cmnd *cmd, int enter) +{ + struct exynos_ufs *ufs = ufshcd_get_variant(hba); + struct ufs_exynos_handle *handle = ufs->handle; + + if (enter == 1) + exynos_ufs_cmd_log_start(handle, hba, cmd); + else if (enter == 2) + exynos_ufs_cmd_log_end(handle, hba, cmd); +} +#endif + static void exynos_ufs_specify_nexus_t_xfer_req(struct ufs_hba *hba, int tag, bool op) { struct exynos_ufs *ufs = ufshcd_get_variant(hba); u32 type; +#ifdef CONFIG_SCSI_UFS_EXYNOS_CMD_LOG + struct scsi_cmnd *cmd = &hba->lrb[tag].cmd + if (op) + exynos_ufs_cmd_log(hba, cmd, 1); +#endif type = hci_readl(ufs, HCI_UTRL_NEXUS_TYPE); if (op) @@ -714,8 +733,7 @@ static void exynos_ufs_specify_nexus_t_xfer_req(struct ufs_hba *hba, hci_writel(ufs, type & ~(1 << tag), HCI_UTRL_NEXUS_TYPE); } -static void exynos_ufs_specify_nexus_t_tm_req(struct ufs_hba *hba, - int tag, u8 func) +static void exynos_ufs_specify_nexus_t_tm_req(struct ufs_hba *hba, int tag, u8 func) { struct exynos_ufs *ufs = ufshcd_get_variant(hba); u32 type; @@ -1008,6 +1026,12 @@ static int exynos_ufs_init(struct ufs_hba *hba) goto out; exynos_ufs_specify_phy_time_attr(ufs); exynos_ufs_config_smu(ufs); + + /* init dbg */ + ret = exynos_ufs_init_dbg(ufs->handle, dev); + if (ret) + return ret; + spin_lock_init(&ufs->dbg_lock); return 0; phy_off: @@ -1210,6 +1234,39 @@ static int exynos_ufs_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op) return 0; } +static void exynos_ufs_dbg_register_dump(struct ufs_hba *hba) +{ + struct exynos_ufs *ufs = ufshcd_get_variant(hba); + unsigned long flags; + + spin_lock_irqsave(&ufs->dbg_lock, flags); + if (ufs->under_dump == 0) + ufs->under_dump = 1; + else { + spin_unlock_irqrestore(&ufs->dbg_lock, flags); + goto out; + } + spin_unlock_irqrestore(&ufs->dbg_lock, flags); + + exynos_ufs_dump_info(ufs->handle, hba->dev); + + spin_lock_irqsave(&ufs->dbg_lock, flags); + ufs->under_dump = 0; + spin_unlock_irqrestore(&ufs->dbg_lock, flags); +out: + return; +} + +static void exynos_ufs_compl_xfer_req(struct ufs_hba *hba, int tag, bool op) +{ +#ifdef CONFIG_SCSI_UFS_EXYNOS_CMD_LOG + struct scsi_cmnd *cmd = &hba->lrb[tag].cmd + + if (op) + exynos_ufs_cmd_log(hba, cmd, 2); +#endif +} + static struct ufs_hba_variant_ops ufs_hba_exynos_ops = { .name = "exynos_ufs", .init = exynos_ufs_init, @@ -1221,6 +1278,8 @@ static struct ufs_hba_variant_ops ufs_hba_exynos_ops = { .hibern8_notify = exynos_ufs_hibern8_notify, .suspend = exynos_ufs_suspend, .resume = exynos_ufs_resume, + .dbg_register_dump = exynos_ufs_dbg_register_dump, + .compl_xfer_req = exynos_ufs_compl_xfer_req, }; static int exynos_ufs_probe(struct platform_device *pdev) diff --git a/drivers/scsi/ufs/ufs-exynos.h b/drivers/scsi/ufs/ufs-exynos.h index 76d6e39..0c79a30 100644 --- a/drivers/scsi/ufs/ufs-exynos.h +++ b/drivers/scsi/ufs/ufs-exynos.h @@ -8,6 +8,7 @@ #ifndef _UFS_EXYNOS_H_ #define _UFS_EXYNOS_H_ +#include "ufs-exynos-if.h" /* * UNIPRO registers @@ -212,6 +213,10 @@ struct exynos_ufs { #define EXYNOS_UFS_OPT_BROKEN_AUTO_CLK_CTRL BIT(2) #define EXYNOS_UFS_OPT_BROKEN_RX_SEL_IDX BIT(3) #define EXYNOS_UFS_OPT_USE_SW_HIBERN8_TIMER BIT(4) + + struct ufs_exynos_handle *handle; + spinlock_t dbg_lock; + int under_dump; }; #define for_each_ufs_rx_lane(ufs, i) \ @@ -284,4 +289,12 @@ struct exynos_ufs_uic_attr exynos7_uic_attr = { .rx_hs_g3_prep_sync_len_cap = PREP_LEN(0xf), .pa_dbg_option_suite = 0x30103, }; + +/* public function declarations */ +void exynos_ufs_dump_info(struct ufs_exynos_handle *handle, struct device *dev); +void exynos_ufs_cmd_log_start(struct ufs_exynos_handle *handle, + struct ufs_hba *hba, struct scsi_cmnd *cmd); +void exynos_ufs_cmd_log_end(struct ufs_exynos_handle *handle, + struct ufs_hba *hba, struct scsi_cmnd *cmd); +int exynos_ufs_init_dbg(struct ufs_exynos_handle *handle, struct device *dev); #endif /* _UFS_EXYNOS_H_ */