summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlinyuny <linyuny@google.com>2023-01-23 19:36:47 +0000
committerHolmes Chou <holmeschou@google.com>2023-02-23 06:53:19 +0000
commit5ba6f644695f26b2e4d5802e6f8a60c8865b3a8d (patch)
tree283c1de1681f50fc05143791eb5672f5461cebcd
parentd822d9d2374e33c3d19eb9f36bbc176c6ff235f6 (diff)
downloadlwis-5ba6f644695f26b2e4d5802e6f8a60c8865b3a8d.tar.gz
LWIS: Add new ioctl command: LWIS_DUMP_DEBUG_STATE
Bug: 261126958 Test: Manual run Change-Id: I87da5c1bbb0feb0875c03ae38dc98ff7b820db94 Signed-off-by: linyuny <linyuny@google.com>
-rw-r--r--lwis_cmd.c18
-rw-r--r--lwis_commands.h2
-rw-r--r--lwis_ioctl.c22
3 files changed, 41 insertions, 1 deletions
diff --git a/lwis_cmd.c b/lwis_cmd.c
index b48b7d6..d309502 100644
--- a/lwis_cmd.c
+++ b/lwis_cmd.c
@@ -451,6 +451,20 @@ exit_locked:
return copy_pkt_to_user(lwis_dev, u_msg, (void *)header, sizeof(*header));
}
+static int cmd_dump_debug_state(struct lwis_client *lwis_client, struct lwis_cmd_pkt *header,
+ struct lwis_cmd_pkt __user *u_msg)
+{
+ struct lwis_device *lwis_dev = lwis_client->lwis_dev;
+
+ mutex_lock(&lwis_dev->client_lock);
+ /* Dump lwis device crash info */
+ lwis_device_crash_info_dump(lwis_dev);
+ mutex_unlock(&lwis_dev->client_lock);
+
+ header->ret_code = 0;
+ return copy_pkt_to_user(lwis_dev, u_msg, (void *)header, sizeof(*header));
+}
+
static int cmd_dma_buffer_enroll(struct lwis_client *lwis_client, struct lwis_cmd_pkt *header,
struct lwis_cmd_dma_buffer_enroll __user *u_msg)
{
@@ -1270,6 +1284,10 @@ int lwis_ioctl_handle_cmd_pkt(struct lwis_client *lwis_client, struct lwis_cmd_p
ret = cmd_device_resume(lwis_client, &header,
(struct lwis_cmd_pkt __user *)user_msg);
break;
+ case LWIS_CMD_ID_DUMP_DEBUG_STATE:
+ ret = cmd_dump_debug_state(lwis_client, &header,
+ (struct lwis_cmd_pkt __user *)user_msg);
+ break;
case LWIS_CMD_ID_DMA_BUFFER_ENROLL:
ret = cmd_dma_buffer_enroll(
lwis_client, &header,
diff --git a/lwis_commands.h b/lwis_commands.h
index 596387c..71b8827 100644
--- a/lwis_commands.h
+++ b/lwis_commands.h
@@ -432,6 +432,7 @@ enum lwis_cmd_id {
LWIS_CMD_ID_DEVICE_RESET = 0x10300,
LWIS_CMD_ID_DEVICE_SUSPEND = 0x10400,
LWIS_CMD_ID_DEVICE_RESUME = 0x10500,
+ LWIS_CMD_ID_DUMP_DEBUG_STATE = 0x10600,
LWIS_CMD_ID_DMA_BUFFER_ENROLL = 0x20000,
LWIS_CMD_ID_DMA_BUFFER_DISENROLL = 0x20100,
@@ -585,6 +586,7 @@ struct lwis_cmd_fence_create {
#define LWIS_REG_IO _IOWR(LWIS_IOC_TYPE, 11, struct lwis_io_entries)
#define LWIS_ECHO _IOWR(LWIS_IOC_TYPE, 12, struct lwis_echo)
#define LWIS_DEVICE_RESET _IOWR(LWIS_IOC_TYPE, 13, struct lwis_io_entries)
+#define LWIS_DUMP_DEBUG_STATE _IO(LWIS_IOC_TYPE, 14)
#define LWIS_EVENT_CONTROL_GET _IOWR(LWIS_IOC_TYPE, 20, struct lwis_event_control)
#define LWIS_EVENT_CONTROL_SET _IOW(LWIS_IOC_TYPE, 21, struct lwis_event_control_list)
diff --git a/lwis_ioctl.c b/lwis_ioctl.c
index 4cdc2ff..affcfac 100644
--- a/lwis_ioctl.c
+++ b/lwis_ioctl.c
@@ -91,6 +91,10 @@ static void lwis_ioctl_pr_err(struct lwis_device *lwis_dev, unsigned int ioctl_t
strscpy(type_name, STRINGIFY(LWIS_DEVICE_RESET), sizeof(type_name));
exp_size = IOCTL_ARG_SIZE(LWIS_DEVICE_RESET);
break;
+ case IOCTL_TO_ENUM(LWIS_DUMP_DEBUG_STATE):
+ strscpy(type_name, STRINGIFY(LWIS_DUMP_DEBUG_STATE), sizeof(type_name));
+ exp_size = IOCTL_ARG_SIZE(LWIS_DUMP_DEBUG_STATE);
+ break;
case IOCTL_TO_ENUM(LWIS_EVENT_CONTROL_GET):
strscpy(type_name, STRINGIFY(LWIS_EVENT_CONTROL_GET), sizeof(type_name));
exp_size = IOCTL_ARG_SIZE(LWIS_EVENT_CONTROL_GET);
@@ -793,6 +797,18 @@ soft_reset_exit:
return ret;
}
+static int ioctl_dump_debug_state(struct lwis_client *lwis_client)
+{
+ struct lwis_device *lwis_dev = lwis_client->lwis_dev;
+
+ mutex_lock(&lwis_dev->client_lock);
+ /* Dump lwis device crash info */
+ lwis_device_crash_info_dump(lwis_dev);
+ mutex_unlock(&lwis_dev->client_lock);
+
+ return 0;
+}
+
static int ioctl_event_control_get(struct lwis_client *lwis_client,
struct lwis_event_control __user *msg)
{
@@ -1439,7 +1455,8 @@ int lwis_ioctl_handler(struct lwis_client *lwis_client, unsigned int type, unsig
type != LWIS_EVENT_CONTROL_GET && type != LWIS_TIME_QUERY &&
type != LWIS_EVENT_DEQUEUE && type != LWIS_BUFFER_ENROLL &&
type != LWIS_BUFFER_DISENROLL && type != LWIS_BUFFER_FREE &&
- type != LWIS_DPM_QOS_UPDATE && type != LWIS_DPM_GET_CLOCK && type != LWIS_CMD_PACKET) {
+ type != LWIS_DPM_QOS_UPDATE && type != LWIS_DPM_GET_CLOCK && type != LWIS_CMD_PACKET &&
+ type != LWIS_DUMP_DEBUG_STATE) {
ret = -EBADFD;
dev_err_ratelimited(lwis_dev->dev, "Unsupported IOCTL on disabled device.\n");
goto out;
@@ -1484,6 +1501,9 @@ int lwis_ioctl_handler(struct lwis_client *lwis_client, unsigned int type, unsig
case LWIS_DEVICE_RESET:
ret = ioctl_device_reset(lwis_client, (struct lwis_io_entries *)param);
break;
+ case LWIS_DUMP_DEBUG_STATE:
+ ret = ioctl_dump_debug_state(lwis_client);
+ break;
case LWIS_EVENT_CONTROL_GET:
ret = ioctl_event_control_get(lwis_client, (struct lwis_event_control *)param);
break;