summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNrithya Kanakasabapathy <nrithya@google.com>2022-01-20 22:47:31 +0000
committerNrithya Kanakasabapathy <nrithya@google.com>2022-01-20 22:52:12 +0000
commitb0ec1e39addf8d80d91741c8289f9631c0cbbef7 (patch)
tree4c6af256ee2089e55d4db5daa683818936bf357a
parent77fc4c4466a4e439060ffd59625628cbe37e51d0 (diff)
downloadjaneiro-b0ec1e39addf8d80d91741c8289f9631c0cbbef7.tar.gz
Revert "[Copybara Auto Merge] Merge branch 'pro' into android13-gs-pixel-5.10"
This reverts commit 77fc4c4466a4e439060ffd59625628cbe37e51d0. Reason for revert: b/215599630 Change-Id: I1d5a212c269729d28e2d777fd003af455cd8f4f2
-rw-r--r--drivers/edgetpu/edgetpu-core.c11
-rw-r--r--drivers/edgetpu/edgetpu-debug-dump.c22
-rw-r--r--drivers/edgetpu/edgetpu-debug-dump.h5
-rw-r--r--drivers/edgetpu/edgetpu-firmware.c6
-rw-r--r--drivers/edgetpu/edgetpu-kci.c3
-rw-r--r--drivers/edgetpu/edgetpu-kci.h8
-rw-r--r--drivers/edgetpu/janeiro-pm.c9
7 files changed, 30 insertions, 34 deletions
diff --git a/drivers/edgetpu/edgetpu-core.c b/drivers/edgetpu/edgetpu-core.c
index b84d626..9bb84ac 100644
--- a/drivers/edgetpu/edgetpu-core.c
+++ b/drivers/edgetpu/edgetpu-core.c
@@ -558,10 +558,8 @@ void edgetpu_client_put(struct edgetpu_client *client)
{
if (!client)
return;
- if (refcount_dec_and_test(&client->count)) {
- edgetpu_wakelock_free(client->wakelock);
+ if (refcount_dec_and_test(&client->count))
kfree(client);
- }
}
void edgetpu_client_remove(struct edgetpu_client *client)
@@ -596,6 +594,13 @@ void edgetpu_client_remove(struct edgetpu_client *client)
edgetpu_device_group_leave(client);
/* invoke chip-dependent removal handler before releasing resources */
edgetpu_chip_client_remove(client);
+ edgetpu_wakelock_free(client->wakelock);
+ /*
+ * It should be impossible to access client->wakelock after this cleanup
+ * procedure. Set to NULL to cause kernel panic if use-after-free does
+ * happen.
+ */
+ client->wakelock = NULL;
/* Clean up all the per die event fds registered by the client */
if (client->perdie_events &
diff --git a/drivers/edgetpu/edgetpu-debug-dump.c b/drivers/edgetpu/edgetpu-debug-dump.c
index d49649f..4539e87 100644
--- a/drivers/edgetpu/edgetpu-debug-dump.c
+++ b/drivers/edgetpu/edgetpu-debug-dump.c
@@ -49,29 +49,29 @@ int edgetpu_get_debug_dump(struct edgetpu_dev *etdev, u64 type)
{
int ret;
struct edgetpu_debug_dump_setup *dump_setup;
- bool init_fw_dump_buffer = false;
if (!etdev->debug_dump_mem.vaddr) {
etdev_err(etdev, "Debug dump not allocated");
return -EINVAL;
}
- if (type) {
- dump_setup =
- (struct edgetpu_debug_dump_setup *)etdev->debug_dump_mem.vaddr;
- dump_setup->type = type;
- } else {
- init_fw_dump_buffer = true;
+ if (!edgetpu_pm_get_if_powered(etdev->pm)) {
+ etdev_warn(etdev, "Device not powered, skip debug dump");
+ return -ENODEV;
}
+ dump_setup =
+ (struct edgetpu_debug_dump_setup *)etdev->debug_dump_mem.vaddr;
+ dump_setup->type = type;
/* Signal the type of dump and buffer address to firmware */
ret = edgetpu_kci_get_debug_dump(etdev->kci,
etdev->debug_dump_mem.tpu_addr,
- etdev->debug_dump_mem.size, init_fw_dump_buffer);
+ etdev->debug_dump_mem.size);
etdev_dbg(etdev, "Sent debug dump request, tpu addr: %llx",
(u64)etdev->debug_dump_mem.tpu_addr);
if (ret)
- etdev_err(etdev, "Debug dump KCI req failed: %d", ret);
+ etdev_err(etdev, "KCI dump info req failed: %d", ret);
+ edgetpu_pm_put(etdev->pm);
return ret;
}
@@ -120,8 +120,10 @@ void edgetpu_debug_dump_resp_handler(struct edgetpu_dev *etdev)
struct edgetpu_debug_dump_setup *dump_setup;
struct edgetpu_debug_dump *debug_dump;
- if (!etdev->debug_dump_mem.vaddr)
+ if (!etdev->debug_dump_mem.vaddr) {
+ etdev_err(etdev, "Debug dump memory not allocated");
return;
+ }
dump_setup =
(struct edgetpu_debug_dump_setup *)etdev->debug_dump_mem.vaddr;
debug_dump = (struct edgetpu_debug_dump *)(dump_setup + 1);
diff --git a/drivers/edgetpu/edgetpu-debug-dump.h b/drivers/edgetpu/edgetpu-debug-dump.h
index 07e396a..6a30ef8 100644
--- a/drivers/edgetpu/edgetpu-debug-dump.h
+++ b/drivers/edgetpu/edgetpu-debug-dump.h
@@ -85,11 +85,6 @@ void edgetpu_debug_dump_exit(struct edgetpu_dev *etdev);
/*
* Send KCI request to get fw debug dump segments.
- *
- * This function can be called with @type set to 0 to simply set the dump buffer address and size
- * in the FW without dumping any segments.
- *
- * The caller must ensure that the device is powered on.
*/
int edgetpu_get_debug_dump(struct edgetpu_dev *etdev,
u64 type);
diff --git a/drivers/edgetpu/edgetpu-firmware.c b/drivers/edgetpu/edgetpu-firmware.c
index c1dc554..31f0f4c 100644
--- a/drivers/edgetpu/edgetpu-firmware.c
+++ b/drivers/edgetpu/edgetpu-firmware.c
@@ -16,7 +16,6 @@
#include <linux/types.h>
#include "edgetpu.h"
-#include "edgetpu-debug-dump.h"
#include "edgetpu-device-group.h"
#include "edgetpu-firmware.h"
#include "edgetpu-firmware-util.h"
@@ -172,11 +171,6 @@ static int edgetpu_firmware_handshake(struct edgetpu_firmware *et_fw)
if (ret)
etdev_warn(etdev, "telemetry KCI error: %d", ret);
- /* Set debug dump buffer in FW */
- ret = edgetpu_get_debug_dump(etdev, 0);
-
- if (ret)
- etdev_err(etdev, "failed to set dump buffer in FW error: %d", ret);
}
return 0;
}
diff --git a/drivers/edgetpu/edgetpu-kci.c b/drivers/edgetpu/edgetpu-kci.c
index 87b57f5..9339953 100644
--- a/drivers/edgetpu/edgetpu-kci.c
+++ b/drivers/edgetpu/edgetpu-kci.c
@@ -1005,14 +1005,13 @@ int edgetpu_kci_shutdown(struct edgetpu_kci *kci)
}
int edgetpu_kci_get_debug_dump(struct edgetpu_kci *kci, tpu_addr_t tpu_addr,
- size_t size, bool init_buffer)
+ size_t size)
{
struct edgetpu_command_element cmd = {
.code = KCI_CODE_GET_DEBUG_DUMP,
.dma = {
.address = tpu_addr,
.size = size,
- .flags = init_buffer,
},
};
diff --git a/drivers/edgetpu/edgetpu-kci.h b/drivers/edgetpu/edgetpu-kci.h
index 58e399e..acdf31a 100644
--- a/drivers/edgetpu/edgetpu-kci.h
+++ b/drivers/edgetpu/edgetpu-kci.h
@@ -363,13 +363,9 @@ void edgetpu_kci_mappings_show(struct edgetpu_dev *etdev, struct seq_file *s);
/* Send shutdown request to firmware */
int edgetpu_kci_shutdown(struct edgetpu_kci *kci);
-/* Request dump of inaccessible segments from firmware.
- *
- * @init_buffer flag is used to indicate that the req is only sent to set the dump buffer address
- * and size in FW.
- */
+/* Request dump of inaccessible segments from firmware */
int edgetpu_kci_get_debug_dump(struct edgetpu_kci *kci, tpu_addr_t tpu_addr,
- size_t size, bool init_buffer);
+ size_t size);
/*
* Inform the firmware to prepare to serve the VII of @mailbox_id.
diff --git a/drivers/edgetpu/janeiro-pm.c b/drivers/edgetpu/janeiro-pm.c
index 3b56bb1..2a6dbee 100644
--- a/drivers/edgetpu/janeiro-pm.c
+++ b/drivers/edgetpu/janeiro-pm.c
@@ -21,7 +21,8 @@
#define SHUTDOWN_DELAY_US_MAX 20
#define BOOTUP_DELAY_US_MIN 200
#define BOOTUP_DELAY_US_MAX 250
-#define SHUTDOWN_MAX_DELAY_COUNT 50
+#define SHUTDOWN_MAX_DELAY_COUNT 1000
+#define SHUTDOWN_EXPECTED_DELAY_COUNT 50
#define EDGETPU_PSM0_CFG 0x1c1880
#define EDGETPU_PSM0_START 0x1c1884
@@ -107,7 +108,11 @@ static void janeiro_block_down(struct edgetpu_dev *etdev)
timeout_cnt++;
} while (timeout_cnt < SHUTDOWN_MAX_DELAY_COUNT);
if (timeout_cnt == SHUTDOWN_MAX_DELAY_COUNT)
- etdev_warn(etdev, "%s: blk_shutdown timeout\n", __func__);
+ etdev_warn(etdev, "%s: blk_shutdown timeout (%d uS) exceeded\n", __func__,
+ SHUTDOWN_MAX_DELAY_COUNT * SHUTDOWN_DELAY_US_MAX);
+ else if (timeout_cnt > SHUTDOWN_EXPECTED_DELAY_COUNT)
+ etdev_info(etdev, "%s: excessive shutdown time (%d uS)", __func__,
+ timeout_cnt * SHUTDOWN_DELAY_US_MAX);
}
static void janeiro_firmware_down(struct edgetpu_dev *etdev)