Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

crypto: ccp - Add an S4 restore flow

The system will have lost power during S4. The ring used for TEE
communications needs to be initialized before use.

Fixes: f892a21f51162 ("crypto: ccp - use generic power management")
Reported-by: Lars Francke <lars.francke@gmail.com>
Closes: https://lore.kernel.org/platform-driver-x86/CAD-Ua_gfJnQSo8ucS_7ZwzuhoBRJ14zXP7s8b-zX3ZcxcyWePw@mail.gmail.com/
Tested-by: Yijun Shen <Yijun.Shen@Dell.com>
Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
Reviewed-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com>
Link: https://patch.msgid.link/20260116041132.153674-4-superm1@kernel.org
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>

authored by

Mario Limonciello (AMD) and committed by
Ilpo Järvinen
0ba20350 5e599d78

+47 -1
+11
drivers/crypto/ccp/psp-dev.c
··· 351 351 return sp ? sp->psp_data : NULL; 352 352 } 353 353 354 + int psp_restore(struct sp_device *sp) 355 + { 356 + struct psp_device *psp = sp->psp_data; 357 + int ret = 0; 358 + 359 + if (psp->tee_data) 360 + ret = tee_restore(psp); 361 + 362 + return ret; 363 + } 364 + 354 365 void psp_pci_init(void) 355 366 { 356 367 psp_master = psp_get_master_device();
+12
drivers/crypto/ccp/sp-dev.c
··· 230 230 return 0; 231 231 } 232 232 233 + int sp_restore(struct sp_device *sp) 234 + { 235 + if (sp->psp_data) { 236 + int ret = psp_restore(sp); 237 + 238 + if (ret) 239 + return ret; 240 + } 241 + 242 + return sp_resume(sp); 243 + } 244 + 233 245 struct sp_device *sp_get_psp_master_device(void) 234 246 { 235 247 struct sp_device *i, *ret = NULL;
+3
drivers/crypto/ccp/sp-dev.h
··· 141 141 142 142 int sp_suspend(struct sp_device *sp); 143 143 int sp_resume(struct sp_device *sp); 144 + int sp_restore(struct sp_device *sp); 144 145 int sp_request_ccp_irq(struct sp_device *sp, irq_handler_t handler, 145 146 const char *name, void *data); 146 147 void sp_free_ccp_irq(struct sp_device *sp, void *data); ··· 175 174 void psp_pci_init(void); 176 175 void psp_dev_destroy(struct sp_device *sp); 177 176 void psp_pci_exit(void); 177 + int psp_restore(struct sp_device *sp); 178 178 179 179 #else /* !CONFIG_CRYPTO_DEV_SP_PSP */ 180 180 ··· 183 181 static inline void psp_pci_init(void) { } 184 182 static inline void psp_dev_destroy(struct sp_device *sp) { } 185 183 static inline void psp_pci_exit(void) { } 184 + static inline int psp_restore(struct sp_device *sp) { return 0; } 186 185 187 186 #endif /* CONFIG_CRYPTO_DEV_SP_PSP */ 188 187
+15 -1
drivers/crypto/ccp/sp-pci.c
··· 353 353 return sp_resume(sp); 354 354 } 355 355 356 + static int __maybe_unused sp_pci_restore(struct device *dev) 357 + { 358 + struct sp_device *sp = dev_get_drvdata(dev); 359 + 360 + return sp_restore(sp); 361 + } 362 + 356 363 #ifdef CONFIG_CRYPTO_DEV_SP_PSP 357 364 static const struct sev_vdata sevv1 = { 358 365 .cmdresp_reg = 0x10580, /* C2PMSG_32 */ ··· 570 563 }; 571 564 MODULE_DEVICE_TABLE(pci, sp_pci_table); 572 565 573 - static SIMPLE_DEV_PM_OPS(sp_pci_pm_ops, sp_pci_suspend, sp_pci_resume); 566 + static const struct dev_pm_ops sp_pci_pm_ops = { 567 + .suspend = pm_sleep_ptr(sp_pci_suspend), 568 + .resume = pm_sleep_ptr(sp_pci_resume), 569 + .freeze = pm_sleep_ptr(sp_pci_suspend), 570 + .thaw = pm_sleep_ptr(sp_pci_resume), 571 + .poweroff = pm_sleep_ptr(sp_pci_suspend), 572 + .restore_early = pm_sleep_ptr(sp_pci_restore), 573 + }; 574 574 575 575 static struct pci_driver sp_pci_driver = { 576 576 .name = "ccp",
+5
drivers/crypto/ccp/tee-dev.c
··· 366 366 return 0; 367 367 } 368 368 EXPORT_SYMBOL(psp_check_tee_status); 369 + 370 + int tee_restore(struct psp_device *psp) 371 + { 372 + return tee_init_ring(psp->tee_data); 373 + }
+1
drivers/crypto/ccp/tee-dev.h
··· 111 111 112 112 int tee_dev_init(struct psp_device *psp); 113 113 void tee_dev_destroy(struct psp_device *psp); 114 + int tee_restore(struct psp_device *psp); 114 115 115 116 #endif /* __TEE_DEV_H__ */