| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- .. 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 = {
- .id_table = client_id_table,
- .driver = {
- .name = DRIVER_NAME,
- .bus = &tee_bus_type,
- .probe = client_probe,
- .remove = client_remove,
- },
- };
- static int __init client_init(void)
- {
- return driver_register(&client_driver.driver);
- }
- static void __exit client_exit(void)
- {
- driver_unregister(&client_driver.driver);
- }
- module_init(client_init);
- module_exit(client_exit);
|