1*b25bc4b2Sbluhm /* $OpenBSD: pspvar.h,v 1.6 2024/11/05 13:28:35 bluhm Exp $ */ 20b9f4c66Sjsg 30b9f4c66Sjsg /* 40b9f4c66Sjsg * Copyright (c) 2023, 2024 Hans-Joerg Hoexer <hshoexer@genua.de> 50b9f4c66Sjsg * 60b9f4c66Sjsg * Permission to use, copy, modify, and distribute this software for any 70b9f4c66Sjsg * purpose with or without fee is hereby granted, provided that the above 80b9f4c66Sjsg * copyright notice and this permission notice appear in all copies. 90b9f4c66Sjsg * 100b9f4c66Sjsg * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 110b9f4c66Sjsg * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 120b9f4c66Sjsg * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 130b9f4c66Sjsg * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 140b9f4c66Sjsg * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 150b9f4c66Sjsg * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 160b9f4c66Sjsg * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 170b9f4c66Sjsg */ 180b9f4c66Sjsg 190b9f4c66Sjsg #include <sys/ioctl.h> 200b9f4c66Sjsg 210b9f4c66Sjsg /* AMD 17h */ 2238923a19Sbluhm #define PSPV1_REG_INTEN 0x10610 2338923a19Sbluhm #define PSPV1_REG_INTSTS 0x10614 2438923a19Sbluhm #define PSPV1_REG_CMDRESP 0x10580 2538923a19Sbluhm #define PSPV1_REG_ADDRLO 0x105e0 2638923a19Sbluhm #define PSPV1_REG_ADDRHI 0x105e4 2738923a19Sbluhm #define PSPV1_REG_CAPABILITIES 0x105fc 2838923a19Sbluhm 290b9f4c66Sjsg #define PSP_REG_INTEN 0x10690 300b9f4c66Sjsg #define PSP_REG_INTSTS 0x10694 310b9f4c66Sjsg #define PSP_REG_CMDRESP 0x10980 320b9f4c66Sjsg #define PSP_REG_ADDRLO 0x109e0 330b9f4c66Sjsg #define PSP_REG_ADDRHI 0x109e4 340b9f4c66Sjsg #define PSP_REG_CAPABILITIES 0x109fc 350b9f4c66Sjsg 360b9f4c66Sjsg #define PSP_PSTATE_UNINIT 0x0 370b9f4c66Sjsg #define PSP_PSTATE_INIT 0x1 380b9f4c66Sjsg #define PSP_PSTATE_WORKING 0x2 390b9f4c66Sjsg 400b9f4c66Sjsg #define PSP_GSTATE_UNINIT 0x0 410b9f4c66Sjsg #define PSP_GSTATE_LUPDATE 0x1 420b9f4c66Sjsg #define PSP_GSTATE_LSECRET 0x2 430b9f4c66Sjsg #define PSP_GSTATE_RUNNING 0x3 440b9f4c66Sjsg #define PSP_GSTATE_SUPDATE 0x4 450b9f4c66Sjsg #define PSP_GSTATE_RUPDATE 0x5 460b9f4c66Sjsg #define PSP_GSTATE_SENT 0x6 470b9f4c66Sjsg 480b9f4c66Sjsg #define PSP_CAP_SEV (1 << 0) 490b9f4c66Sjsg #define PSP_CAP_TEE (1 << 1) 500b9f4c66Sjsg #define PSP_CAP_DBC_THRU_EXT (1 << 2) 510b9f4c66Sjsg #define PSP_CAP_SECURITY_REPORTING (1 << 7) 520b9f4c66Sjsg #define PSP_CAP_SECURITY_FUSED_PART (1 << 8) 530b9f4c66Sjsg #define PSP_CAP_SECURITY_DEBUG_LOCK_ON (1 << 10) 540b9f4c66Sjsg #define PSP_CAP_SECURITY_TSME_STATUS (1 << 13) 550b9f4c66Sjsg #define PSP_CAP_SECURITY_ANTI_ROLLBACK_STATUS (1 << 15) 560b9f4c66Sjsg #define PSP_CAP_SECURITY_RPMC_PRODUCTION_ENABLED (1 << 16) 570b9f4c66Sjsg #define PSP_CAP_SECURITY_RPMC_SPIROM_AVAILABLE (1 << 17) 580b9f4c66Sjsg #define PSP_CAP_SECURITY_HSP_TPM_AVAILABLE (1 << 18) 590b9f4c66Sjsg #define PSP_CAP_SECURITY_ROM_ARMOR_ENFORCED (1 << 19) 600b9f4c66Sjsg 610b9f4c66Sjsg #define PSP_CAP_BITS "\20\001SEV\002TEE\003DBC_THRU_EXT\010REPORTING\011FUSED_PART\013DEBUG_LOCK_ON\016TSME_STATUS\020ANTI_ROLLBACK_STATUS\021RPMC_PRODUCTION_ENABLED\022RPMC_SPIROM_AVAILABLE\023HSP_TPM_AVAILABLE\024ROM_ARMOR_ENFORCED" 620b9f4c66Sjsg 630b9f4c66Sjsg #define PSP_CMDRESP_IOC (1 << 0) 640b9f4c66Sjsg #define PSP_CMDRESP_COMPLETE (1 << 1) 650b9f4c66Sjsg #define PSP_CMDRESP_RESPONSE (1 << 31) 660b9f4c66Sjsg 670b9f4c66Sjsg #define PSP_STATUS_MASK 0xffff 680b9f4c66Sjsg #define PSP_STATUS_SUCCESS 0x0000 690b9f4c66Sjsg #define PSP_STATUS_INVALID_PLATFORM_STATE 0x0001 700b9f4c66Sjsg 710b9f4c66Sjsg #define PSP_TMR_SIZE (1024*1024) /* 1 Mb */ 720b9f4c66Sjsg 730b9f4c66Sjsg #define PSP_SUCCESS 0x0000 740b9f4c66Sjsg #define PSP_INVALID_ADDRESS 0x0009 750b9f4c66Sjsg 760b9f4c66Sjsg /* Selection of PSP commands of the SEV API Version 0.24 */ 770b9f4c66Sjsg 780b9f4c66Sjsg #define PSP_CMD_INIT 0x1 79*b25bc4b2Sbluhm #define PSP_CMD_SHUTDOWN 0x2 800b9f4c66Sjsg #define PSP_CMD_PLATFORMSTATUS 0x4 810b9f4c66Sjsg #define PSP_CMD_DF_FLUSH 0xa 8252c926a1Sbluhm #define PSP_CMD_DOWNLOADFIRMWARE 0xb 830b9f4c66Sjsg #define PSP_CMD_DECOMMISSION 0x20 840b9f4c66Sjsg #define PSP_CMD_ACTIVATE 0x21 850b9f4c66Sjsg #define PSP_CMD_DEACTIVATE 0x22 860b9f4c66Sjsg #define PSP_CMD_GUESTSTATUS 0x23 870b9f4c66Sjsg #define PSP_CMD_LAUNCH_START 0x30 880b9f4c66Sjsg #define PSP_CMD_LAUNCH_UPDATE_DATA 0x31 890b9f4c66Sjsg #define PSP_CMD_LAUNCH_MEASURE 0x33 900b9f4c66Sjsg #define PSP_CMD_LAUNCH_FINISH 0x35 910b9f4c66Sjsg #define PSP_CMD_ATTESTATION 0x36 920b9f4c66Sjsg 930b9f4c66Sjsg struct psp_platform_status { 940b9f4c66Sjsg /* Output parameters from PSP_CMD_PLATFORMSTATUS */ 950b9f4c66Sjsg uint8_t api_major; 960b9f4c66Sjsg uint8_t api_minor; 970b9f4c66Sjsg uint8_t state; 980b9f4c66Sjsg uint8_t owner; 990b9f4c66Sjsg uint32_t cfges_build; 1000b9f4c66Sjsg uint32_t guest_count; 1010b9f4c66Sjsg } __packed; 1020b9f4c66Sjsg 1030b9f4c66Sjsg struct psp_guest_status { 1040b9f4c66Sjsg /* Input parameter for PSP_CMD_GUESTSTATUS */ 1050b9f4c66Sjsg uint32_t handle; 1060b9f4c66Sjsg 1070b9f4c66Sjsg /* Output parameters from PSP_CMD_GUESTSTATUS */ 1080b9f4c66Sjsg uint32_t policy; 1090b9f4c66Sjsg uint32_t asid; 1100b9f4c66Sjsg uint8_t state; 1110b9f4c66Sjsg } __packed; 1120b9f4c66Sjsg 1130b9f4c66Sjsg struct psp_launch_start { 1140b9f4c66Sjsg /* Input/Output parameter for PSP_CMD_LAUNCH_START */ 1150b9f4c66Sjsg uint32_t handle; 1160b9f4c66Sjsg 1170b9f4c66Sjsg /* Input parameters for PSP_CMD_LAUNCH_START */ 1180b9f4c66Sjsg uint32_t policy; 1190b9f4c66Sjsg 1200b9f4c66Sjsg /* The following input parameters are not used yet */ 1210b9f4c66Sjsg uint64_t dh_cert_paddr; 1220b9f4c66Sjsg uint32_t dh_cert_len; 1230b9f4c66Sjsg uint32_t reserved; 1240b9f4c66Sjsg uint64_t session_paddr; 1250b9f4c66Sjsg uint32_t session_len; 1260b9f4c66Sjsg } __packed; 1270b9f4c66Sjsg 1280b9f4c66Sjsg struct psp_launch_update_data { 1290b9f4c66Sjsg /* Input parameters for PSP_CMD_LAUNCH_UPDATE_DATA */ 1300b9f4c66Sjsg uint32_t handle; 1310b9f4c66Sjsg uint32_t reserved; 1320b9f4c66Sjsg uint64_t paddr; 1330b9f4c66Sjsg uint32_t length; 1340b9f4c66Sjsg } __packed; 1350b9f4c66Sjsg 1360b9f4c66Sjsg struct psp_measure { 1370b9f4c66Sjsg /* Output buffer for PSP_CMD_LAUNCH_MEASURE */ 1380b9f4c66Sjsg uint8_t measure[32]; 1390b9f4c66Sjsg uint8_t measure_nonce[16]; 1400b9f4c66Sjsg } __packed; 1410b9f4c66Sjsg 1420b9f4c66Sjsg struct psp_launch_measure { 1430b9f4c66Sjsg /* Input parameters for PSP_CMD_LAUNCH_MEASURE */ 1440b9f4c66Sjsg uint32_t handle; 1450b9f4c66Sjsg uint32_t reserved; 1460b9f4c66Sjsg uint64_t measure_paddr; 1470b9f4c66Sjsg 1480b9f4c66Sjsg /* Input/output parameter for PSP_CMD_LAUNCH_MEASURE */ 1490b9f4c66Sjsg uint32_t measure_len; 1500b9f4c66Sjsg uint32_t padding; 1510b9f4c66Sjsg 1520b9f4c66Sjsg /* Output buffer from PSP_CMD_LAUNCH_MEASURE */ 1530b9f4c66Sjsg struct psp_measure psp_measure; /* 64bit aligned */ 1540b9f4c66Sjsg #define measure psp_measure.measure 1550b9f4c66Sjsg #define measure_nonce psp_measure.measure_nonce 1560b9f4c66Sjsg } __packed; 1570b9f4c66Sjsg 1580b9f4c66Sjsg struct psp_launch_finish { 1590b9f4c66Sjsg /* Input parameter for PSP_CMD_LAUNCH_FINISH */ 1600b9f4c66Sjsg uint32_t handle; 1610b9f4c66Sjsg } __packed; 1620b9f4c66Sjsg 1630b9f4c66Sjsg struct psp_report { 1640b9f4c66Sjsg /* Output buffer for PSP_CMD_ATTESTATION */ 1650b9f4c66Sjsg uint8_t report_nonce[16]; 1660b9f4c66Sjsg uint8_t report_launch_digest[32]; 1670b9f4c66Sjsg uint32_t report_policy; 1680b9f4c66Sjsg uint32_t report_sig_usage; 1690b9f4c66Sjsg uint32_t report_sig_algo; 1700b9f4c66Sjsg uint32_t reserved2; 1710b9f4c66Sjsg uint8_t report_sig1[144]; 1720b9f4c66Sjsg } __packed; 1730b9f4c66Sjsg 1740b9f4c66Sjsg struct psp_attestation { 1750b9f4c66Sjsg /* Input parameters for PSP_CMD_ATTESTATION */ 1760b9f4c66Sjsg uint32_t handle; 1770b9f4c66Sjsg uint32_t reserved; 1780b9f4c66Sjsg uint64_t attest_paddr; 1790b9f4c66Sjsg uint8_t attest_nonce[16]; 1800b9f4c66Sjsg 1810b9f4c66Sjsg /* Input/output parameter from PSP_CMD_ATTESTATION */ 1820b9f4c66Sjsg uint32_t attest_len; 1830b9f4c66Sjsg uint32_t padding; 1840b9f4c66Sjsg 1850b9f4c66Sjsg /* Output parameter from PSP_CMD_ATTESTATION */ 1860b9f4c66Sjsg struct psp_report psp_report; /* 64bit aligned */ 1870b9f4c66Sjsg #define report_nonce psp_report.report_nonce 1880b9f4c66Sjsg #define report_launch_digest psp_report.report_launch_digest 1890b9f4c66Sjsg #define report_policy psp_report.report_policy 1900b9f4c66Sjsg #define report_sig_usage psp_report.report_sig_usage; 1910b9f4c66Sjsg #define report_report_sig_alg psp_report.report_sig_algo; 1920b9f4c66Sjsg #define report_report_sig1 psp_report.report_sig1; 1930b9f4c66Sjsg } __packed; 1940b9f4c66Sjsg 1950b9f4c66Sjsg struct psp_activate { 1960b9f4c66Sjsg /* Input parameters for PSP_CMD_ACTIVATE */ 1970b9f4c66Sjsg uint32_t handle; 1980b9f4c66Sjsg uint32_t asid; 1990b9f4c66Sjsg } __packed; 2000b9f4c66Sjsg 2010b9f4c66Sjsg struct psp_deactivate { 2020b9f4c66Sjsg /* Input parameter for PSP_CMD_DEACTIVATE */ 2030b9f4c66Sjsg uint32_t handle; 2040b9f4c66Sjsg } __packed; 2050b9f4c66Sjsg 2060b9f4c66Sjsg struct psp_decommission { 2070b9f4c66Sjsg /* Input parameter for PSP_CMD_DECOMMISSION */ 2080b9f4c66Sjsg uint32_t handle; 2090b9f4c66Sjsg } __packed; 2100b9f4c66Sjsg 2110b9f4c66Sjsg struct psp_init { 2120b9f4c66Sjsg /* Output parameters from PSP_CMD_INIT */ 2130b9f4c66Sjsg uint32_t enable_es; 2140b9f4c66Sjsg uint32_t reserved; 2150b9f4c66Sjsg uint64_t tmr_paddr; 2160b9f4c66Sjsg uint32_t tmr_length; 2170b9f4c66Sjsg } __packed; 2180b9f4c66Sjsg 21952c926a1Sbluhm struct psp_downloadfirmware { 22052c926a1Sbluhm /* Input parameters for PSP_CMD_DOWNLOADFIRMWARE */ 22152c926a1Sbluhm uint64_t fw_paddr; 22252c926a1Sbluhm uint32_t fw_len; 22352c926a1Sbluhm } __packed; 2240b9f4c66Sjsg 2250b9f4c66Sjsg struct psp_guest_shutdown { 2260b9f4c66Sjsg /* Input parameter for PSP_CMD_GUEST_SHUTDOWN */ 2270b9f4c66Sjsg uint32_t handle; 2280b9f4c66Sjsg } __packed; 2290b9f4c66Sjsg 2300b9f4c66Sjsg /* Selection of PSP commands of the SEV-SNP ABI Version 1.55 */ 2310b9f4c66Sjsg 2320b9f4c66Sjsg #define PSP_CMD_SNP_PLATFORMSTATUS 0x81 2330b9f4c66Sjsg 2340b9f4c66Sjsg struct psp_snp_platform_status { 2350b9f4c66Sjsg uint8_t api_major; 2360b9f4c66Sjsg uint8_t api_minor; 2370b9f4c66Sjsg uint8_t state; 2380b9f4c66Sjsg uint8_t is_rmp_init; 2390b9f4c66Sjsg uint32_t build; 2400b9f4c66Sjsg uint32_t features; 2410b9f4c66Sjsg uint32_t guest_count; 2420b9f4c66Sjsg uint64_t current_tcb; 2430b9f4c66Sjsg uint64_t reported_tcb; 2440b9f4c66Sjsg } __packed; 2450b9f4c66Sjsg 2460b9f4c66Sjsg #define PSP_IOC_GET_PSTATUS _IOR('P', 0, struct psp_platform_status) 2470b9f4c66Sjsg #define PSP_IOC_DF_FLUSH _IO('P', 1) 2480b9f4c66Sjsg #define PSP_IOC_DECOMMISSION _IOW('P', 2, struct psp_decommission) 2490b9f4c66Sjsg #define PSP_IOC_GET_GSTATUS _IOWR('P', 3, struct psp_guest_status) 2500b9f4c66Sjsg #define PSP_IOC_LAUNCH_START _IOWR('P', 4, struct psp_launch_start) 2510b9f4c66Sjsg #define PSP_IOC_LAUNCH_UPDATE_DATA \ 2520b9f4c66Sjsg _IOW('P', 5, struct psp_launch_update_data) 2530b9f4c66Sjsg #define PSP_IOC_LAUNCH_MEASURE _IOWR('P', 6, struct psp_launch_measure) 2540b9f4c66Sjsg #define PSP_IOC_LAUNCH_FINISH _IOW('P', 7, struct psp_launch_finish) 2550b9f4c66Sjsg #define PSP_IOC_ATTESTATION _IOWR('P', 8, struct psp_attestation) 2560b9f4c66Sjsg #define PSP_IOC_ACTIVATE _IOW('P', 9, struct psp_activate) 2570b9f4c66Sjsg #define PSP_IOC_DEACTIVATE _IOW('P', 10, struct psp_deactivate) 2580b9f4c66Sjsg #define PSP_IOC_SNP_GET_PSTATUS _IOR('P', 11, struct psp_snp_platform_status) 259ff28563eSbluhm #define PSP_IOC_INIT _IO('P', 12) 260*b25bc4b2Sbluhm #define PSP_IOC_SHUTDOWN _IO('P', 13) 2610b9f4c66Sjsg #define PSP_IOC_GUEST_SHUTDOWN _IOW('P', 255, struct psp_guest_shutdown) 2620b9f4c66Sjsg 2630b9f4c66Sjsg #ifdef _KERNEL 2640b9f4c66Sjsg 2658eadc5ecSjsg struct psp_attach_args { 2668eadc5ecSjsg bus_space_tag_t iot; 2678eadc5ecSjsg bus_space_handle_t ioh; 2680b9f4c66Sjsg 2698eadc5ecSjsg bus_dma_tag_t dmat; 2708eadc5ecSjsg uint32_t capabilities; 27138923a19Sbluhm int version; 2728eadc5ecSjsg }; 2738eadc5ecSjsg 2748eadc5ecSjsg int pspsubmatch(struct device *, void *, void *); 2758eadc5ecSjsg int pspprint(void *aux, const char *pnp); 2768eadc5ecSjsg int psp_sev_intr(void *); 2770b9f4c66Sjsg 27838923a19Sbluhm struct ccp_softc; 27938923a19Sbluhm struct pci_attach_args; 28038923a19Sbluhm 28138923a19Sbluhm int psp_pci_match(struct ccp_softc *, struct pci_attach_args *); 28238923a19Sbluhm void psp_pci_intr_map(struct ccp_softc *, struct pci_attach_args *); 28338923a19Sbluhm void psp_pci_attach(struct ccp_softc *, struct pci_attach_args *); 28438923a19Sbluhm 2850b9f4c66Sjsg #endif /* _KERNEL */ 286