tpm_ftpm_tee: register driver on TEE bus
authorMaxim Uvarov <maxim.uvarov@linaro.org>
Thu, 18 Jun 2020 13:52:51 +0000 (16:52 +0300)
committerJens Wiklander <jens.wiklander@linaro.org>
Fri, 10 Jul 2020 07:41:58 +0000 (09:41 +0200)
OP-TEE based fTPM Trusted Application depends on tee-supplicant to
provide NV RAM implementation based on RPMB secure storage. So this
dependency can be resolved via TEE bus where we only invoke fTPM
driver probe once fTPM device is registered on the bus which is only
true after the tee-supplicant is up and running. Additionally, TEE bus
provides auto device enumeration.

Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
Suggested-by: Sumit Garg <sumit.garg@linaro.org>
Suggested-by: Arnd Bergmann <arnd@linaro.org>
Reviewed-by: Sumit Garg <sumit.garg@linaro.org>
Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Tested-by: Sumit Garg <sumit.garg@linaro.org>
Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
drivers/char/tpm/tpm_ftpm_tee.c

index 22bf553..28da638 100644 (file)
@@ -214,11 +214,10 @@ static int ftpm_tee_match(struct tee_ioctl_version_data *ver, const void *data)
  * Return:
  *     On success, 0. On failure, -errno.
  */
-static int ftpm_tee_probe(struct platform_device *pdev)
+static int ftpm_tee_probe(struct device *dev)
 {
        int rc;
        struct tpm_chip *chip;
-       struct device *dev = &pdev->dev;
        struct ftpm_tee_private *pvt_data = NULL;
        struct tee_ioctl_open_session_arg sess_arg;
 
@@ -297,6 +296,13 @@ out_tee_session:
        return rc;
 }
 
+static int ftpm_plat_tee_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+
+       return ftpm_tee_probe(dev);
+}
+
 /**
  * ftpm_tee_remove() - remove the TPM device
  * @pdev: the platform_device description.
@@ -304,9 +310,9 @@ out_tee_session:
  * Return:
  *     0 always.
  */
-static int ftpm_tee_remove(struct platform_device *pdev)
+static int ftpm_tee_remove(struct device *dev)
 {
-       struct ftpm_tee_private *pvt_data = dev_get_drvdata(&pdev->dev);
+       struct ftpm_tee_private *pvt_data = dev_get_drvdata(dev);
 
        /* Release the chip */
        tpm_chip_unregister(pvt_data->chip);
@@ -328,11 +334,18 @@ static int ftpm_tee_remove(struct platform_device *pdev)
        return 0;
 }
 
+static int ftpm_plat_tee_remove(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+
+       return ftpm_tee_remove(dev);
+}
+
 /**
  * ftpm_tee_shutdown() - shutdown the TPM device
  * @pdev: the platform_device description.
  */
-static void ftpm_tee_shutdown(struct platform_device *pdev)
+static void ftpm_plat_tee_shutdown(struct platform_device *pdev)
 {
        struct ftpm_tee_private *pvt_data = dev_get_drvdata(&pdev->dev);
 
@@ -347,17 +360,54 @@ static const struct of_device_id of_ftpm_tee_ids[] = {
 };
 MODULE_DEVICE_TABLE(of, of_ftpm_tee_ids);
 
-static struct platform_driver ftpm_tee_driver = {
+static struct platform_driver ftpm_tee_plat_driver = {
        .driver = {
                .name = "ftpm-tee",
                .of_match_table = of_match_ptr(of_ftpm_tee_ids),
        },
-       .probe = ftpm_tee_probe,
-       .remove = ftpm_tee_remove,
-       .shutdown = ftpm_tee_shutdown,
+       .shutdown = ftpm_plat_tee_shutdown,
+       .probe = ftpm_plat_tee_probe,
+       .remove = ftpm_plat_tee_remove,
+};
+
+/* UUID of the fTPM TA */
+static const struct tee_client_device_id optee_ftpm_id_table[] = {
+       {UUID_INIT(0xbc50d971, 0xd4c9, 0x42c4,
+                  0x82, 0xcb, 0x34, 0x3f, 0xb7, 0xf3, 0x78, 0x96)},
+       {}
 };
 
-module_platform_driver(ftpm_tee_driver);
+MODULE_DEVICE_TABLE(tee, optee_ftpm_id_table);
+
+static struct tee_client_driver ftpm_tee_driver = {
+       .id_table       = optee_ftpm_id_table,
+       .driver         = {
+               .name           = "optee-ftpm",
+               .bus            = &tee_bus_type,
+               .probe          = ftpm_tee_probe,
+               .remove         = ftpm_tee_remove,
+       },
+};
+
+static int __init ftpm_mod_init(void)
+{
+       int rc;
+
+       rc = platform_driver_register(&ftpm_tee_plat_driver);
+       if (rc)
+               return rc;
+
+       return driver_register(&ftpm_tee_driver.driver);
+}
+
+static void __exit ftpm_mod_exit(void)
+{
+       platform_driver_unregister(&ftpm_tee_plat_driver);
+       driver_unregister(&ftpm_tee_driver.driver);
+}
+
+module_init(ftpm_mod_init);
+module_exit(ftpm_mod_exit);
 
 MODULE_AUTHOR("Thirupathaiah Annapureddy <thiruan@microsoft.com>");
 MODULE_DESCRIPTION("TPM Driver for fTPM TA in TEE");