summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErick Reyes <erickreyes@google.com>2020-08-18 12:51:00 -0700
committerErick Reyes <erickreyes@google.com>2020-08-18 13:14:52 -0700
commit569210b9d2ca684fac2cbb3856eefad6cc8a9e35 (patch)
tree228cf15ad7ba68a73bd807faa8c39456e2d78de9
parent1abb315a440d0cbeadb8fd4ccaa3a7e24f46c88b (diff)
downloadabrolhos-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.c7
-rw-r--r--drivers/edgetpu/abrolhos-platform.c6
-rw-r--r--drivers/edgetpu/abrolhos-pm.c27
-rw-r--r--drivers/edgetpu/edgetpu-firmware.c3
-rw-r--r--drivers/edgetpu/edgetpu-iremap-pool.c2
-rw-r--r--drivers/edgetpu/edgetpu-pm.c6
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);
}