summaryrefslogtreecommitdiff
path: root/drivers/edgetpu/edgetpu-kci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/edgetpu/edgetpu-kci.c')
-rw-r--r--drivers/edgetpu/edgetpu-kci.c63
1 files changed, 39 insertions, 24 deletions
diff --git a/drivers/edgetpu/edgetpu-kci.c b/drivers/edgetpu/edgetpu-kci.c
index 834318f..0c6f5ad 100644
--- a/drivers/edgetpu/edgetpu-kci.c
+++ b/drivers/edgetpu/edgetpu-kci.c
@@ -38,8 +38,8 @@
/* fake-firmware could respond in a short time */
#define KCI_TIMEOUT (200)
#else
-/* 5 secs. */
-#define KCI_TIMEOUT (5000)
+/* Wait for up to 1 second for FW to respond. */
+#define KCI_TIMEOUT (1000)
#endif
/* A macro for KCIs to leave early when the device state is known to be bad. */
@@ -246,10 +246,9 @@ edgetpu_kci_handle_response(struct edgetpu_kci *kci,
int ret = edgetpu_reverse_kci_add_response(kci, resp);
if (ret)
- etdev_warn(
- kci->mailbox->etdev,
- "Failed to handle reverse KCI code %u (%d)\n",
- resp->code, ret);
+ etdev_warn_ratelimited(kci->mailbox->etdev,
+ "Failed to handle reverse KCI code %u (%d)\n",
+ resp->code, ret);
return;
}
/*
@@ -642,7 +641,12 @@ int edgetpu_kci_push_cmd(struct edgetpu_kci *kci,
mutex_lock(&kci->cmd_queue_lock);
- cmd->seq = kci->cur_seq;
+ /*
+ * Only update sequence number for KCI commands. Do not change
+ * sequence number for responses to RKCI commands.
+ */
+ if (!(cmd->seq & KCI_REVERSE_FLAG))
+ cmd->seq = kci->cur_seq;
/*
* The lock ensures mailbox->cmd_queue_tail cannot be changed by
* other processes (this method should be the only one to modify the
@@ -681,7 +685,8 @@ int edgetpu_kci_push_cmd(struct edgetpu_kci *kci,
/* triggers doorbell */
EDGETPU_MAILBOX_CMD_QUEUE_WRITE_SYNC(kci->mailbox, doorbell_set, 1);
/* bumps sequence number after the command is sent */
- kci->cur_seq++;
+ if (!(cmd->seq & KCI_REVERSE_FLAG))
+ kci->cur_seq++;
ret = 0;
out:
mutex_unlock(&kci->cmd_queue_lock);
@@ -707,6 +712,10 @@ static int edgetpu_kci_send_cmd_return_resp(
ret = edgetpu_kci_push_cmd(kci, cmd, resp);
if (ret)
return ret;
+
+ if (!resp)
+ return 0;
+
ret = wait_event_timeout(kci->wait_list_waitq,
resp->status != KCI_STATUS_WAITING_RESPONSE,
msecs_to_jiffies(KCI_TIMEOUT));
@@ -755,22 +764,11 @@ int edgetpu_kci_send_cmd(struct edgetpu_kci *kci,
{
struct edgetpu_kci_response_element resp;
- return edgetpu_kci_send_cmd_return_resp(kci, cmd, &resp);
-}
-
-int edgetpu_kci_unmap_buffer(struct edgetpu_kci *kci, tpu_addr_t tpu_addr,
- u32 size, enum dma_data_direction dir)
-{
- struct edgetpu_command_element cmd = {
- .code = KCI_CODE_UNMAP_BUFFER,
- .dma = {
- .address = tpu_addr,
- .size = size,
- .flags = dir,
- },
- };
-
- return edgetpu_kci_send_cmd(kci, &cmd);
+ /* Don't wait on a response for reverse KCI response. */
+ if (cmd->seq & KCI_REVERSE_FLAG)
+ return edgetpu_kci_send_cmd_return_resp(kci, cmd, NULL);
+ else
+ return edgetpu_kci_send_cmd_return_resp(kci, cmd, &resp);
}
int edgetpu_kci_map_log_buffer(struct edgetpu_kci *kci, tpu_addr_t tpu_addr,
@@ -926,6 +924,9 @@ int edgetpu_kci_update_usage(struct edgetpu_dev *etdev)
fw_unlock:
edgetpu_firmware_unlock(etdev);
+
+ if (ret)
+ etdev_warn_once(etdev, "get firmware usage stats failed: %d", ret);
return ret;
}
@@ -1091,3 +1092,17 @@ int edgetpu_kci_block_bus_speed_control(struct edgetpu_dev *etdev, bool block)
return edgetpu_kci_send_cmd(etdev->kci, &cmd);
}
+
+int edgetpu_kci_resp_rkci_ack(struct edgetpu_dev *etdev,
+ struct edgetpu_kci_response_element *rkci_cmd)
+{
+ struct edgetpu_command_element cmd = {
+ .seq = rkci_cmd->seq,
+ .code = KCI_CODE_RKCI_ACK,
+ };
+
+ if (!etdev->kci)
+ return -ENODEV;
+
+ return edgetpu_kci_send_cmd(etdev->kci, &cmd);
+}