Message ID | 2a2c2b55c2b137b777ef5beab8e2a814f0c268a7.1737505394.git.ashish.kalra@amd.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Fix broken SNP support with KVM module built-in | expand |
On 1/21/25 19:00, Ashish Kalra wrote: > From: Sean Christopherson <seanjc@google.com> > > Add a new external API interface for PSP module initialization which > allows PSP SEV driver to be initialized explicitly before proceeding > with SEV/SNP initialization with KVM if KVM is built-in as the > dependency between modules is not supported/handled by the initcall > infrastructure and the dependent PSP module is not implicitly loaded > before KVM module if KVM module is built-in. This is big run on sentence. Please start off describing the issue and why this fixes it. > > Co-developed-by: Ashish Kalra <ashish.kalra@amd.com> > Signed-off-by: Ashish Kalra <ashish.kalra@amd.com> Your SOB should come after Sean's. > Signed-off-by: Sean Christopherson <seanjc@google.com> > --- > drivers/crypto/ccp/sp-dev.c | 12 ++++++++++++ > drivers/crypto/ccp/sp-dev.h | 1 + > include/linux/psp-sev.h | 11 +++++++++++ > 3 files changed, 24 insertions(+) > > diff --git a/drivers/crypto/ccp/sp-dev.c b/drivers/crypto/ccp/sp-dev.c > index 7eb3e4668286..a0cdc03984cb 100644 > --- a/drivers/crypto/ccp/sp-dev.c > +++ b/drivers/crypto/ccp/sp-dev.c > @@ -253,8 +253,12 @@ struct sp_device *sp_get_psp_master_device(void) > static int __init sp_mod_init(void) > { > #ifdef CONFIG_X86 > + static bool initialized; This definition is within CONFIG_X86, but... > int ret; > > + if (initialized) > + return 0; > + > ret = sp_pci_init(); > if (ret) > return ret; > @@ -263,6 +267,7 @@ static int __init sp_mod_init(void) > psp_pci_init(); > #endif > > + initialized = true; Add a blank line. > return 0; > #endif > > @@ -279,6 +284,13 @@ static int __init sp_mod_init(void) > return -ENODEV; > } > > +#if IS_BUILTIN(CONFIG_KVM_AMD) && IS_ENABLED(CONFIG_KVM_AMD_SEV) > +int __init sev_module_init(void) > +{ > + return sp_mod_init(); > +} > +#endif > + > static void __exit sp_mod_exit(void) > { > #ifdef CONFIG_X86 > diff --git a/drivers/crypto/ccp/sp-dev.h b/drivers/crypto/ccp/sp-dev.h > index 6f9d7063257d..3f5f7491bec1 100644 > --- a/drivers/crypto/ccp/sp-dev.h > +++ b/drivers/crypto/ccp/sp-dev.h > @@ -148,6 +148,7 @@ int sp_request_psp_irq(struct sp_device *sp, irq_handler_t handler, > const char *name, void *data); > void sp_free_psp_irq(struct sp_device *sp, void *data); > struct sp_device *sp_get_psp_master_device(void); > +int __init sev_module_init(void); Why is this declared both here and below? Please just have it one place. > > #ifdef CONFIG_CRYPTO_DEV_SP_CCP > > diff --git a/include/linux/psp-sev.h b/include/linux/psp-sev.h > index 903ddfea8585..1cf197fca93d 100644 > --- a/include/linux/psp-sev.h > +++ b/include/linux/psp-sev.h > @@ -814,6 +814,15 @@ struct sev_data_snp_commit { > > #ifdef CONFIG_CRYPTO_DEV_SP_PSP > > +/** > + * sev_module_init - perform PSP module initialization > + * > + * Returns: > + * 0 if the PSP module is successfully initialized > + * -%ENODEV if the PSP module initialization fails There are more possible return values in the sp_mod_init() path than just ENODEV. So maybe just say that it returns a negative value on error unless you want to chase them all down. > + */ > +int __init sev_module_init(void); > + > /** > * sev_platform_init - perform SEV INIT command > * > @@ -948,6 +957,8 @@ void snp_free_firmware_page(void *addr); > > #else /* !CONFIG_CRYPTO_DEV_SP_PSP */ > > +static inline int __init sev_module_init(void) { return -ENODEV } Remove the "__init". Although I'm not sure this is even needed since it will only be called by KVM and CONFIG_KVM_AMD_SEV depends on CONFIG_CRYPTO_DEV_SP_PSP. Plus, the function itself is only defined under a specific config. Thanks, Tom > + > static inline int > sev_platform_status(struct sev_user_data_status *status, int *error) { return -ENODEV; } >
diff --git a/drivers/crypto/ccp/sp-dev.c b/drivers/crypto/ccp/sp-dev.c index 7eb3e4668286..a0cdc03984cb 100644 --- a/drivers/crypto/ccp/sp-dev.c +++ b/drivers/crypto/ccp/sp-dev.c @@ -253,8 +253,12 @@ struct sp_device *sp_get_psp_master_device(void) static int __init sp_mod_init(void) { #ifdef CONFIG_X86 + static bool initialized; int ret; + if (initialized) + return 0; + ret = sp_pci_init(); if (ret) return ret; @@ -263,6 +267,7 @@ static int __init sp_mod_init(void) psp_pci_init(); #endif + initialized = true; return 0; #endif @@ -279,6 +284,13 @@ static int __init sp_mod_init(void) return -ENODEV; } +#if IS_BUILTIN(CONFIG_KVM_AMD) && IS_ENABLED(CONFIG_KVM_AMD_SEV) +int __init sev_module_init(void) +{ + return sp_mod_init(); +} +#endif + static void __exit sp_mod_exit(void) { #ifdef CONFIG_X86 diff --git a/drivers/crypto/ccp/sp-dev.h b/drivers/crypto/ccp/sp-dev.h index 6f9d7063257d..3f5f7491bec1 100644 --- a/drivers/crypto/ccp/sp-dev.h +++ b/drivers/crypto/ccp/sp-dev.h @@ -148,6 +148,7 @@ int sp_request_psp_irq(struct sp_device *sp, irq_handler_t handler, const char *name, void *data); void sp_free_psp_irq(struct sp_device *sp, void *data); struct sp_device *sp_get_psp_master_device(void); +int __init sev_module_init(void); #ifdef CONFIG_CRYPTO_DEV_SP_CCP diff --git a/include/linux/psp-sev.h b/include/linux/psp-sev.h index 903ddfea8585..1cf197fca93d 100644 --- a/include/linux/psp-sev.h +++ b/include/linux/psp-sev.h @@ -814,6 +814,15 @@ struct sev_data_snp_commit { #ifdef CONFIG_CRYPTO_DEV_SP_PSP +/** + * sev_module_init - perform PSP module initialization + * + * Returns: + * 0 if the PSP module is successfully initialized + * -%ENODEV if the PSP module initialization fails + */ +int __init sev_module_init(void); + /** * sev_platform_init - perform SEV INIT command * @@ -948,6 +957,8 @@ void snp_free_firmware_page(void *addr); #else /* !CONFIG_CRYPTO_DEV_SP_PSP */ +static inline int __init sev_module_init(void) { return -ENODEV } + static inline int sev_platform_status(struct sev_user_data_status *status, int *error) { return -ENODEV; }