xref: /openbsd-src/sys/dev/ic/pspvar.h (revision b25bc4b2a81dea264ceac41af194cf3d91be5b48)
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