xref: /linux/Documentation/driver-api/issei/issei.rst (revision 67f8bc848ee31831336bd478e57d2f993551902e)
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