diff options
author | Erick Reyes <erickreyes@google.com> | 2020-08-18 12:51:00 -0700 |
---|---|---|
committer | Erick Reyes <erickreyes@google.com> | 2020-08-18 13:14:52 -0700 |
commit | 569210b9d2ca684fac2cbb3856eefad6cc8a9e35 (patch) | |
tree | 228cf15ad7ba68a73bd807faa8c39456e2d78de9 | |
parent | 1abb315a440d0cbeadb8fd4ccaa3a7e24f46c88b (diff) | |
download | abrolhos-569210b9d2ca684fac2cbb3856eefad6cc8a9e35.tar.gz |
Merge branch 'whitechapel' into android-gs-pixel-4.19
* whitechapel:
edgetpu: abrolhos: fix power-down sequence on rmmod
edgetpu: abrolhos: fix default power state
edgetpu: fix compile error on missing pr_warn on x86
Bug: 159626862
Bug: 164127181
Signed-off-by: Erick Reyes <erickreyes@google.com>
Change-Id: Iec69e9615ecbb9b43d90ca1a58013cf2915cc2ac
-rw-r--r-- | drivers/edgetpu/abrolhos-firmware.c | 7 | ||||
-rw-r--r-- | drivers/edgetpu/abrolhos-platform.c | 6 | ||||
-rw-r--r-- | drivers/edgetpu/abrolhos-pm.c | 27 | ||||
-rw-r--r-- | drivers/edgetpu/edgetpu-firmware.c | 3 | ||||
-rw-r--r-- | drivers/edgetpu/edgetpu-iremap-pool.c | 2 | ||||
-rw-r--r-- | drivers/edgetpu/edgetpu-pm.c | 6 |
6 files changed, 28 insertions, 23 deletions
diff --git a/drivers/edgetpu/abrolhos-firmware.c b/drivers/edgetpu/abrolhos-firmware.c index aaa1c80..c4c267f 100644 --- a/drivers/edgetpu/abrolhos-firmware.c +++ b/drivers/edgetpu/abrolhos-firmware.c @@ -24,12 +24,6 @@ static void r52_reset(struct edgetpu_dev *etdev, u64 val) edgetpu_dev_write_64(etdev, EDGETPU_REG_RESET_CONTROL, val); } -static void abrolhos_firmware_before_destroy( - struct edgetpu_firmware *et_fw) -{ - r52_reset(et_fw->etdev, 1); -} - static int abrolhos_firmware_alloc_buffer( struct edgetpu_firmware *et_fw, struct edgetpu_firmware_buffer *fw_buf) @@ -99,7 +93,6 @@ static int abrolhos_firmware_prepare_run(struct edgetpu_firmware *et_fw, } static const struct edgetpu_firmware_handlers abrolhos_firmware_handlers = { - .before_destroy = abrolhos_firmware_before_destroy, .alloc_buffer = abrolhos_firmware_alloc_buffer, .free_buffer = abrolhos_firmware_free_buffer, .setup_buffer = abrolhos_firmware_setup_buffer, diff --git a/drivers/edgetpu/abrolhos-platform.c b/drivers/edgetpu/abrolhos-platform.c index 4e04623..a1c9a59 100644 --- a/drivers/edgetpu/abrolhos-platform.c +++ b/drivers/edgetpu/abrolhos-platform.c @@ -312,14 +312,18 @@ static int edgetpu_platform_remove(struct platform_device *pdev) struct edgetpu_dev *etdev = platform_get_drvdata(pdev); struct edgetpu_platform_dev *edgetpu_pdev = container_of( etdev, struct edgetpu_platform_dev, edgetpu_dev); - edgetpu_pm_shutdown(etdev); + abrolhos_edgetpu_firmware_destroy(etdev); if (edgetpu_pdev->irq >= 0) edgetpu_unregister_irq(etdev, edgetpu_pdev->irq); + + edgetpu_pm_get(etdev->pm); edgetpu_telemetry_exit(etdev); edgetpu_iremap_pool_destroy(etdev); edgetpu_platform_cleanup_fw_region(edgetpu_pdev); edgetpu_device_remove(etdev); + edgetpu_pm_put(etdev->pm); + edgetpu_pm_shutdown(etdev); abrolhos_pm_destroy(etdev); return 0; } diff --git a/drivers/edgetpu/abrolhos-pm.c b/drivers/edgetpu/abrolhos-pm.c index a408a99..a895060 100644 --- a/drivers/edgetpu/abrolhos-pm.c +++ b/drivers/edgetpu/abrolhos-pm.c @@ -19,9 +19,7 @@ #include "edgetpu-pm.h" /* Default power state: the lowest power state that keeps firmware running */ -// static int power_state = TPU_DEEP_SLEEP_CLOCKS_SLOW; -// TODO: switch back to the correct power state once b/160361784 is fixed -static int power_state = TPU_ACTIVE_NOM; +static int power_state = TPU_DEEP_SLEEP_CLOCKS_SLOW; module_param(power_state, int, 0660); @@ -82,14 +80,11 @@ static int abrolhos_pwr_state_set(void *data, u64 val) } if (curr_state != TPU_OFF && val == TPU_OFF) { - curr_state = exynos_acpm_get_rate(TPU_ACPM_DOMAIN, 0); - if (curr_state <= TPU_DEEP_SLEEP_CLOCKS_FAST) { - ret = pm_runtime_put_sync(dev); - if (ret) { - dev_err(dev, "%s: pm_runtime_put_sync returned %d\n", - __func__, ret); - return ret; - } + ret = pm_runtime_put_sync(dev); + if (ret) { + dev_err(dev, "%s: pm_runtime_put_sync returned %d\n", + __func__, ret); + return ret; } } @@ -383,6 +378,9 @@ static int abrolhos_power_up(struct edgetpu_pm *etpm) edgetpu_mailbox_reset_vii(etdev->mailbox_manager); } + if (!etdev->firmware) + return 0; + switch (edgetpu_firmware_status_locked(etdev)) { case FW_VALID: ret = edgetpu_firmware_restart_locked(etdev); @@ -409,6 +407,13 @@ static void abrolhos_power_down(struct edgetpu_pm *etpm) struct edgetpu_platform_dev *edgetpu_pdev = container_of( etpm->etdev, struct edgetpu_platform_dev, edgetpu_dev); int res; + int curr_state; + + curr_state = exynos_acpm_get_rate(TPU_ACPM_DOMAIN, 0); + + /* We don't need to do anything if the block is already off */ + if (curr_state == TPU_OFF) + return; if (etpm->etdev->kci && edgetpu_firmware_status_locked(etpm->etdev) == FW_VALID) { diff --git a/drivers/edgetpu/edgetpu-firmware.c b/drivers/edgetpu/edgetpu-firmware.c index e4f3eaa..01bb214 100644 --- a/drivers/edgetpu/edgetpu-firmware.c +++ b/drivers/edgetpu/edgetpu-firmware.c @@ -351,14 +351,13 @@ int edgetpu_firmware_lock(struct edgetpu_dev *etdev) { struct edgetpu_firmware *et_fw = etdev->firmware; - mutex_lock(&et_fw->p->fw_desc_lock); if (!et_fw) { etdev_err( etdev, "Cannot load firmware when no loader is available\n"); - mutex_unlock(&et_fw->p->fw_desc_lock); return -EINVAL; } + mutex_lock(&et_fw->p->fw_desc_lock); /* Disallow group join while loading, fail if already joined */ if (!edgetpu_set_group_join_lockout(etdev, true)) { diff --git a/drivers/edgetpu/edgetpu-iremap-pool.c b/drivers/edgetpu/edgetpu-iremap-pool.c index c5c4914..fa2800a 100644 --- a/drivers/edgetpu/edgetpu-iremap-pool.c +++ b/drivers/edgetpu/edgetpu-iremap-pool.c @@ -6,6 +6,8 @@ * Copyright (C) 2020 Google, Inc. */ +#include <linux/printk.h> + #ifdef CONFIG_X86 #include <asm/set_memory.h> #endif diff --git a/drivers/edgetpu/edgetpu-pm.c b/drivers/edgetpu/edgetpu-pm.c index 8e38f5d..8a9ef6b 100644 --- a/drivers/edgetpu/edgetpu-pm.c +++ b/drivers/edgetpu/edgetpu-pm.c @@ -108,12 +108,14 @@ void edgetpu_pm_shutdown(struct edgetpu_dev *etdev) if (!etpm) return; - edgetpu_firmware_lock(etdev); + if (etdev->firmware) + edgetpu_firmware_lock(etdev); if (etpm->p->power_up_count) { etdev_warn(etdev, "Leaving %d clients behind!\n", etpm->p->power_up_count); } if (etpm->p->handlers && etpm->p->handlers->power_down) etpm->p->handlers->power_down(etpm); - edgetpu_firmware_unlock(etdev); + if (etdev->firmware) + edgetpu_firmware_unlock(etdev); } |