67 lines
2.0 KiB
ReStructuredText
67 lines
2.0 KiB
ReStructuredText
|
.. 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);
|