mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-06 13:23:18 +00:00
Documentation: tee: Document TEE kernel interface
Update documentation with TEE bus infrastructure which provides an interface for kernel client drivers to communicate with corresponding Trusted Application. Signed-off-by: Sumit Garg <sumit.garg@linaro.org> Reviewed-by: Maxim Uvarov <maxim.uvarov@linaro.org> Link: https://lore.kernel.org/r/1591253979-29067-1-git-send-email-sumit.garg@linaro.org Signed-off-by: Jonathan Corbet <corbet@lwn.net>
This commit is contained in:
parent
cf37fc4a0c
commit
2253bd8480
@ -53,6 +53,66 @@ clients, forward them to the TEE and send back the results. In the case of
|
||||
supplicants the communication goes in the other direction, the TEE sends
|
||||
requests to the supplicant which then sends back the result.
|
||||
|
||||
The TEE kernel interface
|
||||
========================
|
||||
|
||||
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);
|
||||
|
||||
OP-TEE driver
|
||||
=============
|
||||
|
||||
@ -112,6 +172,14 @@ kernel are handled by the kernel driver. Other RPC messages will be forwarded to
|
||||
tee-supplicant without further involvement of the driver, except switching
|
||||
shared memory buffer representation.
|
||||
|
||||
OP-TEE device enumeration
|
||||
-------------------------
|
||||
|
||||
OP-TEE provides a pseudo Trusted Application: drivers/tee/optee/device.c in
|
||||
order to support device enumeration. In other words, OP-TEE driver invokes this
|
||||
application to retrieve a list of Trusted Applications which can be registered
|
||||
as devices on the TEE bus.
|
||||
|
||||
AMD-TEE driver
|
||||
==============
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user