summaryrefslogtreecommitdiff
path: root/drivers/edgetpu/edgetpu-kci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/edgetpu/edgetpu-kci.c')
-rw-r--r--drivers/edgetpu/edgetpu-kci.c42
1 files changed, 29 insertions, 13 deletions
diff --git a/drivers/edgetpu/edgetpu-kci.c b/drivers/edgetpu/edgetpu-kci.c
index ed9b9e2..77c56f9 100644
--- a/drivers/edgetpu/edgetpu-kci.c
+++ b/drivers/edgetpu/edgetpu-kci.c
@@ -15,6 +15,7 @@
#include <linux/slab.h>
#include <linux/string.h> /* memcpy */
+#include <gcip/gcip-pm.h>
#include <gcip/gcip-telemetry.h>
#include "edgetpu-firmware.h"
@@ -440,8 +441,9 @@ int edgetpu_kci_update_usage(struct edgetpu_dev *etdev)
int ret = -EAGAIN;
/* Quick return if device is already powered down. */
- if (!edgetpu_is_powered(etdev))
+ if (!gcip_pm_is_powered(etdev->pm))
return -EAGAIN;
+
/*
* Lockout change in f/w load/unload status during usage update.
* Skip usage update if the firmware is being updated now or is not
@@ -452,17 +454,12 @@ int edgetpu_kci_update_usage(struct edgetpu_dev *etdev)
if (edgetpu_firmware_status_locked(etdev) != GCIP_FW_VALID)
goto fw_unlock;
- /*
- * This function may run in a worker that is being canceled when the
- * device is powering down, and the power down code holds the PM lock.
- * Using trylock to prevent cancel_work_sync() waiting forever.
- */
- if (!edgetpu_pm_trylock(etdev->pm))
+
+ if (gcip_pm_get_if_powered(etdev->pm, false))
goto fw_unlock;
- if (edgetpu_is_powered(etdev))
- ret = edgetpu_kci_update_usage_locked(etdev);
- edgetpu_pm_unlock(etdev->pm);
+ ret = edgetpu_kci_update_usage_locked(etdev);
+ gcip_pm_put_async(etdev->pm);
fw_unlock:
edgetpu_firmware_unlock(etdev);
@@ -636,18 +633,37 @@ int edgetpu_kci_block_bus_speed_control(struct edgetpu_dev *etdev, bool block)
return gcip_kci_send_cmd(etdev->etkci->kci, &cmd);
}
-int edgetpu_kci_thermal_control(struct edgetpu_dev *etdev, bool enable)
+int edgetpu_kci_firmware_tracing_level(void *data, unsigned long level, unsigned long *active_level)
{
+ struct edgetpu_dev *etdev = data;
struct gcip_kci_command_element cmd = {
- .code = GCIP_KCI_CODE_THERMAL_CONTROL,
+ .code = GCIP_KCI_CODE_FIRMWARE_TRACING_LEVEL,
.dma = {
- .flags = (u32)enable,
+ .flags = (u32)level,
},
};
+ struct gcip_kci_response_element resp;
+ int ret;
if (!etdev->etkci)
return -ENODEV;
+ ret = gcip_kci_send_cmd_return_resp(etdev->etkci->kci, &cmd, &resp);
+ if (ret == GCIP_KCI_ERROR_OK)
+ *active_level = resp.retval;
+
+ return ret;
+}
+
+int edgetpu_kci_thermal_control(struct edgetpu_dev *etdev, bool enable)
+{
+ struct gcip_kci_command_element cmd = {
+ .code = GCIP_KCI_CODE_THERMAL_CONTROL,
+ .dma = {
+ .flags = (u32)enable,
+ },
+ };
+
return gcip_kci_send_cmd(etdev->etkci->kci, &cmd);
}