summaryrefslogtreecommitdiff
path: root/drivers/scsi
diff options
context:
space:
mode:
authorDov Levenglick <dovl@codeaurora.org>2015-01-05 08:24:32 +0200
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-22 10:58:30 -0700
commit25531d6eead1a9d1778dc143876178b1dd8be145 (patch)
tree0984f3b2215af03a6dbd97ce763b23704d1ec7bf /drivers/scsi
parent6021822ecaf116058f1099992ba8d4fce9e08d6b (diff)
scsi: ufs-qcom: add ICE debug prints
Add ICE debug prints for debugging purposes. These prints will be shown as part of dumping registers during error handling. Enabling can be controlled by debugfs. Change-Id: I7d070cc8df099e6c526997d39973a3e1c161091b Signed-off-by: Dov Levenglick <dovl@codeaurora.org>
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/ufs/ufs-qcom-ice.c40
-rw-r--r--drivers/scsi/ufs/ufs-qcom-ice.h10
-rw-r--r--drivers/scsi/ufs/ufs-qcom.c3
3 files changed, 50 insertions, 3 deletions
diff --git a/drivers/scsi/ufs/ufs-qcom-ice.c b/drivers/scsi/ufs/ufs-qcom-ice.c
index 09ccd7cf145a..7a2b321ea95e 100644
--- a/drivers/scsi/ufs/ufs-qcom-ice.c
+++ b/drivers/scsi/ufs/ufs-qcom-ice.c
@@ -1,4 +1,5 @@
-/* Copyright (c) 2014, The Linux Foundation. All rights reserved.
+/*
+ * Copyright (c) 2014-2015, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -18,12 +19,45 @@
#include <crypto/ice.h>
#include "ufs-qcom-ice.h"
-
+#include "qcom-debugfs.h"
#define UFS_QCOM_CRYPTO_LABEL "ufs-qcom-crypto"
/* Timeout waiting for ICE initialization, that requires TZ access */
#define UFS_QCOM_ICE_COMPLETION_TIMEOUT_MS 500
+#define UFS_QCOM_ICE_DEFAULT_DBG_PRINT_EN 0
+
+static void ufs_qcom_ice_dump_regs(struct ufs_qcom_host *qcom_host, int offset,
+ int len, char *prefix)
+{
+ print_hex_dump(KERN_ERR, prefix,
+ len > 4 ? DUMP_PREFIX_OFFSET : DUMP_PREFIX_NONE,
+ 16, 4, qcom_host->hba->mmio_base + offset, len * 4,
+ false);
+}
+
+void ufs_qcom_ice_print_regs(struct ufs_qcom_host *qcom_host)
+{
+ int i;
+
+ if (!(qcom_host->dbg_print_en & UFS_QCOM_DBG_PRINT_ICE_REGS_EN))
+ return;
+
+ ufs_qcom_ice_dump_regs(qcom_host, REG_UFS_QCOM_ICE_CFG, 1,
+ "REG_UFS_QCOM_ICE_CFG ");
+ for (i = 0; i < NUM_QCOM_ICE_CTRL_INFO_n_REGS; i++) {
+ pr_err("REG_UFS_QCOM_ICE_CTRL_INFO_1_%d = 0x%08X\n", i,
+ ufshcd_readl(qcom_host->hba,
+ (REG_UFS_QCOM_ICE_CTRL_INFO_1_n + 8 * i)));
+
+ pr_err("REG_UFS_QCOM_ICE_CTRL_INFO_2_%d = 0x%08X\n", i,
+ ufshcd_readl(qcom_host->hba,
+ (REG_UFS_QCOM_ICE_CTRL_INFO_2_n + 8 * i)));
+
+ }
+
+}
+
static void ufs_qcom_ice_success_cb(void *host_ctrl,
enum ice_event_completion evt)
{
@@ -190,6 +224,8 @@ int ufs_qcom_ice_init(struct ufs_qcom_host *qcom_host)
err = -EINVAL;
}
+ qcom_host->dbg_print_en |= UFS_QCOM_ICE_DEFAULT_DBG_PRINT_EN;
+
out:
return err;
}
diff --git a/drivers/scsi/ufs/ufs-qcom-ice.h b/drivers/scsi/ufs/ufs-qcom-ice.h
index 1ed8e92f5861..ae78a5120426 100644
--- a/drivers/scsi/ufs/ufs-qcom-ice.h
+++ b/drivers/scsi/ufs/ufs-qcom-ice.h
@@ -1,4 +1,5 @@
-/* Copyright (c) 2014, The Linux Foundation. All rights reserved.
+/*
+ * Copyright (c) 2014-2015, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -23,9 +24,11 @@
* of each of these registers
*/
enum {
+ REG_UFS_QCOM_ICE_CFG = 0x2200,
REG_UFS_QCOM_ICE_CTRL_INFO_1_n = 0x2204,
REG_UFS_QCOM_ICE_CTRL_INFO_2_n = 0x2208,
};
+#define NUM_QCOM_ICE_CTRL_INFO_n_REGS 32
/* UFS QCOM ICE CTRL Info 2 register offset */
enum {
@@ -73,6 +76,7 @@ int ufs_qcom_ice_reset(struct ufs_qcom_host *qcom_host);
int ufs_qcom_ice_resume(struct ufs_qcom_host *qcom_host);
int ufs_qcom_ice_suspend(struct ufs_qcom_host *qcom_host);
int ufs_qcom_ice_get_status(struct ufs_qcom_host *qcom_host, int *ice_status);
+void ufs_qcom_ice_print_regs(struct ufs_qcom_host *qcom_host);
#else
inline int ufs_qcom_ice_get_dev(struct ufs_qcom_host *qcom_host)
{
@@ -108,6 +112,10 @@ inline int ufs_qcom_ice_get_status(struct ufs_qcom_host *qcom_host,
{
return 0;
}
+inline void ufs_qcom_ice_print_regs(struct ufs_qcom_host *qcom_host)
+{
+ return;
+}
#endif /* CONFIG_SCSI_UFS_QCOM_ICE */
#endif /* UFS_QCOM_ICE_H_ */
diff --git a/drivers/scsi/ufs/ufs-qcom.c b/drivers/scsi/ufs/ufs-qcom.c
index d7eafc3bb8ce..ae5dd64ad371 100644
--- a/drivers/scsi/ufs/ufs-qcom.c
+++ b/drivers/scsi/ufs/ufs-qcom.c
@@ -1415,10 +1415,13 @@ static void ufs_qcom_print_hw_debug_reg_all(struct ufs_hba *hba)
static void ufs_qcom_dump_dbg_regs(struct ufs_hba *hba)
{
+ struct ufs_qcom_host *host = hba->priv;
+
ufs_qcom_dump_regs(hba, REG_UFS_SYS1CLK_1US, 16,
"HCI Vendor Specific Registers ");
ufs_qcom_print_hw_debug_reg_all(hba);
+ ufs_qcom_ice_print_regs(host);
}
/**