diff options
Diffstat (limited to 'drivers/edgetpu/edgetpu-mobile-platform.c')
-rw-r--r-- | drivers/edgetpu/edgetpu-mobile-platform.c | 41 |
1 files changed, 38 insertions, 3 deletions
diff --git a/drivers/edgetpu/edgetpu-mobile-platform.c b/drivers/edgetpu/edgetpu-mobile-platform.c index af6bcb7..979c109 100644 --- a/drivers/edgetpu/edgetpu-mobile-platform.c +++ b/drivers/edgetpu/edgetpu-mobile-platform.c @@ -22,6 +22,8 @@ #include "mobile-firmware.h" #include "mobile-pm.h" +static struct edgetpu_dev *edgetpu_debug_pointer; + /* * Log and trace buffers at the beginning of the remapped region, * pool memory afterwards. @@ -157,7 +159,7 @@ int edgetpu_chip_acquire_ext_mailbox(struct edgetpu_client *client, mutex_unlock(&etmdev->tz_mailbox_lock); return -EBUSY; } - ret = edgetpu_mailbox_enable_ext(client, EDGETPU_TZ_MAILBOX_ID, NULL); + ret = edgetpu_mailbox_enable_ext(client, EDGETPU_TZ_MAILBOX_ID, NULL, 0); if (!ret) etmdev->secure_client = client; mutex_unlock(&etmdev->tz_mailbox_lock); @@ -220,6 +222,20 @@ void edgetpu_chip_remove_mmu(struct edgetpu_dev *etdev) edgetpu_mmu_detach(etdev); } +static void edgetpu_platform_parse_pmu(struct edgetpu_mobile_platform_dev *etmdev) +{ + struct edgetpu_dev *etdev = &etmdev->edgetpu_dev; + struct device *dev = etdev->dev; + u32 reg; + + if (of_find_property(dev->of_node, "pmu-status-base", NULL) && + !of_property_read_u32_index(dev->of_node, "pmu-status-base", 0, ®)) { + etmdev->pmu_status = devm_ioremap(dev, reg, 0x4); + if (!etmdev->pmu_status) + etdev_info(etdev, "Using ACPM for blk status query\n"); + } +} + static int edgetpu_platform_parse_ssmt(struct edgetpu_mobile_platform_dev *etmdev) { struct edgetpu_dev *etdev = &etmdev->edgetpu_dev; @@ -311,6 +327,17 @@ edgetpu_mobile_platform_set_fw_ctx_memory(struct edgetpu_mobile_platform_dev *et return 0; } +static inline const char *get_driver_commit(void) +{ +#if IS_ENABLED(CONFIG_MODULE_SCMVERSION) + return THIS_MODULE->scmversion ?: "scmversion missing"; +#elif defined(GIT_REPO_TAG) + return GIT_REPO_TAG; +#else + return "Unknown"; +#endif +} + static int edgetpu_mobile_platform_probe(struct platform_device *pdev, struct edgetpu_mobile_platform_dev *etmdev) { @@ -397,6 +424,8 @@ static int edgetpu_mobile_platform_probe(struct platform_device *pdev, if (ret) dev_warn(dev, "SSMT setup failed (%d). Context isolation not enforced", ret); + edgetpu_platform_parse_pmu(etmdev); + etmdev->log_mem = devm_kcalloc(dev, etdev->num_cores, sizeof(*etmdev->log_mem), GFP_KERNEL); if (!etmdev->log_mem) { ret = -ENOMEM; @@ -434,10 +463,13 @@ static int edgetpu_mobile_platform_probe(struct platform_device *pdev, } } - dev_info(dev, "%s edgetpu initialized. Build: %s", etdev->dev_name, GIT_REPO_TAG); + dev_info(dev, "%s edgetpu initialized. Build: %s", etdev->dev_name, get_driver_commit()); + /* Turn the device off unless a client request is already received. */ edgetpu_pm_shutdown(etdev, false); + edgetpu_debug_pointer = etdev; + return 0; out_destroy_fw: edgetpu_mobile_firmware_destroy(etdev); @@ -473,6 +505,9 @@ static int edgetpu_mobile_platform_remove(struct platform_device *pdev) edgetpu_platform_cleanup_fw_region(etmdev); edgetpu_pm_put(etdev->pm); edgetpu_pm_shutdown(etdev, true); - mobile_pm_destroy(etdev); + edgetpu_mobile_pm_destroy(etdev); + + edgetpu_debug_pointer = NULL; + return 0; } |