mmc: cmdq: add new crypto_cfg_reset host operation
When encryption/decryption is enabled in CQ mode, the legacy commands that are sent in HALT state will use different slot other than slot 0 for crypto configuration information. The slot that is selected depends on the last slot that was used when it is in CQ mode. This is causing the data of legacy commands to be encrypted/decrypted based on the wrong slot usage for crypto config details. Hence, clear the crypto configuration of the slot used in CQ mode whenever it gets completed. Change-Id: If573de5025054a10de1dde544aa79022016f65fd Signed-off-by: Sahitya Tummala <stummala@codeaurora.org>
This commit is contained in:
parent
cedee495d8
commit
2f3532d344
4 changed files with 20 additions and 0 deletions
|
@ -653,6 +653,8 @@ static void cmdq_finish_data(struct mmc_host *mmc, unsigned int tag)
|
|||
CMDQ_SEND_STATUS_TRIGGER, CQCTL);
|
||||
|
||||
cmdq_runtime_pm_put(cq_host);
|
||||
if (cq_host->ops->crypto_cfg_reset)
|
||||
cq_host->ops->crypto_cfg_reset(mmc, tag);
|
||||
mrq->done(mrq);
|
||||
}
|
||||
|
||||
|
|
|
@ -206,6 +206,7 @@ struct cmdq_host_ops {
|
|||
int (*reset)(struct mmc_host *mmc);
|
||||
int (*crypto_cfg)(struct mmc_host *mmc, struct mmc_request *mrq,
|
||||
u32 slot);
|
||||
void (*crypto_cfg_reset)(struct mmc_host *mmc, unsigned int slot);
|
||||
void (*post_cqe_halt)(struct mmc_host *mmc);
|
||||
};
|
||||
|
||||
|
|
|
@ -3530,6 +3530,17 @@ static int sdhci_cmdq_crypto_cfg(struct mmc_host *mmc,
|
|||
return sdhci_crypto_cfg(host, mrq, slot);
|
||||
}
|
||||
|
||||
static void sdhci_cmdq_crypto_cfg_reset(struct mmc_host *mmc, unsigned int slot)
|
||||
{
|
||||
struct sdhci_host *host = mmc_priv(mmc);
|
||||
|
||||
if (!host->is_crypto_en)
|
||||
return;
|
||||
|
||||
if (host->ops->crypto_cfg_reset)
|
||||
host->ops->crypto_cfg_reset(host, slot);
|
||||
}
|
||||
|
||||
static void sdhci_cmdq_post_cqe_halt(struct mmc_host *mmc)
|
||||
{
|
||||
struct sdhci_host *host = mmc_priv(mmc);
|
||||
|
@ -3580,6 +3591,10 @@ static int sdhci_cmdq_crypto_cfg(struct mmc_host *mmc,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void sdhci_cmdq_crypto_cfg_reset(struct mmc_host *mmc, unsigned int slot)
|
||||
{
|
||||
|
||||
}
|
||||
static void sdhci_cmdq_post_cqe_halt(struct mmc_host *mmc)
|
||||
{
|
||||
}
|
||||
|
@ -3593,6 +3608,7 @@ static const struct cmdq_host_ops sdhci_cmdq_ops = {
|
|||
.clear_set_dumpregs = sdhci_cmdq_clear_set_dumpregs,
|
||||
.enhanced_strobe_mask = sdhci_enhanced_strobe_mask,
|
||||
.crypto_cfg = sdhci_cmdq_crypto_cfg,
|
||||
.crypto_cfg_reset = sdhci_cmdq_crypto_cfg_reset,
|
||||
.post_cqe_halt = sdhci_cmdq_post_cqe_halt,
|
||||
};
|
||||
|
||||
|
|
|
@ -655,6 +655,7 @@ struct sdhci_ops {
|
|||
int (*crypto_engine_cfg)(struct sdhci_host *host,
|
||||
struct mmc_request *mrq, u32 slot);
|
||||
int (*crypto_engine_reset)(struct sdhci_host *host);
|
||||
void (*crypto_cfg_reset)(struct sdhci_host *host, unsigned int slot);
|
||||
void (*set_uhs_signaling)(struct sdhci_host *host, unsigned int uhs);
|
||||
void (*hw_reset)(struct sdhci_host *host);
|
||||
void (*adma_workaround)(struct sdhci_host *host, u32 intmask);
|
||||
|
|
Loading…
Add table
Reference in a new issue