summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuma copybara merger <zuma-automerger@google.com>2022-12-01 14:22:45 +0800
committerCopybara-Service <copybara-worker@google.com>2022-12-01 19:01:30 -0800
commit281d60c6af15345f0b4b19174cbbc5bd853d498c (patch)
tree7979fb75b469771fec124350e288c72bf5ac0e62
parent6d4c0dabf332947d505368ae5aef2ca2e2768416 (diff)
downloadrio-281d60c6af15345f0b4b19174cbbc5bd853d498c.tar.gz
[Copybara Auto Merge] Merge branch zuma into android13-gs-pixel-5.15
edgetpu: Use thermal throttling KCI instead of set_policy Bug: 258427511 edgetpu: Add a static debug pointer to driver state Bug: 260768055 Signed-off-by: Zuma copybara merger <zuma-automerger@google.com> GitOrigin-RevId: aaa7370d2eb6b4505495736b461a21736d449b59 Change-Id: Ib14b0b31209169197c2f507b82c55cf5f1e2825d
-rw-r--r--drivers/edgetpu/edgetpu-firmware.c7
-rw-r--r--drivers/edgetpu/edgetpu-mobile-platform.c7
-rw-r--r--drivers/edgetpu/edgetpu-soc.h3
-rw-r--r--drivers/edgetpu/edgetpu-thermal.h7
-rw-r--r--drivers/edgetpu/mobile-pm.c3
-rw-r--r--drivers/edgetpu/mobile-soc-gsx01.c5
-rw-r--r--drivers/edgetpu/mobile-thermal.c45
7 files changed, 45 insertions, 32 deletions
diff --git a/drivers/edgetpu/edgetpu-firmware.c b/drivers/edgetpu/edgetpu-firmware.c
index fc26c2f..4d5d853 100644
--- a/drivers/edgetpu/edgetpu-firmware.c
+++ b/drivers/edgetpu/edgetpu-firmware.c
@@ -176,6 +176,13 @@ static int edgetpu_firmware_handshake(struct edgetpu_firmware *et_fw)
ret = edgetpu_telemetry_kci(etdev);
if (ret)
etdev_warn(etdev, "telemetry KCI error: %d", ret);
+
+ if (etdev->thermal->cooling_state) {
+ ret = edgetpu_thermal_resume(etdev->dev);
+ if (ret)
+ etdev_warn(etdev, "Thermal resume error: %d", ret);
+ }
+
/* Set debug dump buffer in FW */
edgetpu_get_debug_dump(etdev, 0);
return 0;
diff --git a/drivers/edgetpu/edgetpu-mobile-platform.c b/drivers/edgetpu/edgetpu-mobile-platform.c
index 3ee70af..3c7e302 100644
--- a/drivers/edgetpu/edgetpu-mobile-platform.c
+++ b/drivers/edgetpu/edgetpu-mobile-platform.c
@@ -23,6 +23,8 @@
#include "mobile-firmware.h"
#include "mobile-pm.h"
+static struct edgetpu_dev *edgetpu_debug_pointer;
+
static void set_telemetry_mem(struct edgetpu_mobile_platform_dev *etmdev,
enum gcip_telemetry_type type, struct edgetpu_coherent_mem *mem)
{
@@ -426,6 +428,8 @@ static int edgetpu_mobile_platform_probe(struct platform_device *pdev,
/* 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);
@@ -460,5 +464,8 @@ static int edgetpu_mobile_platform_remove(struct platform_device *pdev)
edgetpu_pm_put(etdev->pm);
edgetpu_pm_shutdown(etdev, true);
edgetpu_mobile_pm_destroy(etdev);
+
+ edgetpu_debug_pointer = NULL;
+
return 0;
}
diff --git a/drivers/edgetpu/edgetpu-soc.h b/drivers/edgetpu/edgetpu-soc.h
index 53d06d2..98b1f3d 100644
--- a/drivers/edgetpu/edgetpu-soc.h
+++ b/drivers/edgetpu/edgetpu-soc.h
@@ -32,9 +32,6 @@ long edgetpu_soc_pm_get_rate(struct edgetpu_dev *etdev, int flags);
/* Power management set TPU clock rate */
int edgetpu_soc_pm_set_rate(unsigned long rate);
-/* Set PM policy */
-int edgetpu_soc_pm_set_policy(u64 val);
-
/* Power down */
void edgetpu_soc_pm_power_down(struct edgetpu_dev *etdev);
diff --git a/drivers/edgetpu/edgetpu-thermal.h b/drivers/edgetpu/edgetpu-thermal.h
index dbd283f..bcfed04 100644
--- a/drivers/edgetpu/edgetpu-thermal.h
+++ b/drivers/edgetpu/edgetpu-thermal.h
@@ -56,6 +56,13 @@ int edgetpu_thermal_suspend(struct device *dev);
int edgetpu_thermal_resume(struct device *dev);
/*
+ * Sends the thermal throttling KCI if the device is powered.
+ *
+ * Returns the return value of KCI if the device is powered, otherwise 0.
+ */
+int edgetpu_thermal_kci_if_powered(struct edgetpu_dev *etdev, u32 state);
+
+/*
* Holds thermal->lock.
*
* Does nothing if the thermal management is not supported.
diff --git a/drivers/edgetpu/mobile-pm.c b/drivers/edgetpu/mobile-pm.c
index 9a6a21e..aaf6a2f 100644
--- a/drivers/edgetpu/mobile-pm.c
+++ b/drivers/edgetpu/mobile-pm.c
@@ -18,6 +18,7 @@
#include "edgetpu-mailbox.h"
#include "edgetpu-mobile-platform.h"
#include "edgetpu-pm.h"
+#include "edgetpu-thermal.h"
#include "mobile-firmware.h"
#include "mobile-pm.h"
@@ -148,7 +149,7 @@ static int mobile_pwr_policy_set(void *data, u64 val)
int ret;
mutex_lock(&platform_pwr->policy_lock);
- ret = edgetpu_soc_pm_set_policy(val);
+ ret = edgetpu_thermal_kci_if_powered(etdev, val);
if (ret) {
dev_err(etmdev->edgetpu_dev.dev,
diff --git a/drivers/edgetpu/mobile-soc-gsx01.c b/drivers/edgetpu/mobile-soc-gsx01.c
index 104cf46..baefb33 100644
--- a/drivers/edgetpu/mobile-soc-gsx01.c
+++ b/drivers/edgetpu/mobile-soc-gsx01.c
@@ -358,11 +358,6 @@ int edgetpu_soc_pm_set_rate(unsigned long rate)
return -EOPNOTSUPP;
}
-int edgetpu_soc_pm_set_policy(u64 val)
-{
- return 0;
-}
-
static int edgetpu_core_rate_get(void *data, u64 *val)
{
struct edgetpu_dev *etdev = (typeof(etdev))data;
diff --git a/drivers/edgetpu/mobile-thermal.c b/drivers/edgetpu/mobile-thermal.c
index c8fb0a2..73b68d3 100644
--- a/drivers/edgetpu/mobile-thermal.c
+++ b/drivers/edgetpu/mobile-thermal.c
@@ -30,26 +30,6 @@
#define OF_DATA_NUM_MAX (MAX_NUM_TPU_STATES * 2)
static struct edgetpu_state_pwr state_pwr_map[MAX_NUM_TPU_STATES] = {0};
-/*
- * Sends the thermal throttling KCI if the device is powered.
- *
- * Returns the return value of KCI if the device is powered, otherwise 0.
- */
-static int edgetpu_thermal_kci_if_powered(struct edgetpu_dev *etdev, enum edgetpu_pwr_state state)
-{
- int ret = 0;
-
- if (edgetpu_pm_get_if_powered(etdev->pm)) {
- ret = edgetpu_kci_notify_throttling(etdev, state);
- if (ret)
- etdev_err_ratelimited(etdev,
- "Failed to notify FW about power state %u, error:%d",
- state, ret);
- edgetpu_pm_put(etdev->pm);
- }
- return ret;
-}
-
static int edgetpu_get_max_state(struct thermal_cooling_device *cdev, unsigned long *state)
{
struct edgetpu_thermal *thermal = cdev->devdata;
@@ -71,7 +51,7 @@ static int edgetpu_set_thermal_policy(struct edgetpu_dev *etdev, unsigned long p
if (edgetpu_is_powered(etdev))
edgetpu_kci_block_bus_speed_control(etdev, true);
- ret = edgetpu_soc_pm_set_policy(pwr_state);
+ ret = edgetpu_thermal_kci_if_powered(etdev, pwr_state);
if (edgetpu_is_powered(etdev))
edgetpu_kci_block_bus_speed_control(etdev, false);
@@ -140,7 +120,7 @@ static int edgetpu_get_cur_state(struct thermal_cooling_device *cdev, unsigned l
dev_warn(cooling->dev, "Unknown cooling state: %lu, resetting\n", *state);
mutex_lock(&cooling->lock);
- ret = edgetpu_soc_pm_set_policy(TPU_ACTIVE_NOM);
+ ret = edgetpu_thermal_kci_if_powered(cooling->etdev, TPU_ACTIVE_NOM);
if (ret) {
dev_err(cooling->dev, "error setting tpu policy: %d\n", ret);
mutex_unlock(&cooling->lock);
@@ -443,7 +423,11 @@ int edgetpu_thermal_resume(struct device *dev)
if (IS_ERR(cooling))
return PTR_ERR(cooling);
mutex_lock(&cooling->lock);
- ret = edgetpu_thermal_kci_if_powered(etdev, state_pwr_map[0].state);
+
+ if (cooling->cooling_state >= cooling->tpu_num_states)
+ cooling->cooling_state = 0;
+
+ ret = edgetpu_thermal_kci_if_powered(etdev, state_pwr_map[cooling->cooling_state].state);
/*
* Unlike edgetpu_thermal_suspend(), only set the device is resumed if the FW handled the
* KCI request.
@@ -453,3 +437,18 @@ int edgetpu_thermal_resume(struct device *dev)
mutex_unlock(&cooling->lock);
return ret;
}
+
+int edgetpu_thermal_kci_if_powered(struct edgetpu_dev *etdev, u32 state)
+{
+ int ret = 0;
+
+ if (edgetpu_pm_get_if_powered(etdev->pm)) {
+ ret = edgetpu_kci_notify_throttling(etdev, state);
+ if (ret)
+ etdev_err_ratelimited(etdev,
+ "Failed to notify FW about power state %u, error:%d",
+ state, ret);
+ edgetpu_pm_put(etdev->pm);
+ }
+ return ret;
+}