static enum ia_css_err sp_init_stage(struct sh_css_pipeline_stage *stage, unsigned int pipe_num, unsigned stage_num, bool preview_mode, bool low_light, bool xnr, unsigned int if_config_index) { struct sh_css_binary *binary = stage->binary; const struct ia_css_fw_info *firmware = stage->firmware; const struct sh_css_binary_args *args = &stage->args; /* * Initialiser required because of the "else" path below. * Is this a valid path ? */ const char *binary_name = ""; const struct ia_css_binary_info *info = NULL; struct sh_css_binary tmp_binary; const struct ia_css_blob_info *blob_info = NULL; struct ia_css_data isp_mem_if[IA_CSS_NUM_ISP_MEMORIES]; const struct ia_css_data *mem_if = isp_mem_if; memset(isp_mem_if, 0, sizeof(isp_mem_if)); if (binary) { info = binary->info; binary_name = (const char *)(info->blob->name); blob_info = &info->blob->header.blob; } else if (firmware) { info = &firmware->info.isp; sh_css_fill_binary_info(info, false, false, IA_CSS_STREAM_FORMAT_RAW_10, args->in_frame ? &args->in_frame->info : NULL, args->out_frame ? &args->out_frame->info : NULL, args->out_vf_frame ? &args->out_vf_frame->info : NULL, &tmp_binary, false, NULL); binary = &tmp_binary; binary->info = info; binary_name = IA_CSS_EXT_ISP_PROG_NAME(firmware); blob_info = &firmware->blob; mem_if = firmware->mem_initializers; } else { /* SP stage */ assert (stage->sp_func != SH_CSS_SP_NO_FUNC); } #ifdef __KERNEL__ printk(KERN_ERR "load binary: %s\n", binary_name); #endif sh_css_sp_init_stage(binary, (const char *)binary_name, blob_info, args, pipe_num, stage_num, preview_mode, low_light, xnr, stage->irq_buf_flags, mem_if, if_config_index); return IA_CSS_SUCCESS; }
static enum ia_css_err sp_init_stage(struct ia_css_pipeline_stage *stage, unsigned int pipe_num, bool xnr, unsigned int if_config_index) { struct ia_css_binary *binary; const struct ia_css_fw_info *firmware; const struct sh_css_binary_args *args; unsigned stage_num; /* * Initialiser required because of the "else" path below. * Is this a valid path ? */ const char *binary_name = ""; const struct ia_css_binary_xinfo *info = NULL; struct ia_css_binary tmp_binary; const struct ia_css_blob_info *blob_info = NULL; struct ia_css_isp_param_css_segments isp_mem_if; /* LA: should be ia_css_data, should not contain host pointer. However, CSS/DDR pointer is not available yet. Hack is to store it in params->ddr_ptrs and then copy it late in the SP just before vmem init. TODO: Call this after CSS/DDR allocation and store that pointer. Best is to allocate it at stage creation time together with host pointer. Remove vmem from params. */ struct ia_css_isp_param_css_segments *mem_if = &isp_mem_if; enum ia_css_err err = IA_CSS_SUCCESS; assert(stage != NULL); binary = stage->binary; firmware = stage->firmware; args = &stage->args; stage_num = stage->stage_num;; if (binary) { info = binary->info; binary_name = (const char *)(info->blob->name); blob_info = &info->blob->header.blob; ia_css_init_memory_interface(mem_if, &binary->mem_params, &binary->css_params); } else if (firmware) { info = &firmware->info.isp; ia_css_binary_fill_info(info, false, false, IA_CSS_STREAM_FORMAT_RAW_10, args->in_frame ? &args->in_frame->info : NULL, NULL, args->out_frame ? &args->out_frame->info : NULL, args->out_vf_frame ? &args->out_vf_frame->info : NULL, &tmp_binary, NULL, -1, true); binary = &tmp_binary; binary->info = info; binary_name = IA_CSS_EXT_ISP_PROG_NAME(firmware); blob_info = &firmware->blob; mem_if = (struct ia_css_isp_param_css_segments *)&firmware->mem_initializers; } else { /* SP stage */ assert (stage->sp_func != IA_CSS_PIPELINE_NO_FUNC); /* binary and blob_info are now NULL. These will be passed to sh_css_sp_init_stage and dereferenced there, so passing a NULL pointer is no good. return an error */ return IA_CSS_ERR_INTERNAL_ERROR; } #ifdef __KERNEL__ printk(KERN_ERR "load binary: %s\n", binary_name); #endif err = sh_css_sp_init_stage(binary, (const char *)binary_name, blob_info, args, pipe_num, stage_num, xnr, mem_if, if_config_index); return err; }