| .. SPDX-License-Identifier: GPL-2.0 | |
| Introduction | |
| ============ | |
| The Intel Silicon Security Engine (Intel SSE) is an isolated and | |
| protected computing resource (Co-processor) residing inside | |
| Intel client chipsets released in 2024 (Lunar Lake) or later. | |
| The Intel SSE provide security support and platform boot orchestration. | |
| The actual feature set depends on the Intel chipset SKU. | |
| The Intel Silicon Security Engine Interface (Intel SSEI) | |
| is the interface between the Host and Intel SSE. | |
| This interface is exposed to the host as one or more PCI devices. | |
| The Intel SSEI Driver is in charge of the communication channel between | |
| a host application and the Intel SSE features. | |
| Each Intel SSE feature, or Intel SSE Client is addressed by a unique UUID and | |
| each client has its own protocol. The protocol is message-based with a | |
| header and payload up to maximal number of bytes advertised by the client, | |
| upon connection. | |
| Intel SSEI Driver | |
| ================= | |
| The driver exposes a character device with device nodes /dev/isseiX. | |
| An application maintains communication with an Intel SSE feature while | |
| /dev/isseiX is open. The binding to a specific feature is performed by calling | |
| :c:macro:`IOCTL_ISSEI_CONNECT_CLIENT`, which passes the desired UUID. | |
| The number of instances of an Intel SSE feature that can be opened | |
| at the same time is limited to single instance. | |
| The driver is transparent to data that are passed between firmware feature | |
| and host application. | |
| Because some of the Intel SSE features can change the system | |
| configuration, the driver by default allows only a privileged | |
| user to access it. | |
| The connection termination is performed by calling | |
| :c:macro:`IOCTL_ISSEI_DISCONNECT_CLIENT`. | |
| The session is terminated calling :c:expr:`close(fd)`. | |
| A code snippet for an application communicating with SPDM client: | |
| .. code-block:: C | |
| struct issei_connect_client_data data = {.in_client_uuid = | |
| {0xe8, 0x51, 0x49, 0xdf, 0x94, 0x47, 0x4C, | |
| 0x9A, 0x83, 0x67, 0xC4, 0xE3, 0x34, 0x64, 0xF1, 0xB4}}; | |
| __u8 req_data[] = {0x10, 0x84, 0x00, 0x00}; /* SPDM Get Version */ | |
| size_t req_data_len = sizeof(req_data); | |
| __u8 res_data[256]; | |
| size_t res_data_len = sizeof(res_data); | |
| int fd = open("/dev/issei0", O_RDWR); | |
| ioctl(fd, IOCTL_ISSEI_CONNECT_CLIENT, &data); | |
| printf("Ver=%d, MaxLen=%u, Flags=0x%08X\n", | |
| data.out_client_properties.protocol_version, | |
| data.out_client_properties.max_msg_length, | |
| data.out_client_properties.flags); | |
| [...] | |
| write(fd, req_data, req_data_len); | |
| [...] | |
| read(fd, res_data, res_data_len); | |
| printf("SPDM version count %u, version[0]=%02X%02X\n", | |
| res_data[5], res_data[6], res_data[7]); | |
| [...] | |
| ioctl(fd, IOCTL_ISSEI_DISCONNECT_CLIENT, &data); | |
| [...] | |
| close(fd); | |
| User space API ioctl | |
| ==================== | |
| The Intel SSEI Driver supports the following ioctl commands: | |
| IOCTL_ISSEI_CONNECT_CLIENT | |
| -------------------------- | |
| Connect to firmware Feature/Client. | |
| .. code-block:: none | |
| Usage: | |
| struct issei_connect_client_data client_data; | |
| ioctl(fd, IOCTL_ISSEI_CONNECT_CLIENT, &client_data); | |
| struct issei_connect_client_data - contain the following | |
| Inputs: | |
| in_client_uuid - UUID of the FW Feature that needs to connect to. | |
| Outputs: | |
| out_client_properties - Client Properties: MTU, Protocol Version and Flags. | |
| Error returns: | |
| ENOTTY No such client (i.e. wrong UUID) or connection is not allowed. | |
| EINVAL Wrong IOCTL Number | |
| ENODEV Device or Connection is not initialized or ready. | |
| ENOMEM Unable to allocate memory to client internal data. | |
| EFAULT Fatal Error (e.g. Unable to access user input data) | |
| EBUSY Connection Already Open | |
| :Note: | |
| max_msg_length (MTU) in client properties describes the maximum | |
| data that can be sent or received. (e.g. with MTU=2K, can send | |
| requests up to bytes 2k and received responses up to 2k bytes). | |
| IOCTL_ISSEI_DISCONNECT_CLIENT | |
| ----------------------------- | |
| Disconnect from firmware Feature/Client. | |
| .. code-block:: none | |
| Usage: | |
| ioctl(fd, IOCTL_ISSEI_DISCONNECT_CLIENT, NULL); | |
| Error returns: | |
| EINVAL Wrong IOCTL Number | |
| ENODEV Device or Connection is not initialized or ready. | |
| ENOTCONN Feature/Client is not connected. |