Lines Matching refs:sev
113 static void __sev_firmware_shutdown(struct sev_device *sev, bool panic);
124 struct sev_device *sev = psp_master->sev_data; in sev_version_greater_or_equal() local
126 if (sev->api_major > maj) in sev_version_greater_or_equal()
129 if (sev->api_major == maj && sev->api_minor >= min) in sev_version_greater_or_equal()
137 struct sev_device *sev = data; in sev_irq_handler() local
145 reg = ioread32(sev->io_regs + sev->vdata->cmdresp_reg); in sev_irq_handler()
147 sev->int_rcvd = 1; in sev_irq_handler()
148 wake_up(&sev->int_queue); in sev_irq_handler()
152 static int sev_wait_cmd_ioc(struct sev_device *sev, in sev_wait_cmd_ioc() argument
167 *reg = ioread32(sev->io_regs + sev->vdata->cmdresp_reg); in sev_wait_cmd_ioc()
176 ret = wait_event_timeout(sev->int_queue, in sev_wait_cmd_ioc()
177 sev->int_rcvd, timeout * HZ); in sev_wait_cmd_ioc()
181 *reg = ioread32(sev->io_regs + sev->vdata->cmdresp_reg); in sev_wait_cmd_ioc()
269 struct sev_device *sev = psp_master->sev_data; in sev_read_init_ex_file() local
283 dev_info(sev->dev, in sev_read_init_ex_file()
288 dev_err(sev->dev, in sev_read_init_ex_file()
297 dev_info(sev->dev, in sev_read_init_ex_file()
302 dev_dbg(sev->dev, "SEV: read %ld bytes from NV file\n", nread); in sev_read_init_ex_file()
310 struct sev_device *sev = psp_master->sev_data; in sev_write_init_ex_file() local
324 dev_err(sev->dev, in sev_write_init_ex_file()
335 dev_err(sev->dev, in sev_write_init_ex_file()
341 dev_dbg(sev->dev, "SEV: write successful to NV file\n"); in sev_write_init_ex_file()
440 struct sev_device *sev; in __snp_alloc_firmware_pages() local
451 sev = psp_master->sev_data; in __snp_alloc_firmware_pages()
452 if (!sev->snp_initialized) in __snp_alloc_firmware_pages()
474 struct sev_device *sev = psp_master->sev_data; in __snp_free_firmware_pages() local
481 if (sev->snp_initialized && in __snp_free_firmware_pages()
801 struct sev_device *sev = psp_master->sev_data; in snp_legacy_handling_needed() local
803 return cmd < SEV_CMD_SNP_INIT && sev->snp_initialized; in snp_legacy_handling_needed()
846 struct sev_device *sev; in __sev_do_cmd_locked() local
859 sev = psp->sev_data; in __sev_do_cmd_locked()
879 if (!sev->cmd_buf_active) { in __sev_do_cmd_locked()
880 cmd_buf = sev->cmd_buf; in __sev_do_cmd_locked()
881 sev->cmd_buf_active = true; in __sev_do_cmd_locked()
882 } else if (!sev->cmd_buf_backup_active) { in __sev_do_cmd_locked()
883 cmd_buf = sev->cmd_buf_backup; in __sev_do_cmd_locked()
884 sev->cmd_buf_backup_active = true; in __sev_do_cmd_locked()
886 dev_err(sev->dev, in __sev_do_cmd_locked()
899 dev_err(sev->dev, in __sev_do_cmd_locked()
905 cmd_buf = sev->cmd_buf; in __sev_do_cmd_locked()
912 dev_dbg(sev->dev, "sev command id %#x buffer 0x%08x%08x timeout %us\n", in __sev_do_cmd_locked()
918 iowrite32(phys_lsb, sev->io_regs + sev->vdata->cmdbuff_addr_lo_reg); in __sev_do_cmd_locked()
919 iowrite32(phys_msb, sev->io_regs + sev->vdata->cmdbuff_addr_hi_reg); in __sev_do_cmd_locked()
921 sev->int_rcvd = 0; in __sev_do_cmd_locked()
935 iowrite32(reg, sev->io_regs + sev->vdata->cmdresp_reg); in __sev_do_cmd_locked()
938 ret = sev_wait_cmd_ioc(sev, ®, psp_timeout); in __sev_do_cmd_locked()
943 dev_err(sev->dev, "sev command %#x timed out, disabling PSP\n", cmd); in __sev_do_cmd_locked()
955 dev_dbg(sev->dev, "sev command %#x failed (%#010lx)\n", in __sev_do_cmd_locked()
963 cmdbuff_hi = ioread32(sev->io_regs + sev->vdata->cmdbuff_addr_hi_reg); in __sev_do_cmd_locked()
964 cmdbuff_lo = ioread32(sev->io_regs + sev->vdata->cmdbuff_addr_lo_reg); in __sev_do_cmd_locked()
966 dev_dbg(sev->dev, "Additional error information reported in cmdbuff:"); in __sev_do_cmd_locked()
967 dev_dbg(sev->dev, " cmdbuff hi: %#010x\n", cmdbuff_hi); in __sev_do_cmd_locked()
968 dev_dbg(sev->dev, " cmdbuff lo: %#010x\n", cmdbuff_lo); in __sev_do_cmd_locked()
986 dev_err(sev->dev, in __sev_do_cmd_locked()
994 if (sev->cmd_buf_backup_active) in __sev_do_cmd_locked()
995 sev->cmd_buf_backup_active = false; in __sev_do_cmd_locked()
997 sev->cmd_buf_active = false; in __sev_do_cmd_locked()
1110 struct sev_device *sev; in __sev_snp_init_locked() local
1117 sev = psp->sev_data; in __sev_snp_init_locked()
1119 if (sev->snp_initialized) in __sev_snp_init_locked()
1123 dev_dbg(sev->dev, "SEV-SNP support requires firmware version >= %d:%d\n", in __sev_snp_init_locked()
1149 dev_err(sev->dev, in __sev_snp_init_locked()
1161 dev_err(sev->dev, in __sev_snp_init_locked()
1190 dev_err(sev->dev, "SEV-SNP: %s failed rc %d, error %#x\n", in __sev_snp_init_locked()
1200 dev_err(sev->dev, "SEV-SNP: SNP_DF_FLUSH failed rc %d, error %#x\n", in __sev_snp_init_locked()
1205 sev->snp_initialized = true; in __sev_snp_init_locked()
1206 dev_dbg(sev->dev, "SEV-SNP firmware initialized\n"); in __sev_snp_init_locked()
1208 dev_info(sev->dev, "SEV-SNP API:%d.%d build:%d\n", sev->api_major, in __sev_snp_init_locked()
1209 sev->api_minor, sev->build); in __sev_snp_init_locked()
1219 static void __sev_platform_init_handle_tmr(struct sev_device *sev) in __sev_platform_init_handle_tmr() argument
1228 if (!sev->snp_initialized) in __sev_platform_init_handle_tmr()
1231 dev_warn(sev->dev, "SEV: TMR allocation failed, SEV-ES support unavailable\n"); in __sev_platform_init_handle_tmr()
1240 static int __sev_platform_init_handle_init_ex_path(struct sev_device *sev) in __sev_platform_init_handle_init_ex_path() argument
1253 dev_err(sev->dev, "SEV: INIT_EX NV memory allocation failed\n"); in __sev_platform_init_handle_init_ex_path()
1264 if (sev->snp_initialized) { in __sev_platform_init_handle_init_ex_path()
1269 dev_err(sev->dev, "SEV: INIT_EX NV memory page state change failed.\n"); in __sev_platform_init_handle_init_ex_path()
1280 struct sev_device *sev; in __sev_platform_init_locked() local
1287 sev = psp_master->sev_data; in __sev_platform_init_locked()
1289 if (sev->state == SEV_STATE_INIT) in __sev_platform_init_locked()
1292 __sev_platform_init_handle_tmr(sev); in __sev_platform_init_locked()
1294 rc = __sev_platform_init_handle_init_ex_path(sev); in __sev_platform_init_locked()
1307 dev_err(sev->dev, in __sev_platform_init_locked()
1316 dev_err(sev->dev, "SEV: %s failed %#x, rc %d\n", in __sev_platform_init_locked()
1321 sev->state = SEV_STATE_INIT; in __sev_platform_init_locked()
1327 dev_err(sev->dev, "SEV: DF_FLUSH failed %#x, rc %d\n", in __sev_platform_init_locked()
1332 dev_dbg(sev->dev, "SEV firmware initialized\n"); in __sev_platform_init_locked()
1334 dev_info(sev->dev, "SEV API:%d.%d build:%d\n", sev->api_major, in __sev_platform_init_locked()
1335 sev->api_minor, sev->build); in __sev_platform_init_locked()
1342 struct sev_device *sev; in _sev_platform_init_locked() local
1348 sev = psp_master->sev_data; in _sev_platform_init_locked()
1350 if (sev->state == SEV_STATE_INIT) in _sev_platform_init_locked()
1379 struct sev_device *sev; in __sev_platform_shutdown_locked() local
1385 sev = psp->sev_data; in __sev_platform_shutdown_locked()
1387 if (sev->state == SEV_STATE_UNINIT) in __sev_platform_shutdown_locked()
1392 dev_err(sev->dev, "SEV: failed to SHUTDOWN error %#x, rc %d\n", in __sev_platform_shutdown_locked()
1397 sev->state = SEV_STATE_UNINIT; in __sev_platform_shutdown_locked()
1398 dev_dbg(sev->dev, "SEV firmware shutdown\n"); in __sev_platform_shutdown_locked()
1498 struct sev_device *sev = psp_master->sev_data; in sev_ioctl_do_pek_pdh_gen() local
1505 if (sev->state == SEV_STATE_UNINIT) { in sev_ioctl_do_pek_pdh_gen()
1514 __sev_firmware_shutdown(sev, false); in sev_ioctl_do_pek_pdh_gen()
1521 struct sev_device *sev = psp_master->sev_data; in sev_ioctl_do_pek_csr() local
1554 if (sev->state == SEV_STATE_UNINIT) { in sev_ioctl_do_pek_csr()
1577 __sev_firmware_shutdown(sev, false); in sev_ioctl_do_pek_csr()
1598 struct sev_device *sev = psp_master->sev_data; in sev_get_api_version() local
1604 dev_err(sev->dev, in sev_get_api_version()
1609 sev->api_major = status.api_major; in sev_get_api_version()
1610 sev->api_minor = status.api_minor; in sev_get_api_version()
1611 sev->build = status.build; in sev_get_api_version()
1612 sev->state = status.state; in sev_get_api_version()
1720 struct sev_device *sev; in __sev_snp_shutdown_locked() local
1727 sev = psp->sev_data; in __sev_snp_shutdown_locked()
1729 if (!sev->snp_initialized) in __sev_snp_shutdown_locked()
1754 dev_err(sev->dev, "SEV-SNP DF_FLUSH failed, ret = %d, error = %#x\n", in __sev_snp_shutdown_locked()
1763 dev_err(sev->dev, "SEV-SNP firmware shutdown failed, rc %d, error %#x\n", in __sev_snp_shutdown_locked()
1783 dev_err(sev->dev, "SNP IOMMU shutdown failed\n"); in __sev_snp_shutdown_locked()
1787 sev->snp_initialized = false; in __sev_snp_shutdown_locked()
1788 dev_dbg(sev->dev, "SEV-SNP firmware shutdown\n"); in __sev_snp_shutdown_locked()
1807 struct sev_device *sev = psp_master->sev_data; in sev_ioctl_do_pek_import() local
1840 if (sev->state != SEV_STATE_INIT) { in sev_ioctl_do_pek_import()
1850 __sev_firmware_shutdown(sev, false); in sev_ioctl_do_pek_import()
1962 struct sev_device *sev = psp_master->sev_data; in sev_ioctl_do_pdh_export() local
2011 if (sev->state != SEV_STATE_INIT) { in sev_ioctl_do_pdh_export()
2048 __sev_firmware_shutdown(sev, false); in sev_ioctl_do_pdh_export()
2058 struct sev_device *sev = psp_master->sev_data; in sev_ioctl_do_snp_platform_status() local
2074 if (!sev->snp_initialized) { in sev_ioctl_do_snp_platform_status()
2117 struct sev_device *sev = psp_master->sev_data; in sev_ioctl_do_snp_commit() local
2122 if (!sev->snp_initialized) { in sev_ioctl_do_snp_commit()
2140 struct sev_device *sev = psp_master->sev_data; in sev_ioctl_do_snp_set_config() local
2154 if (!sev->snp_initialized) { in sev_ioctl_do_snp_set_config()
2170 struct sev_device *sev = psp_master->sev_data; in sev_ioctl_do_snp_vlek_load() local
2195 if (!sev->snp_initialized) { in sev_ioctl_do_snp_vlek_load()
2330 static int sev_misc_init(struct sev_device *sev) in sev_misc_init() argument
2332 struct device *dev = sev->dev; in sev_misc_init()
2363 init_waitqueue_head(&sev->int_queue); in sev_misc_init()
2364 sev->misc = misc_dev; in sev_misc_init()
2373 struct sev_device *sev; in sev_dev_init() local
2381 sev = devm_kzalloc(dev, sizeof(*sev), GFP_KERNEL); in sev_dev_init()
2382 if (!sev) in sev_dev_init()
2385 sev->cmd_buf = (void *)devm_get_free_pages(dev, GFP_KERNEL, 1); in sev_dev_init()
2386 if (!sev->cmd_buf) in sev_dev_init()
2389 sev->cmd_buf_backup = (uint8_t *)sev->cmd_buf + PAGE_SIZE; in sev_dev_init()
2391 psp->sev_data = sev; in sev_dev_init()
2393 sev->dev = dev; in sev_dev_init()
2394 sev->psp = psp; in sev_dev_init()
2396 sev->io_regs = psp->io_regs; in sev_dev_init()
2398 sev->vdata = (struct sev_vdata *)psp->vdata->sev; in sev_dev_init()
2399 if (!sev->vdata) { in sev_dev_init()
2405 psp_set_sev_irq_handler(psp, sev_irq_handler, sev); in sev_dev_init()
2407 ret = sev_misc_init(sev); in sev_dev_init()
2418 devm_free_pages(dev, (unsigned long)sev->cmd_buf); in sev_dev_init()
2420 devm_kfree(dev, sev); in sev_dev_init()
2429 static void __sev_firmware_shutdown(struct sev_device *sev, bool panic) in __sev_firmware_shutdown() argument
2469 static void sev_firmware_shutdown(struct sev_device *sev) in sev_firmware_shutdown() argument
2472 __sev_firmware_shutdown(sev, false); in sev_firmware_shutdown()
2487 struct sev_device *sev = psp->sev_data; in sev_dev_destroy() local
2489 if (!sev) in sev_dev_destroy()
2492 sev_firmware_shutdown(sev); in sev_dev_destroy()
2494 if (sev->misc) in sev_dev_destroy()
2503 struct sev_device *sev = psp_master->sev_data; in snp_shutdown_on_panic() local
2514 __sev_firmware_shutdown(sev, true); in snp_shutdown_on_panic()
2531 struct sev_device *sev = psp_master->sev_data; in sev_pci_init() local
2534 if (!sev) in sev_pci_init()
2542 api_major = sev->api_major; in sev_pci_init()
2543 api_minor = sev->api_minor; in sev_pci_init()
2544 build = sev->build; in sev_pci_init()
2546 if (sev_update_firmware(sev->dev) == 0) in sev_pci_init()
2549 if (api_major != sev->api_major || api_minor != sev->api_minor || in sev_pci_init()
2550 build != sev->build) in sev_pci_init()
2551 dev_info(sev->dev, "SEV firmware updated from %d.%d.%d to %d.%d.%d\n", in sev_pci_init()
2553 sev->api_major, sev->api_minor, sev->build); in sev_pci_init()
2565 struct sev_device *sev = psp_master->sev_data; in sev_pci_exit() local
2567 if (!sev) in sev_pci_exit()
2570 sev_firmware_shutdown(sev); in sev_pci_exit()