summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWhi copybara merger <whitechapel-automerger@google.com>2022-02-07 19:11:43 -0800
committerCopybara-Service <copybara-worker@google.com>2022-02-14 11:34:55 -0800
commita9092ff1d4ef3bfbd4291ac35137ee2f37beb28c (patch)
tree5af10875a8b213a923c5258ffef5f45c4e4cea39
parent4504dcb0127800f115ef53342a86829c9b137244 (diff)
downloadjaneiro-a9092ff1d4ef3bfbd4291ac35137ee2f37beb28c.tar.gz
[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
-rw-r--r--drivers/edgetpu/edgetpu-debug-dump.c8
-rw-r--r--drivers/edgetpu/edgetpu-device-group.c41
-rw-r--r--drivers/edgetpu/edgetpu-firmware.c5
-rw-r--r--drivers/edgetpu/edgetpu-telemetry.c1
-rw-r--r--drivers/edgetpu/edgetpu-telemetry.h3
-rw-r--r--drivers/edgetpu/janeiro-platform.c39
-rw-r--r--drivers/edgetpu/janeiro/config-mailbox.h2
7 files changed, 66 insertions, 33 deletions
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