OSDN Git Service

scsi: ufs: ufshcd_dump_regs to use memcpy_fromio
authorTomas Winkler <tomas.winkler@intel.com>
Thu, 14 Jun 2018 08:14:09 +0000 (11:14 +0300)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 20 Jun 2018 02:02:25 +0000 (22:02 -0400)
ufshcd_dump_regs should use memcpy_fromio to read host registers
instead of directly accessing using memcpy.  The same function is
utilized in ufs-qcom.

Elminite compilation warning
drivers/scsi/ufs/ufshcd.c:356:9: warning: incorrect type in argument 6 (different address spaces)
drivers/scsi/ufs/ufshcd.c:356:9:    expected void const *buf
drivers/scsi/ufs/ufshcd.c:356:9:    got void [noderef] <asn:2>*mmio_base

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Reviewed-by: Avri Altman <avri.altman@wdc.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/ufs/ufs-qcom.c
drivers/scsi/ufs/ufshcd.c
drivers/scsi/ufs/ufshcd.h

index 221820a..75ee590 100644 (file)
@@ -50,19 +50,10 @@ static void ufs_qcom_get_default_testbus_cfg(struct ufs_qcom_host *host);
 static int ufs_qcom_set_dme_vs_core_clk_ctrl_clear_div(struct ufs_hba *hba,
                                                       u32 clk_cycles);
 
-static void ufs_qcom_dump_regs(struct ufs_hba *hba, int offset, int len,
-               char *prefix)
-{
-       print_hex_dump(KERN_ERR, prefix,
-                       len > 4 ? DUMP_PREFIX_OFFSET : DUMP_PREFIX_NONE,
-                       16, 4, (void __force *)hba->mmio_base + offset,
-                       len * 4, false);
-}
-
 static void ufs_qcom_dump_regs_wrapper(struct ufs_hba *hba, int offset, int len,
-               char *prefix, void *priv)
+                                      const char *prefix, void *priv)
 {
-       ufs_qcom_dump_regs(hba, offset, len, prefix);
+       ufshcd_dump_regs(hba, offset, len * 4, prefix);
 }
 
 static int ufs_qcom_get_connected_tx_lanes(struct ufs_hba *hba, u32 *tx_lanes)
@@ -1431,7 +1422,7 @@ out:
 
 static void ufs_qcom_print_hw_debug_reg_all(struct ufs_hba *hba,
                void *priv, void (*print_fn)(struct ufs_hba *hba,
-               int offset, int num_regs, char *str, void *priv))
+               int offset, int num_regs, const char *str, void *priv))
 {
        u32 reg;
        struct ufs_qcom_host *host;
@@ -1613,7 +1604,7 @@ int ufs_qcom_testbus_config(struct ufs_qcom_host *host)
 
 static void ufs_qcom_testbus_read(struct ufs_hba *hba)
 {
-       ufs_qcom_dump_regs(hba, UFS_TEST_BUS, 1, "UFS_TEST_BUS ");
+       ufshcd_dump_regs(hba, UFS_TEST_BUS, 4, "UFS_TEST_BUS ");
 }
 
 static void ufs_qcom_print_unipro_testbus(struct ufs_hba *hba)
@@ -1639,8 +1630,8 @@ static void ufs_qcom_print_unipro_testbus(struct ufs_hba *hba)
 
 static void ufs_qcom_dump_dbg_regs(struct ufs_hba *hba)
 {
-       ufs_qcom_dump_regs(hba, REG_UFS_SYS1CLK_1US, 16,
-                       "HCI Vendor Specific Registers ");
+       ufshcd_dump_regs(hba, REG_UFS_SYS1CLK_1US, 16 * 4,
+                        "HCI Vendor Specific Registers ");
 
        /* sleep a bit intermittently as we are dumping too much data */
        ufs_qcom_print_hw_debug_reg_all(hba, NULL, ufs_qcom_dump_regs_wrapper);
index 397081d..350f859 100644 (file)
                _ret;                                                   \
        })
 
-#define ufshcd_hex_dump(prefix_str, buf, len) \
-print_hex_dump(KERN_ERR, prefix_str, DUMP_PREFIX_OFFSET, 16, 4, buf, len, false)
+#define ufshcd_hex_dump(prefix_str, buf, len) do {                       \
+       size_t __len = (len);                                            \
+       print_hex_dump(KERN_ERR, prefix_str,                             \
+                      __len > 4 ? DUMP_PREFIX_OFFSET : DUMP_PREFIX_NONE,\
+                      16, 4, buf, __len, false);                        \
+} while (0)
+
+int ufshcd_dump_regs(struct ufs_hba *hba, size_t offset, size_t len,
+                    const char *prefix)
+{
+       u8 *regs;
+
+       regs = kzalloc(len, GFP_KERNEL);
+       if (!regs)
+               return -ENOMEM;
+
+       memcpy_fromio(regs, hba->mmio_base + offset, len);
+       ufshcd_hex_dump(prefix, regs, len);
+       kfree(regs);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(ufshcd_dump_regs);
 
 enum {
        UFSHCD_MAX_CHANNEL      = 0,
@@ -386,15 +407,7 @@ static void ufshcd_print_uic_err_hist(struct ufs_hba *hba,
 
 static void ufshcd_print_host_regs(struct ufs_hba *hba)
 {
-       /*
-        * hex_dump reads its data without the readl macro. This might
-        * cause inconsistency issues on some platform, as the printed
-        * values may be from cache and not the most recent value.
-        * To know whether you are looking at an un-cached version verify
-        * that IORESOURCE_MEM flag is on when xxx_get_resource() is invoked
-        * during platform/pci probe function.
-        */
-       ufshcd_hex_dump("host regs: ", hba->mmio_base, UFSHCI_REG_SPACE_SIZE);
+       ufshcd_dump_regs(hba, 0, UFSHCI_REG_SPACE_SIZE, "host_regs: ");
        dev_err(hba->dev, "hba->ufs_version = 0x%x, hba->capabilities = 0x%x\n",
                hba->ufs_version, hba->capabilities);
        dev_err(hba->dev,
index f51758f..33fdd3f 100644 (file)
@@ -1043,4 +1043,7 @@ static inline u8 ufshcd_scsi_to_upiu_lun(unsigned int scsi_lun)
                return scsi_lun & UFS_UPIU_MAX_UNIT_NUM_ID;
 }
 
+int ufshcd_dump_regs(struct ufs_hba *hba, size_t offset, size_t len,
+                    const char *prefix);
+
 #endif /* End of Header */