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