diff options
author | Nrithya Kanakasabapathy <nrithya@google.com> | 2022-01-20 22:47:31 +0000 |
---|---|---|
committer | Nrithya Kanakasabapathy <nrithya@google.com> | 2022-01-20 22:52:12 +0000 |
commit | b0ec1e39addf8d80d91741c8289f9631c0cbbef7 (patch) | |
tree | 4c6af256ee2089e55d4db5daa683818936bf357a | |
parent | 77fc4c4466a4e439060ffd59625628cbe37e51d0 (diff) | |
download | janeiro-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.c | 11 | ||||
-rw-r--r-- | drivers/edgetpu/edgetpu-debug-dump.c | 22 | ||||
-rw-r--r-- | drivers/edgetpu/edgetpu-debug-dump.h | 5 | ||||
-rw-r--r-- | drivers/edgetpu/edgetpu-firmware.c | 6 | ||||
-rw-r--r-- | drivers/edgetpu/edgetpu-kci.c | 3 | ||||
-rw-r--r-- | drivers/edgetpu/edgetpu-kci.h | 8 | ||||
-rw-r--r-- | drivers/edgetpu/janeiro-pm.c | 9 |
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) |