diff options
author | linyuny <linyuny@google.com> | 2023-01-23 19:36:47 +0000 |
---|---|---|
committer | Holmes Chou <holmeschou@google.com> | 2023-02-23 06:53:19 +0000 |
commit | 5ba6f644695f26b2e4d5802e6f8a60c8865b3a8d (patch) | |
tree | 283c1de1681f50fc05143791eb5672f5461cebcd | |
parent | d822d9d2374e33c3d19eb9f36bbc176c6ff235f6 (diff) | |
download | lwis-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.c | 18 | ||||
-rw-r--r-- | lwis_commands.h | 2 | ||||
-rw-r--r-- | lwis_ioctl.c | 22 |
3 files changed, 41 insertions, 1 deletions
@@ -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; |