diff options
author | Dov Levenglick <dovl@codeaurora.org> | 2015-01-05 08:24:32 +0200 |
---|---|---|
committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-22 10:58:30 -0700 |
commit | 25531d6eead1a9d1778dc143876178b1dd8be145 (patch) | |
tree | 0984f3b2215af03a6dbd97ce763b23704d1ec7bf /drivers/scsi | |
parent | 6021822ecaf116058f1099992ba8d4fce9e08d6b (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.c | 40 | ||||
-rw-r--r-- | drivers/scsi/ufs/ufs-qcom-ice.h | 10 | ||||
-rw-r--r-- | drivers/scsi/ufs/ufs-qcom.c | 3 |
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); } /** |