summaryrefslogtreecommitdiff
path: root/drivers/crypto
diff options
context:
space:
mode:
authorTycho Andersen <tycho@kernel.org>2026-04-16 16:23:23 -0700
committerSean Christopherson <seanjc@google.com>2026-05-13 09:55:53 -0700
commitacf4d11a35d8bb546e205fe05349f60cfefbff76 (patch)
treec4a2bed22ea28a5163f47520a7edea395b0204dc /drivers/crypto
parentb7fbe9a1bf9ee6c967ef77d366ca58c35fcf1887 (diff)
crypto/ccp: hoist kernel part of SNP_PLATFORM_STATUS
...to its own function. This way it can be used when the kernel needs access to the platform status regardless of the INIT state of the firmware. No functional change intended. Cc: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: Tycho Andersen (AMD) <tycho@kernel.org> Acked-by: Herbert Xu <herbert@gondor.apana.org.au> Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com> Tested-by: Tycho Andersen (AMD) <tycho@kernel.org> Link: https://patch.msgid.link/20260416232329.3408497-2-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
Diffstat (limited to 'drivers/crypto')
-rw-r--r--drivers/crypto/ccp/sev-dev.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/drivers/crypto/ccp/sev-dev.c b/drivers/crypto/ccp/sev-dev.c
index d1e9e0ac63b6..22bc4ef27a63 100644
--- a/drivers/crypto/ccp/sev-dev.c
+++ b/drivers/crypto/ccp/sev-dev.c
@@ -2381,7 +2381,8 @@ e_free_pdh:
return ret;
}
-static int sev_ioctl_do_snp_platform_status(struct sev_issue_cmd *argp)
+static int __sev_do_snp_platform_status(struct sev_user_data_snp_status *status,
+ int *error)
{
struct sev_device *sev = psp_master->sev_data;
struct sev_data_snp_addr buf;
@@ -2389,9 +2390,6 @@ static int sev_ioctl_do_snp_platform_status(struct sev_issue_cmd *argp)
void *data;
int ret;
- if (!argp->data)
- return -EINVAL;
-
status_page = alloc_page(GFP_KERNEL_ACCOUNT);
if (!status_page)
return -ENOMEM;
@@ -2414,7 +2412,7 @@ static int sev_ioctl_do_snp_platform_status(struct sev_issue_cmd *argp)
}
buf.address = __psp_pa(data);
- ret = __sev_do_cmd_locked(SEV_CMD_SNP_PLATFORM_STATUS, &buf, &argp->error);
+ ret = __sev_do_cmd_locked(SEV_CMD_SNP_PLATFORM_STATUS, &buf, error);
if (sev->snp_initialized) {
/*
@@ -2429,15 +2427,32 @@ static int sev_ioctl_do_snp_platform_status(struct sev_issue_cmd *argp)
if (ret)
goto cleanup;
- if (copy_to_user((void __user *)argp->data, data,
- sizeof(struct sev_user_data_snp_status)))
- ret = -EFAULT;
+ memcpy(status, data, sizeof(*status));
cleanup:
__free_pages(status_page, 0);
return ret;
}
+static int sev_ioctl_do_snp_platform_status(struct sev_issue_cmd *argp)
+{
+ struct sev_user_data_snp_status status;
+ int ret;
+
+ if (!argp->data)
+ return -EINVAL;
+
+ ret = __sev_do_snp_platform_status(&status, &argp->error);
+ if (ret < 0)
+ return ret;
+
+ if (copy_to_user((void __user *)argp->data, &status,
+ sizeof(struct sev_user_data_snp_status)))
+ ret = -EFAULT;
+
+ return ret;
+}
+
static int sev_ioctl_do_snp_commit(struct sev_issue_cmd *argp)
{
struct sev_device *sev = psp_master->sev_data;