From ad3c7a0b5e4d057e75d2be615ecd38b46ac0bf44 Mon Sep 17 00:00:00 2001 From: wanggc6 Date: Sat, 5 Nov 2022 23:59:23 +0800 Subject: [PATCH] bm_ulog: Optimize adsp bm ulog driver Check if the bm ulog is enabled when the driver was insmod. Add bm_ulog_kthread to auto read adsp bm ulog and print them. This makes it easier to print the bm ulog and reduce log loss. Change-Id: I31e3721fdeaabf2da7bf239d5cb6afc380d10f71 Signed-off-by: Guocheng Wang Reviewed-on: https://gerrit.mot.com/2422015 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Yonghua Yan Reviewed-by: Huosheng Liao Submit-Approved: Jira Key --- drivers/power/bm_adsp_ulog/bm_adsp_ulog.c | 82 ++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-) diff --git a/drivers/power/bm_adsp_ulog/bm_adsp_ulog.c b/drivers/power/bm_adsp_ulog/bm_adsp_ulog.c index f5340c8bb4fa..5de30f6ee238 100644 --- a/drivers/power/bm_adsp_ulog/bm_adsp_ulog.c +++ b/drivers/power/bm_adsp_ulog/bm_adsp_ulog.c @@ -17,6 +17,10 @@ #include #include +#include +#include +#include + /* owner/type/opcodes for battery charger */ #define MSG_OWNER_BC 32778 #define MSG_TYPE_REQ_RESP 1 @@ -75,6 +79,7 @@ struct bm_ulog_dev { struct dentry *debugfs_dir; bool *debug_enabled; void *ipc_log; + struct task_struct *bm_ulog_task; char ulog_buffer[MAX_ULOG_READ_BUFFER_SIZE]; }; @@ -297,7 +302,7 @@ int bm_ulog_get_mask_log(enum bm_ulog_category_bitmap categories, } EXPORT_SYMBOL(bm_ulog_get_mask_log); -static void bm_ulog_print_buffer(struct bm_ulog_dev *bmdev, u32 size) +static int bm_ulog_print_buffer(struct bm_ulog_dev *bmdev, u32 size) { int i; int header = 0; @@ -314,6 +319,9 @@ static void bm_ulog_print_buffer(struct bm_ulog_dev *bmdev, u32 size) break; } } + if (i > 0) + pr_info("recv len=%d\n", i); + return i; } static int bm_ulog_print_init_log(u32 size) @@ -493,6 +501,65 @@ static void bm_ulog_add_debugfs(struct bm_ulog_dev *bmdev) static void bm_ulog_add_debugfs(struct bm_ulog_dev *bmdev) { } #endif +static int bm_ulog_kthread(void *param) +{ + struct bm_ulog_dev * bmdev = param; + int read_count = 0; + int sleep_ms = 0; + + bm_info(bmdev, "bm ulog kthread start\n"); + do { + bm_ulog_request_log(bmdev, MAX_ULOG_READ_BUFFER_SIZE); + read_count = bm_ulog_print_buffer(bmdev, MAX_ULOG_READ_BUFFER_SIZE); + + if (read_count > 1024) { + sleep_ms = 1; + } else if (read_count > 128) { + sleep_ms = 50; + } else if (read_count == 0) { + sleep_ms = sleep_ms + 50; + } + if (sleep_ms > 200) + sleep_ms = 200; + + msleep(sleep_ms); + } while(!kthread_should_stop()); + + bm_info(bmdev, "bm ulog kthread exit\n"); + return 0; +} + +bool bm_ulog_is_bm_ulog_enabled(struct bm_ulog_dev *bmdev) +{ + struct device_node *np = of_find_node_by_path("/chosen"); + bool rt = false; + const char *bootargs = NULL; + char *bm_ulog_enabled = NULL; + + if (bmdev && bmdev->debug_enabled && *bmdev->debug_enabled) { + bm_info(bmdev, "bmdev->bm_ulog_enabled is true\n"); + return true; + } + + if (!np) { + bm_info(bmdev, "np is null\n"); + return false; + } + + if (!of_property_read_string(np, "bootargs", &bootargs)) { + bm_ulog_enabled = strstr(bootargs, "bm_ulog_enabled=1 "); + bm_info(bmdev, "of_property_read_string bm_ulog_enabled=%s\n", bm_ulog_enabled); + if (bm_ulog_enabled) { + rt = true; + } + } + + of_node_put(np); + + bm_info(bmdev,"bm ulog rt = %d\n", rt); + return rt; +} + static int bm_ulog_probe(struct platform_device *pdev) { int rc; @@ -547,6 +614,19 @@ static int bm_ulog_probe(struct platform_device *pdev) MAX_ULOG_READ_BUFFER_SIZE); debug_enabled = init_debug_enabled; } + + debug_enabled = bm_ulog_is_bm_ulog_enabled(bmdev); + bm_info(bmdev, "bm_ulog_check_debug_enabled debug_enabled=%d\n", debug_enabled); + if (bmdev->debug_enabled && *bmdev->debug_enabled) { + bmdev->bm_ulog_task = kthread_create(bm_ulog_kthread, bmdev, "bm_ulog_kthread"); + if (IS_ERR(bmdev->bm_ulog_task)) { + bm_info(bmdev, "Failed to create bm_ulog_task ret = %ld\n", PTR_ERR(bmdev->bm_ulog_task)); + }else { + wake_up_process(bmdev->bm_ulog_task); + bm_info(bmdev, "Successed to create bm_ulog_task\n"); + } + } + bm_ulog_add_debugfs(bmdev); bm_info(bmdev, "BM adsp ulog driver initialized successfully\n");