Unverified Commit d95f87a6 authored by Mario Limonciello (AMD)'s avatar Mario Limonciello (AMD) Committed by Ilpo Järvinen
Browse files

crypto: ccp - Factor out ring destroy handling to a helper



The ring destroy command needs to be used in multiple places. Split
out the code to a helper.

Tested-by: default avatarYijun Shen <Yijun.Shen@Dell.com>
Signed-off-by: default avatarMario Limonciello (AMD) <superm1@kernel.org>
Acked-by: default avatarTom Lendacky <thomas.lendacky@amd.com>
Reviewed-by: default avatarShyam Sundar S K <Shyam-sundar.S-k@amd.com>
Link: https://patch.msgid.link/20260116041132.153674-5-superm1@kernel.org


Signed-off-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
parent 0ba20350
Loading
Loading
Loading
Loading
+24 −12
Original line number Diff line number Diff line
@@ -86,6 +86,29 @@ static inline void tee_free_cmd_buffer(struct tee_init_ring_cmd *cmd)
	kfree(cmd);
}

static bool tee_send_destroy_cmd(struct psp_tee_device *tee)
{
	unsigned int reg;
	int ret;

	ret = psp_mailbox_command(tee->psp, PSP_CMD_TEE_RING_DESTROY, NULL,
				  TEE_DEFAULT_CMD_TIMEOUT, &reg);
	if (ret) {
		dev_err(tee->dev, "tee: ring destroy command timed out, disabling TEE support\n");
		psp_dead = true;
		return false;
	}

	if (FIELD_GET(PSP_CMDRESP_STS, reg)) {
		dev_err(tee->dev, "tee: ring destroy command failed (%#010lx)\n",
			FIELD_GET(PSP_CMDRESP_STS, reg));
		psp_dead = true;
		return false;
	}

	return true;
}

static int tee_init_ring(struct psp_tee_device *tee)
{
	int ring_size = MAX_RING_BUFFER_ENTRIES * sizeof(struct tee_ring_cmd);
@@ -137,24 +160,13 @@ static int tee_init_ring(struct psp_tee_device *tee)

static void tee_destroy_ring(struct psp_tee_device *tee)
{
	unsigned int reg;
	int ret;

	if (!tee->rb_mgr.ring_start)
		return;

	if (psp_dead)
		goto free_ring;

	ret = psp_mailbox_command(tee->psp, PSP_CMD_TEE_RING_DESTROY, NULL,
				  TEE_DEFAULT_CMD_TIMEOUT, &reg);
	if (ret) {
		dev_err(tee->dev, "tee: ring destroy command timed out, disabling TEE support\n");
		psp_dead = true;
	} else if (FIELD_GET(PSP_CMDRESP_STS, reg)) {
		dev_err(tee->dev, "tee: ring destroy command failed (%#010lx)\n",
			FIELD_GET(PSP_CMDRESP_STS, reg));
	}
	tee_send_destroy_cmd(tee);

free_ring:
	tee_free_ring(tee);