From 3cf198f22860f91f1bf6b1c8a46ed97263f97628 Mon Sep 17 00:00:00 2001 From: Petar Ivanov Date: Wed, 14 Dec 2022 05:44:31 -0800 Subject: [PATCH] msm: camera: memmgr: Add LDAR Support Dump mem mgr bufq to user buffer. CRs-Fixed: 3377820 Change-Id: I5be4e245857ccb0602e54546f127793d9f6b03f6 Signed-off-by: Petar Ivanov --- drivers/cam_req_mgr/cam_mem_mgr.c | 101 ++++++++++++++++++++++++- drivers/cam_req_mgr/cam_mem_mgr.h | 9 ++- drivers/cam_req_mgr/cam_req_mgr_core.c | 11 +++ 3 files changed, 119 insertions(+), 2 deletions(-) diff --git a/drivers/cam_req_mgr/cam_mem_mgr.c b/drivers/cam_req_mgr/cam_mem_mgr.c index aab18927ec..5fae97cf2a 100644 --- a/drivers/cam_req_mgr/cam_mem_mgr.c +++ b/drivers/cam_req_mgr/cam_mem_mgr.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. */ #include @@ -31,6 +31,9 @@ static struct cam_mem_table tbl; static atomic_t cam_mem_mgr_state = ATOMIC_INIT(CAM_MEM_MGR_UNINITIALIZED); +/* Number of words for dumping req state info */ +#define CAM_MEM_MGR_DUMP_BUF_NUM_WORDS 29 + /* cam_mem_mgr_debug - global struct to keep track of debug settings for mem mgr * * @dentry : Directory entry to the mem mgr root folder @@ -1912,6 +1915,102 @@ ion_fail: } EXPORT_SYMBOL(cam_mem_mgr_reserve_memory_region); +static void *cam_mem_mgr_user_dump_buf( + void *dump_struct, uint8_t *addr_ptr) +{ + struct cam_mem_buf_queue *buf = NULL; + uint64_t *addr; + int i = 0; + + buf = (struct cam_mem_buf_queue *)dump_struct; + + addr = (uint64_t *)addr_ptr; + + *addr++ = buf->timestamp.tv_sec; + *addr++ = buf->timestamp.tv_nsec / NSEC_PER_USEC; + *addr++ = buf->fd; + *addr++ = buf->i_ino; + *addr++ = buf->buf_handle; + *addr++ = buf->len; + *addr++ = buf->align; + *addr++ = buf->flags; + *addr++ = buf->vaddr; + *addr++ = buf->kmdvaddr; + *addr++ = buf->is_imported; + *addr++ = buf->is_internal; + *addr++ = buf->num_hdl; + for (i = 0; i < buf->num_hdl; i++) + *addr++ = buf->hdls[i]; + + return addr; +} + +int cam_mem_mgr_dump_user(struct cam_dump_req_cmd *dump_req) +{ + int rc = 0; + int i; + struct cam_common_hw_dump_args dump_args; + size_t buf_len; + size_t remain_len; + uint32_t min_len; + uintptr_t cpu_addr; + + rc = cam_mem_get_cpu_buf(dump_req->buf_handle, + &cpu_addr, &buf_len); + if (rc) { + CAM_ERR(CAM_MEM, "Invalid handle %u rc %d", + dump_req->buf_handle, rc); + return rc; + } + if (buf_len <= dump_req->offset) { + CAM_WARN(CAM_MEM, "Dump buffer overshoot len %zu offset %zu", + buf_len, dump_req->offset); + return -ENOSPC; + } + + remain_len = buf_len - dump_req->offset; + min_len = + (CAM_MEM_BUFQ_MAX * + (CAM_MEM_MGR_DUMP_BUF_NUM_WORDS * sizeof(uint64_t) + + sizeof(struct cam_common_hw_dump_header))); + + if (remain_len < min_len) { + CAM_WARN(CAM_MEM, "Dump buffer exhaust remain %zu min %u", + remain_len, min_len); + return -ENOSPC; + } + + dump_args.req_id = dump_req->issue_req_id; + dump_args.cpu_addr = cpu_addr; + dump_args.buf_len = buf_len; + dump_args.offset = dump_req->offset; + dump_args.ctxt_to_hw_map = NULL; + + mutex_lock(&tbl.m_lock); + for (i = 1; i < CAM_MEM_BUFQ_MAX; i++) { + if (tbl.bufq[i].active) { + mutex_lock(&tbl.bufq[i].q_lock); + rc = cam_common_user_dump_helper(&dump_args, + cam_mem_mgr_user_dump_buf, + &tbl.bufq[i], + sizeof(uint64_t), "MEM_MGR_BUF.%d:", i); + if (rc) { + CAM_ERR(CAM_CRM, + "Dump state info failed, rc: %d", + rc); + return rc; + } + mutex_unlock(&tbl.bufq[i].q_lock); + } + } + mutex_unlock(&tbl.m_lock); + + dump_req->offset = dump_args.offset; + + return rc; +} + + int cam_mem_mgr_free_memory_region(struct cam_mem_mgr_memory_desc *inp) { int32_t idx; diff --git a/drivers/cam_req_mgr/cam_mem_mgr.h b/drivers/cam_req_mgr/cam_mem_mgr.h index a3160421d0..df6f61d064 100644 --- a/drivers/cam_req_mgr/cam_mem_mgr.h +++ b/drivers/cam_req_mgr/cam_mem_mgr.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef _CAM_MEM_MGR_H_ @@ -240,4 +240,11 @@ int cam_mem_mgr_send_buffer_to_presil(int32_t iommu_hdl, int32_t buf_handle); */ int cam_mem_mgr_retrieve_buffer_from_presil(int32_t buf_handle, uint32_t buf_size, uint32_t offset, int32_t iommu_hdl); + +/** + * @brief: Dump mem mgr info into user buffer + * + * @return Status of operation. Negative in case of error. Zero otherwise. + */ +int cam_mem_mgr_dump_user(struct cam_dump_req_cmd *dump_req); #endif /* _CAM_MEM_MGR_H_ */ diff --git a/drivers/cam_req_mgr/cam_req_mgr_core.c b/drivers/cam_req_mgr/cam_req_mgr_core.c index 090e749df7..b07b45541e 100644 --- a/drivers/cam_req_mgr/cam_req_mgr_core.c +++ b/drivers/cam_req_mgr/cam_req_mgr_core.c @@ -5637,6 +5637,17 @@ int cam_req_mgr_dump_request(struct cam_dump_req_cmd *dump_req) goto end; } + /* + * Dump Mem MGR + */ + rc = cam_mem_mgr_dump_user(dump_req); + if (rc) + CAM_ERR(CAM_REQ, + "Fail to dump mem mgr rc %d", rc); + + /* + * Dump CRM + */ info.offset = dump_req->offset; info.link_hdl = dump_req->link_hdl; info.dev_hdl = 0;