| .. SPDX-License-Identifier: GPL-2.0 | |
| =============================================== | |
| TEE (Trusted Execution Environment) driver API | |
| =============================================== | |
| Kernel provides a TEE bus infrastructure where a Trusted Application is | |
| represented as a device identified via Universally Unique Identifier (UUID) and | |
| client drivers register a table of supported device UUIDs. | |
| TEE bus infrastructure registers following APIs: | |
| match(): | |
| iterates over the client driver UUID table to find a corresponding | |
| match for device UUID. If a match is found, then this particular device is | |
| probed via corresponding probe API registered by the client driver. This | |
| process happens whenever a device or a client driver is registered with TEE | |
| bus. | |
| uevent(): | |
| notifies user-space (udev) whenever a new device is registered on | |
| TEE bus for auto-loading of modularized client drivers. | |
| TEE bus device enumeration is specific to underlying TEE implementation, so it | |
| is left open for TEE drivers to provide corresponding implementation. | |
| Then TEE client driver can talk to a matched Trusted Application using APIs | |
| listed in include/linux/tee_drv.h. | |
| TEE client driver example | |
| ------------------------- | |
| Suppose a TEE client driver needs to communicate with a Trusted Application | |
| having UUID: ``ac6a4085-0e82-4c33-bf98-8eb8e118b6c2``, so driver registration | |
| snippet would look like:: | |
| static const struct tee_client_device_id client_id_table[] = { | |
| {UUID_INIT(0xac6a4085, 0x0e82, 0x4c33, | |
| 0xbf, 0x98, 0x8e, 0xb8, 0xe1, 0x18, 0xb6, 0xc2)}, | |
| {} | |
| }; | |
| MODULE_DEVICE_TABLE(tee, client_id_table); | |
| static struct tee_client_driver client_driver = { | |
| .probe = client_probe, | |
| .remove = client_remove, | |
| .id_table = client_id_table, | |
| .driver = { | |
| .name = DRIVER_NAME, | |
| }, | |
| }; | |
| module_tee_client_driver(client_driver); |