From 295bcc19e79f669cecd12d866045dc6c54add993 Mon Sep 17 00:00:00 2001 From: Subhash Jadavani Date: Mon, 2 Mar 2015 12:39:41 -0800 Subject: scsi: ufs-qcom-ice: add support for register interface changes This change adds support for following changes in register interface for newer UFS controllers: The register UFS_ICE_CTRL_INFO_n_1 contains 32-bit LSB of crypto data-unit base number. The register UFS_ICE_CTRL_INFO_n_2 contains 32-bit MSB of the crypto data-unit base number. The register UFS_ICE_CTRL_INFO_n_3 contains bitfields BYPASS, CNFG_KEY_INDX, and CDU_SIZE. Change-Id: I2a9b0b87e912a876e46746431c75e32a0e21a1c6 Signed-off-by: Subhash Jadavani Signed-off-by: Krishna Konda --- drivers/scsi/ufs/ufs-qcom-ice.c | 39 +++++++++++++++++++++++++-------------- drivers/scsi/ufs/ufs-qcom-ice.h | 17 +++++++++-------- 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/drivers/scsi/ufs/ufs-qcom-ice.c b/drivers/scsi/ufs/ufs-qcom-ice.c index 84a6cff5f97a..81a08907592f 100644 --- a/drivers/scsi/ufs/ufs-qcom-ice.c +++ b/drivers/scsi/ufs/ufs-qcom-ice.c @@ -263,7 +263,7 @@ int ufs_qcom_ice_cfg(struct ufs_qcom_host *qcom_host, struct scsi_cmnd *cmd) struct ice_data_setting ice_set; unsigned int slot = 0; sector_t lba = 0; - unsigned int ctrl_info_2_val = 0; + unsigned int ctrl_info_val = 0; unsigned int bypass = 0; struct request *req; char cmd_op; @@ -320,27 +320,38 @@ int ufs_qcom_ice_cfg(struct ufs_qcom_host *qcom_host, struct scsi_cmnd *cmd) UFS_QCOM_ICE_DISABLE_BYPASS; /* Configure ICE index */ - ctrl_info_2_val = + ctrl_info_val = (ice_set.crypto_data.key_index & - MASK_UFS_QCOM_ICE_CTRL_INFO_2_KEY_INDEX) - << OFFSET_UFS_QCOM_ICE_CTRL_INFO_2_KEY_INDEX; + MASK_UFS_QCOM_ICE_CTRL_INFO_KEY_INDEX) + << OFFSET_UFS_QCOM_ICE_CTRL_INFO_KEY_INDEX; /* Configure data unit size of transfer request */ - ctrl_info_2_val |= + ctrl_info_val |= (UFS_QCOM_ICE_TR_DATA_UNIT_4_KB & - MASK_UFS_QCOM_ICE_CTRL_INFO_2_CDU) - << OFFSET_UFS_QCOM_ICE_CTRL_INFO_2_CDU; + MASK_UFS_QCOM_ICE_CTRL_INFO_CDU) + << OFFSET_UFS_QCOM_ICE_CTRL_INFO_CDU; /* Configure ICE bypass mode */ - ctrl_info_2_val |= - (bypass & MASK_UFS_QCOM_ICE_CTRL_INFO_2_BYPASS) - << OFFSET_UFS_QCOM_ICE_CTRL_INFO_2_BYPASS; + ctrl_info_val |= + (bypass & MASK_UFS_QCOM_ICE_CTRL_INFO_BYPASS) + << OFFSET_UFS_QCOM_ICE_CTRL_INFO_BYPASS; - ufshcd_writel(qcom_host->hba, lba, - (REG_UFS_QCOM_ICE_CTRL_INFO_1_n + 8 * slot)); + if (qcom_host->hw_ver.major < 0x2) { + ufshcd_writel(qcom_host->hba, lba, + (REG_UFS_QCOM_ICE_CTRL_INFO_1_n + 8 * slot)); - ufshcd_writel(qcom_host->hba, ctrl_info_2_val, - (REG_UFS_QCOM_ICE_CTRL_INFO_2_n + 8 * slot)); + ufshcd_writel(qcom_host->hba, ctrl_info_val, + (REG_UFS_QCOM_ICE_CTRL_INFO_2_n + 8 * slot)); + } else { + ufshcd_writel(qcom_host->hba, (lba & 0xFFFFFFFF), + (REG_UFS_QCOM_ICE_CTRL_INFO_1_n + 16 * slot)); + + ufshcd_writel(qcom_host->hba, ((lba >> 32) & 0xFFFFFFFF), + (REG_UFS_QCOM_ICE_CTRL_INFO_2_n + 16 * slot)); + + ufshcd_writel(qcom_host->hba, ctrl_info_val, + (REG_UFS_QCOM_ICE_CTRL_INFO_3_n + 16 * slot)); + } /* * Ensure UFS-ICE registers are being configured diff --git a/drivers/scsi/ufs/ufs-qcom-ice.h b/drivers/scsi/ufs/ufs-qcom-ice.h index adadbe0b218b..03d306d67dbb 100644 --- a/drivers/scsi/ufs/ufs-qcom-ice.h +++ b/drivers/scsi/ufs/ufs-qcom-ice.h @@ -27,21 +27,22 @@ 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, + REG_UFS_QCOM_ICE_CTRL_INFO_3_n = 0x220C, }; #define NUM_QCOM_ICE_CTRL_INFO_n_REGS 32 -/* UFS QCOM ICE CTRL Info 2 register offset */ +/* UFS QCOM ICE CTRL Info register offset */ enum { - OFFSET_UFS_QCOM_ICE_CTRL_INFO_2_BYPASS = 0, - OFFSET_UFS_QCOM_ICE_CTRL_INFO_2_KEY_INDEX = 0x1, - OFFSET_UFS_QCOM_ICE_CTRL_INFO_2_CDU = 0x6, + OFFSET_UFS_QCOM_ICE_CTRL_INFO_BYPASS = 0, + OFFSET_UFS_QCOM_ICE_CTRL_INFO_KEY_INDEX = 0x1, + OFFSET_UFS_QCOM_ICE_CTRL_INFO_CDU = 0x6, }; -/* UFS QCOM ICE CTRL Info 2 register masks */ +/* UFS QCOM ICE CTRL Info register masks */ enum { - MASK_UFS_QCOM_ICE_CTRL_INFO_2_BYPASS = 0x1, - MASK_UFS_QCOM_ICE_CTRL_INFO_2_KEY_INDEX = 0x1F, - MASK_UFS_QCOM_ICE_CTRL_INFO_2_CDU = 0x8, + MASK_UFS_QCOM_ICE_CTRL_INFO_BYPASS = 0x1, + MASK_UFS_QCOM_ICE_CTRL_INFO_KEY_INDEX = 0x1F, + MASK_UFS_QCOM_ICE_CTRL_INFO_CDU = 0x8, }; /* UFS QCOM ICE encryption/decryption bypass state */ -- cgit v1.2.3