Loading drivers/media/platform/msm/camera/cam_isp/cam_isp_context.c +102 −16 Original line number Diff line number Diff line Loading @@ -66,6 +66,73 @@ static int __cam_isp_ctx_enqueue_request_in_order( return 0; } static int __cam_isp_ctx_enqueue_init_request( struct cam_context *ctx, struct cam_ctx_request *req) { int rc = 0; struct cam_ctx_request *req_old; struct cam_isp_ctx_req *req_isp_old; struct cam_isp_ctx_req *req_isp_new; spin_lock_bh(&ctx->lock); if (list_empty(&ctx->pending_req_list)) { list_add_tail(&req->list, &ctx->pending_req_list); CAM_DBG(CAM_ISP, "INIT packet added req id= %d", req->request_id); goto end; } req_old = list_first_entry(&ctx->pending_req_list, struct cam_ctx_request, list); req_isp_old = (struct cam_isp_ctx_req *) req_old->req_priv; req_isp_new = (struct cam_isp_ctx_req *) req->req_priv; if (req_isp_old->packet_opcode_type == CAM_ISP_PACKET_INIT_DEV) { if ((req_isp_old->num_cfg + req_isp_new->num_cfg) >= CAM_ISP_CTX_CFG_MAX) { CAM_WARN(CAM_ISP, "Can not merge INIT pkt"); rc = -ENOMEM; } if (req_isp_old->num_fence_map_out != 0 || req_isp_old->num_fence_map_in != 0) { CAM_WARN(CAM_ISP, "Invalid INIT pkt sequence"); rc = -EINVAL; } if (!rc) { memcpy(req_isp_old->fence_map_out, req_isp_new->fence_map_out, sizeof(req_isp_new->fence_map_out[0])* req_isp_new->num_fence_map_out); req_isp_old->num_fence_map_out = req_isp_new->num_fence_map_out; memcpy(req_isp_old->fence_map_in, req_isp_new->fence_map_in, sizeof(req_isp_new->fence_map_in[0])* req_isp_new->num_fence_map_in); req_isp_old->num_fence_map_in = req_isp_new->num_fence_map_in; memcpy(&req_isp_old->cfg[req_isp_old->num_cfg], req_isp_new->cfg, sizeof(req_isp_new->cfg[0])* req_isp_new->num_cfg); req_isp_old->num_cfg += req_isp_new->num_cfg; list_add_tail(&req->list, &ctx->free_req_list); } } else { CAM_WARN(CAM_ISP, "Received Update pkt before INIT pkt. req_id= %lld", req->request_id); rc = -EINVAL; } end: spin_unlock_bh(&ctx->lock); return rc; } static const char *__cam_isp_resource_handle_id_to_type (uint32_t resource_handle) { Loading Loading @@ -1627,6 +1694,7 @@ static int __cam_isp_ctx_config_dev_in_top_state( struct cam_req_mgr_add_request add_req; struct cam_isp_context *ctx_isp = (struct cam_isp_context *) ctx->ctx_priv; struct cam_isp_prepare_hw_update_data hw_update_data; CAM_DBG(CAM_ISP, "get free request object......"); Loading Loading @@ -1677,6 +1745,7 @@ static int __cam_isp_ctx_config_dev_in_top_state( cfg.max_in_map_entries = CAM_ISP_CTX_RES_MAX; cfg.out_map_entries = req_isp->fence_map_out; cfg.in_map_entries = req_isp->fence_map_in; cfg.priv = &hw_update_data; CAM_DBG(CAM_ISP, "try to prepare config packet......"); Loading @@ -1691,6 +1760,7 @@ static int __cam_isp_ctx_config_dev_in_top_state( req_isp->num_fence_map_out = cfg.num_out_map_entries; req_isp->num_fence_map_in = cfg.num_in_map_entries; req_isp->num_acked = 0; req_isp->packet_opcode_type = hw_update_data.packet_opcode_type; CAM_DBG(CAM_ISP, "num_entry: %d, num fence out: %d, num fence in: %d", req_isp->num_cfg, req_isp->num_fence_map_out, Loading @@ -1699,6 +1769,19 @@ static int __cam_isp_ctx_config_dev_in_top_state( req->request_id = packet->header.request_id; req->status = 1; CAM_DBG(CAM_ISP, "Packet request id 0x%llx packet opcode:%d", packet->header.request_id, req_isp->packet_opcode_type); if (req_isp->packet_opcode_type == CAM_ISP_PACKET_INIT_DEV) { if (ctx->state < CAM_CTX_ACTIVATED) { rc = __cam_isp_ctx_enqueue_init_request(ctx, req); if (rc) CAM_ERR(CAM_ISP, "Enqueue INIT pkt failed"); } else { rc = -EINVAL; CAM_ERR(CAM_ISP, "Recevied INIT pkt in wrong state"); } } else { if (ctx->state >= CAM_CTX_READY && ctx->ctx_crm_intf->add_req) { add_req.link_hdl = ctx->link_hdl; add_req.dev_hdl = ctx->dev_hdl; Loading @@ -1706,16 +1789,19 @@ static int __cam_isp_ctx_config_dev_in_top_state( add_req.skip_before_applying = 0; rc = ctx->ctx_crm_intf->add_req(&add_req); if (rc) { CAM_ERR(CAM_ISP, "Error: Adding request id=%llu", CAM_ERR(CAM_ISP, "Add req failed: req id=%llu", req->request_id); goto free_req; } else { __cam_isp_ctx_enqueue_request_in_order( ctx, req); } } else { rc = -EINVAL; CAM_ERR(CAM_ISP, "Recevied Update in wrong state"); } } CAM_DBG(CAM_ISP, "Packet request id 0x%llx", packet->header.request_id); __cam_isp_ctx_enqueue_request_in_order(ctx, req); if (rc) goto free_req; CAM_DBG(CAM_ISP, "Preprocessing Config %lld successful", req->request_id); Loading drivers/media/platform/msm/camera/cam_isp/cam_isp_context.h +3 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,8 @@ struct cam_isp_ctx_irq_ops { * the request has been completed. * @bubble_report: Flag to track if bubble report is active on * current request * @packet_opcode_type: Request packet opcode type, * ie INIT packet or update packet * */ struct cam_isp_ctx_req { Loading @@ -94,6 +96,7 @@ struct cam_isp_ctx_req { uint32_t num_fence_map_in; uint32_t num_acked; int32_t bubble_report; uint32_t packet_opcode_type; }; /** Loading drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c +12 −6 Original line number Diff line number Diff line Loading @@ -2357,6 +2357,7 @@ static int cam_ife_mgr_prepare_hw_update(void *hw_mgr_priv, struct cam_kmd_buf_info kmd_buf; uint32_t i; bool fill_fence = true; struct cam_isp_prepare_hw_update_data *prepare_hw_data; if (!hw_mgr_priv || !prepare_hw_update_args) { CAM_ERR(CAM_ISP, "Invalid args"); Loading Loading @@ -2442,9 +2443,14 @@ static int cam_ife_mgr_prepare_hw_update(void *hw_mgr_priv, * bits to get the type of operation since UMD definition * of op_code has some difference from KMD. */ prepare_hw_data = (struct cam_isp_prepare_hw_update_data *) prepare->priv; if (((prepare->packet->header.op_code + 1) & 0xF) == CAM_ISP_PACKET_INIT_DEV) CAM_ISP_PACKET_INIT_DEV) { prepare_hw_data->packet_opcode_type = CAM_ISP_PACKET_INIT_DEV; goto end; } else prepare_hw_data->packet_opcode_type = CAM_ISP_PACKET_UPDATE_DEV; /* add reg update commands */ for (i = 0; i < ctx->num_base; i++) { Loading drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/include/cam_isp_hw_mgr_intf.h +12 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,18 @@ enum cam_isp_hw_err_type { CAM_ISP_HW_ERROR_MAX, }; /** * struct cam_isp_prepare_hw_update_data - hw prepare data * * @packet_opcode_type: Packet header opcode in the packet header * this opcode defines, packet is init packet or * update packet * */ struct cam_isp_prepare_hw_update_data { uint32_t packet_opcode_type; }; /** * struct cam_isp_hw_sof_event_data - Event payload for CAM_HW_EVENT_SOF Loading Loading
drivers/media/platform/msm/camera/cam_isp/cam_isp_context.c +102 −16 Original line number Diff line number Diff line Loading @@ -66,6 +66,73 @@ static int __cam_isp_ctx_enqueue_request_in_order( return 0; } static int __cam_isp_ctx_enqueue_init_request( struct cam_context *ctx, struct cam_ctx_request *req) { int rc = 0; struct cam_ctx_request *req_old; struct cam_isp_ctx_req *req_isp_old; struct cam_isp_ctx_req *req_isp_new; spin_lock_bh(&ctx->lock); if (list_empty(&ctx->pending_req_list)) { list_add_tail(&req->list, &ctx->pending_req_list); CAM_DBG(CAM_ISP, "INIT packet added req id= %d", req->request_id); goto end; } req_old = list_first_entry(&ctx->pending_req_list, struct cam_ctx_request, list); req_isp_old = (struct cam_isp_ctx_req *) req_old->req_priv; req_isp_new = (struct cam_isp_ctx_req *) req->req_priv; if (req_isp_old->packet_opcode_type == CAM_ISP_PACKET_INIT_DEV) { if ((req_isp_old->num_cfg + req_isp_new->num_cfg) >= CAM_ISP_CTX_CFG_MAX) { CAM_WARN(CAM_ISP, "Can not merge INIT pkt"); rc = -ENOMEM; } if (req_isp_old->num_fence_map_out != 0 || req_isp_old->num_fence_map_in != 0) { CAM_WARN(CAM_ISP, "Invalid INIT pkt sequence"); rc = -EINVAL; } if (!rc) { memcpy(req_isp_old->fence_map_out, req_isp_new->fence_map_out, sizeof(req_isp_new->fence_map_out[0])* req_isp_new->num_fence_map_out); req_isp_old->num_fence_map_out = req_isp_new->num_fence_map_out; memcpy(req_isp_old->fence_map_in, req_isp_new->fence_map_in, sizeof(req_isp_new->fence_map_in[0])* req_isp_new->num_fence_map_in); req_isp_old->num_fence_map_in = req_isp_new->num_fence_map_in; memcpy(&req_isp_old->cfg[req_isp_old->num_cfg], req_isp_new->cfg, sizeof(req_isp_new->cfg[0])* req_isp_new->num_cfg); req_isp_old->num_cfg += req_isp_new->num_cfg; list_add_tail(&req->list, &ctx->free_req_list); } } else { CAM_WARN(CAM_ISP, "Received Update pkt before INIT pkt. req_id= %lld", req->request_id); rc = -EINVAL; } end: spin_unlock_bh(&ctx->lock); return rc; } static const char *__cam_isp_resource_handle_id_to_type (uint32_t resource_handle) { Loading Loading @@ -1627,6 +1694,7 @@ static int __cam_isp_ctx_config_dev_in_top_state( struct cam_req_mgr_add_request add_req; struct cam_isp_context *ctx_isp = (struct cam_isp_context *) ctx->ctx_priv; struct cam_isp_prepare_hw_update_data hw_update_data; CAM_DBG(CAM_ISP, "get free request object......"); Loading Loading @@ -1677,6 +1745,7 @@ static int __cam_isp_ctx_config_dev_in_top_state( cfg.max_in_map_entries = CAM_ISP_CTX_RES_MAX; cfg.out_map_entries = req_isp->fence_map_out; cfg.in_map_entries = req_isp->fence_map_in; cfg.priv = &hw_update_data; CAM_DBG(CAM_ISP, "try to prepare config packet......"); Loading @@ -1691,6 +1760,7 @@ static int __cam_isp_ctx_config_dev_in_top_state( req_isp->num_fence_map_out = cfg.num_out_map_entries; req_isp->num_fence_map_in = cfg.num_in_map_entries; req_isp->num_acked = 0; req_isp->packet_opcode_type = hw_update_data.packet_opcode_type; CAM_DBG(CAM_ISP, "num_entry: %d, num fence out: %d, num fence in: %d", req_isp->num_cfg, req_isp->num_fence_map_out, Loading @@ -1699,6 +1769,19 @@ static int __cam_isp_ctx_config_dev_in_top_state( req->request_id = packet->header.request_id; req->status = 1; CAM_DBG(CAM_ISP, "Packet request id 0x%llx packet opcode:%d", packet->header.request_id, req_isp->packet_opcode_type); if (req_isp->packet_opcode_type == CAM_ISP_PACKET_INIT_DEV) { if (ctx->state < CAM_CTX_ACTIVATED) { rc = __cam_isp_ctx_enqueue_init_request(ctx, req); if (rc) CAM_ERR(CAM_ISP, "Enqueue INIT pkt failed"); } else { rc = -EINVAL; CAM_ERR(CAM_ISP, "Recevied INIT pkt in wrong state"); } } else { if (ctx->state >= CAM_CTX_READY && ctx->ctx_crm_intf->add_req) { add_req.link_hdl = ctx->link_hdl; add_req.dev_hdl = ctx->dev_hdl; Loading @@ -1706,16 +1789,19 @@ static int __cam_isp_ctx_config_dev_in_top_state( add_req.skip_before_applying = 0; rc = ctx->ctx_crm_intf->add_req(&add_req); if (rc) { CAM_ERR(CAM_ISP, "Error: Adding request id=%llu", CAM_ERR(CAM_ISP, "Add req failed: req id=%llu", req->request_id); goto free_req; } else { __cam_isp_ctx_enqueue_request_in_order( ctx, req); } } else { rc = -EINVAL; CAM_ERR(CAM_ISP, "Recevied Update in wrong state"); } } CAM_DBG(CAM_ISP, "Packet request id 0x%llx", packet->header.request_id); __cam_isp_ctx_enqueue_request_in_order(ctx, req); if (rc) goto free_req; CAM_DBG(CAM_ISP, "Preprocessing Config %lld successful", req->request_id); Loading
drivers/media/platform/msm/camera/cam_isp/cam_isp_context.h +3 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,8 @@ struct cam_isp_ctx_irq_ops { * the request has been completed. * @bubble_report: Flag to track if bubble report is active on * current request * @packet_opcode_type: Request packet opcode type, * ie INIT packet or update packet * */ struct cam_isp_ctx_req { Loading @@ -94,6 +96,7 @@ struct cam_isp_ctx_req { uint32_t num_fence_map_in; uint32_t num_acked; int32_t bubble_report; uint32_t packet_opcode_type; }; /** Loading
drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c +12 −6 Original line number Diff line number Diff line Loading @@ -2357,6 +2357,7 @@ static int cam_ife_mgr_prepare_hw_update(void *hw_mgr_priv, struct cam_kmd_buf_info kmd_buf; uint32_t i; bool fill_fence = true; struct cam_isp_prepare_hw_update_data *prepare_hw_data; if (!hw_mgr_priv || !prepare_hw_update_args) { CAM_ERR(CAM_ISP, "Invalid args"); Loading Loading @@ -2442,9 +2443,14 @@ static int cam_ife_mgr_prepare_hw_update(void *hw_mgr_priv, * bits to get the type of operation since UMD definition * of op_code has some difference from KMD. */ prepare_hw_data = (struct cam_isp_prepare_hw_update_data *) prepare->priv; if (((prepare->packet->header.op_code + 1) & 0xF) == CAM_ISP_PACKET_INIT_DEV) CAM_ISP_PACKET_INIT_DEV) { prepare_hw_data->packet_opcode_type = CAM_ISP_PACKET_INIT_DEV; goto end; } else prepare_hw_data->packet_opcode_type = CAM_ISP_PACKET_UPDATE_DEV; /* add reg update commands */ for (i = 0; i < ctx->num_base; i++) { Loading
drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/include/cam_isp_hw_mgr_intf.h +12 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,18 @@ enum cam_isp_hw_err_type { CAM_ISP_HW_ERROR_MAX, }; /** * struct cam_isp_prepare_hw_update_data - hw prepare data * * @packet_opcode_type: Packet header opcode in the packet header * this opcode defines, packet is init packet or * update packet * */ struct cam_isp_prepare_hw_update_data { uint32_t packet_opcode_type; }; /** * struct cam_isp_hw_sof_event_data - Event payload for CAM_HW_EVENT_SOF Loading