summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWhi copybara merger <whitechapel-automerger@google.com>2021-12-14 02:47:23 -0800
committerCopybara-Service <copybara-worker@google.com>2022-01-18 08:28:03 -0800
commit77fc4c4466a4e439060ffd59625628cbe37e51d0 (patch)
tree170411b7d8d7a0b2a770ad1d26343bbe9b83536e
parentfe84380d608375c60f50696b8c97903a2f20fcd4 (diff)
downloadjaneiro-77fc4c4466a4e439060ffd59625628cbe37e51d0.tar.gz
[Copybara Auto Merge] Merge branch 'pro' into android13-gs-pixel-5.10
edgetpu: Set debug dump buffer in FW after handshake Bug: 176556808 edgetpu: move wakelock releasing to client put edgetpu: Remove dbg dump error msg to avoid flooding logs. GitOrigin-RevId: e501a10922cce20ddfa4c082fc942c828d6d860b Change-Id: I24d7dacfba9e420b2863dfb96e65cd6eb3262fb5
-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, 34 insertions, 30 deletions
diff --git a/drivers/edgetpu/edgetpu-core.c b/drivers/edgetpu/edgetpu-core.c
index 9bb84ac..b84d626 100644
--- a/drivers/edgetpu/edgetpu-core.c
+++ b/drivers/edgetpu/edgetpu-core.c
@@ -558,8 +558,10 @@ void edgetpu_client_put(struct edgetpu_client *client)
{
if (!client)
return;
- if (refcount_dec_and_test(&client->count))
+ if (refcount_dec_and_test(&client->count)) {
+ edgetpu_wakelock_free(client->wakelock);
kfree(client);
+ }
}
void edgetpu_client_remove(struct edgetpu_client *client)
@@ -594,13 +596,6 @@ 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 4539e87..d49649f 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 (!edgetpu_pm_get_if_powered(etdev->pm)) {
- etdev_warn(etdev, "Device not powered, skip debug dump");
- return -ENODEV;
+ if (type) {
+ dump_setup =
+ (struct edgetpu_debug_dump_setup *)etdev->debug_dump_mem.vaddr;
+ dump_setup->type = type;
+ } else {
+ init_fw_dump_buffer = true;
}
- 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);
+ etdev->debug_dump_mem.size, init_fw_dump_buffer);
etdev_dbg(etdev, "Sent debug dump request, tpu addr: %llx",
(u64)etdev->debug_dump_mem.tpu_addr);
if (ret)
- etdev_err(etdev, "KCI dump info req failed: %d", ret);
+ etdev_err(etdev, "Debug dump KCI req failed: %d", ret);
- edgetpu_pm_put(etdev->pm);
return ret;
}
@@ -120,10 +120,8 @@ 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) {
- etdev_err(etdev, "Debug dump memory not allocated");
+ if (!etdev->debug_dump_mem.vaddr)
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 6a30ef8..07e396a 100644
--- a/drivers/edgetpu/edgetpu-debug-dump.h
+++ b/drivers/edgetpu/edgetpu-debug-dump.h
@@ -85,6 +85,11 @@ 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 31f0f4c..c1dc554 100644
--- a/drivers/edgetpu/edgetpu-firmware.c
+++ b/drivers/edgetpu/edgetpu-firmware.c
@@ -16,6 +16,7 @@
#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"
@@ -171,6 +172,11 @@ 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 9339953..87b57f5 100644
--- a/drivers/edgetpu/edgetpu-kci.c
+++ b/drivers/edgetpu/edgetpu-kci.c
@@ -1005,13 +1005,14 @@ 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)
+ size_t size, bool init_buffer)
{
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 acdf31a..58e399e 100644
--- a/drivers/edgetpu/edgetpu-kci.h
+++ b/drivers/edgetpu/edgetpu-kci.h
@@ -363,9 +363,13 @@ 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 */
+/* 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.
+ */
int edgetpu_kci_get_debug_dump(struct edgetpu_kci *kci, tpu_addr_t tpu_addr,
- size_t size);
+ size_t size, bool init_buffer);
/*
* 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 2a6dbee..3b56bb1 100644
--- a/drivers/edgetpu/janeiro-pm.c
+++ b/drivers/edgetpu/janeiro-pm.c
@@ -21,8 +21,7 @@
#define SHUTDOWN_DELAY_US_MAX 20
#define BOOTUP_DELAY_US_MIN 200
#define BOOTUP_DELAY_US_MAX 250
-#define SHUTDOWN_MAX_DELAY_COUNT 1000
-#define SHUTDOWN_EXPECTED_DELAY_COUNT 50
+#define SHUTDOWN_MAX_DELAY_COUNT 50
#define EDGETPU_PSM0_CFG 0x1c1880
#define EDGETPU_PSM0_START 0x1c1884
@@ -108,11 +107,7 @@ 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 (%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);
+ etdev_warn(etdev, "%s: blk_shutdown timeout\n", __func__);
}
static void janeiro_firmware_down(struct edgetpu_dev *etdev)