diff options
author | Whi copybara merger <whitechapel-automerger@google.com> | 2021-12-14 02:47:23 -0800 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2022-01-18 08:28:03 -0800 |
commit | 77fc4c4466a4e439060ffd59625628cbe37e51d0 (patch) | |
tree | 170411b7d8d7a0b2a770ad1d26343bbe9b83536e | |
parent | fe84380d608375c60f50696b8c97903a2f20fcd4 (diff) | |
download | janeiro-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.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, 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) |