summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPixelBot AutoMerger <android-nexus-securitybot@system.gserviceaccount.com>2023-06-04 18:42:42 -0700
committerSecurityBot <android-nexus-securitybot@system.gserviceaccount.com>2023-06-04 18:42:43 -0700
commita6f6d0631733ad3f966a1d423b04ccb686192d35 (patch)
treeae8d7960f536a5ad8449a744383222f196ee69fd
parent0c19c9fa8f8f829376ac7d07d14ae935f98c2c7e (diff)
parent23d38ea88e35b77a85f8c940078e0f5df2152dc1 (diff)
downloadlwis-a6f6d0631733ad3f966a1d423b04ccb686192d35.tar.gz
Merge android13-gs-pixel-5.10-udc into android13-gs-pixel-5.10-udc-qpr1android-u-qpr1-beta-2_r0.7android-u-qpr1-beta-2_r0.5android-u-qpr1-beta-2_r0.4android-u-qpr1-beta-2_r0.3android-u-qpr1-beta-2_r0.2android-u-qpr1-beta-2_r0.1android-u-qpr1-beta-2.2_r0.6android-u-qpr1-beta-2.2_r0.5android-u-qpr1-beta-2.2_r0.4android-u-qpr1-beta-2.2_r0.3android-u-qpr1-beta-2.2_r0.2android-u-qpr1-beta-2.2_r0.1android-u-qpr1-beta-2.1_r0.7android-u-qpr1-beta-2.1_r0.5android-u-qpr1-beta-2.1_r0.4android-u-qpr1-beta-2.1_r0.3android-u-qpr1-beta-2.1_r0.2android-u-qpr1-beta-2.1_r0.1android-u-qpr1-beta-1_r0.7android-u-qpr1-beta-1_r0.5android-u-qpr1-beta-1_r0.4android-u-qpr1-beta-1_r0.3android-u-qpr1-beta-1_r0.2android-u-qpr1-beta-1_r0.1android-14.0.0_r0.44android-14.0.0_r0.43android-14.0.0_r0.42android-14.0.0_r0.41android-14.0.0_r0.40android-14.0.0_r0.39android-14.0.0_r0.37android-14.0.0_r0.36android-14.0.0_r0.35android-14.0.0_r0.34android-14.0.0_r0.33android-14.0.0_r0.31android-14.0.0_r0.25android-14.0.0_r0.23android-14.0.0_r0.22android-14.0.0_r0.21android-14.0.0_r0.19android-gs-tangorpro-5.10-u-qpr1-beta2android-gs-tangorpro-5.10-android14-qpr1-betaandroid-gs-tangorpro-5.10-android14-qpr1android-gs-raviole-5.10-u-qpr1-beta2android-gs-raviole-5.10-android14-qpr1-betaandroid-gs-raviole-5.10-android14-qpr1android-gs-pantah-5.10-u-qpr1-beta2android-gs-pantah-5.10-android14-qpr1-betaandroid-gs-pantah-5.10-android14-qpr1android-gs-lynx-5.10-u-qpr1-beta2android-gs-lynx-5.10-android14-qpr1-betaandroid-gs-lynx-5.10-android14-qpr1android-gs-felix-5.10-u-qpr1-beta2android-gs-felix-5.10-android14-qpr1-betaandroid-gs-felix-5.10-android14-qpr1android-gs-bluejay-5.10-u-qpr1-beta2android-gs-bluejay-5.10-android14-qpr1-betaandroid-gs-bluejay-5.10-android14-qpr1
SBMerger: 526756187 Change-Id: I379540f9f160a263c3994f374638530c582e1a03 Signed-off-by: SecurityBot <android-nexus-securitybot@system.gserviceaccount.com>
-rw-r--r--lwis_debug.c63
-rw-r--r--lwis_debug.h7
-rw-r--r--lwis_device.c15
-rw-r--r--lwis_device.h7
-rw-r--r--lwis_device_i2c.c2
-rw-r--r--lwis_i2c.c33
-rw-r--r--lwis_i2c.h3
-rw-r--r--lwis_ioctl.c3
8 files changed, 57 insertions, 76 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
@@ -415,13 +415,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_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, &reg_value, lwis_dev);
+ ret = i2c_read(i2c, entry->mod.offset, &reg_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_ */
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;