Loading drivers/cam_icp/cam_icp_subdev.c +10 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <media/cam_req_mgr.h> #include <media/cam_defs.h> #include <media/cam_icp.h> #include "cam_mem_mgr.h" #include "cam_req_mgr_dev.h" #include "cam_subdev.h" #include "cam_node.h" Loading Loading @@ -86,10 +87,18 @@ static int cam_icp_subdev_open(struct v4l2_subdev *sd, goto end; } rc = cam_mem_mgr_init(); if (rc) { CAM_ERR(CAM_CRM, "mem mgr init failed"); goto end; } hw_mgr_intf = &node->hw_mgr_intf; rc = hw_mgr_intf->hw_open(hw_mgr_intf->hw_mgr_priv, NULL); if (rc < 0) { CAM_ERR(CAM_ICP, "FW download failed"); cam_mem_mgr_deinit(); goto end; } g_icp_dev.open_cnt++; Loading Loading @@ -130,6 +139,7 @@ int cam_icp_subdev_close_internal(struct v4l2_subdev *sd, goto end; } cam_mem_mgr_deinit(); end: mutex_unlock(&g_icp_dev.icp_lock); return rc; Loading drivers/cam_req_mgr/cam_mem_mgr.c +40 −25 Original line number Diff line number Diff line Loading @@ -19,8 +19,11 @@ #include "cam_trace.h" #include "cam_common_util.h" static struct cam_mem_table tbl; static atomic_t cam_mem_mgr_state = ATOMIC_INIT(CAM_MEM_MGR_UNINITIALIZED); static struct cam_mem_table tbl = { .m_lock = __MUTEX_INITIALIZER(tbl.m_lock), }; static atomic_t cam_mem_mgr_refcnt = ATOMIC_INIT(0); static void cam_mem_mgr_print_tbl(void) { Loading Loading @@ -164,6 +167,16 @@ int cam_mem_mgr_init(void) int i; int bitmap_size; mutex_lock(&tbl.m_lock); if (atomic_inc_return(&cam_mem_mgr_refcnt) > 1) { CAM_DBG(CAM_MEM, "Mem mgr refcnt: %d", atomic_read(&cam_mem_mgr_refcnt)); mutex_unlock(&tbl.m_lock); return 0; } memset(tbl.bufq, 0, sizeof(tbl.bufq)); if (cam_smmu_need_force_alloc_cached(&tbl.force_cache_allocs)) { Loading @@ -173,8 +186,13 @@ int cam_mem_mgr_init(void) bitmap_size = BITS_TO_LONGS(CAM_MEM_BUFQ_MAX) * sizeof(long); tbl.bitmap = kzalloc(bitmap_size, GFP_KERNEL); if (!tbl.bitmap) if (!tbl.bitmap) { atomic_dec(&cam_mem_mgr_refcnt); CAM_DBG(CAM_MEM, "Mem mgr refcnt: %d", atomic_read(&cam_mem_mgr_refcnt)); mutex_unlock(&tbl.m_lock); return -ENOMEM; } tbl.bits = bitmap_size * BITS_PER_BYTE; bitmap_zero(tbl.bitmap, tbl.bits); Loading @@ -185,9 +203,8 @@ int cam_mem_mgr_init(void) tbl.bufq[i].fd = -1; tbl.bufq[i].buf_handle = -1; } mutex_init(&tbl.m_lock); atomic_set(&cam_mem_mgr_state, CAM_MEM_MGR_INITIALIZED); mutex_unlock(&tbl.m_lock); cam_mem_mgr_create_debug_fs(); Loading Loading @@ -234,7 +251,7 @@ int cam_mem_get_io_buf(int32_t buf_handle, int32_t mmu_handle, *len_ptr = 0; if (!atomic_read(&cam_mem_mgr_state)) { if (!atomic_read(&cam_mem_mgr_refcnt)) { CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized"); return -EINVAL; } Loading Loading @@ -285,12 +302,7 @@ int cam_mem_get_cpu_buf(int32_t buf_handle, uintptr_t *vaddr_ptr, size_t *len) { int idx; if (!atomic_read(&cam_mem_mgr_state)) { CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized"); return -EINVAL; } if (!atomic_read(&cam_mem_mgr_state)) { if (!atomic_read(&cam_mem_mgr_refcnt)) { CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized"); return -EINVAL; } Loading Loading @@ -333,7 +345,7 @@ int cam_mem_mgr_cache_ops(struct cam_mem_cache_ops_cmd *cmd) uint32_t cache_dir; unsigned long dmabuf_flag = 0; if (!atomic_read(&cam_mem_mgr_state)) { if (!atomic_read(&cam_mem_mgr_refcnt)) { CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized"); return -EINVAL; } Loading Loading @@ -659,7 +671,7 @@ int cam_mem_mgr_alloc_and_map(struct cam_mem_mgr_alloc_cmd *cmd) uintptr_t kvaddr = 0; size_t klen; if (!atomic_read(&cam_mem_mgr_state)) { if (!atomic_read(&cam_mem_mgr_refcnt)) { CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized"); return -EINVAL; } Loading Loading @@ -811,7 +823,7 @@ int cam_mem_mgr_map(struct cam_mem_mgr_map_cmd *cmd) size_t len = 0; bool is_internal = false; if (!atomic_read(&cam_mem_mgr_state)) { if (!atomic_read(&cam_mem_mgr_refcnt)) { CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized"); return -EINVAL; } Loading Loading @@ -998,7 +1010,6 @@ static int cam_mem_mgr_cleanup_table(void) { int i; mutex_lock(&tbl.m_lock); for (i = 1; i < CAM_MEM_BUFQ_MAX; i++) { if (!tbl.bufq[i].active) { CAM_DBG(CAM_MEM, Loading Loading @@ -1034,23 +1045,27 @@ static int cam_mem_mgr_cleanup_table(void) bitmap_zero(tbl.bitmap, tbl.bits); /* We need to reserve slot 0 because 0 is invalid */ set_bit(0, tbl.bitmap); mutex_unlock(&tbl.m_lock); return 0; } void cam_mem_mgr_deinit(void) { atomic_set(&cam_mem_mgr_state, CAM_MEM_MGR_UNINITIALIZED); mutex_lock(&tbl.m_lock); if (!atomic_dec_and_test(&cam_mem_mgr_refcnt)) { CAM_DBG(CAM_MEM, "Mem mgr refcnt: %d", atomic_read(&cam_mem_mgr_refcnt)); mutex_unlock(&tbl.m_lock); return; } cam_mem_mgr_cleanup_table(); debugfs_remove_recursive(tbl.dentry); mutex_lock(&tbl.m_lock); bitmap_zero(tbl.bitmap, tbl.bits); kfree(tbl.bitmap); tbl.bitmap = NULL; tbl.dbg_buf_idx = -1; mutex_unlock(&tbl.m_lock); mutex_destroy(&tbl.m_lock); } static int cam_mem_util_unmap(int32_t idx, Loading Loading @@ -1148,7 +1163,7 @@ int cam_mem_mgr_release(struct cam_mem_mgr_release_cmd *cmd) int idx; int rc; if (!atomic_read(&cam_mem_mgr_state)) { if (!atomic_read(&cam_mem_mgr_refcnt)) { CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized"); return -EINVAL; } Loading Loading @@ -1201,7 +1216,7 @@ int cam_mem_mgr_request_mem(struct cam_mem_mgr_request_desc *inp, enum cam_smmu_region_id region = CAM_SMMU_REGION_SHARED; if (!atomic_read(&cam_mem_mgr_state)) { if (!atomic_read(&cam_mem_mgr_refcnt)) { CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized"); return -EINVAL; } Loading Loading @@ -1327,7 +1342,7 @@ int cam_mem_mgr_release_mem(struct cam_mem_mgr_memory_desc *inp) int32_t idx; int rc; if (!atomic_read(&cam_mem_mgr_state)) { if (!atomic_read(&cam_mem_mgr_refcnt)) { CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized"); return -EINVAL; } Loading Loading @@ -1380,7 +1395,7 @@ int cam_mem_mgr_reserve_memory_region(struct cam_mem_mgr_request_desc *inp, int32_t smmu_hdl = 0; int32_t num_hdl = 0; if (!atomic_read(&cam_mem_mgr_state)) { if (!atomic_read(&cam_mem_mgr_refcnt)) { CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized"); return -EINVAL; } Loading Loading @@ -1475,7 +1490,7 @@ int cam_mem_mgr_free_memory_region(struct cam_mem_mgr_memory_desc *inp) int rc; int32_t smmu_hdl; if (!atomic_read(&cam_mem_mgr_state)) { if (!atomic_read(&cam_mem_mgr_refcnt)) { CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized"); return -EINVAL; } Loading drivers/cam_req_mgr/cam_mem_mgr.h +0 −6 Original line number Diff line number Diff line Loading @@ -11,12 +11,6 @@ #include <media/cam_req_mgr.h> #include "cam_mem_mgr_api.h" /* Enum for possible mem mgr states */ enum cam_mem_mgr_state { CAM_MEM_MGR_UNINITIALIZED, CAM_MEM_MGR_INITIALIZED, }; /*Enum for possible SMMU operations */ enum cam_smmu_mapping_client { CAM_SMMU_MAPPING_USER, Loading Loading
drivers/cam_icp/cam_icp_subdev.c +10 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <media/cam_req_mgr.h> #include <media/cam_defs.h> #include <media/cam_icp.h> #include "cam_mem_mgr.h" #include "cam_req_mgr_dev.h" #include "cam_subdev.h" #include "cam_node.h" Loading Loading @@ -86,10 +87,18 @@ static int cam_icp_subdev_open(struct v4l2_subdev *sd, goto end; } rc = cam_mem_mgr_init(); if (rc) { CAM_ERR(CAM_CRM, "mem mgr init failed"); goto end; } hw_mgr_intf = &node->hw_mgr_intf; rc = hw_mgr_intf->hw_open(hw_mgr_intf->hw_mgr_priv, NULL); if (rc < 0) { CAM_ERR(CAM_ICP, "FW download failed"); cam_mem_mgr_deinit(); goto end; } g_icp_dev.open_cnt++; Loading Loading @@ -130,6 +139,7 @@ int cam_icp_subdev_close_internal(struct v4l2_subdev *sd, goto end; } cam_mem_mgr_deinit(); end: mutex_unlock(&g_icp_dev.icp_lock); return rc; Loading
drivers/cam_req_mgr/cam_mem_mgr.c +40 −25 Original line number Diff line number Diff line Loading @@ -19,8 +19,11 @@ #include "cam_trace.h" #include "cam_common_util.h" static struct cam_mem_table tbl; static atomic_t cam_mem_mgr_state = ATOMIC_INIT(CAM_MEM_MGR_UNINITIALIZED); static struct cam_mem_table tbl = { .m_lock = __MUTEX_INITIALIZER(tbl.m_lock), }; static atomic_t cam_mem_mgr_refcnt = ATOMIC_INIT(0); static void cam_mem_mgr_print_tbl(void) { Loading Loading @@ -164,6 +167,16 @@ int cam_mem_mgr_init(void) int i; int bitmap_size; mutex_lock(&tbl.m_lock); if (atomic_inc_return(&cam_mem_mgr_refcnt) > 1) { CAM_DBG(CAM_MEM, "Mem mgr refcnt: %d", atomic_read(&cam_mem_mgr_refcnt)); mutex_unlock(&tbl.m_lock); return 0; } memset(tbl.bufq, 0, sizeof(tbl.bufq)); if (cam_smmu_need_force_alloc_cached(&tbl.force_cache_allocs)) { Loading @@ -173,8 +186,13 @@ int cam_mem_mgr_init(void) bitmap_size = BITS_TO_LONGS(CAM_MEM_BUFQ_MAX) * sizeof(long); tbl.bitmap = kzalloc(bitmap_size, GFP_KERNEL); if (!tbl.bitmap) if (!tbl.bitmap) { atomic_dec(&cam_mem_mgr_refcnt); CAM_DBG(CAM_MEM, "Mem mgr refcnt: %d", atomic_read(&cam_mem_mgr_refcnt)); mutex_unlock(&tbl.m_lock); return -ENOMEM; } tbl.bits = bitmap_size * BITS_PER_BYTE; bitmap_zero(tbl.bitmap, tbl.bits); Loading @@ -185,9 +203,8 @@ int cam_mem_mgr_init(void) tbl.bufq[i].fd = -1; tbl.bufq[i].buf_handle = -1; } mutex_init(&tbl.m_lock); atomic_set(&cam_mem_mgr_state, CAM_MEM_MGR_INITIALIZED); mutex_unlock(&tbl.m_lock); cam_mem_mgr_create_debug_fs(); Loading Loading @@ -234,7 +251,7 @@ int cam_mem_get_io_buf(int32_t buf_handle, int32_t mmu_handle, *len_ptr = 0; if (!atomic_read(&cam_mem_mgr_state)) { if (!atomic_read(&cam_mem_mgr_refcnt)) { CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized"); return -EINVAL; } Loading Loading @@ -285,12 +302,7 @@ int cam_mem_get_cpu_buf(int32_t buf_handle, uintptr_t *vaddr_ptr, size_t *len) { int idx; if (!atomic_read(&cam_mem_mgr_state)) { CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized"); return -EINVAL; } if (!atomic_read(&cam_mem_mgr_state)) { if (!atomic_read(&cam_mem_mgr_refcnt)) { CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized"); return -EINVAL; } Loading Loading @@ -333,7 +345,7 @@ int cam_mem_mgr_cache_ops(struct cam_mem_cache_ops_cmd *cmd) uint32_t cache_dir; unsigned long dmabuf_flag = 0; if (!atomic_read(&cam_mem_mgr_state)) { if (!atomic_read(&cam_mem_mgr_refcnt)) { CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized"); return -EINVAL; } Loading Loading @@ -659,7 +671,7 @@ int cam_mem_mgr_alloc_and_map(struct cam_mem_mgr_alloc_cmd *cmd) uintptr_t kvaddr = 0; size_t klen; if (!atomic_read(&cam_mem_mgr_state)) { if (!atomic_read(&cam_mem_mgr_refcnt)) { CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized"); return -EINVAL; } Loading Loading @@ -811,7 +823,7 @@ int cam_mem_mgr_map(struct cam_mem_mgr_map_cmd *cmd) size_t len = 0; bool is_internal = false; if (!atomic_read(&cam_mem_mgr_state)) { if (!atomic_read(&cam_mem_mgr_refcnt)) { CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized"); return -EINVAL; } Loading Loading @@ -998,7 +1010,6 @@ static int cam_mem_mgr_cleanup_table(void) { int i; mutex_lock(&tbl.m_lock); for (i = 1; i < CAM_MEM_BUFQ_MAX; i++) { if (!tbl.bufq[i].active) { CAM_DBG(CAM_MEM, Loading Loading @@ -1034,23 +1045,27 @@ static int cam_mem_mgr_cleanup_table(void) bitmap_zero(tbl.bitmap, tbl.bits); /* We need to reserve slot 0 because 0 is invalid */ set_bit(0, tbl.bitmap); mutex_unlock(&tbl.m_lock); return 0; } void cam_mem_mgr_deinit(void) { atomic_set(&cam_mem_mgr_state, CAM_MEM_MGR_UNINITIALIZED); mutex_lock(&tbl.m_lock); if (!atomic_dec_and_test(&cam_mem_mgr_refcnt)) { CAM_DBG(CAM_MEM, "Mem mgr refcnt: %d", atomic_read(&cam_mem_mgr_refcnt)); mutex_unlock(&tbl.m_lock); return; } cam_mem_mgr_cleanup_table(); debugfs_remove_recursive(tbl.dentry); mutex_lock(&tbl.m_lock); bitmap_zero(tbl.bitmap, tbl.bits); kfree(tbl.bitmap); tbl.bitmap = NULL; tbl.dbg_buf_idx = -1; mutex_unlock(&tbl.m_lock); mutex_destroy(&tbl.m_lock); } static int cam_mem_util_unmap(int32_t idx, Loading Loading @@ -1148,7 +1163,7 @@ int cam_mem_mgr_release(struct cam_mem_mgr_release_cmd *cmd) int idx; int rc; if (!atomic_read(&cam_mem_mgr_state)) { if (!atomic_read(&cam_mem_mgr_refcnt)) { CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized"); return -EINVAL; } Loading Loading @@ -1201,7 +1216,7 @@ int cam_mem_mgr_request_mem(struct cam_mem_mgr_request_desc *inp, enum cam_smmu_region_id region = CAM_SMMU_REGION_SHARED; if (!atomic_read(&cam_mem_mgr_state)) { if (!atomic_read(&cam_mem_mgr_refcnt)) { CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized"); return -EINVAL; } Loading Loading @@ -1327,7 +1342,7 @@ int cam_mem_mgr_release_mem(struct cam_mem_mgr_memory_desc *inp) int32_t idx; int rc; if (!atomic_read(&cam_mem_mgr_state)) { if (!atomic_read(&cam_mem_mgr_refcnt)) { CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized"); return -EINVAL; } Loading Loading @@ -1380,7 +1395,7 @@ int cam_mem_mgr_reserve_memory_region(struct cam_mem_mgr_request_desc *inp, int32_t smmu_hdl = 0; int32_t num_hdl = 0; if (!atomic_read(&cam_mem_mgr_state)) { if (!atomic_read(&cam_mem_mgr_refcnt)) { CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized"); return -EINVAL; } Loading Loading @@ -1475,7 +1490,7 @@ int cam_mem_mgr_free_memory_region(struct cam_mem_mgr_memory_desc *inp) int rc; int32_t smmu_hdl; if (!atomic_read(&cam_mem_mgr_state)) { if (!atomic_read(&cam_mem_mgr_refcnt)) { CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized"); return -EINVAL; } Loading
drivers/cam_req_mgr/cam_mem_mgr.h +0 −6 Original line number Diff line number Diff line Loading @@ -11,12 +11,6 @@ #include <media/cam_req_mgr.h> #include "cam_mem_mgr_api.h" /* Enum for possible mem mgr states */ enum cam_mem_mgr_state { CAM_MEM_MGR_UNINITIALIZED, CAM_MEM_MGR_INITIALIZED, }; /*Enum for possible SMMU operations */ enum cam_smmu_mapping_client { CAM_SMMU_MAPPING_USER, Loading