xref: /linux-6.15/include/linux/tboot.h (revision 853788b9)
1a61127c2SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
269575d38SShane Wang /*
369575d38SShane Wang  * tboot.h: shared data structure with tboot and kernel and functions
469575d38SShane Wang  *          used by kernel for runtime support of Intel(R) Trusted
569575d38SShane Wang  *          Execution Technology
669575d38SShane Wang  *
769575d38SShane Wang  * Copyright (c) 2006-2009, Intel Corporation
869575d38SShane Wang  */
969575d38SShane Wang 
1069575d38SShane Wang #ifndef _LINUX_TBOOT_H
1169575d38SShane Wang #define _LINUX_TBOOT_H
1269575d38SShane Wang 
1369575d38SShane Wang /* these must have the values from 0-5 in this order */
1469575d38SShane Wang enum {
1569575d38SShane Wang 	TB_SHUTDOWN_REBOOT = 0,
1669575d38SShane Wang 	TB_SHUTDOWN_S5,
1769575d38SShane Wang 	TB_SHUTDOWN_S4,
1869575d38SShane Wang 	TB_SHUTDOWN_S3,
1969575d38SShane Wang 	TB_SHUTDOWN_HALT,
2069575d38SShane Wang 	TB_SHUTDOWN_WFS
2169575d38SShane Wang };
2269575d38SShane Wang 
2369575d38SShane Wang #ifdef CONFIG_INTEL_TXT
248b48463fSLv Zheng #include <linux/acpi.h>
2569575d38SShane Wang /* used to communicate between tboot and the launched kernel */
2669575d38SShane Wang 
2769575d38SShane Wang #define TB_KEY_SIZE             64   /* 512 bits */
2869575d38SShane Wang 
2969575d38SShane Wang #define MAX_TB_MAC_REGIONS      32
3069575d38SShane Wang 
3169575d38SShane Wang struct tboot_mac_region {
3269575d38SShane Wang 	u64  start;         /* must be 64 byte -aligned */
3369575d38SShane Wang 	u32  size;          /* must be 64 byte -granular */
3469575d38SShane Wang } __packed;
3569575d38SShane Wang 
3669575d38SShane Wang /* GAS - Generic Address Structure (ACPI 2.0+) */
3769575d38SShane Wang struct tboot_acpi_generic_address {
3869575d38SShane Wang 	u8  space_id;
3969575d38SShane Wang 	u8  bit_width;
4069575d38SShane Wang 	u8  bit_offset;
4169575d38SShane Wang 	u8  access_width;
4269575d38SShane Wang 	u64 address;
4369575d38SShane Wang } __packed;
4469575d38SShane Wang 
4569575d38SShane Wang /*
4669575d38SShane Wang  * combines Sx info from FADT and FACS tables per ACPI 2.0+ spec
47*0585c1c0STiezhu Yang  * (https://uefi.org/specifications)
4869575d38SShane Wang  */
4969575d38SShane Wang struct tboot_acpi_sleep_info {
5069575d38SShane Wang 	struct tboot_acpi_generic_address pm1a_cnt_blk;
5169575d38SShane Wang 	struct tboot_acpi_generic_address pm1b_cnt_blk;
5269575d38SShane Wang 	struct tboot_acpi_generic_address pm1a_evt_blk;
5369575d38SShane Wang 	struct tboot_acpi_generic_address pm1b_evt_blk;
5469575d38SShane Wang 	u16 pm1a_cnt_val;
5569575d38SShane Wang 	u16 pm1b_cnt_val;
5669575d38SShane Wang 	u64 wakeup_vector;
5769575d38SShane Wang 	u32 vector_width;
5869575d38SShane Wang 	u64 kernel_s3_resume_vector;
5969575d38SShane Wang } __packed;
6069575d38SShane Wang 
6169575d38SShane Wang /*
6269575d38SShane Wang  * shared memory page used for communication between tboot and kernel
6369575d38SShane Wang  */
6469575d38SShane Wang struct tboot {
6569575d38SShane Wang 	/*
6669575d38SShane Wang 	 * version 3+ fields:
6769575d38SShane Wang 	 */
6869575d38SShane Wang 
6969575d38SShane Wang 	/* TBOOT_UUID */
7069575d38SShane Wang 	u8 uuid[16];
7169575d38SShane Wang 
7269575d38SShane Wang 	/* version number: 5 is current */
7369575d38SShane Wang 	u32 version;
7469575d38SShane Wang 
7569575d38SShane Wang 	/* physical addr of tb_log_t log */
7669575d38SShane Wang 	u32 log_addr;
7769575d38SShane Wang 
7869575d38SShane Wang 	/*
7969575d38SShane Wang 	 * physical addr of entry point for tboot shutdown and
8069575d38SShane Wang 	 * type of shutdown (TB_SHUTDOWN_*) being requested
8169575d38SShane Wang 	 */
8269575d38SShane Wang 	u32 shutdown_entry;
8369575d38SShane Wang 	u32 shutdown_type;
8469575d38SShane Wang 
8569575d38SShane Wang 	/* kernel-specified ACPI info for Sx shutdown */
8669575d38SShane Wang 	struct tboot_acpi_sleep_info acpi_sinfo;
8769575d38SShane Wang 
8869575d38SShane Wang 	/* tboot location in memory (physical) */
8969575d38SShane Wang 	u32 tboot_base;
9069575d38SShane Wang 	u32 tboot_size;
9169575d38SShane Wang 
9269575d38SShane Wang 	/* memory regions (phys addrs) for tboot to MAC on S3 */
9369575d38SShane Wang 	u8 num_mac_regions;
9469575d38SShane Wang 	struct tboot_mac_region mac_regions[MAX_TB_MAC_REGIONS];
9569575d38SShane Wang 
9669575d38SShane Wang 
9769575d38SShane Wang 	/*
9869575d38SShane Wang 	 * version 4+ fields:
9969575d38SShane Wang 	 */
10069575d38SShane Wang 
10169575d38SShane Wang 	/* symmetric key for use by kernel; will be encrypted on S3 */
10269575d38SShane Wang 	u8 s3_key[TB_KEY_SIZE];
10369575d38SShane Wang 
10469575d38SShane Wang 
10569575d38SShane Wang 	/*
10669575d38SShane Wang 	 * version 5+ fields:
10769575d38SShane Wang 	 */
10869575d38SShane Wang 
10969575d38SShane Wang 	/* used to 4byte-align num_in_wfs */
11069575d38SShane Wang 	u8 reserved_align[3];
11169575d38SShane Wang 
11269575d38SShane Wang 	/* number of processors in wait-for-SIPI */
11369575d38SShane Wang 	u32 num_in_wfs;
11469575d38SShane Wang } __packed;
11569575d38SShane Wang 
11669575d38SShane Wang /*
11769575d38SShane Wang  * UUID for tboot data struct to facilitate matching
11869575d38SShane Wang  * defined as {663C8DFF-E8B3-4b82-AABF-19EA4D057A08} by tboot, which is
11969575d38SShane Wang  * represented as {} in the char array used here
12069575d38SShane Wang  */
12169575d38SShane Wang #define TBOOT_UUID	{0xff, 0x8d, 0x3c, 0x66, 0xb3, 0xe8, 0x82, 0x4b, 0xbf,\
12269575d38SShane Wang 			 0xaa, 0x19, 0xea, 0x4d, 0x5, 0x7a, 0x8}
12369575d38SShane Wang 
124767dea21SChristoph Hellwig bool tboot_enabled(void);
12569575d38SShane Wang extern void tboot_probe(void);
12669575d38SShane Wang extern void tboot_shutdown(u32 shutdown_type);
12769575d38SShane Wang extern struct acpi_table_header *tboot_get_dmar_table(
12869575d38SShane Wang 				      struct acpi_table_header *dmar_tbl);
12969575d38SShane Wang 
13069575d38SShane Wang #else
13169575d38SShane Wang 
132cafd6659SShane Wang #define tboot_enabled()			0
13369575d38SShane Wang #define tboot_probe()			do { } while (0)
13469575d38SShane Wang #define tboot_shutdown(shutdown_type)	do { } while (0)
13569575d38SShane Wang #define tboot_sleep(sleep_state, pm1a_control, pm1b_control)	\
13669575d38SShane Wang 					do { } while (0)
13769575d38SShane Wang #define tboot_get_dmar_table(dmar_tbl)	(dmar_tbl)
13869575d38SShane Wang 
13969575d38SShane Wang #endif /* !CONFIG_INTEL_TXT */
14069575d38SShane Wang 
14169575d38SShane Wang #endif /* _LINUX_TBOOT_H */
142