| From 2c69f973b4457ae12b6798fd446922237345c70a Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 15 Jan 2026 22:11:31 -0600 |
| Subject: crypto: ccp - Factor out ring destroy handling to a helper |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Mario Limonciello (AMD) <superm1@kernel.org> |
| |
| [ Upstream commit d95f87a65bce5f2f2a02ca6094ca4841d4073df3 ] |
| |
| The ring destroy command needs to be used in multiple places. Split |
| out the code to a helper. |
| |
| Tested-by: Yijun Shen <Yijun.Shen@Dell.com> |
| Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org> |
| Acked-by: Tom Lendacky <thomas.lendacky@amd.com> |
| Reviewed-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com> |
| Link: https://patch.msgid.link/20260116041132.153674-5-superm1@kernel.org |
| Signed-off-by: Ilpo Jรคrvinen <ilpo.jarvinen@linux.intel.com> |
| Stable-dep-of: 7b85137caf11 ("crypto: ccp - Send PSP_CMD_TEE_RING_DESTROY when PSP_CMD_TEE_RING_INIT fails") |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/crypto/ccp/tee-dev.c | 36 ++++++++++++++++++++++++------------ |
| 1 file changed, 24 insertions(+), 12 deletions(-) |
| |
| diff --git a/drivers/crypto/ccp/tee-dev.c b/drivers/crypto/ccp/tee-dev.c |
| index 11c4b05e2f3a2..ef1430f86ad62 100644 |
| --- a/drivers/crypto/ccp/tee-dev.c |
| +++ b/drivers/crypto/ccp/tee-dev.c |
| @@ -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, ®); |
| + 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, ®); |
| - 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); |
| -- |
| 2.51.0 |
| |