1*65f0ecb9SAlexander Usyskin.. SPDX-License-Identifier: GPL-2.0 2*65f0ecb9SAlexander Usyskin 3*65f0ecb9SAlexander UsyskinIntroduction 4*65f0ecb9SAlexander Usyskin============ 5*65f0ecb9SAlexander Usyskin 6*65f0ecb9SAlexander UsyskinThe Intel Silicon Security Engine (Intel SSE) is an isolated and 7*65f0ecb9SAlexander Usyskinprotected computing resource (Co-processor) residing inside 8*65f0ecb9SAlexander UsyskinIntel client chipsets released in 2024 (Lunar Lake) or later. 9*65f0ecb9SAlexander UsyskinThe Intel SSE provide security support and platform boot orchestration. 10*65f0ecb9SAlexander UsyskinThe actual feature set depends on the Intel chipset SKU. 11*65f0ecb9SAlexander Usyskin 12*65f0ecb9SAlexander UsyskinThe Intel Silicon Security Engine Interface (Intel SSEI) 13*65f0ecb9SAlexander Usyskinis the interface between the Host and Intel SSE. 14*65f0ecb9SAlexander UsyskinThis interface is exposed to the host as one or more PCI devices. 15*65f0ecb9SAlexander UsyskinThe Intel SSEI Driver is in charge of the communication channel between 16*65f0ecb9SAlexander Usyskina host application and the Intel SSE features. 17*65f0ecb9SAlexander Usyskin 18*65f0ecb9SAlexander UsyskinEach Intel SSE feature, or Intel SSE Client is addressed by a unique UUID and 19*65f0ecb9SAlexander Usyskineach client has its own protocol. The protocol is message-based with a 20*65f0ecb9SAlexander Usyskinheader and payload up to maximal number of bytes advertised by the client, 21*65f0ecb9SAlexander Usyskinupon connection. 22*65f0ecb9SAlexander Usyskin 23*65f0ecb9SAlexander UsyskinIntel SSEI Driver 24*65f0ecb9SAlexander Usyskin================= 25*65f0ecb9SAlexander Usyskin 26*65f0ecb9SAlexander UsyskinThe driver exposes a character device with device nodes /dev/isseiX. 27*65f0ecb9SAlexander Usyskin 28*65f0ecb9SAlexander UsyskinAn application maintains communication with an Intel SSE feature while 29*65f0ecb9SAlexander Usyskin/dev/isseiX is open. The binding to a specific feature is performed by calling 30*65f0ecb9SAlexander Usyskin:c:macro:`IOCTL_ISSEI_CONNECT_CLIENT`, which passes the desired UUID. 31*65f0ecb9SAlexander UsyskinThe number of instances of an Intel SSE feature that can be opened 32*65f0ecb9SAlexander Usyskinat the same time is limited to single instance. 33*65f0ecb9SAlexander Usyskin 34*65f0ecb9SAlexander UsyskinThe driver is transparent to data that are passed between firmware feature 35*65f0ecb9SAlexander Usyskinand host application. 36*65f0ecb9SAlexander Usyskin 37*65f0ecb9SAlexander UsyskinBecause some of the Intel SSE features can change the system 38*65f0ecb9SAlexander Usyskinconfiguration, the driver by default allows only a privileged 39*65f0ecb9SAlexander Usyskinuser to access it. 40*65f0ecb9SAlexander Usyskin 41*65f0ecb9SAlexander UsyskinThe connection termination is performed by calling 42*65f0ecb9SAlexander Usyskin:c:macro:`IOCTL_ISSEI_DISCONNECT_CLIENT`. 43*65f0ecb9SAlexander Usyskin 44*65f0ecb9SAlexander UsyskinThe session is terminated calling :c:expr:`close(fd)`. 45*65f0ecb9SAlexander Usyskin 46*65f0ecb9SAlexander UsyskinA code snippet for an application communicating with SPDM client: 47*65f0ecb9SAlexander Usyskin 48*65f0ecb9SAlexander Usyskin.. code-block:: C 49*65f0ecb9SAlexander Usyskin 50*65f0ecb9SAlexander Usyskin struct issei_connect_client_data data = {.in_client_uuid = 51*65f0ecb9SAlexander Usyskin {0xe8, 0x51, 0x49, 0xdf, 0x94, 0x47, 0x4C, 52*65f0ecb9SAlexander Usyskin 0x9A, 0x83, 0x67, 0xC4, 0xE3, 0x34, 0x64, 0xF1, 0xB4}}; 53*65f0ecb9SAlexander Usyskin __u8 req_data[] = {0x10, 0x84, 0x00, 0x00}; /* SPDM Get Version */ 54*65f0ecb9SAlexander Usyskin size_t req_data_len = sizeof(req_data); 55*65f0ecb9SAlexander Usyskin __u8 res_data[256]; 56*65f0ecb9SAlexander Usyskin size_t res_data_len = sizeof(res_data); 57*65f0ecb9SAlexander Usyskin int fd = open("/dev/issei0", O_RDWR); 58*65f0ecb9SAlexander Usyskin 59*65f0ecb9SAlexander Usyskin ioctl(fd, IOCTL_ISSEI_CONNECT_CLIENT, &data); 60*65f0ecb9SAlexander Usyskin 61*65f0ecb9SAlexander Usyskin printf("Ver=%d, MaxLen=%u, Flags=0x%08X\n", 62*65f0ecb9SAlexander Usyskin data.out_client_properties.protocol_version, 63*65f0ecb9SAlexander Usyskin data.out_client_properties.max_msg_length, 64*65f0ecb9SAlexander Usyskin data.out_client_properties.flags); 65*65f0ecb9SAlexander Usyskin 66*65f0ecb9SAlexander Usyskin [...] 67*65f0ecb9SAlexander Usyskin 68*65f0ecb9SAlexander Usyskin write(fd, req_data, req_data_len); 69*65f0ecb9SAlexander Usyskin 70*65f0ecb9SAlexander Usyskin [...] 71*65f0ecb9SAlexander Usyskin 72*65f0ecb9SAlexander Usyskin read(fd, res_data, res_data_len); 73*65f0ecb9SAlexander Usyskin 74*65f0ecb9SAlexander Usyskin printf("SPDM version count %u, version[0]=%02X%02X\n", 75*65f0ecb9SAlexander Usyskin res_data[5], res_data[6], res_data[7]); 76*65f0ecb9SAlexander Usyskin 77*65f0ecb9SAlexander Usyskin [...] 78*65f0ecb9SAlexander Usyskin 79*65f0ecb9SAlexander Usyskin ioctl(fd, IOCTL_ISSEI_DISCONNECT_CLIENT, &data); 80*65f0ecb9SAlexander Usyskin 81*65f0ecb9SAlexander Usyskin [...] 82*65f0ecb9SAlexander Usyskin 83*65f0ecb9SAlexander Usyskin close(fd); 84*65f0ecb9SAlexander Usyskin 85*65f0ecb9SAlexander Usyskin 86*65f0ecb9SAlexander UsyskinUser space API ioctl 87*65f0ecb9SAlexander Usyskin==================== 88*65f0ecb9SAlexander Usyskin 89*65f0ecb9SAlexander UsyskinThe Intel SSEI Driver supports the following ioctl commands: 90*65f0ecb9SAlexander Usyskin 91*65f0ecb9SAlexander UsyskinIOCTL_ISSEI_CONNECT_CLIENT 92*65f0ecb9SAlexander Usyskin-------------------------- 93*65f0ecb9SAlexander UsyskinConnect to firmware Feature/Client. 94*65f0ecb9SAlexander Usyskin 95*65f0ecb9SAlexander Usyskin.. code-block:: none 96*65f0ecb9SAlexander Usyskin 97*65f0ecb9SAlexander Usyskin Usage: 98*65f0ecb9SAlexander Usyskin 99*65f0ecb9SAlexander Usyskin struct issei_connect_client_data client_data; 100*65f0ecb9SAlexander Usyskin 101*65f0ecb9SAlexander Usyskin ioctl(fd, IOCTL_ISSEI_CONNECT_CLIENT, &client_data); 102*65f0ecb9SAlexander Usyskin 103*65f0ecb9SAlexander Usyskin struct issei_connect_client_data - contain the following 104*65f0ecb9SAlexander Usyskin Inputs: 105*65f0ecb9SAlexander Usyskin in_client_uuid - UUID of the FW Feature that needs to connect to. 106*65f0ecb9SAlexander Usyskin Outputs: 107*65f0ecb9SAlexander Usyskin out_client_properties - Client Properties: MTU, Protocol Version and Flags. 108*65f0ecb9SAlexander Usyskin 109*65f0ecb9SAlexander Usyskin Error returns: 110*65f0ecb9SAlexander Usyskin ENOTTY No such client (i.e. wrong UUID) or connection is not allowed. 111*65f0ecb9SAlexander Usyskin EINVAL Wrong IOCTL Number 112*65f0ecb9SAlexander Usyskin ENODEV Device or Connection is not initialized or ready. 113*65f0ecb9SAlexander Usyskin ENOMEM Unable to allocate memory to client internal data. 114*65f0ecb9SAlexander Usyskin EFAULT Fatal Error (e.g. Unable to access user input data) 115*65f0ecb9SAlexander Usyskin EBUSY Connection Already Open 116*65f0ecb9SAlexander Usyskin 117*65f0ecb9SAlexander Usyskin:Note: 118*65f0ecb9SAlexander Usyskin max_msg_length (MTU) in client properties describes the maximum 119*65f0ecb9SAlexander Usyskin data that can be sent or received. (e.g. with MTU=2K, can send 120*65f0ecb9SAlexander Usyskin requests up to bytes 2k and received responses up to 2k bytes). 121*65f0ecb9SAlexander Usyskin 122*65f0ecb9SAlexander UsyskinIOCTL_ISSEI_DISCONNECT_CLIENT 123*65f0ecb9SAlexander Usyskin----------------------------- 124*65f0ecb9SAlexander UsyskinDisconnect from firmware Feature/Client. 125*65f0ecb9SAlexander Usyskin 126*65f0ecb9SAlexander Usyskin.. code-block:: none 127*65f0ecb9SAlexander Usyskin 128*65f0ecb9SAlexander Usyskin Usage: 129*65f0ecb9SAlexander Usyskin 130*65f0ecb9SAlexander Usyskin ioctl(fd, IOCTL_ISSEI_DISCONNECT_CLIENT, NULL); 131*65f0ecb9SAlexander Usyskin 132*65f0ecb9SAlexander Usyskin Error returns: 133*65f0ecb9SAlexander Usyskin EINVAL Wrong IOCTL Number 134*65f0ecb9SAlexander Usyskin ENODEV Device or Connection is not initialized or ready. 135*65f0ecb9SAlexander Usyskin ENOTCONN Feature/Client is not connected. 136