From a9092ff1d4ef3bfbd4291ac35137ee2f37beb28c Mon Sep 17 00:00:00 2001 From: Whi copybara merger Date: Mon, 7 Feb 2022 19:11:43 -0800 Subject: [Copybara Auto Merge] Merge branch 'pro' into android13-gs-pixel-5.10 edgeptu: janeiro: add suspend/resume ops Bug: 217585538 edgetpu: initialize telemetry buffer size Bug: 216696239 edgetpu: change err logging during fw dbg dump buffer init Bug: 216522017 edgetpu: janeiro: extend block shutdown time Bug: 214251686 edgetpu: janeiro: Return error on failed fw ctx initialization Bug: 202262532 edgetpu: Modify wdt ref count based on mailbox activation Bug: 213415021 edgetpu: fixup comment typos GitOrigin-RevId: 01a1a1d7d206ed162dcda643af56bf5d39cc0464 Change-Id: I871d0eb964a33b172cce9b05a468beb0e96428e6 --- drivers/edgetpu/edgetpu-debug-dump.c | 8 +++++-- drivers/edgetpu/edgetpu-device-group.c | 41 +++++++++++++++++++------------- drivers/edgetpu/edgetpu-firmware.c | 5 +--- drivers/edgetpu/edgetpu-telemetry.c | 1 + drivers/edgetpu/edgetpu-telemetry.h | 3 ++- drivers/edgetpu/janeiro-platform.c | 39 +++++++++++++++++++++++------- drivers/edgetpu/janeiro/config-mailbox.h | 2 +- 7 files changed, 66 insertions(+), 33 deletions(-) (limited to 'drivers') diff --git a/drivers/edgetpu/edgetpu-debug-dump.c b/drivers/edgetpu/edgetpu-debug-dump.c index d49649f..86928a6 100644 --- a/drivers/edgetpu/edgetpu-debug-dump.c +++ b/drivers/edgetpu/edgetpu-debug-dump.c @@ -52,7 +52,7 @@ int edgetpu_get_debug_dump(struct edgetpu_dev *etdev, u64 type) bool init_fw_dump_buffer = false; if (!etdev->debug_dump_mem.vaddr) { - etdev_err(etdev, "Debug dump not allocated"); + etdev_dbg(etdev, "Debug dump not allocated"); return -EINVAL; } @@ -69,8 +69,12 @@ int edgetpu_get_debug_dump(struct edgetpu_dev *etdev, u64 type) 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) + if (ret) { + if (init_fw_dump_buffer) + etdev_err(etdev, "failed to init dump buffer in FW"); + etdev_err(etdev, "Debug dump KCI req failed: %d", ret); + } return ret; } diff --git a/drivers/edgetpu/edgetpu-device-group.c b/drivers/edgetpu/edgetpu-device-group.c index c5d768c..64fbbfa 100644 --- a/drivers/edgetpu/edgetpu-device-group.c +++ b/drivers/edgetpu/edgetpu-device-group.c @@ -91,10 +91,14 @@ static int edgetpu_kci_join_group_worker(struct kci_worker_param *param) struct edgetpu_device_group *group = param->group; uint i = param->idx; struct edgetpu_dev *etdev = edgetpu_device_group_nth_etdev(group, i); + int ret; etdev_dbg(etdev, "%s: join group %u %u/%u", __func__, group->workload_id, i + 1, group->n_clients); - return edgetpu_kci_join_group(etdev->kci, group->n_clients, i); + ret = edgetpu_kci_join_group(etdev->kci, group->n_clients, i); + if (!ret) + edgetpu_sw_wdt_inc_active_ref(etdev); + return ret; } static int edgetpu_kci_leave_group_worker(struct kci_worker_param *param) @@ -104,6 +108,7 @@ static int edgetpu_kci_leave_group_worker(struct kci_worker_param *param) struct edgetpu_dev *etdev = edgetpu_device_group_nth_etdev(group, i); etdev_dbg(etdev, "%s: leave group %u", __func__, group->workload_id); + edgetpu_sw_wdt_dec_active_ref(etdev); edgetpu_kci_update_usage(etdev); edgetpu_kci_leave_group(etdev->kci); return 0; @@ -119,17 +124,24 @@ static int edgetpu_kci_leave_group_worker(struct kci_worker_param *param) static int edgetpu_group_activate(struct edgetpu_device_group *group) { u8 mailbox_id; - int ret; + int ret, i; + struct edgetpu_dev *etdev; if (edgetpu_group_mailbox_detached_locked(group)) return 0; + mailbox_id = edgetpu_group_context_id_locked(group); ret = edgetpu_mailbox_activate(group->etdev, mailbox_id, group->vcid, !group->activated); - if (ret) + if (ret) { etdev_err(group->etdev, "activate mailbox for VCID %d failed with %d", group->vcid, ret); - else + } else { group->activated = true; + for (i = 0; i < group->n_clients; i++) { + etdev = edgetpu_device_group_nth_etdev(group, i); + edgetpu_sw_wdt_inc_active_ref(etdev); + } + } atomic_inc(&group->etdev->job_count); return ret; } @@ -142,9 +154,16 @@ static int edgetpu_group_activate(struct edgetpu_device_group *group) static void edgetpu_group_deactivate(struct edgetpu_device_group *group) { u8 mailbox_id; + int i; + struct edgetpu_dev *etdev; if (edgetpu_group_mailbox_detached_locked(group)) return; + + for (i = 0; i < group->n_clients; i++) { + etdev = edgetpu_device_group_nth_etdev(group, i); + edgetpu_sw_wdt_dec_active_ref(etdev); + } mailbox_id = edgetpu_group_context_id_locked(group); edgetpu_mailbox_deactivate(group->etdev, mailbox_id); } @@ -450,15 +469,8 @@ void edgetpu_group_notify(struct edgetpu_device_group *group, uint event_id) */ static void edgetpu_device_group_release(struct edgetpu_device_group *group) { - int i; - struct edgetpu_dev *etdev; - edgetpu_group_clear_events(group); if (is_finalized_or_errored(group)) { - for (i = 0; i < group->n_clients; i++) { - etdev = edgetpu_device_group_nth_etdev(group, i); - edgetpu_sw_wdt_dec_active_ref(etdev); - } edgetpu_device_group_kci_leave(group); /* * Mappings clear should be performed after had a handshake with @@ -793,8 +805,7 @@ bool edgetpu_device_group_is_leader(struct edgetpu_device_group *group, int edgetpu_device_group_finalize(struct edgetpu_device_group *group) { - int ret = 0, i; - struct edgetpu_dev *etdev; + int ret = 0; bool mailbox_attached = false; struct edgetpu_client *leader; @@ -870,10 +881,6 @@ int edgetpu_device_group_finalize(struct edgetpu_device_group *group) group->status = EDGETPU_DEVICE_GROUP_FINALIZED; - for (i = 0; i < group->n_clients; i++) { - etdev = edgetpu_device_group_nth_etdev(group, i); - edgetpu_sw_wdt_inc_active_ref(etdev); - } mutex_unlock(&group->lock); return 0; diff --git a/drivers/edgetpu/edgetpu-firmware.c b/drivers/edgetpu/edgetpu-firmware.c index c1dc554..1ef1354 100644 --- a/drivers/edgetpu/edgetpu-firmware.c +++ b/drivers/edgetpu/edgetpu-firmware.c @@ -173,10 +173,7 @@ 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); + edgetpu_get_debug_dump(etdev, 0); } return 0; } diff --git a/drivers/edgetpu/edgetpu-telemetry.c b/drivers/edgetpu/edgetpu-telemetry.c index f18cef8..87820e0 100644 --- a/drivers/edgetpu/edgetpu-telemetry.c +++ b/drivers/edgetpu/edgetpu-telemetry.c @@ -329,6 +329,7 @@ static int telemetry_init(struct edgetpu_dev *etdev, struct edgetpu_telemetry *t tel->header = (struct edgetpu_telemetry_header *)vaddr; tel->header->head = 0; + tel->header->size = 0; tel->header->tail = 0; tel->header->entries_dropped = 0; diff --git a/drivers/edgetpu/edgetpu-telemetry.h b/drivers/edgetpu/edgetpu-telemetry.h index 2c89aff..f849c8c 100644 --- a/drivers/edgetpu/edgetpu-telemetry.h +++ b/drivers/edgetpu/edgetpu-telemetry.h @@ -45,7 +45,8 @@ enum edgetpu_telemetry_type { struct edgetpu_telemetry_header { u32 head; - u32 reserved0[15]; /* Place head and tail into different cache lines */ + u32 size; + u32 reserved0[14]; /* Place head and tail into different cache lines */ u32 tail; u32 entries_dropped; /* Number of entries dropped due to buffer full */ u32 reserved1[14]; /* Pad to 128 bytes in total */ diff --git a/drivers/edgetpu/janeiro-platform.c b/drivers/edgetpu/janeiro-platform.c index dea49aa..d17aa9c 100644 --- a/drivers/edgetpu/janeiro-platform.c +++ b/drivers/edgetpu/janeiro-platform.c @@ -81,11 +81,10 @@ static int janeiro_parse_set_dt_property(struct edgetpu_mobile_platform_dev *etm struct device *dev = etdev->dev; ret = janeiro_set_fw_ctx_memory(etmdev); - /* - * TODO(b/202262532): - * ignore return value till ctx switching support is added on - * firmware. - */ + if (ret) { + etdev_err(etdev, "Failed to initialize fw context memory: %d", ret); + return ret; + } if (!of_find_property(dev->of_node, "edgetpu,shareability", NULL)) { ret = -ENODEV; @@ -127,13 +126,37 @@ static int edgetpu_platform_remove(struct platform_device *pdev) return edgetpu_mobile_platform_remove(pdev); } +#if IS_ENABLED(CONFIG_PM_SLEEP) + +static int edgetpu_platform_suspend(struct device *dev) +{ + struct edgetpu_dev *etdev = dev_get_drvdata(dev); + + return edgetpu_pm_suspend(etdev); +} + +static int edgetpu_platform_resume(struct device *dev) +{ + struct edgetpu_dev *etdev = dev_get_drvdata(dev); + + return edgetpu_pm_resume(etdev); +} + +#endif /* IS_ENABLED(CONFIG_PM_SLEEP) */ + +static const struct dev_pm_ops edgetpu_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(edgetpu_platform_suspend, + edgetpu_platform_resume) +}; + static struct platform_driver edgetpu_platform_driver = { .probe = edgetpu_platform_probe, .remove = edgetpu_platform_remove, .driver = { - .name = "edgetpu_platform", - .of_match_table = edgetpu_of_match, - }, + .name = "edgetpu_platform", + .of_match_table = edgetpu_of_match, + .pm = &edgetpu_pm_ops, + }, }; static int __init edgetpu_platform_init(void) diff --git a/drivers/edgetpu/janeiro/config-mailbox.h b/drivers/edgetpu/janeiro/config-mailbox.h index e99cfae..e37747a 100644 --- a/drivers/edgetpu/janeiro/config-mailbox.h +++ b/drivers/edgetpu/janeiro/config-mailbox.h @@ -22,7 +22,7 @@ * | KCI X 1 | VII(s) X 7 | EXT_DSP(s) X 4 | EXT_AOC(s) X 1 | * --------------------------------------------------------------- * The TZ mailbox is not managed by the kernel, but we still need to tell firmware to enable it, - * so it's index is placed after the kernel managed mailboxes. + * so its index is placed after the kernel managed mailboxes. */ #define EDGETPU_TZ_MAILBOX_ID 13 -- cgit v1.2.3