msm: camera: memmgr: Add missing calls of put buf to avoid leak

This change add missing calls to put cpu buf in few scenarios.

CRs-Fixed: 3578162
Change-Id: Iab6aa0324b5072390b38df296c7acee00f5102a1
Signed-off-by: Vikram Sharma <quic_vikramsa@quicinc.com>
This commit is contained in:
Vikram Sharma
2023-08-30 17:41:43 +05:30
parent 8a04130f3b
commit ec8012559c
18 changed files with 261 additions and 59 deletions

View File

@@ -253,6 +253,7 @@ int cam_context_buf_done_from_hw(struct cam_context *ctx,
ctx->img_iommu_hdl, req->out_map_entries[j].resource_handle); ctx->img_iommu_hdl, req->out_map_entries[j].resource_handle);
if (rc) { if (rc) {
CAM_ERR(CAM_CTXT, "Failed to retrieve image buffers rc:%d", rc); CAM_ERR(CAM_CTXT, "Failed to retrieve image buffers rc:%d", rc);
cam_packet_util_put_packet_addr(req->pf_data.packet_handle);
return rc; return rc;
} }
} }
@@ -1855,7 +1856,7 @@ static void __cam_context_req_mini_dump(struct cam_ctx_request *req,
if (packet && packet->num_io_configs) { if (packet && packet->num_io_configs) {
bytes_required = packet->num_io_configs * sizeof(struct cam_buf_io_cfg); bytes_required = packet->num_io_configs * sizeof(struct cam_buf_io_cfg);
if (start_addr + bytes_written + bytes_required > end_addr) if (start_addr + bytes_written + bytes_required > end_addr)
goto end; goto exit;
io_cfg = (struct cam_buf_io_cfg *)((uint32_t *)&packet->payload + io_cfg = (struct cam_buf_io_cfg *)((uint32_t *)&packet->payload +
packet->io_configs_offset / 4); packet->io_configs_offset / 4);
@@ -1864,7 +1865,7 @@ static void __cam_context_req_mini_dump(struct cam_ctx_request *req,
bytes_written += bytes_required; bytes_written += bytes_required;
req_md->num_io_cfg = packet->num_io_configs; req_md->num_io_cfg = packet->num_io_configs;
} }
exit:
cam_packet_util_put_packet_addr(req->pf_data.packet_handle); cam_packet_util_put_packet_addr(req->pf_data.packet_handle);
end: end:
*bytes_updated = bytes_written; *bytes_updated = bytes_written;

View File

@@ -3560,6 +3560,7 @@ static int cam_cpas_dump_state_monitor_array_info(
if (buf_len <= dump_info->offset) { if (buf_len <= dump_info->offset) {
CAM_WARN(CAM_CPAS, "Dump buffer overshoot len %zu offset %zu", CAM_WARN(CAM_CPAS, "Dump buffer overshoot len %zu offset %zu",
buf_len, dump_info->offset); buf_len, dump_info->offset);
cam_mem_put_cpu_buf(dump_info->buf_handle);
return -ENOSPC; return -ENOSPC;
} }
@@ -3598,6 +3599,7 @@ static int cam_cpas_dump_state_monitor_array_info(
if (remain_len < min_len) { if (remain_len < min_len) {
CAM_WARN(CAM_CPAS, "Dump buffer exhaust remain %zu min %u", CAM_WARN(CAM_CPAS, "Dump buffer exhaust remain %zu min %u",
remain_len, min_len); remain_len, min_len);
cam_mem_put_cpu_buf(dump_info->buf_handle);
return -ENOSPC; return -ENOSPC;
} }
@@ -3614,6 +3616,7 @@ static int cam_cpas_dump_state_monitor_array_info(
&cpas_core->monitor_entries[index].identifier_string); &cpas_core->monitor_entries[index].identifier_string);
if (rc) { if (rc) {
CAM_ERR(CAM_CPAS, "Dump state info failed, rc: %d", rc); CAM_ERR(CAM_CPAS, "Dump state info failed, rc: %d", rc);
cam_mem_put_cpu_buf(dump_info->buf_handle);
return rc; return rc;
} }
@@ -3621,6 +3624,7 @@ static int cam_cpas_dump_state_monitor_array_info(
} }
dump_info->offset = dump_args.offset; dump_info->offset = dump_args.offset;
cam_mem_put_cpu_buf(dump_info->buf_handle);
return rc; return rc;
} }

View File

@@ -667,7 +667,7 @@ static int cam_fd_mgr_util_prepare_io_buf_info(int32_t iommu_hdl,
"Invalid cpu buf %d %d %d", "Invalid cpu buf %d %d %d",
io_cfg[i].direction, io_cfg[i].direction,
io_cfg[i].resource_type, plane); io_cfg[i].resource_type, plane);
cam_mem_put_cpu_buf(io_cfg[i].mem_handle[plane]; cam_mem_put_cpu_buf(io_cfg[i].mem_handle[plane]);
rc = -EINVAL; rc = -EINVAL;
return rc; return rc;
} }

View File

@@ -989,6 +989,7 @@ static int cam_isp_ctx_dump_req(
if (dump_to_buff) { if (dump_to_buff) {
if (!cpu_addr || !offset || !buf_len) { if (!cpu_addr || !offset || !buf_len) {
CAM_ERR(CAM_ISP, "Invalid args"); CAM_ERR(CAM_ISP, "Invalid args");
cam_mem_put_cpu_buf(req_isp->cfg[i].handle);
break; break;
} }
dump_info.src_start = buf_start; dump_info.src_start = buf_start;
@@ -999,8 +1000,10 @@ static int cam_isp_ctx_dump_req(
rc = cam_cdm_util_dump_cmd_bufs_v2( rc = cam_cdm_util_dump_cmd_bufs_v2(
&dump_info); &dump_info);
*offset = dump_info.dst_offset; *offset = dump_info.dst_offset;
if (rc) if (rc) {
cam_mem_put_cpu_buf(req_isp->cfg[i].handle);
return rc; return rc;
}
} else } else
cam_cdm_util_dump_cmd_buf(buf_start, buf_end); cam_cdm_util_dump_cmd_buf(buf_start, buf_end);
cam_mem_put_cpu_buf(req_isp->cfg[i].handle); cam_mem_put_cpu_buf(req_isp->cfg[i].handle);
@@ -1751,7 +1754,6 @@ static int __cam_isp_ctx_handle_buf_done_for_req_list(
req_isp->fence_map_out[i].sync_id, req_isp->fence_map_out[i].sync_id,
CAM_SYNC_STATE_SIGNALED_ERROR, CAM_SYNC_STATE_SIGNALED_ERROR,
CAM_SYNC_ISP_EVENT_BUBBLE); CAM_SYNC_ISP_EVENT_BUBBLE);
list_add_tail(&req->list, &ctx->free_req_list); list_add_tail(&req->list, &ctx->free_req_list);
CAM_DBG(CAM_REQ, CAM_DBG(CAM_REQ,
"Move active request %lld to free list(cnt = %d) [flushed], ctx %u, link: 0x%x", "Move active request %lld to free list(cnt = %d) [flushed], ctx %u, link: 0x%x",
@@ -5412,7 +5414,8 @@ hw_dump:
if (rc) { if (rc) {
CAM_ERR(CAM_ISP, "Invalid handle %u rc %d, ctx_idx: %u, link: 0x%x", CAM_ERR(CAM_ISP, "Invalid handle %u rc %d, ctx_idx: %u, link: 0x%x",
dump_info->buf_handle, rc, ctx->ctx_id, ctx->link_hdl); dump_info->buf_handle, rc, ctx->ctx_id, ctx->link_hdl);
goto end; spin_unlock_bh(&ctx->lock);
return rc;
} }
if (buf_len <= dump_info->offset) { if (buf_len <= dump_info->offset) {
spin_unlock_bh(&ctx->lock); spin_unlock_bh(&ctx->lock);

View File

@@ -4896,7 +4896,8 @@ static void cam_tfe_mgr_dump_pf_data(
pf_cmd_args = hw_cmd_args->u.pf_cmd_args; pf_cmd_args = hw_cmd_args->u.pf_cmd_args;
rc = cam_packet_util_get_packet_addr(&packet, rc = cam_packet_util_get_packet_addr(&packet,
pf_cmd_args->pf_req_info->packet_handle, pf_cmd_args->pf_req_info->packet_offset); pf_cmd_args->pf_req_info->packet_handle,
pf_cmd_args->pf_req_info->packet_offset);
if (rc) if (rc)
return; return;
ctx_found = &pf_cmd_args->pf_args->pf_context_info.ctx_found; ctx_found = &pf_cmd_args->pf_args->pf_context_info.ctx_found;
@@ -4925,6 +4926,7 @@ static void cam_tfe_mgr_dump_pf_data(
CAM_INFO(CAM_ISP, CAM_INFO(CAM_ISP,
"PID:%d is not matching with any TFE HW PIDs ctx id:%d", "PID:%d is not matching with any TFE HW PIDs ctx id:%d",
pf_cmd_args->pf_args->pf_smmu_info->pid, ctx->ctx_index); pf_cmd_args->pf_args->pf_smmu_info->pid, ctx->ctx_index);
cam_packet_util_put_packet_addr(pf_cmd_args->pf_req_info->packet_handle);
return; return;
} }
@@ -4939,6 +4941,7 @@ static void cam_tfe_mgr_dump_pf_data(
CAM_INFO(CAM_ISP, CAM_INFO(CAM_ISP,
"This context does not cause pf:pid:%d hw id:%d ctx_id:%d", "This context does not cause pf:pid:%d hw id:%d ctx_id:%d",
pf_cmd_args->pf_args->pf_smmu_info->pid, hw_id, ctx->ctx_index); pf_cmd_args->pf_args->pf_smmu_info->pid, hw_id, ctx->ctx_index);
cam_packet_util_put_packet_addr(pf_cmd_args->pf_req_info->packet_handle);
return; return;
} }
@@ -4946,7 +4949,6 @@ static void cam_tfe_mgr_dump_pf_data(
hw_mgr_res = &ctx->res_list_tfe_out[i]; hw_mgr_res = &ctx->res_list_tfe_out[i];
if (!hw_mgr_res->hw_res[0]) if (!hw_mgr_res->hw_res[0])
continue; continue;
break; break;
} }
@@ -4954,6 +4956,7 @@ static void cam_tfe_mgr_dump_pf_data(
CAM_ERR(CAM_ISP, CAM_ERR(CAM_ISP,
"NO valid outport resources ctx id:%d req id:%lld", "NO valid outport resources ctx id:%d req id:%lld",
ctx->ctx_index, packet->header.request_id); ctx->ctx_index, packet->header.request_id);
cam_packet_util_put_packet_addr(pf_cmd_args->pf_req_info->packet_handle);
return; return;
} }
@@ -4967,11 +4970,11 @@ static void cam_tfe_mgr_dump_pf_data(
hw_mgr_res->hw_res[0]->hw_intf->hw_priv, hw_mgr_res->hw_res[0]->hw_intf->hw_priv,
cmd_update.cmd_type, &cmd_update, cmd_update.cmd_type, &cmd_update,
sizeof(struct cam_isp_hw_get_cmd_update)); sizeof(struct cam_isp_hw_get_cmd_update));
if (rc) { if (rc) {
CAM_ERR(CAM_ISP, CAM_ERR(CAM_ISP,
"getting mid port resource id failed ctx id:%d req id:%lld", "getting mid port resource id failed ctx id:%d req id:%lld",
ctx->ctx_index, packet->header.request_id); ctx->ctx_index, packet->header.request_id);
cam_packet_util_put_packet_addr(pf_cmd_args->pf_req_info->packet_handle);
return; return;
} }
CAM_ERR(CAM_ISP, CAM_ERR(CAM_ISP,

View File

@@ -1990,11 +1990,13 @@ static void cam_jpeg_mgr_dump_pf_data(
&jpeg_pid_mid_args, sizeof(jpeg_pid_mid_args)); &jpeg_pid_mid_args, sizeof(jpeg_pid_mid_args));
if (rc) { if (rc) {
CAM_ERR(CAM_JPEG, "CAM_JPEG_CMD_MATCH_PID_MID failed %d", rc); CAM_ERR(CAM_JPEG, "CAM_JPEG_CMD_MATCH_PID_MID failed %d", rc);
cam_packet_util_put_packet_addr(pf_req_info->packet_handle);
return; return;
} }
if (!jpeg_pid_mid_args.pid_match_found) { if (!jpeg_pid_mid_args.pid_match_found) {
CAM_INFO(CAM_JPEG, "This context data is not matched with pf pid and mid"); CAM_INFO(CAM_JPEG, "This context data is not matched with pf pid and mid");
cam_packet_util_put_packet_addr(pf_req_info->packet_handle);
return; return;
} }
pf_args->pf_context_info.resource_type = jpeg_pid_mid_args.match_res; pf_args->pf_context_info.resource_type = jpeg_pid_mid_args.match_res;

View File

@@ -2229,8 +2229,6 @@ static int cam_ope_mgr_process_cmd_buf_req(struct cam_ope_hw_mgr *hw_mgr,
ope_request->ope_kmd_buf.cpu_addr, ope_request->ope_kmd_buf.cpu_addr,
ope_request->ope_kmd_buf.iova_addr, ope_request->ope_kmd_buf.iova_addr,
ope_request->ope_kmd_buf.iova_cdm_addr); ope_request->ope_kmd_buf.iova_cdm_addr);
cam_mem_put_cpu_buf(cmd_buf->mem_handle);
break;
} else if (cmd_buf->cmd_buf_usage == } else if (cmd_buf->cmd_buf_usage ==
OPE_CMD_BUF_DEBUG) { OPE_CMD_BUF_DEBUG) {
ope_request->ope_debug_buf.cpu_addr = ope_request->ope_debug_buf.cpu_addr =
@@ -2245,8 +2243,6 @@ static int cam_ope_mgr_process_cmd_buf_req(struct cam_ope_hw_mgr *hw_mgr,
cmd_buf->offset; cmd_buf->offset;
CAM_DBG(CAM_OPE, "dbg buf = %x", CAM_DBG(CAM_OPE, "dbg buf = %x",
ope_request->ope_debug_buf.cpu_addr); ope_request->ope_debug_buf.cpu_addr);
cam_mem_put_cpu_buf(cmd_buf->mem_handle);
break;
} }
cam_mem_put_cpu_buf(cmd_buf->mem_handle); cam_mem_put_cpu_buf(cmd_buf->mem_handle);
break; break;
@@ -2310,8 +2306,8 @@ static int cam_ope_mgr_process_cmd_desc(struct cam_ope_hw_mgr *hw_mgr,
if (cmd_desc[i].type != CAM_CMD_BUF_GENERIC || if (cmd_desc[i].type != CAM_CMD_BUF_GENERIC ||
cmd_desc[i].meta_data == OPE_CMD_META_GENERIC_BLOB) cmd_desc[i].meta_data == OPE_CMD_META_GENERIC_BLOB)
continue; continue;
rc = cam_mem_get_cpu_buf(cmd_desc[i].mem_handle,
rc = cam_mem_get_cpu_buf(cmd_desc[i].mem_handle, &cpu_addr, &len); &cpu_addr, &len);
if (rc || !cpu_addr) { if (rc || !cpu_addr) {
CAM_ERR(CAM_OPE, "get cmd buf failed %x", CAM_ERR(CAM_OPE, "get cmd buf failed %x",
hw_mgr->iommu_hdl); hw_mgr->iommu_hdl);
@@ -4212,6 +4208,7 @@ static void cam_ope_mgr_dump_pf_data(
CAM_INFO(CAM_OPE, CAM_INFO(CAM_OPE,
"PID:%d is not matching with any OPE HW PIDs ctx id:%d", "PID:%d is not matching with any OPE HW PIDs ctx id:%d",
pf_args->pf_smmu_info->pid, ctx_data->ctx_id); pf_args->pf_smmu_info->pid, ctx_data->ctx_id);
cam_packet_util_put_packet_addr(pf_req_info->packet_handle);
return; return;
} }
@@ -4224,6 +4221,7 @@ static void cam_ope_mgr_dump_pf_data(
if (rc) { if (rc) {
CAM_ERR(CAM_OPE, CAM_ERR(CAM_OPE,
"CAM_OPE_CMD_MATCH_PID_MID failed %d", rc); "CAM_OPE_CMD_MATCH_PID_MID failed %d", rc);
cam_packet_util_put_packet_addr(pf_req_info->packet_handle);
return; return;
} }

View File

@@ -95,17 +95,15 @@ static void cam_mem_mgr_print_tbl(void)
CAM_GET_TIMESTAMP(current_ts); CAM_GET_TIMESTAMP(current_ts);
CAM_CONVERT_TIMESTAMP_FORMAT(current_ts, hrs, min, sec, ms); CAM_CONVERT_TIMESTAMP_FORMAT(current_ts, hrs, min, sec, ms);
CAM_INFO(CAM_MEM, "***%llu:%llu:%llu:%llu Mem mgr table dump***", CAM_INFO(CAM_MEM, "***%llu:%llu:%llu:%llu Mem mgr table dump***",
hrs, min, sec, ms); hrs, min, sec, ms);
for (i = 1; i < CAM_MEM_BUFQ_MAX; i++) { for (i = 1; i < CAM_MEM_BUFQ_MAX; i++) {
if (tbl.bufq[i].active) {
CAM_CONVERT_TIMESTAMP_FORMAT((tbl.bufq[i].timestamp), hrs, min, sec, ms); CAM_CONVERT_TIMESTAMP_FORMAT((tbl.bufq[i].timestamp), hrs, min, sec, ms);
CAM_INFO(CAM_MEM, CAM_INFO(CAM_MEM,
"%llu:%llu:%llu:%llu idx %d fd %d i_ino %lu size %llu", "%llu:%llu:%llu:%llu idx %d fd %d i_ino %lu size %llu active %d buf_handle %d refCount %d buf_name %s",
hrs, min, sec, ms, i, tbl.bufq[i].fd, tbl.bufq[i].i_ino, hrs, min, sec, ms, i, tbl.bufq[i].fd, tbl.bufq[i].i_ino,
tbl.bufq[i].len); tbl.bufq[i].len, tbl.bufq[i].active, tbl.bufq[i].buf_handle,
} kref_read(&tbl.bufq[i].krefcount), tbl.bufq[i].buf_name);
} }
} }
@@ -338,6 +336,7 @@ static int32_t cam_mem_get_slot(void)
set_bit(idx, tbl.bitmap); set_bit(idx, tbl.bitmap);
tbl.bufq[idx].active = true; tbl.bufq[idx].active = true;
tbl.bufq[idx].release_deferred = false;
CAM_GET_TIMESTAMP((tbl.bufq[idx].timestamp)); CAM_GET_TIMESTAMP((tbl.bufq[idx].timestamp));
mutex_init(&tbl.bufq[idx].q_lock); mutex_init(&tbl.bufq[idx].q_lock);
mutex_unlock(&tbl.m_lock); mutex_unlock(&tbl.m_lock);
@@ -350,6 +349,7 @@ static void cam_mem_put_slot(int32_t idx)
mutex_lock(&tbl.m_lock); mutex_lock(&tbl.m_lock);
mutex_lock(&tbl.bufq[idx].q_lock); mutex_lock(&tbl.bufq[idx].q_lock);
tbl.bufq[idx].active = false; tbl.bufq[idx].active = false;
tbl.bufq[idx].release_deferred = false;
tbl.bufq[idx].is_internal = false; tbl.bufq[idx].is_internal = false;
memset(&tbl.bufq[idx].timestamp, 0, sizeof(struct timespec64)); memset(&tbl.bufq[idx].timestamp, 0, sizeof(struct timespec64));
mutex_unlock(&tbl.bufq[idx].q_lock); mutex_unlock(&tbl.bufq[idx].q_lock);
@@ -1341,6 +1341,7 @@ int cam_mem_mgr_alloc_and_map(struct cam_mem_mgr_alloc_cmd_v2 *cmd)
if (idx < 0) { if (idx < 0) {
CAM_ERR(CAM_MEM, "Failed in getting mem slot, idx=%d", idx); CAM_ERR(CAM_MEM, "Failed in getting mem slot, idx=%d", idx);
rc = -ENOMEM; rc = -ENOMEM;
cam_mem_mgr_print_tbl();
goto slot_fail; goto slot_fail;
} }
@@ -1417,6 +1418,7 @@ int cam_mem_mgr_alloc_and_map(struct cam_mem_mgr_alloc_cmd_v2 *cmd)
tbl.bufq[idx].is_imported = false; tbl.bufq[idx].is_imported = false;
kref_init(&tbl.bufq[idx].krefcount); kref_init(&tbl.bufq[idx].krefcount);
tbl.bufq[idx].smmu_mapping_client = CAM_SMMU_MAPPING_USER; tbl.bufq[idx].smmu_mapping_client = CAM_SMMU_MAPPING_USER;
strscpy(tbl.bufq[idx].buf_name, cmd->buf_name, sizeof(tbl.bufq[idx].buf_name));
mutex_unlock(&tbl.bufq[idx].q_lock); mutex_unlock(&tbl.bufq[idx].q_lock);
cmd->out.buf_handle = tbl.bufq[idx].buf_handle; cmd->out.buf_handle = tbl.bufq[idx].buf_handle;
@@ -1502,6 +1504,7 @@ int cam_mem_mgr_map(struct cam_mem_mgr_map_cmd_v2 *cmd)
CAM_ERR(CAM_MEM, "Failed in getting mem slot, idx=%d, fd=%d", CAM_ERR(CAM_MEM, "Failed in getting mem slot, idx=%d, fd=%d",
idx, cmd->fd); idx, cmd->fd);
rc = -ENOMEM; rc = -ENOMEM;
cam_mem_mgr_print_tbl();
goto slot_fail; goto slot_fail;
} }
@@ -1550,6 +1553,7 @@ int cam_mem_mgr_map(struct cam_mem_mgr_map_cmd_v2 *cmd)
tbl.bufq[idx].is_internal = is_internal; tbl.bufq[idx].is_internal = is_internal;
kref_init(&tbl.bufq[idx].krefcount); kref_init(&tbl.bufq[idx].krefcount);
tbl.bufq[idx].smmu_mapping_client = CAM_SMMU_MAPPING_USER; tbl.bufq[idx].smmu_mapping_client = CAM_SMMU_MAPPING_USER;
strscpy(tbl.bufq[idx].buf_name, cmd->buf_name, sizeof(tbl.bufq[idx].buf_name));
mutex_unlock(&tbl.bufq[idx].q_lock); mutex_unlock(&tbl.bufq[idx].q_lock);
cmd->out.buf_handle = tbl.bufq[idx].buf_handle; cmd->out.buf_handle = tbl.bufq[idx].buf_handle;
@@ -1688,6 +1692,7 @@ static int cam_mem_mgr_cleanup_table(void)
tbl.bufq[i].num_hdls = 0; tbl.bufq[i].num_hdls = 0;
tbl.bufq[i].dma_buf = NULL; tbl.bufq[i].dma_buf = NULL;
tbl.bufq[i].active = false; tbl.bufq[i].active = false;
tbl.bufq[i].release_deferred = false;
tbl.bufq[i].is_internal = false; tbl.bufq[i].is_internal = false;
memset(tbl.bufq[i].hdls_info, 0x0, tbl.max_hdls_info_size); memset(tbl.bufq[i].hdls_info, 0x0, tbl.max_hdls_info_size);
cam_mem_mgr_reset_presil_params(i); cam_mem_mgr_reset_presil_params(i);
@@ -1758,6 +1763,7 @@ static void cam_mem_util_unmap(struct kref *kref)
/* Deactivate the buffer queue to prevent multiple unmap */ /* Deactivate the buffer queue to prevent multiple unmap */
mutex_lock(&tbl.bufq[idx].q_lock); mutex_lock(&tbl.bufq[idx].q_lock);
tbl.bufq[idx].active = false; tbl.bufq[idx].active = false;
tbl.bufq[idx].release_deferred = false;
mutex_unlock(&tbl.bufq[idx].q_lock); mutex_unlock(&tbl.bufq[idx].q_lock);
mutex_unlock(&tbl.m_lock); mutex_unlock(&tbl.m_lock);
@@ -1823,6 +1829,8 @@ static void cam_mem_util_unmap(struct kref *kref)
void cam_mem_put_cpu_buf(int32_t buf_handle) void cam_mem_put_cpu_buf(int32_t buf_handle)
{ {
int idx; int idx;
uint64_t ms, hrs, min, sec;
struct timespec64 current_ts;
if (!buf_handle) { if (!buf_handle) {
CAM_ERR(CAM_MEM, "Invalid buf_handle"); CAM_ERR(CAM_MEM, "Invalid buf_handle");
@@ -1846,11 +1854,25 @@ void cam_mem_put_cpu_buf(int32_t buf_handle)
return; return;
} }
if (kref_put(&tbl.bufq[idx].krefcount, cam_mem_util_unmap)) if (kref_put(&tbl.bufq[idx].krefcount, cam_mem_util_unmap)) {
CAM_GET_TIMESTAMP(current_ts);
CAM_CONVERT_TIMESTAMP_FORMAT(current_ts, hrs, min, sec, ms);
CAM_DBG(CAM_MEM, CAM_DBG(CAM_MEM,
"Called unmap from here, buf_handle: %u, idx: %d", "%llu:%llu:%llu:%llu Called unmap from here, buf_handle: %u, idx: %d",
buf_handle, idx); hrs, min, sec, ms, buf_handle, idx);
} else if (tbl.bufq[idx].release_deferred) {
CAM_CONVERT_TIMESTAMP_FORMAT((tbl.bufq[idx].timestamp), hrs, min, sec, ms);
CAM_ERR(CAM_MEM,
"%llu:%llu:%llu:%llu idx %d fd %d i_ino %lu size %llu active %d buf_handle %d refCount %d buf_name %s",
hrs, min, sec, ms, idx, tbl.bufq[idx].fd, tbl.bufq[idx].i_ino,
tbl.bufq[idx].len, tbl.bufq[idx].active, tbl.bufq[idx].buf_handle,
kref_read(&tbl.bufq[idx].krefcount), tbl.bufq[idx].buf_name);
CAM_GET_TIMESTAMP(current_ts);
CAM_CONVERT_TIMESTAMP_FORMAT(current_ts, hrs, min, sec, ms);
CAM_ERR(CAM_MEM,
"%llu:%llu:%llu:%llu Not unmapping even after defer, buf_handle: %u, idx: %d",
hrs, min, sec, ms, buf_handle, idx);
}
} }
EXPORT_SYMBOL(cam_mem_put_cpu_buf); EXPORT_SYMBOL(cam_mem_put_cpu_buf);
@@ -1859,6 +1881,8 @@ int cam_mem_mgr_release(struct cam_mem_mgr_release_cmd *cmd)
{ {
int idx; int idx;
int rc = 0; int rc = 0;
uint64_t ms, hrs, min, sec;
struct timespec64 current_ts;
if (!atomic_read(&cam_mem_mgr_state)) { if (!atomic_read(&cam_mem_mgr_state)) {
CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized"); CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized");
@@ -1890,17 +1914,21 @@ int cam_mem_mgr_release(struct cam_mem_mgr_release_cmd *cmd)
} }
CAM_DBG(CAM_MEM, "Releasing hdl = %x, idx = %d", cmd->buf_handle, idx); CAM_DBG(CAM_MEM, "Releasing hdl = %x, idx = %d", cmd->buf_handle, idx);
if (kref_put(&tbl.bufq[idx].krefcount, cam_mem_util_unmap)) { if (kref_put(&tbl.bufq[idx].krefcount, cam_mem_util_unmap)) {
CAM_DBG(CAM_MEM, CAM_DBG(CAM_MEM,
"Called unmap from here, buf_handle: %u, idx: %d", "Called unmap from here, buf_handle: %u, idx: %d",
cmd->buf_handle, idx); cmd->buf_handle, idx);
} else { } else {
rc = -EINVAL; rc = -EINVAL;
CAM_GET_TIMESTAMP(current_ts);
CAM_CONVERT_TIMESTAMP_FORMAT(current_ts, hrs, min, sec, ms);
CAM_CONVERT_TIMESTAMP_FORMAT((tbl.bufq[idx].timestamp), hrs, min, sec, ms);
CAM_ERR(CAM_MEM, CAM_ERR(CAM_MEM,
"Unbalanced release Called buf_handle: %u, idx: %d", "%llu:%llu:%llu:%llu idx %d fd %d i_ino %lu size %llu active %d buf_handle %d refCount %d buf_name %s",
cmd->buf_handle, idx); hrs, min, sec, ms, idx, tbl.bufq[idx].fd, tbl.bufq[idx].i_ino,
tbl.bufq[idx].len, tbl.bufq[idx].active, tbl.bufq[idx].buf_handle,
kref_read(&tbl.bufq[idx].krefcount), tbl.bufq[idx].buf_name);
tbl.bufq[idx].release_deferred = true;
} }
return rc; return rc;
} }
@@ -1992,6 +2020,7 @@ int cam_mem_mgr_request_mem(struct cam_mem_mgr_request_desc *inp,
if (idx < 0) { if (idx < 0) {
CAM_ERR(CAM_MEM, "Failed in getting mem slot, idx=%d", idx); CAM_ERR(CAM_MEM, "Failed in getting mem slot, idx=%d", idx);
rc = -ENOMEM; rc = -ENOMEM;
cam_mem_mgr_print_tbl();
goto slot_fail; goto slot_fail;
} }
@@ -2154,6 +2183,7 @@ int cam_mem_mgr_reserve_memory_region(struct cam_mem_mgr_request_desc *inp,
if (idx < 0) { if (idx < 0) {
CAM_ERR(CAM_MEM, "Failed in getting mem slot, idx=%d", idx); CAM_ERR(CAM_MEM, "Failed in getting mem slot, idx=%d", idx);
rc = -ENOMEM; rc = -ENOMEM;
cam_mem_mgr_print_tbl();
goto slot_fail; goto slot_fail;
} }
@@ -2251,6 +2281,7 @@ int cam_mem_mgr_dump_user(struct cam_dump_req_cmd *dump_req)
if (buf_len <= dump_req->offset) { if (buf_len <= dump_req->offset) {
CAM_WARN(CAM_MEM, "Dump buffer overshoot len %zu offset %zu", CAM_WARN(CAM_MEM, "Dump buffer overshoot len %zu offset %zu",
buf_len, dump_req->offset); buf_len, dump_req->offset);
cam_mem_put_cpu_buf(dump_req->buf_handle);
return -ENOSPC; return -ENOSPC;
} }
@@ -2263,6 +2294,7 @@ int cam_mem_mgr_dump_user(struct cam_dump_req_cmd *dump_req)
if (remain_len < min_len) { if (remain_len < min_len) {
CAM_WARN(CAM_MEM, "Dump buffer exhaust remain %zu min %u", CAM_WARN(CAM_MEM, "Dump buffer exhaust remain %zu min %u",
remain_len, min_len); remain_len, min_len);
cam_mem_put_cpu_buf(dump_req->buf_handle);
return -ENOSPC; return -ENOSPC;
} }
@@ -2292,6 +2324,7 @@ int cam_mem_mgr_dump_user(struct cam_dump_req_cmd *dump_req)
mutex_unlock(&tbl.m_lock); mutex_unlock(&tbl.m_lock);
dump_req->offset = dump_args.offset; dump_req->offset = dump_args.offset;
cam_mem_put_cpu_buf(dump_req->buf_handle);
return rc; return rc;
} }

View File

@@ -77,12 +77,14 @@ struct cam_mem_buf_hw_hdl_info {
* using the same indexing as SMMU * using the same indexing as SMMU
* @kmdvaddr: Kernel virtual address * @kmdvaddr: Kernel virtual address
* @active: state of the buffer * @active: state of the buffer
* @release_deferred: Buffer is deferred for release.
* @is_imported: Flag indicating if buffer is imported from an FD in user space * @is_imported: Flag indicating if buffer is imported from an FD in user space
* @is_internal: Flag indicating kernel allocated buffer * @is_internal: Flag indicating kernel allocated buffer
* @timestamp: Timestamp at which this entry in tbl was made * @timestamp: Timestamp at which this entry in tbl was made
* @krefcount: Reference counter to track whether the buffer is * @krefcount: Reference counter to track whether the buffer is
* mapped and in use * mapped and in use
* @smmu_mapping_client: Client buffer (User or kernel) * @smmu_mapping_client: Client buffer (User or kernel)
* @buf_name: Name associated with buffer.
* @presil_params: Parameters specific to presil environment * @presil_params: Parameters specific to presil environment
*/ */
struct cam_mem_buf_queue { struct cam_mem_buf_queue {
@@ -98,11 +100,13 @@ struct cam_mem_buf_queue {
int32_t num_hdls; int32_t num_hdls;
struct cam_mem_buf_hw_hdl_info *hdls_info; struct cam_mem_buf_hw_hdl_info *hdls_info;
bool active; bool active;
bool release_deferred;
bool is_imported; bool is_imported;
bool is_internal; bool is_internal;
struct timespec64 timestamp; struct timespec64 timestamp;
struct kref krefcount; struct kref krefcount;
enum cam_smmu_mapping_client smmu_mapping_client; enum cam_smmu_mapping_client smmu_mapping_client;
char buf_name[CAM_DMA_BUF_NAME_LEN];
#ifdef CONFIG_CAM_PRESIL #ifdef CONFIG_CAM_PRESIL
struct cam_presil_dmabuf_params presil_params; struct cam_presil_dmabuf_params presil_params;

View File

@@ -527,6 +527,7 @@ int32_t cam_actuator_i2c_pkt_parse(struct cam_actuator_ctrl_t *a_ctrl,
cmd_buf = (uint32_t *)generic_ptr; cmd_buf = (uint32_t *)generic_ptr;
if (!cmd_buf) { if (!cmd_buf) {
CAM_ERR(CAM_ACTUATOR, "invalid cmd buf"); CAM_ERR(CAM_ACTUATOR, "invalid cmd buf");
cam_mem_put_cpu_buf(cmd_desc[i].mem_handle);
rc = -EINVAL; rc = -EINVAL;
goto end; goto end;
} }
@@ -535,6 +536,7 @@ int32_t cam_actuator_i2c_pkt_parse(struct cam_actuator_ctrl_t *a_ctrl,
sizeof(struct common_header)))) { sizeof(struct common_header)))) {
CAM_ERR(CAM_ACTUATOR, CAM_ERR(CAM_ACTUATOR,
"Invalid length for sensor cmd"); "Invalid length for sensor cmd");
cam_mem_put_cpu_buf(cmd_desc[i].mem_handle);
rc = -EINVAL; rc = -EINVAL;
goto end; goto end;
} }
@@ -551,6 +553,7 @@ int32_t cam_actuator_i2c_pkt_parse(struct cam_actuator_ctrl_t *a_ctrl,
if (rc < 0) { if (rc < 0) {
CAM_ERR(CAM_ACTUATOR, CAM_ERR(CAM_ACTUATOR,
"Failed to parse slave info: %d", rc); "Failed to parse slave info: %d", rc);
cam_mem_put_cpu_buf(cmd_desc[i].mem_handle);
goto end; goto end;
} }
break; break;
@@ -566,6 +569,7 @@ int32_t cam_actuator_i2c_pkt_parse(struct cam_actuator_ctrl_t *a_ctrl,
CAM_ERR(CAM_ACTUATOR, CAM_ERR(CAM_ACTUATOR,
"Failed:parse power settings: %d", "Failed:parse power settings: %d",
rc); rc);
cam_mem_put_cpu_buf(cmd_desc[i].mem_handle);
goto end; goto end;
} }
break; break;
@@ -586,6 +590,7 @@ int32_t cam_actuator_i2c_pkt_parse(struct cam_actuator_ctrl_t *a_ctrl,
CAM_ERR(CAM_ACTUATOR, CAM_ERR(CAM_ACTUATOR,
"Failed:parse init settings: %d", "Failed:parse init settings: %d",
rc); rc);
cam_mem_put_cpu_buf(cmd_desc[i].mem_handle);
goto end; goto end;
} }
break; break;

View File

@@ -659,7 +659,6 @@ static int __cam_csiphy_parse_lane_info_cmd_buf(
uintptr_t generic_ptr; uintptr_t generic_ptr;
uint32_t *cmd_buf = NULL; uint32_t *cmd_buf = NULL;
size_t len; size_t len;
rc = cam_mem_get_cpu_buf(cmd_desc->mem_handle, rc = cam_mem_get_cpu_buf(cmd_desc->mem_handle,
&generic_ptr, &len); &generic_ptr, &len);
if (rc < 0) { if (rc < 0) {
@@ -673,6 +672,7 @@ static int __cam_csiphy_parse_lane_info_cmd_buf(
index = cam_csiphy_get_instance_offset(csiphy_dev, dev_handle); index = cam_csiphy_get_instance_offset(csiphy_dev, dev_handle);
if (index < 0 || index >= csiphy_dev->session_max_device_support) { if (index < 0 || index >= csiphy_dev->session_max_device_support) {
CAM_ERR(CAM_CSIPHY, "index in invalid: %d", index); CAM_ERR(CAM_CSIPHY, "index in invalid: %d", index);
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
return -EINVAL; return -EINVAL;
} }
@@ -684,6 +684,7 @@ static int __cam_csiphy_parse_lane_info_cmd_buf(
CAM_ERR(CAM_CSIPHY, CAM_ERR(CAM_CSIPHY,
"Not enough buffer provided for cam_csiphy_info"); "Not enough buffer provided for cam_csiphy_info");
rc = -EINVAL; rc = -EINVAL;
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
return rc; return rc;
} }
@@ -693,6 +694,7 @@ static int __cam_csiphy_parse_lane_info_cmd_buf(
if (rc) { if (rc) {
CAM_ERR(CAM_CSIPHY, "Wrong configuration lane_cnt: %u", CAM_ERR(CAM_CSIPHY, "Wrong configuration lane_cnt: %u",
cam_cmd_csiphy_info_v2->lane_cnt); cam_cmd_csiphy_info_v2->lane_cnt);
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
return rc; return rc;
} }
@@ -721,6 +723,7 @@ static int __cam_csiphy_parse_lane_info_cmd_buf(
CAM_ERR(CAM_CSIPHY, CAM_ERR(CAM_CSIPHY,
"Not enough buffer provided for cam_csiphy_info"); "Not enough buffer provided for cam_csiphy_info");
rc = -EINVAL; rc = -EINVAL;
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
return rc; return rc;
} }
@@ -730,6 +733,7 @@ static int __cam_csiphy_parse_lane_info_cmd_buf(
if (rc) { if (rc) {
CAM_ERR(CAM_CSIPHY, "Wrong configuration lane_cnt: %u", CAM_ERR(CAM_CSIPHY, "Wrong configuration lane_cnt: %u",
cam_cmd_csiphy_info->lane_cnt); cam_cmd_csiphy_info->lane_cnt);
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
return rc; return rc;
} }
@@ -763,6 +767,7 @@ static int __cam_csiphy_parse_lane_info_cmd_buf(
"Cannot support %s combo mode with differnt preamble settings", "Cannot support %s combo mode with differnt preamble settings",
(csiphy_dev->csiphy_info[index].csiphy_3phase ? (csiphy_dev->csiphy_info[index].csiphy_3phase ?
"CPHY" : "DPHY")); "CPHY" : "DPHY"));
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
return -EINVAL; return -EINVAL;
} }
@@ -955,6 +960,7 @@ int32_t cam_cmd_buf_parser(struct csiphy_device *csiphy_dev,
CAM_ERR(CAM_CSIPHY, CAM_ERR(CAM_CSIPHY,
"Inval cam_packet strut size: %zu, len_of_buff: %zu", "Inval cam_packet strut size: %zu, len_of_buff: %zu",
sizeof(struct cam_packet), len); sizeof(struct cam_packet), len);
cam_mem_put_cpu_buf(cfg_dev->packet_handle);
rc = -EINVAL; rc = -EINVAL;
return rc; return rc;
} }
@@ -966,6 +972,7 @@ int32_t cam_cmd_buf_parser(struct csiphy_device *csiphy_dev,
if (cam_packet_util_validate_packet(csl_packet, if (cam_packet_util_validate_packet(csl_packet,
remain_len)) { remain_len)) {
CAM_ERR(CAM_CSIPHY, "Invalid packet params"); CAM_ERR(CAM_CSIPHY, "Invalid packet params");
cam_mem_put_cpu_buf(cfg_dev->packet_handle);
rc = -EINVAL; rc = -EINVAL;
return rc; return rc;
} }
@@ -976,6 +983,7 @@ int32_t cam_cmd_buf_parser(struct csiphy_device *csiphy_dev,
csl_packet->cmd_buf_offset / 4); csl_packet->cmd_buf_offset / 4);
else { else {
CAM_ERR(CAM_CSIPHY, "num_cmd_buffer = %d", csl_packet->num_cmd_buf); CAM_ERR(CAM_CSIPHY, "num_cmd_buffer = %d", csl_packet->num_cmd_buf);
cam_mem_put_cpu_buf(cfg_dev->packet_handle);
rc = -EINVAL; rc = -EINVAL;
return rc; return rc;
} }
@@ -985,8 +993,10 @@ int32_t cam_cmd_buf_parser(struct csiphy_device *csiphy_dev,
for (i = 0; i < csl_packet->num_cmd_buf; i++) { for (i = 0; i < csl_packet->num_cmd_buf; i++) {
rc = cam_packet_util_validate_cmd_desc(&cmd_desc[i]); rc = cam_packet_util_validate_cmd_desc(&cmd_desc[i]);
if (rc) if (rc) {
cam_mem_put_cpu_buf(cfg_dev->packet_handle);
return rc; return rc;
}
cmd_buf_type = cmd_desc[i].meta_data; cmd_buf_type = cmd_desc[i].meta_data;

View File

@@ -1104,6 +1104,7 @@ static int32_t cam_eeprom_get_cal_data(struct cam_eeprom_ctrl_t *e_ctrl,
} }
if (buf_size <= io_cfg->offsets[0]) { if (buf_size <= io_cfg->offsets[0]) {
CAM_ERR(CAM_EEPROM, "Not enough buffer"); CAM_ERR(CAM_EEPROM, "Not enough buffer");
cam_mem_put_cpu_buf(io_cfg->mem_handle[0]);
rc = -EINVAL; rc = -EINVAL;
return rc; return rc;
} }
@@ -1116,6 +1117,7 @@ static int32_t cam_eeprom_get_cal_data(struct cam_eeprom_ctrl_t *e_ctrl,
if (!read_buffer) { if (!read_buffer) {
CAM_ERR(CAM_EEPROM, CAM_ERR(CAM_EEPROM,
"invalid buffer to copy data"); "invalid buffer to copy data");
cam_mem_put_cpu_buf(io_cfg->mem_handle[0]);
rc = -EINVAL; rc = -EINVAL;
return rc; return rc;
} }
@@ -1124,6 +1126,7 @@ static int32_t cam_eeprom_get_cal_data(struct cam_eeprom_ctrl_t *e_ctrl,
if (remain_len < e_ctrl->cal_data.num_data) { if (remain_len < e_ctrl->cal_data.num_data) {
CAM_ERR(CAM_EEPROM, CAM_ERR(CAM_EEPROM,
"failed to copy, Invalid size"); "failed to copy, Invalid size");
cam_mem_put_cpu_buf(io_cfg->mem_handle[0]);
rc = -EINVAL; rc = -EINVAL;
return rc; return rc;
} }
@@ -1239,6 +1242,7 @@ static int32_t cam_eeprom_pkt_parse(struct cam_eeprom_ctrl_t *e_ctrl, void *arg)
"Inval cam_packet strut size: %zu, len_of_buff: %zu", "Inval cam_packet strut size: %zu, len_of_buff: %zu",
sizeof(struct cam_packet), pkt_len); sizeof(struct cam_packet), pkt_len);
rc = -EINVAL; rc = -EINVAL;
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
@@ -1249,6 +1253,7 @@ static int32_t cam_eeprom_pkt_parse(struct cam_eeprom_ctrl_t *e_ctrl, void *arg)
if (cam_packet_util_validate_packet(csl_packet, if (cam_packet_util_validate_packet(csl_packet,
remain_len)) { remain_len)) {
CAM_ERR(CAM_EEPROM, "Invalid packet params"); CAM_ERR(CAM_EEPROM, "Invalid packet params");
cam_mem_put_cpu_buf(dev_config.packet_handle);
rc = -EINVAL; rc = -EINVAL;
return rc; return rc;
} }
@@ -1260,6 +1265,7 @@ static int32_t cam_eeprom_pkt_parse(struct cam_eeprom_ctrl_t *e_ctrl, void *arg)
e_ctrl->soc_info.dev->of_node, e_ctrl); e_ctrl->soc_info.dev->of_node, e_ctrl);
if (rc < 0) { if (rc < 0) {
CAM_ERR(CAM_EEPROM, "Failed: rc : %d", rc); CAM_ERR(CAM_EEPROM, "Failed: rc : %d", rc);
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
rc = cam_eeprom_get_cal_data(e_ctrl, csl_packet); rc = cam_eeprom_get_cal_data(e_ctrl, csl_packet);
@@ -1278,6 +1284,7 @@ static int32_t cam_eeprom_pkt_parse(struct cam_eeprom_ctrl_t *e_ctrl, void *arg)
if (rc) { if (rc) {
CAM_ERR(CAM_EEPROM, CAM_ERR(CAM_EEPROM,
"Failed in parsing the pkt"); "Failed in parsing the pkt");
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
@@ -1339,6 +1346,7 @@ static int32_t cam_eeprom_pkt_parse(struct cam_eeprom_ctrl_t *e_ctrl, void *arg)
csl_packet, e_ctrl); csl_packet, e_ctrl);
if (rc < 0) { if (rc < 0) {
CAM_ERR(CAM_EEPROM, "Failed: rc : %d", rc); CAM_ERR(CAM_EEPROM, "Failed: rc : %d", rc);
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
@@ -1360,6 +1368,7 @@ static int32_t cam_eeprom_pkt_parse(struct cam_eeprom_ctrl_t *e_ctrl, void *arg)
e_ctrl->eebin_info.size); e_ctrl->eebin_info.size);
if (rc < 0) { if (rc < 0) {
CAM_ERR(CAM_EEPROM, "Failed in erase : %d", rc); CAM_ERR(CAM_EEPROM, "Failed in erase : %d", rc);
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
@@ -1369,6 +1378,7 @@ static int32_t cam_eeprom_pkt_parse(struct cam_eeprom_ctrl_t *e_ctrl, void *arg)
rc = cam_eeprom_write(e_ctrl); rc = cam_eeprom_write(e_ctrl);
if (rc < 0) { if (rc < 0) {
CAM_ERR(CAM_EEPROM, "Failed: rc : %d", rc); CAM_ERR(CAM_EEPROM, "Failed: rc : %d", rc);
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
@@ -1393,6 +1403,7 @@ power_down:
memdata_free: memdata_free:
vfree(e_ctrl->cal_data.mapdata); vfree(e_ctrl->cal_data.mapdata);
error: error:
cam_mem_put_cpu_buf(dev_config.packet_handle);
kfree(power_info->power_setting); kfree(power_info->power_setting);
kfree(power_info->power_down_setting); kfree(power_info->power_down_setting);
power_info->power_setting = NULL; power_info->power_setting = NULL;

View File

@@ -974,6 +974,7 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
CAM_ERR(CAM_FLASH, CAM_ERR(CAM_FLASH,
"Inval cam_packet strut size: %zu, len_of_buff: %zu", "Inval cam_packet strut size: %zu, len_of_buff: %zu",
sizeof(struct cam_packet), len_of_buffer); sizeof(struct cam_packet), len_of_buffer);
cam_mem_put_cpu_buf(config.packet_handle);
return -EINVAL; return -EINVAL;
} }
@@ -984,6 +985,7 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
if (cam_packet_util_validate_packet(csl_packet, if (cam_packet_util_validate_packet(csl_packet,
remain_len)) { remain_len)) {
CAM_ERR(CAM_FLASH, "Invalid packet params"); CAM_ERR(CAM_FLASH, "Invalid packet params");
cam_mem_put_cpu_buf(config.packet_handle);
return -EINVAL; return -EINVAL;
} }
@@ -994,6 +996,7 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
CAM_DBG(CAM_FLASH, CAM_DBG(CAM_FLASH,
"reject request %lld, last request to flush %lld", "reject request %lld, last request to flush %lld",
csl_packet->header.request_id, fctrl->last_flush_req); csl_packet->header.request_id, fctrl->last_flush_req);
cam_mem_put_cpu_buf(config.packet_handle);
return -EBADR; return -EBADR;
} }
@@ -1015,12 +1018,15 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
rc = cam_mem_get_cpu_buf(cmd_desc[i].mem_handle, rc = cam_mem_get_cpu_buf(cmd_desc[i].mem_handle,
&generic_ptr, &len_of_buffer); &generic_ptr, &len_of_buffer);
if (rc < 0) { if (rc < 0) {
cam_mem_put_cpu_buf(config.packet_handle);
CAM_ERR(CAM_FLASH, "Failed to get cpu buf"); CAM_ERR(CAM_FLASH, "Failed to get cpu buf");
return rc; return rc;
} }
cmd_buf = (uint32_t *)generic_ptr; cmd_buf = (uint32_t *)generic_ptr;
if (!cmd_buf) { if (!cmd_buf) {
CAM_ERR(CAM_FLASH, "invalid cmd buf"); CAM_ERR(CAM_FLASH, "invalid cmd buf");
cam_mem_put_cpu_buf(cmd_desc[i].mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
return -EINVAL; return -EINVAL;
} }
@@ -1028,6 +1034,8 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
(cmd_desc[i].offset > (cmd_desc[i].offset >
(len_of_buffer - (len_of_buffer -
sizeof(struct common_header)))) { sizeof(struct common_header)))) {
cam_mem_put_cpu_buf(cmd_desc[i].mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
CAM_ERR(CAM_FLASH, "invalid cmd buf length"); CAM_ERR(CAM_FLASH, "invalid cmd buf length");
return -EINVAL; return -EINVAL;
} }
@@ -1044,6 +1052,8 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
if (len_of_buffer < if (len_of_buffer <
sizeof(struct cam_flash_init)) { sizeof(struct cam_flash_init)) {
CAM_ERR(CAM_FLASH, "Not enough buffer"); CAM_ERR(CAM_FLASH, "Not enough buffer");
cam_mem_put_cpu_buf(cmd_desc[i].mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
return -EINVAL; return -EINVAL;
} }
@@ -1057,6 +1067,8 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
CAM_ERR(CAM_FLASH, CAM_ERR(CAM_FLASH,
"Failed parsing slave info: rc: %d", "Failed parsing slave info: rc: %d",
rc); rc);
cam_mem_put_cpu_buf(cmd_desc[i].mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
break; break;
@@ -1071,6 +1083,8 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
if (rc) { if (rc) {
CAM_ERR(CAM_FLASH, CAM_ERR(CAM_FLASH,
"Failed update power settings"); "Failed update power settings");
cam_mem_put_cpu_buf(cmd_desc[i].mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
break; break;
@@ -1089,6 +1103,8 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
if (rc < 0) { if (rc < 0) {
CAM_ERR(CAM_FLASH, CAM_ERR(CAM_FLASH,
"pkt parsing failed: %d", rc); "pkt parsing failed: %d", rc);
cam_mem_put_cpu_buf(cmd_desc[i].mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
break; break;
@@ -1098,6 +1114,7 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
power_info = &fctrl->power_info; power_info = &fctrl->power_info;
if (!power_info) { if (!power_info) {
CAM_ERR(CAM_FLASH, "Power_info is NULL"); CAM_ERR(CAM_FLASH, "Power_info is NULL");
cam_mem_put_cpu_buf(config.packet_handle);
return -EINVAL; return -EINVAL;
} }
@@ -1109,6 +1126,7 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
CAM_ERR(CAM_FLASH, CAM_ERR(CAM_FLASH,
"failed to fill vreg params for power up rc:%d", "failed to fill vreg params for power up rc:%d",
rc); rc);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
@@ -1121,6 +1139,7 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
CAM_ERR(CAM_FLASH, CAM_ERR(CAM_FLASH,
"failed to fill vreg params power down rc:%d", "failed to fill vreg params power down rc:%d",
rc); rc);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
@@ -1128,12 +1147,14 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
if (rc) { if (rc) {
CAM_ERR(CAM_FLASH, CAM_ERR(CAM_FLASH,
"Enable Regulator Failed rc = %d", rc); "Enable Regulator Failed rc = %d", rc);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
rc = fctrl->func_tbl.apply_setting(fctrl, 0); rc = fctrl->func_tbl.apply_setting(fctrl, 0);
if (rc) { if (rc) {
CAM_ERR(CAM_FLASH, "cannot apply settings rc = %d", rc); CAM_ERR(CAM_FLASH, "cannot apply settings rc = %d", rc);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
@@ -1163,6 +1184,7 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
if (rc) { if (rc) {
CAM_ERR(CAM_FLASH, CAM_ERR(CAM_FLASH,
"Failed in parsing i2c packets"); "Failed in parsing i2c packets");
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
break; break;
@@ -1181,6 +1203,7 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
if (rc) { if (rc) {
CAM_ERR(CAM_FLASH, CAM_ERR(CAM_FLASH,
"Failed in Deleting the err: %d", rc); "Failed in Deleting the err: %d", rc);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
} }
@@ -1194,12 +1217,14 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
if (rc) { if (rc) {
CAM_ERR(CAM_FLASH, CAM_ERR(CAM_FLASH,
"Failed in parsing i2c NRT packets"); "Failed in parsing i2c NRT packets");
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
rc = fctrl->func_tbl.apply_setting(fctrl, 0); rc = fctrl->func_tbl.apply_setting(fctrl, 0);
if (rc) if (rc)
CAM_ERR(CAM_FLASH, CAM_ERR(CAM_FLASH,
"Apply setting failed: %d", rc); "Apply setting failed: %d", rc);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
case CAM_PKT_NOP_OPCODE: { case CAM_PKT_NOP_OPCODE: {
@@ -1211,6 +1236,7 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
MAX_PER_FRAME_ARRAY; MAX_PER_FRAME_ARRAY;
fctrl->i2c_data.per_frame[frm_offset].is_settings_valid fctrl->i2c_data.per_frame[frm_offset].is_settings_valid
= false; = false;
cam_mem_put_cpu_buf(config.packet_handle);
return 0; return 0;
} }
@@ -1221,6 +1247,7 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
default: default:
CAM_ERR(CAM_FLASH, "Wrong Opcode : %d", CAM_ERR(CAM_FLASH, "Wrong Opcode : %d",
(csl_packet->header.op_code & 0xFFFFFF)); (csl_packet->header.op_code & 0xFFFFFF));
cam_mem_put_cpu_buf(config.packet_handle);
return -EINVAL; return -EINVAL;
} }
update_req_mgr: update_req_mgr:
@@ -1251,6 +1278,7 @@ update_req_mgr:
CAM_ERR(CAM_FLASH, CAM_ERR(CAM_FLASH,
"Failed in adding request: %llu to request manager", "Failed in adding request: %llu to request manager",
csl_packet->header.request_id); csl_packet->header.request_id);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
CAM_DBG(CAM_FLASH, CAM_DBG(CAM_FLASH,
@@ -1258,7 +1286,6 @@ update_req_mgr:
add_req.req_id, add_req.trigger_eof); add_req.req_id, add_req.trigger_eof);
} }
} }
cam_mem_put_cpu_buf(config.packet_handle); cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
@@ -1318,6 +1345,7 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
CAM_ERR(CAM_FLASH, CAM_ERR(CAM_FLASH,
"Inval cam_packet strut size: %zu, len_of_buff: %zu", "Inval cam_packet strut size: %zu, len_of_buff: %zu",
sizeof(struct cam_packet), len_of_buffer); sizeof(struct cam_packet), len_of_buffer);
cam_mem_put_cpu_buf(config.packet_handle);
rc = -EINVAL; rc = -EINVAL;
return rc; return rc;
} }
@@ -1329,6 +1357,7 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
if (cam_packet_util_validate_packet(csl_packet, if (cam_packet_util_validate_packet(csl_packet,
remain_len)) { remain_len)) {
CAM_ERR(CAM_FLASH, "Invalid packet params"); CAM_ERR(CAM_FLASH, "Invalid packet params");
cam_mem_put_cpu_buf(config.packet_handle);
rc = -EINVAL; rc = -EINVAL;
return rc; return rc;
} }
@@ -1340,6 +1369,7 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
CAM_WARN(CAM_FLASH, CAM_WARN(CAM_FLASH,
"reject request %lld, last request to flush %d", "reject request %lld, last request to flush %d",
csl_packet->header.request_id, fctrl->last_flush_req); csl_packet->header.request_id, fctrl->last_flush_req);
cam_mem_put_cpu_buf(config.packet_handle);
rc = -EINVAL; rc = -EINVAL;
return rc; return rc;
} }
@@ -1356,12 +1386,15 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
rc = cam_mem_get_cpu_buf(cmd_desc->mem_handle, rc = cam_mem_get_cpu_buf(cmd_desc->mem_handle,
&cmd_buf_ptr, &len_of_buffer); &cmd_buf_ptr, &len_of_buffer);
if (rc) { if (rc) {
cam_mem_put_cpu_buf(config.packet_handle);
CAM_ERR(CAM_FLASH, "Fail in get buffer: %d", rc); CAM_ERR(CAM_FLASH, "Fail in get buffer: %d", rc);
return rc; return rc;
} }
if ((len_of_buffer < sizeof(struct cam_flash_init)) || if ((len_of_buffer < sizeof(struct cam_flash_init)) ||
(cmd_desc->offset > (cmd_desc->offset >
(len_of_buffer - sizeof(struct cam_flash_init)))) { (len_of_buffer - sizeof(struct cam_flash_init)))) {
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
CAM_ERR(CAM_FLASH, "Not enough buffer"); CAM_ERR(CAM_FLASH, "Not enough buffer");
rc = -EINVAL; rc = -EINVAL;
return rc; return rc;
@@ -1393,6 +1426,8 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
if (remain_len < sizeof(struct cam_flash_set_on_off)) { if (remain_len < sizeof(struct cam_flash_set_on_off)) {
CAM_ERR(CAM_FLASH, "Not enough buffer"); CAM_ERR(CAM_FLASH, "Not enough buffer");
rc = -EINVAL; rc = -EINVAL;
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
@@ -1401,12 +1436,16 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
if (!flash_operation_info) { if (!flash_operation_info) {
CAM_ERR(CAM_FLASH, CAM_ERR(CAM_FLASH,
"flash_operation_info Null"); "flash_operation_info Null");
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
rc = -EINVAL; rc = -EINVAL;
return rc; return rc;
} }
if (flash_operation_info->count > if (flash_operation_info->count >
CAM_FLASH_MAX_LED_TRIGGERS) { CAM_FLASH_MAX_LED_TRIGGERS) {
CAM_ERR(CAM_FLASH, "led count out of limit"); CAM_ERR(CAM_FLASH, "led count out of limit");
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
rc = -EINVAL; rc = -EINVAL;
return rc; return rc;
} }
@@ -1433,6 +1472,8 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
CAM_ERR(CAM_FLASH, "Wrong cmd_type = %d", CAM_ERR(CAM_FLASH, "Wrong cmd_type = %d",
cam_flash_info->cmd_type); cam_flash_info->cmd_type);
rc = -EINVAL; rc = -EINVAL;
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
@@ -1461,6 +1502,7 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
if (rc) { if (rc) {
CAM_ERR(CAM_FLASH, "Fail in get buffer: 0x%x", CAM_ERR(CAM_FLASH, "Fail in get buffer: 0x%x",
cmd_desc->mem_handle); cmd_desc->mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
@@ -1468,6 +1510,8 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
(cmd_desc->offset > (cmd_desc->offset >
(len_of_buffer - sizeof(struct common_header)))) { (len_of_buffer - sizeof(struct common_header)))) {
CAM_ERR(CAM_FLASH, "not enough buffer"); CAM_ERR(CAM_FLASH, "not enough buffer");
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
rc = -EINVAL; rc = -EINVAL;
return rc; return rc;
} }
@@ -1493,6 +1537,8 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
if (remain_len < sizeof(struct cam_flash_set_on_off)) { if (remain_len < sizeof(struct cam_flash_set_on_off)) {
CAM_ERR(CAM_FLASH, "Not enough buffer"); CAM_ERR(CAM_FLASH, "Not enough buffer");
rc = -EINVAL; rc = -EINVAL;
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
@@ -1502,11 +1548,15 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
CAM_ERR(CAM_FLASH, CAM_ERR(CAM_FLASH,
"flash_operation_info Null"); "flash_operation_info Null");
rc = -EINVAL; rc = -EINVAL;
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
if (flash_operation_info->count > if (flash_operation_info->count >
CAM_FLASH_MAX_LED_TRIGGERS) { CAM_FLASH_MAX_LED_TRIGGERS) {
CAM_ERR(CAM_FLASH, "led count out of limit"); CAM_ERR(CAM_FLASH, "led count out of limit");
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
rc = -EINVAL; rc = -EINVAL;
return rc; return rc;
} }
@@ -1541,6 +1591,8 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
default: default:
CAM_ERR(CAM_FLASH, "Wrong cmd_type = %d", CAM_ERR(CAM_FLASH, "Wrong cmd_type = %d",
cmn_hdr->cmd_type); cmn_hdr->cmd_type);
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
rc = -EINVAL; rc = -EINVAL;
return rc; return rc;
} }
@@ -1556,6 +1608,7 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
rc = cam_mem_get_cpu_buf(cmd_desc->mem_handle, rc = cam_mem_get_cpu_buf(cmd_desc->mem_handle,
&cmd_buf_ptr, &len_of_buffer); &cmd_buf_ptr, &len_of_buffer);
if (rc) { if (rc) {
cam_mem_put_cpu_buf(config.packet_handle);
CAM_ERR(CAM_FLASH, "Fail in get buffer: %d", rc); CAM_ERR(CAM_FLASH, "Fail in get buffer: %d", rc);
return rc; return rc;
} }
@@ -1565,6 +1618,8 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
(len_of_buffer - sizeof(struct common_header)))) { (len_of_buffer - sizeof(struct common_header)))) {
CAM_ERR(CAM_FLASH, "Not enough buffer"); CAM_ERR(CAM_FLASH, "Not enough buffer");
rc = -EINVAL; rc = -EINVAL;
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
remain_len = len_of_buffer - cmd_desc->offset; remain_len = len_of_buffer - cmd_desc->offset;
@@ -1578,6 +1633,8 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
if (remain_len < sizeof(struct cam_flash_set_on_off)) { if (remain_len < sizeof(struct cam_flash_set_on_off)) {
CAM_ERR(CAM_FLASH, "Not enough buffer"); CAM_ERR(CAM_FLASH, "Not enough buffer");
rc = -EINVAL; rc = -EINVAL;
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
flash_operation_info = flash_operation_info =
@@ -1586,12 +1643,16 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
CAM_ERR(CAM_FLASH, CAM_ERR(CAM_FLASH,
"flash_operation_info Null"); "flash_operation_info Null");
rc = -EINVAL; rc = -EINVAL;
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
if (flash_operation_info->count > if (flash_operation_info->count >
CAM_FLASH_MAX_LED_TRIGGERS) { CAM_FLASH_MAX_LED_TRIGGERS) {
CAM_ERR(CAM_FLASH, "led count out of limit"); CAM_ERR(CAM_FLASH, "led count out of limit");
rc = -EINVAL; rc = -EINVAL;
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
@@ -1611,6 +1672,8 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
if (rc) if (rc)
CAM_ERR(CAM_FLASH, "Apply setting failed: %d", CAM_ERR(CAM_FLASH, "Apply setting failed: %d",
rc); rc);
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
case CAMERA_SENSOR_FLASH_CMD_TYPE_QUERYCURR: { case CAMERA_SENSOR_FLASH_CMD_TYPE_QUERYCURR: {
@@ -1619,6 +1682,8 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
if (remain_len < sizeof(struct cam_flash_query_curr)) { if (remain_len < sizeof(struct cam_flash_query_curr)) {
CAM_ERR(CAM_FLASH, "Not enough buffer"); CAM_ERR(CAM_FLASH, "Not enough buffer");
rc = -EINVAL; rc = -EINVAL;
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
flash_query_info = flash_query_info =
@@ -1638,6 +1703,8 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
if (rc) { if (rc) {
CAM_ERR(CAM_FLASH, CAM_ERR(CAM_FLASH,
"Query current failed with rc=%d", rc); "Query current failed with rc=%d", rc);
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
flash_query_info->query_current_ma = query_curr_ma; flash_query_info->query_current_ma = query_curr_ma;
@@ -1647,6 +1714,8 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
if (remain_len < sizeof(struct cam_flash_set_rer)) { if (remain_len < sizeof(struct cam_flash_set_rer)) {
CAM_ERR(CAM_FLASH, "Not enough buffer"); CAM_ERR(CAM_FLASH, "Not enough buffer");
rc = -EINVAL; rc = -EINVAL;
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
flash_rer_info = (struct cam_flash_set_rer *)cmd_buf; flash_rer_info = (struct cam_flash_set_rer *)cmd_buf;
@@ -1654,12 +1723,16 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
CAM_ERR(CAM_FLASH, CAM_ERR(CAM_FLASH,
"flash_rer_info Null"); "flash_rer_info Null");
rc = -EINVAL; rc = -EINVAL;
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
if (flash_rer_info->count > if (flash_rer_info->count >
CAM_FLASH_MAX_LED_TRIGGERS) { CAM_FLASH_MAX_LED_TRIGGERS) {
CAM_ERR(CAM_FLASH, "led count out of limit"); CAM_ERR(CAM_FLASH, "led count out of limit");
rc = -EINVAL; rc = -EINVAL;
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
@@ -1683,11 +1756,15 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
if (rc) if (rc)
CAM_ERR(CAM_FLASH, "apply_setting failed: %d", CAM_ERR(CAM_FLASH, "apply_setting failed: %d",
rc); rc);
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
default: default:
CAM_ERR(CAM_FLASH, "Wrong cmd_type : %d", CAM_ERR(CAM_FLASH, "Wrong cmd_type : %d",
cmn_hdr->cmd_type); cmn_hdr->cmd_type);
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
cam_mem_put_cpu_buf(config.packet_handle);
rc = -EINVAL; rc = -EINVAL;
return rc; return rc;
} }
@@ -1704,6 +1781,7 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
"Rxed NOP packets without linking"); "Rxed NOP packets without linking");
fctrl->per_frame[frm_offset].cmn_attr.is_settings_valid fctrl->per_frame[frm_offset].cmn_attr.is_settings_valid
= false; = false;
cam_mem_put_cpu_buf(config.packet_handle);
return -EINVAL; return -EINVAL;
} }
@@ -1718,6 +1796,7 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
CAM_ERR(CAM_FLASH, "Wrong Opcode : %d", CAM_ERR(CAM_FLASH, "Wrong Opcode : %d",
(csl_packet->header.op_code & 0xFFFFFF)); (csl_packet->header.op_code & 0xFFFFFF));
rc = -EINVAL; rc = -EINVAL;
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
@@ -1754,6 +1833,7 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
CAM_ERR(CAM_FLASH, CAM_ERR(CAM_FLASH,
"Failed in adding request: %llu to request manager", "Failed in adding request: %llu to request manager",
csl_packet->header.request_id); csl_packet->header.request_id);
cam_mem_put_cpu_buf(config.packet_handle);
return rc; return rc;
} }
CAM_DBG(CAM_FLASH, CAM_DBG(CAM_FLASH,

View File

@@ -1080,6 +1080,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
CAM_ERR(CAM_OIS, CAM_ERR(CAM_OIS,
"Inval cam_packet strut size: %zu, len_of_buff: %zu", "Inval cam_packet strut size: %zu, len_of_buff: %zu",
sizeof(struct cam_packet), pkt_len); sizeof(struct cam_packet), pkt_len);
cam_mem_put_cpu_buf(dev_config.packet_handle);
return -EINVAL; return -EINVAL;
} }
@@ -1090,6 +1091,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
if (cam_packet_util_validate_packet(csl_packet, if (cam_packet_util_validate_packet(csl_packet,
remain_len)) { remain_len)) {
CAM_ERR(CAM_OIS, "Invalid packet params"); CAM_ERR(CAM_OIS, "Invalid packet params");
cam_mem_put_cpu_buf(dev_config.packet_handle);
return -EINVAL; return -EINVAL;
} }
@@ -1113,11 +1115,14 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
if (rc < 0) { if (rc < 0) {
CAM_ERR(CAM_OIS, "Failed to get cpu buf : 0x%x", CAM_ERR(CAM_OIS, "Failed to get cpu buf : 0x%x",
cmd_desc[i].mem_handle); cmd_desc[i].mem_handle);
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
cmd_buf = (uint32_t *)generic_ptr; cmd_buf = (uint32_t *)generic_ptr;
if (!cmd_buf) { if (!cmd_buf) {
CAM_ERR(CAM_OIS, "invalid cmd buf"); CAM_ERR(CAM_OIS, "invalid cmd buf");
cam_mem_put_cpu_buf(cmd_desc[i].mem_handle);
cam_mem_put_cpu_buf(dev_config.packet_handle);
return -EINVAL; return -EINVAL;
} }
@@ -1126,6 +1131,8 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
sizeof(struct common_header)))) { sizeof(struct common_header)))) {
CAM_ERR(CAM_OIS, CAM_ERR(CAM_OIS,
"Invalid length for sensor cmd"); "Invalid length for sensor cmd");
cam_mem_put_cpu_buf(cmd_desc[i].mem_handle);
cam_mem_put_cpu_buf(dev_config.packet_handle);
return -EINVAL; return -EINVAL;
} }
remain_len = len_of_buff - cmd_desc[i].offset; remain_len = len_of_buff - cmd_desc[i].offset;
@@ -1141,6 +1148,8 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
if (rc < 0) { if (rc < 0) {
CAM_ERR(CAM_OIS, CAM_ERR(CAM_OIS,
"Failed in parsing slave info"); "Failed in parsing slave info");
cam_mem_put_cpu_buf(cmd_desc[i].mem_handle);
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
break; break;
@@ -1155,6 +1164,8 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
if (rc) { if (rc) {
CAM_ERR(CAM_OIS, CAM_ERR(CAM_OIS,
"Failed: parse power settings"); "Failed: parse power settings");
cam_mem_put_cpu_buf(cmd_desc[i].mem_handle);
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
break; break;
@@ -1167,6 +1178,8 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
if (rc) { if (rc) {
CAM_ERR(CAM_OIS, CAM_ERR(CAM_OIS,
"Failed: parse fw info settings"); "Failed: parse fw info settings");
cam_mem_put_cpu_buf(cmd_desc[i].mem_handle);
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
break; break;
@@ -1185,6 +1198,8 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
if (rc < 0) { if (rc < 0) {
CAM_ERR(CAM_OIS, CAM_ERR(CAM_OIS,
"init parsing failed: %d", rc); "init parsing failed: %d", rc);
cam_mem_put_cpu_buf(cmd_desc[i].mem_handle);
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
} else if ((o_ctrl->is_ois_calib != 0) && } else if ((o_ctrl->is_ois_calib != 0) &&
@@ -1202,6 +1217,8 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
if (rc < 0) { if (rc < 0) {
CAM_ERR(CAM_OIS, CAM_ERR(CAM_OIS,
"Calib parsing failed: %d", rc); "Calib parsing failed: %d", rc);
cam_mem_put_cpu_buf(cmd_desc[i].mem_handle);
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
} else if (o_ctrl->i2c_fwinit_data.is_settings_valid == 0) { } else if (o_ctrl->i2c_fwinit_data.is_settings_valid == 0) {
@@ -1228,6 +1245,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
rc = cam_ois_power_up(o_ctrl); rc = cam_ois_power_up(o_ctrl);
if (rc) { if (rc) {
CAM_ERR(CAM_OIS, " OIS Power up failed"); CAM_ERR(CAM_OIS, " OIS Power up failed");
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
} }
@@ -1358,6 +1376,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
CAM_WARN(CAM_OIS, CAM_WARN(CAM_OIS,
"Not in right state to control OIS: %d", "Not in right state to control OIS: %d",
o_ctrl->cam_ois_state); o_ctrl->cam_ois_state);
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
offset = (uint32_t *)&csl_packet->payload; offset = (uint32_t *)&csl_packet->payload;
@@ -1371,12 +1390,14 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
cmd_desc, 1, NULL); cmd_desc, 1, NULL);
if (rc < 0) { if (rc < 0) {
CAM_ERR(CAM_OIS, "OIS pkt parsing failed: %d", rc); CAM_ERR(CAM_OIS, "OIS pkt parsing failed: %d", rc);
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
rc = cam_ois_apply_settings(o_ctrl, i2c_reg_settings); rc = cam_ois_apply_settings(o_ctrl, i2c_reg_settings);
if (rc < 0) { if (rc < 0) {
CAM_ERR(CAM_OIS, "Cannot apply mode settings"); CAM_ERR(CAM_OIS, "Cannot apply mode settings");
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
@@ -1384,6 +1405,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
if (rc < 0) { if (rc < 0) {
CAM_ERR(CAM_OIS, CAM_ERR(CAM_OIS,
"Fail deleting Mode data: rc: %d", rc); "Fail deleting Mode data: rc: %d", rc);
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
break; break;
@@ -1399,6 +1421,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
CAM_WARN(CAM_OIS, CAM_WARN(CAM_OIS,
"Not in right state to read OIS: %d", "Not in right state to read OIS: %d",
o_ctrl->cam_ois_state); o_ctrl->cam_ois_state);
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
CAM_DBG(CAM_OIS, "number of I/O configs: %d:", CAM_DBG(CAM_OIS, "number of I/O configs: %d:",
@@ -1406,6 +1429,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
if (csl_packet->num_io_configs == 0) { if (csl_packet->num_io_configs == 0) {
CAM_ERR(CAM_OIS, "No I/O configs to process"); CAM_ERR(CAM_OIS, "No I/O configs to process");
rc = -EINVAL; rc = -EINVAL;
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
@@ -1419,6 +1443,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
if (io_cfg == NULL) { if (io_cfg == NULL) {
CAM_ERR(CAM_OIS, "I/O config is invalid(NULL)"); CAM_ERR(CAM_OIS, "I/O config is invalid(NULL)");
rc = -EINVAL; rc = -EINVAL;
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
@@ -1432,12 +1457,14 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
cmd_desc, 1, &io_cfg[0]); cmd_desc, 1, &io_cfg[0]);
if (rc < 0) { if (rc < 0) {
CAM_ERR(CAM_OIS, "OIS read pkt parsing failed: %d", rc); CAM_ERR(CAM_OIS, "OIS read pkt parsing failed: %d", rc);
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
rc = cam_sensor_util_get_current_qtimer_ns(&qtime_ns); rc = cam_sensor_util_get_current_qtimer_ns(&qtime_ns);
if (rc < 0) { if (rc < 0) {
CAM_ERR(CAM_OIS, "failed to get qtimer rc:%d"); CAM_ERR(CAM_OIS, "failed to get qtimer rc:%d");
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
@@ -1447,6 +1474,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
if (rc < 0) { if (rc < 0) {
CAM_ERR(CAM_OIS, "cannot read data rc: %d", rc); CAM_ERR(CAM_OIS, "cannot read data rc: %d", rc);
delete_request(&i2c_read_settings); delete_request(&i2c_read_settings);
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
@@ -1457,6 +1485,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
CAM_ERR(CAM_OIS, CAM_ERR(CAM_OIS,
"write qtimer failed rc: %d", rc); "write qtimer failed rc: %d", rc);
delete_request(&i2c_read_settings); delete_request(&i2c_read_settings);
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
} }
@@ -1465,6 +1494,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
if (rc < 0) { if (rc < 0) {
CAM_ERR(CAM_OIS, CAM_ERR(CAM_OIS,
"Failed in deleting the read settings"); "Failed in deleting the read settings");
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
break; break;
@@ -1477,6 +1507,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
CAM_ERR(CAM_OIS, CAM_ERR(CAM_OIS,
"Not in right state to write time to OIS: %d", "Not in right state to write time to OIS: %d",
o_ctrl->cam_ois_state); o_ctrl->cam_ois_state);
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
offset = (uint32_t *)&csl_packet->payload; offset = (uint32_t *)&csl_packet->payload;
@@ -1490,6 +1521,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
cmd_desc, 1, NULL); cmd_desc, 1, NULL);
if (rc < 0) { if (rc < 0) {
CAM_ERR(CAM_OIS, "OIS pkt parsing failed: %d", rc); CAM_ERR(CAM_OIS, "OIS pkt parsing failed: %d", rc);
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
@@ -1501,12 +1533,14 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
rc = cam_ois_update_time(i2c_reg_settings, CAM_ENDIANNESS_LITTLE); rc = cam_ois_update_time(i2c_reg_settings, CAM_ENDIANNESS_LITTLE);
if (rc < 0) { if (rc < 0) {
CAM_ERR(CAM_OIS, "Cannot update time"); CAM_ERR(CAM_OIS, "Cannot update time");
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
rc = cam_ois_apply_settings(o_ctrl, i2c_reg_settings); rc = cam_ois_apply_settings(o_ctrl, i2c_reg_settings);
if (rc < 0) { if (rc < 0) {
CAM_ERR(CAM_OIS, "Cannot apply mode settings"); CAM_ERR(CAM_OIS, "Cannot apply mode settings");
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
@@ -1514,6 +1548,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
if (rc < 0) { if (rc < 0) {
CAM_ERR(CAM_OIS, CAM_ERR(CAM_OIS,
"Fail deleting Mode data: rc: %d", rc); "Fail deleting Mode data: rc: %d", rc);
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
} }
break; break;
@@ -1521,13 +1556,16 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
default: default:
CAM_ERR(CAM_OIS, "Invalid Opcode: %d", CAM_ERR(CAM_OIS, "Invalid Opcode: %d",
(csl_packet->header.op_code & 0xFFFFFF)); (csl_packet->header.op_code & 0xFFFFFF));
cam_mem_put_cpu_buf(dev_config.packet_handle);
return -EINVAL; return -EINVAL;
} }
cam_mem_put_cpu_buf(dev_config.packet_handle);
if (!rc) if (!rc) {
cam_mem_put_cpu_buf(dev_config.packet_handle);
return rc; return rc;
}
pwr_dwn: pwr_dwn:
cam_mem_put_cpu_buf(dev_config.packet_handle);
cam_ois_power_down(o_ctrl); cam_ois_power_down(o_ctrl);
return rc; return rc;
} }

View File

@@ -866,6 +866,7 @@ int32_t cam_handle_mem_ptr(uint64_t handle, uint32_t cmd,
if (cmd_desc[i].offset >= len) { if (cmd_desc[i].offset >= len) {
CAM_ERR(CAM_SENSOR, CAM_ERR(CAM_SENSOR,
"offset past length of buffer"); "offset past length of buffer");
cam_mem_put_cpu_buf(cmd_desc[i].mem_handle);
rc = -EINVAL; rc = -EINVAL;
goto end; goto end;
} }
@@ -873,6 +874,7 @@ int32_t cam_handle_mem_ptr(uint64_t handle, uint32_t cmd,
if (cmd_desc[i].length > remain_len) { if (cmd_desc[i].length > remain_len) {
CAM_ERR(CAM_SENSOR, CAM_ERR(CAM_SENSOR,
"Not enough buffer provided for cmd"); "Not enough buffer provided for cmd");
cam_mem_put_cpu_buf(cmd_desc[i].mem_handle);
rc = -EINVAL; rc = -EINVAL;
goto end; goto end;
} }
@@ -886,6 +888,7 @@ int32_t cam_handle_mem_ptr(uint64_t handle, uint32_t cmd,
if (rc < 0) { if (rc < 0) {
CAM_ERR(CAM_SENSOR, CAM_ERR(CAM_SENSOR,
"Failed to parse the command Buffer Header"); "Failed to parse the command Buffer Header");
cam_mem_put_cpu_buf(cmd_desc[i].mem_handle);
goto end; goto end;
} }
cam_mem_put_cpu_buf(cmd_desc[i].mem_handle); cam_mem_put_cpu_buf(cmd_desc[i].mem_handle);

View File

@@ -391,6 +391,7 @@ static int32_t cam_sensor_get_io_buffer(
CAM_ERR(CAM_SENSOR_UTIL, CAM_ERR(CAM_SENSOR_UTIL,
"invalid size:io_cfg->offsets[0]: %d, buf_size: %d", "invalid size:io_cfg->offsets[0]: %d, buf_size: %d",
io_cfg->offsets[0], buf_size); io_cfg->offsets[0], buf_size);
cam_mem_put_cpu_buf(io_cfg->mem_handle[0]);
return -EINVAL; return -EINVAL;
} }
i2c_settings->read_buff = i2c_settings->read_buff =
@@ -402,7 +403,6 @@ static int32_t cam_sensor_get_io_buffer(
io_cfg->direction); io_cfg->direction);
rc = -EINVAL; rc = -EINVAL;
} }
cam_mem_put_cpu_buf(io_cfg->mem_handle[0]); cam_mem_put_cpu_buf(io_cfg->mem_handle[0]);
return rc; return rc;
} }
@@ -436,6 +436,7 @@ int32_t cam_sensor_util_write_qtimer_to_io_buffer(
CAM_ERR(CAM_SENSOR_UTIL, CAM_ERR(CAM_SENSOR_UTIL,
"invalid size:io_cfg->offsets[0]: %d, buf_size: %d", "invalid size:io_cfg->offsets[0]: %d, buf_size: %d",
io_cfg->offsets[0], buf_size); io_cfg->offsets[0], buf_size);
cam_mem_put_cpu_buf(io_cfg->mem_handle[0]);
return -EINVAL; return -EINVAL;
} }
@@ -446,17 +447,18 @@ int32_t cam_sensor_util_write_qtimer_to_io_buffer(
CAM_ERR(CAM_SENSOR_UTIL, CAM_ERR(CAM_SENSOR_UTIL,
"not enough size for qtimer, target_size:%d", "not enough size for qtimer, target_size:%d",
target_size); target_size);
cam_mem_put_cpu_buf(io_cfg->mem_handle[0]);
return -EINVAL; return -EINVAL;
} }
memcpy((void *)target_buf, &qtime_ns, sizeof(uint64_t)); memcpy((void *)target_buf, &qtime_ns, sizeof(uint64_t));
cam_mem_put_cpu_buf(io_cfg->mem_handle[0]);
} else { } else {
CAM_ERR(CAM_SENSOR_UTIL, "Invalid direction: %d", CAM_ERR(CAM_SENSOR_UTIL, "Invalid direction: %d",
io_cfg->direction); io_cfg->direction);
rc = -EINVAL; rc = -EINVAL;
} }
cam_mem_put_cpu_buf(io_cfg->mem_handle[0]);
return rc; return rc;
} }
@@ -645,6 +647,7 @@ int cam_sensor_i2c_command_parser(
(cmd_desc[i].offset > (cmd_desc[i].offset >
(len_of_buff - sizeof(struct common_header)))) { (len_of_buff - sizeof(struct common_header)))) {
CAM_ERR(CAM_SENSOR_UTIL, "buffer provided too small"); CAM_ERR(CAM_SENSOR_UTIL, "buffer provided too small");
cam_mem_put_cpu_buf(cmd_desc[i].mem_handle);
return -EINVAL; return -EINVAL;
} }
cmd_buf = (uint32_t *)generic_ptr; cmd_buf = (uint32_t *)generic_ptr;
@@ -653,6 +656,7 @@ int cam_sensor_i2c_command_parser(
remain_len -= cmd_desc[i].offset; remain_len -= cmd_desc[i].offset;
if (remain_len < cmd_desc[i].length) { if (remain_len < cmd_desc[i].length) {
CAM_ERR(CAM_SENSOR_UTIL, "buffer provided too small"); CAM_ERR(CAM_SENSOR_UTIL, "buffer provided too small");
cam_mem_put_cpu_buf(cmd_desc[i].mem_handle);
return -EINVAL; return -EINVAL;
} }

View File

@@ -480,6 +480,7 @@ static int cam_tpg_validate_cmd_descriptor(
*cmd_addr = (uintptr_t)cmd_header; *cmd_addr = (uintptr_t)cmd_header;
end: end:
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
return rc; return rc;
} }
@@ -678,6 +679,7 @@ static int cam_tpg_packet_parse(
break; break;
} }
end: end:
cam_mem_put_cpu_buf(config->packet_handle);
return rc; return rc;
} }

View File

@@ -67,6 +67,7 @@ int cam_packet_util_get_cmd_mem_addr(int handle, uint32_t **buf_addr,
if (kmd_buf_addr && *len) { if (kmd_buf_addr && *len) {
*buf_addr = (uint32_t *)kmd_buf_addr; *buf_addr = (uint32_t *)kmd_buf_addr;
} else { } else {
cam_mem_put_cpu_buf(handle);
CAM_ERR(CAM_UTIL, "Invalid addr and length :%zd", *len); CAM_ERR(CAM_UTIL, "Invalid addr and length :%zd", *len);
rc = -ENOMEM; rc = -ENOMEM;
} }