Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 674ad037 authored by Sahitya Tummala's avatar Sahitya Tummala
Browse files

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: default avatarSahitya Tummala <stummala@codeaurora.org>
parent 5f368015
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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);
}

+1 −0
Original line number Diff line number Diff line
@@ -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);
};

+16 −0
Original line number Diff line number Diff line
@@ -3601,6 +3601,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);
@@ -3651,6 +3662,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)
{
}
@@ -3664,6 +3679,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,
};

+1 −0
Original line number Diff line number Diff line
@@ -308,6 +308,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);