Loading drivers/media/platform/msm/camera/cam_icp/icp_hw/icp_hw_mgr/cam_icp_hw_mgr.c +58 −10 Original line number Diff line number Diff line Loading @@ -880,6 +880,12 @@ static int cam_icp_mgr_handle_frame_process(uint32_t *msg_ptr, int flag) buf_data.request_id = hfi_frame_process->request_id[idx]; ctx_data->ctxt_event_cb(ctx_data->context_priv, flag, &buf_data); hfi_frame_process->request_id[idx] = 0; if (ctx_data->hfi_frame_process.in_resource[idx] > 0) { CAM_DBG(CAM_ICP, "Delete merged sync in object: %d", ctx_data->hfi_frame_process.in_resource[idx]); cam_sync_destroy(ctx_data->hfi_frame_process.in_resource[idx]); ctx_data->hfi_frame_process.in_resource[idx] = 0; } clear_bit(idx, ctx_data->hfi_frame_process.bitmap); hfi_frame_process->fw_process_flag[idx] = false; mutex_unlock(&ctx_data->ctx_mutex); Loading Loading @@ -1974,13 +1980,16 @@ static int cam_icp_mgr_process_cmd_desc(struct cam_icp_hw_mgr *hw_mgr, return rc; } static void cam_icp_mgr_process_io_cfg(struct cam_icp_hw_mgr *hw_mgr, static int cam_icp_mgr_process_io_cfg(struct cam_icp_hw_mgr *hw_mgr, struct cam_icp_hw_ctx_data *ctx_data, struct cam_packet *packet, struct cam_hw_prepare_update_args *prepare_args) struct cam_hw_prepare_update_args *prepare_args, int32_t index) { int i, j, k; int i, j, k, rc = 0; struct cam_buf_io_cfg *io_cfg_ptr = NULL; int32_t sync_in_obj[CAM_MAX_OUT_RES]; int32_t merged_sync_in_obj; io_cfg_ptr = (struct cam_buf_io_cfg *) ((uint32_t *) &packet->payload + packet->io_configs_offset/4); Loading @@ -1989,8 +1998,7 @@ static void cam_icp_mgr_process_io_cfg(struct cam_icp_hw_mgr *hw_mgr, for (i = 0, j = 0, k = 0; i < packet->num_io_configs; i++) { if (io_cfg_ptr[i].direction == CAM_BUF_INPUT) { prepare_args->in_map_entries[j++].sync_id = io_cfg_ptr[i].fence; sync_in_obj[j++] = io_cfg_ptr[i].fence; prepare_args->num_in_map_entries++; } else { prepare_args->out_map_entries[k++].sync_id = Loading @@ -2000,6 +2008,33 @@ static void cam_icp_mgr_process_io_cfg(struct cam_icp_hw_mgr *hw_mgr, CAM_DBG(CAM_ICP, "dir[%d]: %u, fence: %u", i, io_cfg_ptr[i].direction, io_cfg_ptr[i].fence); } if (prepare_args->num_in_map_entries > 1) { rc = cam_sync_merge(&sync_in_obj[0], prepare_args->num_in_map_entries, &merged_sync_in_obj); if (rc) { prepare_args->num_out_map_entries = 0; prepare_args->num_in_map_entries = 0; return rc; } ctx_data->hfi_frame_process.in_resource[index] = merged_sync_in_obj; prepare_args->in_map_entries[0].sync_id = merged_sync_in_obj; prepare_args->num_in_map_entries = 1; CAM_DBG(CAM_ICP, "Merged Sync obj = %d", merged_sync_in_obj); } else if (prepare_args->num_in_map_entries == 1) { prepare_args->in_map_entries[0].sync_id = sync_in_obj[0]; prepare_args->num_in_map_entries = 1; ctx_data->hfi_frame_process.in_resource[index] = 0; } else { CAM_ERR(CAM_ICP, "No input fences"); prepare_args->num_in_map_entries = 0; ctx_data->hfi_frame_process.in_resource[index] = 0; rc = -EINVAL; } return rc; } static int cam_icp_packet_generic_blob_handler(void *user_data, Loading Loading @@ -2154,15 +2189,21 @@ static int cam_icp_mgr_prepare_hw_update(void *hw_mgr_priv, return rc; } cam_icp_mgr_process_io_cfg(hw_mgr, ctx_data, packet, prepare_args); rc = cam_icp_mgr_update_hfi_frame_process(ctx_data, packet, prepare_args, &idx); if (rc) { if (prepare_args->in_map_entries[0].sync_id > 0) mutex_unlock(&ctx_data->ctx_mutex); return rc; } rc = cam_icp_mgr_process_io_cfg(hw_mgr, ctx_data, packet, prepare_args, idx); if (rc) { if (ctx_data->hfi_frame_process.in_resource[idx] > 0) cam_sync_destroy( prepare_args->in_map_entries[0].sync_id); ctx_data->hfi_frame_process.in_resource[idx]); clear_bit(idx, ctx_data->hfi_frame_process.bitmap); ctx_data->hfi_frame_process.request_id[idx] = -1; mutex_unlock(&ctx_data->ctx_mutex); return rc; } Loading Loading @@ -2197,6 +2238,13 @@ static int cam_icp_mgr_send_abort_status(struct cam_icp_hw_ctx_data *ctx_data) /* now release memory for hfi frame process command */ hfi_frame_process->request_id[idx] = 0; if (ctx_data->hfi_frame_process.in_resource[idx] > 0) { CAM_DBG(CAM_ICP, "Delete merged sync in object: %d", ctx_data->hfi_frame_process.in_resource[idx]); cam_sync_destroy( ctx_data->hfi_frame_process.in_resource[idx]); ctx_data->hfi_frame_process.in_resource[idx] = 0; } clear_bit(idx, ctx_data->hfi_frame_process.bitmap); } mutex_unlock(&ctx_data->ctx_mutex); Loading drivers/media/platform/msm/camera/cam_icp/icp_hw/icp_hw_mgr/cam_icp_hw_mgr.h +1 −0 Original line number Diff line number Diff line Loading @@ -114,6 +114,7 @@ struct hfi_frame_process_info { uint64_t request_id[CAM_FRAME_CMD_MAX]; uint32_t num_out_resources[CAM_FRAME_CMD_MAX]; uint32_t out_resource[CAM_FRAME_CMD_MAX][CAM_MAX_OUT_RES]; uint32_t in_resource[CAM_FRAME_CMD_MAX]; uint32_t fw_process_flag[CAM_FRAME_CMD_MAX]; struct cam_icp_clk_bw_request clk_info[CAM_FRAME_CMD_MAX]; }; Loading Loading
drivers/media/platform/msm/camera/cam_icp/icp_hw/icp_hw_mgr/cam_icp_hw_mgr.c +58 −10 Original line number Diff line number Diff line Loading @@ -880,6 +880,12 @@ static int cam_icp_mgr_handle_frame_process(uint32_t *msg_ptr, int flag) buf_data.request_id = hfi_frame_process->request_id[idx]; ctx_data->ctxt_event_cb(ctx_data->context_priv, flag, &buf_data); hfi_frame_process->request_id[idx] = 0; if (ctx_data->hfi_frame_process.in_resource[idx] > 0) { CAM_DBG(CAM_ICP, "Delete merged sync in object: %d", ctx_data->hfi_frame_process.in_resource[idx]); cam_sync_destroy(ctx_data->hfi_frame_process.in_resource[idx]); ctx_data->hfi_frame_process.in_resource[idx] = 0; } clear_bit(idx, ctx_data->hfi_frame_process.bitmap); hfi_frame_process->fw_process_flag[idx] = false; mutex_unlock(&ctx_data->ctx_mutex); Loading Loading @@ -1974,13 +1980,16 @@ static int cam_icp_mgr_process_cmd_desc(struct cam_icp_hw_mgr *hw_mgr, return rc; } static void cam_icp_mgr_process_io_cfg(struct cam_icp_hw_mgr *hw_mgr, static int cam_icp_mgr_process_io_cfg(struct cam_icp_hw_mgr *hw_mgr, struct cam_icp_hw_ctx_data *ctx_data, struct cam_packet *packet, struct cam_hw_prepare_update_args *prepare_args) struct cam_hw_prepare_update_args *prepare_args, int32_t index) { int i, j, k; int i, j, k, rc = 0; struct cam_buf_io_cfg *io_cfg_ptr = NULL; int32_t sync_in_obj[CAM_MAX_OUT_RES]; int32_t merged_sync_in_obj; io_cfg_ptr = (struct cam_buf_io_cfg *) ((uint32_t *) &packet->payload + packet->io_configs_offset/4); Loading @@ -1989,8 +1998,7 @@ static void cam_icp_mgr_process_io_cfg(struct cam_icp_hw_mgr *hw_mgr, for (i = 0, j = 0, k = 0; i < packet->num_io_configs; i++) { if (io_cfg_ptr[i].direction == CAM_BUF_INPUT) { prepare_args->in_map_entries[j++].sync_id = io_cfg_ptr[i].fence; sync_in_obj[j++] = io_cfg_ptr[i].fence; prepare_args->num_in_map_entries++; } else { prepare_args->out_map_entries[k++].sync_id = Loading @@ -2000,6 +2008,33 @@ static void cam_icp_mgr_process_io_cfg(struct cam_icp_hw_mgr *hw_mgr, CAM_DBG(CAM_ICP, "dir[%d]: %u, fence: %u", i, io_cfg_ptr[i].direction, io_cfg_ptr[i].fence); } if (prepare_args->num_in_map_entries > 1) { rc = cam_sync_merge(&sync_in_obj[0], prepare_args->num_in_map_entries, &merged_sync_in_obj); if (rc) { prepare_args->num_out_map_entries = 0; prepare_args->num_in_map_entries = 0; return rc; } ctx_data->hfi_frame_process.in_resource[index] = merged_sync_in_obj; prepare_args->in_map_entries[0].sync_id = merged_sync_in_obj; prepare_args->num_in_map_entries = 1; CAM_DBG(CAM_ICP, "Merged Sync obj = %d", merged_sync_in_obj); } else if (prepare_args->num_in_map_entries == 1) { prepare_args->in_map_entries[0].sync_id = sync_in_obj[0]; prepare_args->num_in_map_entries = 1; ctx_data->hfi_frame_process.in_resource[index] = 0; } else { CAM_ERR(CAM_ICP, "No input fences"); prepare_args->num_in_map_entries = 0; ctx_data->hfi_frame_process.in_resource[index] = 0; rc = -EINVAL; } return rc; } static int cam_icp_packet_generic_blob_handler(void *user_data, Loading Loading @@ -2154,15 +2189,21 @@ static int cam_icp_mgr_prepare_hw_update(void *hw_mgr_priv, return rc; } cam_icp_mgr_process_io_cfg(hw_mgr, ctx_data, packet, prepare_args); rc = cam_icp_mgr_update_hfi_frame_process(ctx_data, packet, prepare_args, &idx); if (rc) { if (prepare_args->in_map_entries[0].sync_id > 0) mutex_unlock(&ctx_data->ctx_mutex); return rc; } rc = cam_icp_mgr_process_io_cfg(hw_mgr, ctx_data, packet, prepare_args, idx); if (rc) { if (ctx_data->hfi_frame_process.in_resource[idx] > 0) cam_sync_destroy( prepare_args->in_map_entries[0].sync_id); ctx_data->hfi_frame_process.in_resource[idx]); clear_bit(idx, ctx_data->hfi_frame_process.bitmap); ctx_data->hfi_frame_process.request_id[idx] = -1; mutex_unlock(&ctx_data->ctx_mutex); return rc; } Loading Loading @@ -2197,6 +2238,13 @@ static int cam_icp_mgr_send_abort_status(struct cam_icp_hw_ctx_data *ctx_data) /* now release memory for hfi frame process command */ hfi_frame_process->request_id[idx] = 0; if (ctx_data->hfi_frame_process.in_resource[idx] > 0) { CAM_DBG(CAM_ICP, "Delete merged sync in object: %d", ctx_data->hfi_frame_process.in_resource[idx]); cam_sync_destroy( ctx_data->hfi_frame_process.in_resource[idx]); ctx_data->hfi_frame_process.in_resource[idx] = 0; } clear_bit(idx, ctx_data->hfi_frame_process.bitmap); } mutex_unlock(&ctx_data->ctx_mutex); Loading
drivers/media/platform/msm/camera/cam_icp/icp_hw/icp_hw_mgr/cam_icp_hw_mgr.h +1 −0 Original line number Diff line number Diff line Loading @@ -114,6 +114,7 @@ struct hfi_frame_process_info { uint64_t request_id[CAM_FRAME_CMD_MAX]; uint32_t num_out_resources[CAM_FRAME_CMD_MAX]; uint32_t out_resource[CAM_FRAME_CMD_MAX][CAM_MAX_OUT_RES]; uint32_t in_resource[CAM_FRAME_CMD_MAX]; uint32_t fw_process_flag[CAM_FRAME_CMD_MAX]; struct cam_icp_clk_bw_request clk_info[CAM_FRAME_CMD_MAX]; }; Loading