msm: camera: mem_mgr: Add refcount to track in use buffers
The function cam_mem_mgr_release can unmap the buffers when in use. This change prevents unmapping the buffers when in use. CRs-Fixed: 3489559 Change-Id: I2e72e795d39ac15abfa56c19043c419a03686966 Signed-off-by: Shivakumar Malke <quic_smalke@quicinc.com>
This commit is contained in:

committed by
Camera Software Integration

parent
87913e552d
commit
6d99262523
@@ -48,6 +48,11 @@ int cam_packet_util_get_packet_addr(struct cam_packet **packet,
|
||||
return rc;
|
||||
}
|
||||
|
||||
void cam_packet_util_put_packet_addr(uint64_t packet_handle)
|
||||
{
|
||||
cam_mem_put_cpu_buf(packet_handle);
|
||||
}
|
||||
|
||||
int cam_packet_util_get_cmd_mem_addr(int handle, uint32_t **buf_addr,
|
||||
size_t *len)
|
||||
{
|
||||
@@ -57,6 +62,7 @@ int cam_packet_util_get_cmd_mem_addr(int handle, uint32_t **buf_addr,
|
||||
rc = cam_mem_get_cpu_buf(handle, &kmd_buf_addr, len);
|
||||
if (rc) {
|
||||
CAM_ERR(CAM_UTIL, "Unable to get the virtual address %d", rc);
|
||||
rc = -EINVAL;
|
||||
} else {
|
||||
if (kmd_buf_addr && *len) {
|
||||
*buf_addr = (uint32_t *)kmd_buf_addr;
|
||||
@@ -177,14 +183,16 @@ int cam_packet_util_get_kmd_buffer(struct cam_packet *packet,
|
||||
((size_t)cmd_desc->size > (len - (size_t)cmd_desc->offset))) {
|
||||
CAM_ERR(CAM_UTIL, "invalid memory len:%zd and cmd desc size:%d",
|
||||
len, cmd_desc->size);
|
||||
return -EINVAL;
|
||||
rc = -EINVAL;
|
||||
goto rel_kmd_buf;
|
||||
}
|
||||
|
||||
remain_len -= (size_t)cmd_desc->offset;
|
||||
if ((size_t)packet->kmd_cmd_buf_offset >= remain_len) {
|
||||
CAM_ERR(CAM_UTIL, "Invalid kmd cmd buf offset: %zu",
|
||||
(size_t)packet->kmd_cmd_buf_offset);
|
||||
return -EINVAL;
|
||||
rc = -EINVAL;
|
||||
goto rel_kmd_buf;
|
||||
}
|
||||
|
||||
cpu_addr += (cmd_desc->offset / 4) + (packet->kmd_cmd_buf_offset / 4);
|
||||
@@ -201,6 +209,8 @@ int cam_packet_util_get_kmd_buffer(struct cam_packet *packet,
|
||||
kmd_buf->size = cmd_desc->size - cmd_desc->length;
|
||||
kmd_buf->used_bytes = 0;
|
||||
|
||||
rel_kmd_buf:
|
||||
cam_mem_put_cpu_buf(cmd_desc->mem_handle);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -287,6 +297,8 @@ void cam_packet_util_dump_patch_info(struct cam_packet *packet,
|
||||
|
||||
if (!(*dst_cpu_addr))
|
||||
CAM_ERR(CAM_ICP, "Null at dst addr %p", dst_cpu_addr);
|
||||
|
||||
cam_mem_put_cpu_buf(patch_desc[i].dst_buf_hdl);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -418,6 +430,7 @@ int cam_packet_util_process_patches(struct cam_packet *packet,
|
||||
(size_t)patch_desc[i].dst_offset)) {
|
||||
CAM_ERR(CAM_UTIL,
|
||||
"Invalid dst buf patch offset");
|
||||
cam_mem_put_cpu_buf((int32_t)patch_desc[i].dst_buf_hdl);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -447,6 +460,7 @@ int cam_packet_util_process_patches(struct cam_packet *packet,
|
||||
CAM_BOOL_TO_YESNO(flags & CAM_MEM_FLAG_HW_SHARED_ACCESS),
|
||||
CAM_BOOL_TO_YESNO(flags & CAM_MEM_FLAG_CMD_BUF_TYPE),
|
||||
CAM_BOOL_TO_YESNO(flags & CAM_MEM_FLAG_HW_AND_CDM_OR_SHARED));
|
||||
cam_mem_put_cpu_buf((int32_t)patch_desc[i].dst_buf_hdl);
|
||||
}
|
||||
|
||||
return rc;
|
||||
@@ -578,14 +592,16 @@ int cam_packet_util_process_generic_cmd_buffer(
|
||||
((size_t)cmd_buf->offset > (buf_size - sizeof(uint32_t)))) {
|
||||
CAM_ERR(CAM_UTIL, "Invalid offset for cmd buf: %zu",
|
||||
(size_t)cmd_buf->offset);
|
||||
return -EINVAL;
|
||||
rc = -EINVAL;
|
||||
goto end;
|
||||
}
|
||||
remain_len -= (size_t)cmd_buf->offset;
|
||||
|
||||
if (remain_len < (size_t)cmd_buf->length) {
|
||||
CAM_ERR(CAM_UTIL, "Invalid length for cmd buf: %zu",
|
||||
(size_t)cmd_buf->length);
|
||||
return -EINVAL;
|
||||
rc = -EINVAL;
|
||||
goto end;
|
||||
}
|
||||
|
||||
blob_ptr = (uint32_t *)(((uint8_t *)cpu_addr) +
|
||||
@@ -635,6 +651,7 @@ int cam_packet_util_process_generic_cmd_buffer(
|
||||
}
|
||||
|
||||
end:
|
||||
cam_mem_put_cpu_buf(cmd_buf->mem_handle);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user