From 312e68dac762bd9fda592208bb118e7813352b3a Mon Sep 17 00:00:00 2001 From: Edmond Chung Date: Wed, 3 May 2023 12:44:15 -0700 Subject: I2C: Remove redundant parameter in lwis_i2c_io_entry_rw Bug: 280649539 Test: GCA, CTS (cherry picked from https://partner-android-review.googlesource.com/q/commit:062735843f586d57ce34d9048a26fd1c63f5bdf0) Merged-In: I3856558a09ddcc8efc5da83c6d7c3f9a37aa49cb Change-Id: I3856558a09ddcc8efc5da83c6d7c3f9a37aa49cb --- lwis_device_i2c.c | 2 +- lwis_i2c.c | 33 +++++++++++++++------------------ lwis_i2c.h | 3 +-- 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/lwis_device_i2c.c b/lwis_device_i2c.c index 0135b05..ae74232 100644 --- a/lwis_device_i2c.c +++ b/lwis_device_i2c.c @@ -148,7 +148,7 @@ static int lwis_i2c_register_io(struct lwis_device *lwis_dev, struct lwis_io_ent } lwis_save_register_io_info(lwis_dev, entry, access_size); - return lwis_i2c_io_entry_rw(i2c_dev, entry, lwis_dev); + return lwis_i2c_io_entry_rw(i2c_dev, entry); } static int lwis_i2c_addr_matcher(struct device *dev, void *data) diff --git a/lwis_i2c.c b/lwis_i2c.c index a3e3386..d375f3c 100644 --- a/lwis_i2c.c +++ b/lwis_i2c.c @@ -144,8 +144,7 @@ int lwis_i2c_set_state(struct lwis_i2c_device *i2c, const char *state_str) return 0; } -static int i2c_read(struct lwis_i2c_device *i2c, uint64_t offset, uint64_t *value, - struct lwis_device *lwis_dev) +static int i2c_read(struct lwis_i2c_device *i2c, uint64_t offset, uint64_t *value) { int ret = 0; u8 *wbuf; @@ -200,7 +199,7 @@ static int i2c_read(struct lwis_i2c_device *i2c, uint64_t offset, uint64_t *valu msg[1].len = value_bytes; msg[1].buf = rbuf; - ret = perform_read_transfer(client, msg, offset, offset_bytes, lwis_dev); + ret = perform_read_transfer(client, msg, offset, offset_bytes, &i2c->base_dev); if (ret) { dev_err(i2c->base_dev.dev, "I2C Read failed: Offset 0x%llx (%d)\n", offset, ret); @@ -217,8 +216,7 @@ error_rbuf_alloc: return ret; } -static int i2c_write(struct lwis_i2c_device *i2c, uint64_t offset, uint64_t value, - struct lwis_device *lwis_dev) +static int i2c_write(struct lwis_i2c_device *i2c, uint64_t offset, uint64_t value) { int ret; u8 *buf; @@ -268,7 +266,7 @@ static int i2c_write(struct lwis_i2c_device *i2c, uint64_t offset, uint64_t valu msg.len = msg_bytes; ret = perform_write_transfer(client, &msg, offset, offset_bytes, value_bytes, value, - lwis_dev); + &i2c->base_dev); if (ret) { dev_err(i2c->base_dev.dev, "I2C Write failed: Offset 0x%llx Value 0x%llx (%d)\n", @@ -281,7 +279,7 @@ static int i2c_write(struct lwis_i2c_device *i2c, uint64_t offset, uint64_t valu } static int i2c_read_batch(struct lwis_i2c_device *i2c, uint64_t start_offset, uint8_t *read_buf, - int read_buf_size, struct lwis_device *lwis_dev) + int read_buf_size) { int ret = 0; uint8_t *wbuf; @@ -319,7 +317,7 @@ static int i2c_read_batch(struct lwis_i2c_device *i2c, uint64_t start_offset, ui msg[1].len = read_buf_size; msg[1].buf = read_buf; - ret = perform_read_transfer(client, msg, start_offset, offset_bytes, lwis_dev); + ret = perform_read_transfer(client, msg, start_offset, offset_bytes, &i2c->base_dev); if (ret) { dev_err(i2c->base_dev.dev, "I2C Read Batch failed: Start Offset 0x%llx (%d)\n", @@ -331,7 +329,7 @@ static int i2c_read_batch(struct lwis_i2c_device *i2c, uint64_t start_offset, ui } static int i2c_write_batch(struct lwis_i2c_device *i2c, uint64_t start_offset, uint8_t *write_buf, - int write_buf_size, struct lwis_device *lwis_dev) + int write_buf_size) { int ret; uint8_t *buf; @@ -372,7 +370,7 @@ static int i2c_write_batch(struct lwis_i2c_device *i2c, uint64_t start_offset, u msg.len = msg_bytes; ret = perform_write_batch_transfer(client, &msg, start_offset, offset_bytes, write_buf_size, - write_buf, lwis_dev); + write_buf, &i2c->base_dev); if (ret) { dev_err(i2c->base_dev.dev, "I2C Write Batch failed: Start Offset 0x%llx (%d)\n", @@ -384,8 +382,7 @@ static int i2c_write_batch(struct lwis_i2c_device *i2c, uint64_t start_offset, u return ret; } -int lwis_i2c_io_entry_rw(struct lwis_i2c_device *i2c, struct lwis_io_entry *entry, - struct lwis_device *lwis_dev) +int lwis_i2c_io_entry_rw(struct lwis_i2c_device *i2c, struct lwis_io_entry *entry) { int ret; uint64_t reg_value; @@ -396,27 +393,27 @@ int lwis_i2c_io_entry_rw(struct lwis_i2c_device *i2c, struct lwis_io_entry *entr } if (entry->type == LWIS_IO_ENTRY_READ) { - return i2c_read(i2c, entry->rw.offset, &entry->rw.val, lwis_dev); + return i2c_read(i2c, entry->rw.offset, &entry->rw.val); } if (entry->type == LWIS_IO_ENTRY_WRITE) { - return i2c_write(i2c, entry->rw.offset, entry->rw.val, lwis_dev); + return i2c_write(i2c, entry->rw.offset, entry->rw.val); } if (entry->type == LWIS_IO_ENTRY_MODIFY) { - ret = i2c_read(i2c, entry->mod.offset, ®_value, lwis_dev); + ret = i2c_read(i2c, entry->mod.offset, ®_value); if (ret) { return ret; } reg_value &= ~entry->mod.val_mask; reg_value |= entry->mod.val_mask & entry->mod.val; - return i2c_write(i2c, entry->mod.offset, reg_value, lwis_dev); + return i2c_write(i2c, entry->mod.offset, reg_value); } if (entry->type == LWIS_IO_ENTRY_READ_BATCH) { return i2c_read_batch(i2c, entry->rw_batch.offset, entry->rw_batch.buf, - entry->rw_batch.size_in_bytes, lwis_dev); + entry->rw_batch.size_in_bytes); } if (entry->type == LWIS_IO_ENTRY_WRITE_BATCH) { return i2c_write_batch(i2c, entry->rw_batch.offset, entry->rw_batch.buf, - entry->rw_batch.size_in_bytes, lwis_dev); + entry->rw_batch.size_in_bytes); } dev_err(i2c->base_dev.dev, "Invalid IO entry type: %d\n", entry->type); return -EINVAL; diff --git a/lwis_i2c.h b/lwis_i2c.h index e21ec73..d2e7e19 100644 --- a/lwis_i2c.h +++ b/lwis_i2c.h @@ -33,7 +33,6 @@ int lwis_i2c_set_state(struct lwis_i2c_device *i2c, const char *state_str); * lwis_i2c_io_entry_rw: Read/Write from i2c bus via io_entry request. * The readback values will be stored in the entry. */ -int lwis_i2c_io_entry_rw(struct lwis_i2c_device *i2c, struct lwis_io_entry *entry, - struct lwis_device *lwis_dev); +int lwis_i2c_io_entry_rw(struct lwis_i2c_device *i2c, struct lwis_io_entry *entry); #endif /* LWIS_I2C_H_ */ -- cgit v1.2.3 From 23d38ea88e35b77a85f8c940078e0f5df2152dc1 Mon Sep 17 00:00:00 2001 From: Edmond Chung Date: Thu, 4 May 2023 21:23:03 -0700 Subject: Debug: Fix formatting on dump state logs Also: - Better alignment in log for clarity - Only prints on I2C and IOREG types - Also moved lwis_device_crash_info_dump to lwis_debug so it's close to the functions it's calling Bug: 281077148 Test: Log (cherry picked from https://partner-android-review.googlesource.com/q/commit:e6f146eccddb306ee3363e1ff2e9742835d7ee9f) Merged-In: I16f1e35eb906f81aa773b4a312a8c93a1841c114 Change-Id: I16f1e35eb906f81aa773b4a312a8c93a1841c114 --- lwis_debug.c | 63 ++++++++++++++++++++++++++++------------------------------- lwis_debug.h | 7 +++++++ lwis_device.c | 15 +------------- lwis_device.h | 7 ------- lwis_ioctl.c | 3 ++- 5 files changed, 40 insertions(+), 55 deletions(-) diff --git a/lwis_debug.c b/lwis_debug.c index 8e5927e..f3f9501 100644 --- a/lwis_debug.c +++ b/lwis_debug.c @@ -23,7 +23,7 @@ #define PRINT_BUFFER_SIZE 128 /* Printing the log buffer line by line as printk does not work well with large chunks of data */ -static void print_to_log(char *buffer) +static void print_to_log(struct lwis_device *lwis_dev, char *buffer) { int size; char tmpbuf[PRINT_BUFFER_SIZE + 1]; @@ -36,7 +36,7 @@ static void print_to_log(char *buffer) } memcpy(tmpbuf, start, size); tmpbuf[size] = '\0'; - pr_info("%s", tmpbuf); + dev_info(lwis_dev->dev, "%s", tmpbuf); start = end + 1; end = strchr(start, '\n'); } @@ -200,18 +200,10 @@ static int generate_event_states_info(struct lwis_device *lwis_dev, char *buffer return -EINVAL; } + scnprintf(buffer, buffer_size, "=== LWIS EVENT STATES INFO: %s ===\n", lwis_dev->name); if (lwis_event_dump_cnt >= 0 && lwis_event_dump_cnt <= EVENT_DEBUG_HISTORY_SIZE) { - scnprintf(tmp_buf, sizeof(tmp_buf), "=== LWIS DUMP LAST %d Received Events ===\n", - lwis_event_dump_cnt); - strlcat(buffer, tmp_buf, buffer_size); traverse_last_events_size = lwis_event_dump_cnt; - } else if (lwis_event_dump_cnt > EVENT_DEBUG_HISTORY_SIZE) { - pr_err("lwis_event_dump_cnt (%d) exceed EVENT_DEBUG_HISTORY_SIZE (%d) \n", - lwis_event_dump_cnt, EVENT_DEBUG_HISTORY_SIZE); - return -EINVAL; } else { - scnprintf(buffer, buffer_size, "=== LWIS EVENT STATES INFO: %s ===\n", - lwis_dev->name); traverse_last_events_size = EVENT_DEBUG_HISTORY_SIZE; } @@ -220,9 +212,9 @@ static int generate_event_states_info(struct lwis_device *lwis_dev, char *buffer strlcat(buffer, " No events being monitored\n", buffer_size); goto exit; } - strlcat(buffer, "Enabled Device Events:\n", buffer_size); + strlcat(buffer, "Event Counts:\n", buffer_size); hash_for_each (lwis_dev->event_states, i, state, node) { - if (state->enable_counter > 0) { + if (state->event_counter > 0) { scnprintf(tmp_buf, sizeof(tmp_buf), "[%2d] ID: 0x%llx Counter: 0x%llx\n", idx++, state->event_id, state->event_counter); strlcat(buffer, tmp_buf, buffer_size); @@ -230,19 +222,15 @@ static int generate_event_states_info(struct lwis_device *lwis_dev, char *buffer } } if (!enabled_event_present) { - strlcat(buffer, "No enabled events\n", buffer_size); - } - if (lwis_event_dump_cnt < 0) { - strlcat(buffer, "Last Events:\n", buffer_size); + strlcat(buffer, " No enabled events\n", buffer_size); } + strlcat(buffer, "Last Events:\n", buffer_size); idx = lwis_dev->debug_info.cur_event_hist_idx; for (i = 0; i < traverse_last_events_size; ++i) { - if (lwis_event_dump_cnt >= 0) { - if (idx == 0) { - idx = EVENT_DEBUG_HISTORY_SIZE; - } - idx--; + idx--; + if (idx < 0) { + idx = EVENT_DEBUG_HISTORY_SIZE - 1; } state = &lwis_dev->debug_info.event_hist[idx].state; /* Skip uninitialized entries */ @@ -253,12 +241,6 @@ static int generate_event_states_info(struct lwis_device *lwis_dev, char *buffer lwis_dev->debug_info.event_hist[idx].timestamp); strlcat(buffer, tmp_buf, buffer_size); } - if (lwis_event_dump_cnt < 0) { - idx++; - if (idx >= EVENT_DEBUG_HISTORY_SIZE) { - idx = 0; - } - } } exit: @@ -415,7 +397,7 @@ int lwis_debug_print_register_io_history(struct lwis_device *lwis_dev) dev_err(lwis_dev->dev, "Failed to generate register io history"); goto exit; } - print_to_log(buffer); + print_to_log(lwis_dev, buffer); exit: kfree(buffer); @@ -434,7 +416,7 @@ int lwis_debug_print_device_info(struct lwis_device *lwis_dev) dev_err(lwis_dev->dev, "Failed to generate device info"); return ret; } - print_to_log(buffer); + print_to_log(lwis_dev, buffer); return 0; } @@ -454,7 +436,7 @@ int lwis_debug_print_event_states_info(struct lwis_device *lwis_dev, int lwis_ev dev_err(lwis_dev->dev, "Failed to generate event states info"); goto exit; } - print_to_log(buffer); + print_to_log(lwis_dev, buffer); exit: kfree(buffer); return ret; @@ -476,7 +458,7 @@ int lwis_debug_print_transaction_info(struct lwis_device *lwis_dev) dev_err(lwis_dev->dev, "Failed to generate transaction info"); goto exit; } - print_to_log(buffer); + print_to_log(lwis_dev, buffer); exit: kfree(buffer); return ret; @@ -498,12 +480,27 @@ int lwis_debug_print_buffer_info(struct lwis_device *lwis_dev) dev_err(lwis_dev->dev, "Failed to generate buffer info"); goto exit; } - print_to_log(buffer); + print_to_log(lwis_dev, buffer); exit: kfree(buffer); return ret; } +void lwis_debug_crash_info_dump(struct lwis_device *lwis_dev) +{ + const int event_dump_count = 5; + + /* State dump is only meaningful for I2C and IOREG devices */ + if (lwis_dev->type != DEVICE_TYPE_I2C && lwis_dev->type != DEVICE_TYPE_IOREG) { + return; + } + + dev_info(lwis_dev->dev, "LWIS Device (%s) Crash Info Dump:\n", lwis_dev->name); + + /* Dump event states and last 5 received events */ + lwis_debug_print_event_states_info(lwis_dev, event_dump_count); +} + /* DebugFS specific functions */ #ifdef CONFIG_DEBUG_FS diff --git a/lwis_debug.h b/lwis_debug.h index 85996a3..c2604ba 100644 --- a/lwis_debug.h +++ b/lwis_debug.h @@ -17,6 +17,13 @@ int lwis_debug_print_transaction_info(struct lwis_device *lwis_dev); int lwis_debug_print_register_io_history(struct lwis_device *lwis_dev); int lwis_debug_print_buffer_info(struct lwis_device *lwis_dev); +/* + * lwis_debug_crash_info_dump: + * Use the customized function handle to print information from each device registered in LWIS + * when usersapce crash. + */ +void lwis_debug_crash_info_dump(struct lwis_device *lwis_dev); + /* DebugFS specific functions */ int lwis_device_debugfs_setup(struct lwis_device *lwis_dev, struct dentry *dbg_root); int lwis_device_debugfs_cleanup(struct lwis_device *lwis_dev); \ No newline at end of file diff --git a/lwis_device.c b/lwis_device.c index b4c8a44..1ff65b2 100644 --- a/lwis_device.c +++ b/lwis_device.c @@ -250,9 +250,9 @@ static int lwis_release(struct inode *node, struct file *fp) mutex_lock(&lwis_dev->client_lock); /* Release power if client closed without power down called */ if (is_client_enabled && lwis_dev->enabled > 0) { - lwis_device_crash_info_dump(lwis_dev); lwis_dev->enabled--; if (lwis_dev->enabled == 0) { + lwis_debug_crash_info_dump(lwis_dev); dev_info(lwis_dev->dev, "No more client, power down\n"); rc = lwis_dev_power_down_locked(lwis_dev); lwis_dev->is_suspended = false; @@ -1428,19 +1428,6 @@ void lwis_device_info_dump(const char *name, void (*func)(struct lwis_device *)) mutex_unlock(&core.lock); } -void lwis_device_crash_info_dump(struct lwis_device *lwis_dev) -{ - int dump_cnt = 5; - int64_t timestamp; - - pr_info("LWIS Device (%s) Crash Info Dump:\n", lwis_dev->name); - - /* Dump Current kernel timestamp && Last 5 Received Event*/ - timestamp = ktime_to_ns(lwis_get_time()); - dev_info(lwis_dev->dev, " AT %lld Dump Last %d Received Events:\n\n", timestamp, dump_cnt); - lwis_debug_print_event_states_info(lwis_dev, /*lwis_event_dump_cnt=*/dump_cnt); -} - void lwis_save_register_io_info(struct lwis_device *lwis_dev, struct lwis_io_entry *io_entry, size_t access_size) { diff --git a/lwis_device.h b/lwis_device.h index 2f30aa5..c011775 100644 --- a/lwis_device.h +++ b/lwis_device.h @@ -414,13 +414,6 @@ void lwis_dev_power_seq_list_print(struct lwis_device_power_sequence_list *list) */ void lwis_device_info_dump(const char *name, void (*func)(struct lwis_device *)); -/* - * lwis_device_crash_info_dump: - * Use the customized function handle to print information from each device registered in LWIS - * when usersapce crash. - */ -void lwis_device_crash_info_dump(struct lwis_device *lwis_dev); - /* * lwis_save_register_io_info: Saves the register io info in a history buffer * for better debugability. diff --git a/lwis_ioctl.c b/lwis_ioctl.c index 221dd98..6345fd0 100644 --- a/lwis_ioctl.c +++ b/lwis_ioctl.c @@ -20,6 +20,7 @@ #include "lwis_allocator.h" #include "lwis_buffer.h" #include "lwis_commands.h" +#include "lwis_debug.h" #include "lwis_device.h" #include "lwis_device_dpm.h" #include "lwis_device_i2c.h" @@ -733,7 +734,7 @@ static int cmd_dump_debug_state(struct lwis_client *lwis_client, struct lwis_cmd mutex_lock(&lwis_dev->client_lock); /* Dump lwis device crash info */ - lwis_device_crash_info_dump(lwis_dev); + lwis_debug_crash_info_dump(lwis_dev); mutex_unlock(&lwis_dev->client_lock); header->ret_code = 0; -- cgit v1.2.3