msm: camera: memmgr: Add LDAR Support
Dump mem mgr bufq to user buffer. CRs-Fixed: 3377820 Change-Id: I5be4e245857ccb0602e54546f127793d9f6b03f6 Signed-off-by: Petar Ivanov <quic_pivanov@quicinc.com>
This commit is contained in:

کامیت شده توسط
Camera Software Integration

والد
e01b67112a
کامیت
3cf198f228
@@ -1,7 +1,7 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2016-2021, The Linux Foundation. All rights reserved.
|
* 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 <linux/module.h>
|
#include <linux/module.h>
|
||||||
@@ -31,6 +31,9 @@
|
|||||||
static struct cam_mem_table tbl;
|
static struct cam_mem_table tbl;
|
||||||
static atomic_t cam_mem_mgr_state = ATOMIC_INIT(CAM_MEM_MGR_UNINITIALIZED);
|
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
|
/* cam_mem_mgr_debug - global struct to keep track of debug settings for mem mgr
|
||||||
*
|
*
|
||||||
* @dentry : Directory entry to the mem mgr root folder
|
* @dentry : Directory entry to the mem mgr root folder
|
||||||
@@ -1912,6 +1915,102 @@ ion_fail:
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(cam_mem_mgr_reserve_memory_region);
|
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)
|
int cam_mem_mgr_free_memory_region(struct cam_mem_mgr_memory_desc *inp)
|
||||||
{
|
{
|
||||||
int32_t idx;
|
int32_t idx;
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2016-2021, The Linux Foundation. All rights reserved.
|
* 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_
|
#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,
|
int cam_mem_mgr_retrieve_buffer_from_presil(int32_t buf_handle,
|
||||||
uint32_t buf_size, uint32_t offset, int32_t iommu_hdl);
|
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_ */
|
#endif /* _CAM_MEM_MGR_H_ */
|
||||||
|
@@ -5637,6 +5637,17 @@ int cam_req_mgr_dump_request(struct cam_dump_req_cmd *dump_req)
|
|||||||
goto end;
|
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.offset = dump_req->offset;
|
||||||
info.link_hdl = dump_req->link_hdl;
|
info.link_hdl = dump_req->link_hdl;
|
||||||
info.dev_hdl = 0;
|
info.dev_hdl = 0;
|
||||||
|
مرجع در شماره جدید
Block a user