| .. 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); |