|
|
|
@ -209,13 +209,6 @@ ia_css_pipe_check_format(struct ia_css_pipe *pipe,
|
|
|
|
|
enum ia_css_frame_format format);
|
|
|
|
|
|
|
|
|
|
/* ISP 2401 */
|
|
|
|
|
static int
|
|
|
|
|
ia_css_pipe_load_extension(struct ia_css_pipe *pipe,
|
|
|
|
|
struct ia_css_fw_info *firmware);
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
ia_css_pipe_unload_extension(struct ia_css_pipe *pipe,
|
|
|
|
|
struct ia_css_fw_info *firmware);
|
|
|
|
|
static void
|
|
|
|
|
ia_css_reset_defaults(struct sh_css *css);
|
|
|
|
|
|
|
|
|
@ -286,10 +279,6 @@ static int
|
|
|
|
|
init_out_frameinfo_defaults(struct ia_css_pipe *pipe,
|
|
|
|
|
struct ia_css_frame *out_frame, unsigned int idx);
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
sh_css_pipeline_add_acc_stage(struct ia_css_pipeline *pipeline,
|
|
|
|
|
const void *acc_fw);
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
alloc_continuous_frames(struct ia_css_pipe *pipe, bool init_time);
|
|
|
|
|
|
|
|
|
@ -329,9 +318,6 @@ create_host_capture_pipeline(struct ia_css_pipe *pipe);
|
|
|
|
|
static int
|
|
|
|
|
create_host_yuvpp_pipeline(struct ia_css_pipe *pipe);
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
create_host_acc_pipeline(struct ia_css_pipe *pipe);
|
|
|
|
|
|
|
|
|
|
static unsigned int
|
|
|
|
|
sh_css_get_sw_interrupt_value(unsigned int irq);
|
|
|
|
|
|
|
|
|
@ -362,12 +348,6 @@ static struct sh_css_hmm_buffer_record
|
|
|
|
|
*sh_css_hmm_buffer_record_validate(ia_css_ptr ddr_buffer_addr,
|
|
|
|
|
enum ia_css_buffer_type type);
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
ia_css_get_acc_configs(
|
|
|
|
|
struct ia_css_pipe *pipe,
|
|
|
|
|
struct ia_css_isp_config *config);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef ISP2401
|
|
|
|
|
static unsigned int get_crop_lines_for_bayer_order(const struct
|
|
|
|
|
ia_css_stream_config *config);
|
|
|
|
@ -1670,7 +1650,6 @@ map_sp_threads(struct ia_css_stream *stream, bool map)
|
|
|
|
|
struct ia_css_pipe *main_pipe = NULL;
|
|
|
|
|
struct ia_css_pipe *copy_pipe = NULL;
|
|
|
|
|
struct ia_css_pipe *capture_pipe = NULL;
|
|
|
|
|
struct ia_css_pipe *acc_pipe = NULL;
|
|
|
|
|
int err = 0;
|
|
|
|
|
enum ia_css_pipe_id pipe_id;
|
|
|
|
|
|
|
|
|
@ -1691,7 +1670,6 @@ map_sp_threads(struct ia_css_stream *stream, bool map)
|
|
|
|
|
case IA_CSS_PIPE_ID_PREVIEW:
|
|
|
|
|
copy_pipe = main_pipe->pipe_settings.preview.copy_pipe;
|
|
|
|
|
capture_pipe = main_pipe->pipe_settings.preview.capture_pipe;
|
|
|
|
|
acc_pipe = main_pipe->pipe_settings.preview.acc_pipe;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case IA_CSS_PIPE_ID_VIDEO:
|
|
|
|
@ -1700,14 +1678,10 @@ map_sp_threads(struct ia_css_stream *stream, bool map)
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case IA_CSS_PIPE_ID_CAPTURE:
|
|
|
|
|
case IA_CSS_PIPE_ID_ACC:
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (acc_pipe)
|
|
|
|
|
ia_css_pipeline_map(acc_pipe->pipe_num, map);
|
|
|
|
|
|
|
|
|
|
if (capture_pipe)
|
|
|
|
|
ia_css_pipeline_map(capture_pipe->pipe_num, map);
|
|
|
|
|
|
|
|
|
@ -1735,7 +1709,6 @@ static int
|
|
|
|
|
create_host_pipeline_structure(struct ia_css_stream *stream)
|
|
|
|
|
{
|
|
|
|
|
struct ia_css_pipe *copy_pipe = NULL, *capture_pipe = NULL;
|
|
|
|
|
struct ia_css_pipe *acc_pipe = NULL;
|
|
|
|
|
enum ia_css_pipe_id pipe_id;
|
|
|
|
|
struct ia_css_pipe *main_pipe = NULL;
|
|
|
|
|
int err = 0;
|
|
|
|
@ -1763,7 +1736,6 @@ create_host_pipeline_structure(struct ia_css_stream *stream)
|
|
|
|
|
copy_pipe_delay = main_pipe->dvs_frame_delay;
|
|
|
|
|
capture_pipe = main_pipe->pipe_settings.preview.capture_pipe;
|
|
|
|
|
capture_pipe_delay = IA_CSS_FRAME_DELAY_0;
|
|
|
|
|
acc_pipe = main_pipe->pipe_settings.preview.acc_pipe;
|
|
|
|
|
err = ia_css_pipeline_create(&main_pipe->pipeline, main_pipe->mode,
|
|
|
|
|
main_pipe->pipe_num, main_pipe->dvs_frame_delay);
|
|
|
|
|
break;
|
|
|
|
@ -1787,11 +1759,6 @@ create_host_pipeline_structure(struct ia_css_stream *stream)
|
|
|
|
|
main_pipe->pipe_num, main_pipe->dvs_frame_delay);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case IA_CSS_PIPE_ID_ACC:
|
|
|
|
|
err = ia_css_pipeline_create(&main_pipe->pipeline, main_pipe->mode,
|
|
|
|
|
main_pipe->pipe_num, main_pipe->dvs_frame_delay);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
err = -EINVAL;
|
|
|
|
|
}
|
|
|
|
@ -1808,10 +1775,6 @@ create_host_pipeline_structure(struct ia_css_stream *stream)
|
|
|
|
|
capture_pipe->pipe_num,
|
|
|
|
|
capture_pipe_delay);
|
|
|
|
|
|
|
|
|
|
if (!(err) && acc_pipe)
|
|
|
|
|
err = ia_css_pipeline_create(&acc_pipe->pipeline, acc_pipe->mode,
|
|
|
|
|
acc_pipe->pipe_num, main_pipe->dvs_frame_delay);
|
|
|
|
|
|
|
|
|
|
/* DH regular multi pipe - not continuous mode: create the next pipelines too */
|
|
|
|
|
if (!stream->config.continuous) {
|
|
|
|
|
int i;
|
|
|
|
@ -1837,7 +1800,6 @@ static int
|
|
|
|
|
create_host_pipeline(struct ia_css_stream *stream)
|
|
|
|
|
{
|
|
|
|
|
struct ia_css_pipe *copy_pipe = NULL, *capture_pipe = NULL;
|
|
|
|
|
struct ia_css_pipe *acc_pipe = NULL;
|
|
|
|
|
enum ia_css_pipe_id pipe_id;
|
|
|
|
|
struct ia_css_pipe *main_pipe = NULL;
|
|
|
|
|
int err = 0;
|
|
|
|
@ -1881,27 +1843,17 @@ create_host_pipeline(struct ia_css_stream *stream)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if !defined(ISP2401)
|
|
|
|
|
/* old isys: need to allocate_mipi_frames() even in IA_CSS_PIPE_MODE_COPY */
|
|
|
|
|
if (pipe_id != IA_CSS_PIPE_ID_ACC) {
|
|
|
|
|
if (!IS_ISP2401 || main_pipe->config.mode != IA_CSS_PIPE_MODE_COPY) {
|
|
|
|
|
err = allocate_mipi_frames(main_pipe, &stream->info);
|
|
|
|
|
if (err)
|
|
|
|
|
goto ERR;
|
|
|
|
|
}
|
|
|
|
|
#elif defined(ISP2401)
|
|
|
|
|
if ((pipe_id != IA_CSS_PIPE_ID_ACC) &&
|
|
|
|
|
(main_pipe->config.mode != IA_CSS_PIPE_MODE_COPY)) {
|
|
|
|
|
err = allocate_mipi_frames(main_pipe, &stream->info);
|
|
|
|
|
if (err)
|
|
|
|
|
goto ERR;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
switch (pipe_id) {
|
|
|
|
|
case IA_CSS_PIPE_ID_PREVIEW:
|
|
|
|
|
copy_pipe = main_pipe->pipe_settings.preview.copy_pipe;
|
|
|
|
|
capture_pipe = main_pipe->pipe_settings.preview.capture_pipe;
|
|
|
|
|
acc_pipe = main_pipe->pipe_settings.preview.acc_pipe;
|
|
|
|
|
max_input_width =
|
|
|
|
|
main_pipe->pipe_settings.preview.preview_binary.info->sp.input.max_width;
|
|
|
|
|
|
|
|
|
@ -1935,12 +1887,6 @@ create_host_pipeline(struct ia_css_stream *stream)
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case IA_CSS_PIPE_ID_ACC:
|
|
|
|
|
err = create_host_acc_pipeline(main_pipe);
|
|
|
|
|
if (err)
|
|
|
|
|
goto ERR;
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
err = -EINVAL;
|
|
|
|
|
}
|
|
|
|
@ -1960,12 +1906,6 @@ create_host_pipeline(struct ia_css_stream *stream)
|
|
|
|
|
goto ERR;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (acc_pipe) {
|
|
|
|
|
err = create_host_acc_pipeline(acc_pipe);
|
|
|
|
|
if (err)
|
|
|
|
|
goto ERR;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* DH regular multi pipe - not continuous mode: create the next pipelines too */
|
|
|
|
|
if (!stream->config.continuous) {
|
|
|
|
|
int i;
|
|
|
|
@ -1984,9 +1924,6 @@ create_host_pipeline(struct ia_css_stream *stream)
|
|
|
|
|
case IA_CSS_PIPE_ID_YUVPP:
|
|
|
|
|
err = create_host_yuvpp_pipeline(stream->pipes[i]);
|
|
|
|
|
break;
|
|
|
|
|
case IA_CSS_PIPE_ID_ACC:
|
|
|
|
|
err = create_host_acc_pipeline(stream->pipes[i]);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
err = -EINVAL;
|
|
|
|
|
}
|
|
|
|
@ -2037,9 +1974,6 @@ init_pipe_defaults(enum ia_css_pipe_mode mode,
|
|
|
|
|
pipe->mode = IA_CSS_PIPE_ID_VIDEO;
|
|
|
|
|
memcpy(&pipe->pipe_settings.video, &video, sizeof(video));
|
|
|
|
|
break;
|
|
|
|
|
case IA_CSS_PIPE_MODE_ACC:
|
|
|
|
|
pipe->mode = IA_CSS_PIPE_ID_ACC;
|
|
|
|
|
break;
|
|
|
|
|
case IA_CSS_PIPE_MODE_COPY:
|
|
|
|
|
pipe->mode = IA_CSS_PIPE_ID_CAPTURE;
|
|
|
|
|
break;
|
|
|
|
@ -2156,27 +2090,6 @@ find_pipe_by_num(uint32_t pipe_num)
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void sh_css_pipe_free_acc_binaries(
|
|
|
|
|
struct ia_css_pipe *pipe)
|
|
|
|
|
{
|
|
|
|
|
struct ia_css_pipeline *pipeline;
|
|
|
|
|
struct ia_css_pipeline_stage *stage;
|
|
|
|
|
|
|
|
|
|
if (!pipe) {
|
|
|
|
|
IA_CSS_ERROR("NULL input pointer");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
pipeline = &pipe->pipeline;
|
|
|
|
|
|
|
|
|
|
/* loop through the stages and unload them */
|
|
|
|
|
for (stage = pipeline->stages; stage; stage = stage->next) {
|
|
|
|
|
struct ia_css_fw_info *firmware = (struct ia_css_fw_info *)
|
|
|
|
|
stage->firmware;
|
|
|
|
|
if (firmware)
|
|
|
|
|
ia_css_pipe_unload_extension(pipe, firmware);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
ia_css_pipe_destroy(struct ia_css_pipe *pipe)
|
|
|
|
|
{
|
|
|
|
@ -2241,9 +2154,6 @@ ia_css_pipe_destroy(struct ia_css_pipe *pipe)
|
|
|
|
|
ia_css_frame_free_multiple(MAX_NUM_VIDEO_DELAY_FRAMES,
|
|
|
|
|
pipe->pipe_settings.capture.delay_frames);
|
|
|
|
|
break;
|
|
|
|
|
case IA_CSS_PIPE_MODE_ACC:
|
|
|
|
|
sh_css_pipe_free_acc_binaries(pipe);
|
|
|
|
|
break;
|
|
|
|
|
case IA_CSS_PIPE_MODE_COPY:
|
|
|
|
|
break;
|
|
|
|
|
case IA_CSS_PIPE_MODE_YUVPP:
|
|
|
|
@ -2261,10 +2171,6 @@ ia_css_pipe_destroy(struct ia_css_pipe *pipe)
|
|
|
|
|
ia_css_pipeline_destroy(&pipe->pipeline);
|
|
|
|
|
pipe_release_pipe_num(ia_css_pipe_get_pipe_num(pipe));
|
|
|
|
|
|
|
|
|
|
/* Temporarily, not every sh_css_pipe has an acc_extension. */
|
|
|
|
|
if (pipe->config.acc_extension)
|
|
|
|
|
ia_css_pipe_unload_extension(pipe, pipe->config.acc_extension);
|
|
|
|
|
|
|
|
|
|
kfree(pipe);
|
|
|
|
|
IA_CSS_LEAVE("err = %d", err);
|
|
|
|
|
return err;
|
|
|
|
@ -3433,31 +3339,6 @@ static int create_host_video_pipeline(struct ia_css_pipe *pipe)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Append Extension on Video out, if enabled */
|
|
|
|
|
if (!need_vf_pp && video_stage && pipe->config.acc_extension &&
|
|
|
|
|
(pipe->config.acc_extension->info.isp.type == IA_CSS_ACC_OUTPUT)) {
|
|
|
|
|
struct ia_css_frame *out = NULL;
|
|
|
|
|
struct ia_css_frame *in = NULL;
|
|
|
|
|
|
|
|
|
|
if ((pipe->config.acc_extension->info.isp.sp.enable.output) &&
|
|
|
|
|
(pipe->config.acc_extension->info.isp.sp.enable.in_frame) &&
|
|
|
|
|
(pipe->config.acc_extension->info.isp.sp.enable.out_frame)) {
|
|
|
|
|
/* In/Out Frame mapping to support output frame extension.*/
|
|
|
|
|
out = video_stage->args.out_frame[0];
|
|
|
|
|
err = ia_css_frame_allocate_from_info(&in, &pipe->output_info[0]);
|
|
|
|
|
if (err)
|
|
|
|
|
goto ERR;
|
|
|
|
|
video_stage->args.out_frame[0] = in;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = add_firmwares(me, video_binary, pipe->output_stage,
|
|
|
|
|
last_output_firmware(pipe->output_stage),
|
|
|
|
|
IA_CSS_BINARY_MODE_VIDEO,
|
|
|
|
|
in, out, NULL, &video_stage, NULL);
|
|
|
|
|
if (err)
|
|
|
|
|
goto ERR;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (need_yuv_pp && video_stage) {
|
|
|
|
|
struct ia_css_frame *tmp_in_frame = video_stage->args.out_frame[0];
|
|
|
|
|
struct ia_css_frame *tmp_out_frame = NULL;
|
|
|
|
@ -3489,45 +3370,6 @@ ERR:
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
create_host_acc_pipeline(struct ia_css_pipe *pipe)
|
|
|
|
|
{
|
|
|
|
|
int err = 0;
|
|
|
|
|
const struct ia_css_fw_info *fw;
|
|
|
|
|
unsigned int i;
|
|
|
|
|
|
|
|
|
|
IA_CSS_ENTER_PRIVATE("pipe = %p", pipe);
|
|
|
|
|
if ((!pipe) || (!pipe->stream)) {
|
|
|
|
|
IA_CSS_LEAVE_ERR_PRIVATE(-EINVAL);
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pipe->pipeline.num_execs = pipe->config.acc_num_execs;
|
|
|
|
|
/* Reset pipe_qos_config to default disable all QOS extension stages */
|
|
|
|
|
if (pipe->config.acc_extension)
|
|
|
|
|
pipe->pipeline.pipe_qos_config = 0;
|
|
|
|
|
|
|
|
|
|
for (fw = pipe->vf_stage; fw; fw = fw->next) {
|
|
|
|
|
err = sh_css_pipeline_add_acc_stage(&pipe->pipeline, fw);
|
|
|
|
|
if (err)
|
|
|
|
|
goto ERR;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < pipe->config.num_acc_stages; i++) {
|
|
|
|
|
struct ia_css_fw_info *fw = pipe->config.acc_stages[i];
|
|
|
|
|
|
|
|
|
|
err = sh_css_pipeline_add_acc_stage(&pipe->pipeline, fw);
|
|
|
|
|
if (err)
|
|
|
|
|
goto ERR;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ia_css_pipeline_finalize_stages(&pipe->pipeline, pipe->stream->config.continuous);
|
|
|
|
|
|
|
|
|
|
ERR:
|
|
|
|
|
IA_CSS_LEAVE_ERR_PRIVATE(err);
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Create stages for preview */
|
|
|
|
|
static int
|
|
|
|
|
create_host_preview_pipeline(struct ia_css_pipe *pipe)
|
|
|
|
@ -3690,7 +3532,6 @@ preview_start(struct ia_css_pipe *pipe)
|
|
|
|
|
{
|
|
|
|
|
int err = 0;
|
|
|
|
|
struct ia_css_pipe *copy_pipe, *capture_pipe;
|
|
|
|
|
struct ia_css_pipe *acc_pipe;
|
|
|
|
|
enum sh_css_pipe_config_override copy_ovrd;
|
|
|
|
|
enum ia_css_input_mode preview_pipe_input_mode;
|
|
|
|
|
unsigned int thread_id;
|
|
|
|
@ -3705,7 +3546,6 @@ preview_start(struct ia_css_pipe *pipe)
|
|
|
|
|
|
|
|
|
|
copy_pipe = pipe->pipe_settings.preview.copy_pipe;
|
|
|
|
|
capture_pipe = pipe->pipe_settings.preview.capture_pipe;
|
|
|
|
|
acc_pipe = pipe->pipe_settings.preview.acc_pipe;
|
|
|
|
|
|
|
|
|
|
sh_css_metrics_start_frame();
|
|
|
|
|
|
|
|
|
@ -3764,22 +3604,6 @@ preview_start(struct ia_css_pipe *pipe)
|
|
|
|
|
(enum mipi_port_id)0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (acc_pipe) {
|
|
|
|
|
sh_css_sp_init_pipeline(&acc_pipe->pipeline,
|
|
|
|
|
IA_CSS_PIPE_ID_ACC,
|
|
|
|
|
(uint8_t)ia_css_pipe_get_pipe_num(acc_pipe),
|
|
|
|
|
false,
|
|
|
|
|
pipe->stream->config.pixels_per_clock == 2,
|
|
|
|
|
false, /* continuous */
|
|
|
|
|
false, /* offline */
|
|
|
|
|
pipe->required_bds_factor,
|
|
|
|
|
0,
|
|
|
|
|
IA_CSS_INPUT_MODE_MEMORY,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
(enum mipi_port_id)0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
start_pipe(pipe, copy_ovrd, preview_pipe_input_mode);
|
|
|
|
|
|
|
|
|
|
IA_CSS_LEAVE_ERR_PRIVATE(err);
|
|
|
|
@ -3850,9 +3674,7 @@ ia_css_pipe_enqueue_buffer(struct ia_css_pipe *pipe,
|
|
|
|
|
|
|
|
|
|
pipeline = &pipe->pipeline;
|
|
|
|
|
|
|
|
|
|
assert(pipeline ||
|
|
|
|
|
pipe_id == IA_CSS_PIPE_ID_COPY ||
|
|
|
|
|
pipe_id == IA_CSS_PIPE_ID_ACC);
|
|
|
|
|
assert(pipeline || pipe_id == IA_CSS_PIPE_ID_COPY);
|
|
|
|
|
|
|
|
|
|
assert(sizeof(NULL) <= sizeof(ddr_buffer.kernel_ptr));
|
|
|
|
|
ddr_buffer.kernel_ptr = HOST_ADDRESS(NULL);
|
|
|
|
@ -4442,16 +4264,6 @@ ia_css_dequeue_isys_event(struct ia_css_event *event)
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
acc_start(struct ia_css_pipe *pipe)
|
|
|
|
|
{
|
|
|
|
|
assert(pipe);
|
|
|
|
|
assert(pipe->stream);
|
|
|
|
|
|
|
|
|
|
start_pipe(pipe, SH_CSS_PIPE_CONFIG_OVRD_NO_OVRD,
|
|
|
|
|
pipe->stream->config.mode);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
sh_css_pipe_start(struct ia_css_stream *stream)
|
|
|
|
|
{
|
|
|
|
@ -4496,9 +4308,6 @@ sh_css_pipe_start(struct ia_css_stream *stream)
|
|
|
|
|
case IA_CSS_PIPE_ID_YUVPP:
|
|
|
|
|
err = yuvpp_start(pipe);
|
|
|
|
|
break;
|
|
|
|
|
case IA_CSS_PIPE_ID_ACC:
|
|
|
|
|
acc_start(pipe);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
err = -EINVAL;
|
|
|
|
|
}
|
|
|
|
@ -4524,10 +4333,6 @@ sh_css_pipe_start(struct ia_css_stream *stream)
|
|
|
|
|
stream->pipes[i]->stop_requested = false;
|
|
|
|
|
err = yuvpp_start(stream->pipes[i]);
|
|
|
|
|
break;
|
|
|
|
|
case IA_CSS_PIPE_ID_ACC:
|
|
|
|
|
stream->pipes[i]->stop_requested = false;
|
|
|
|
|
acc_start(stream->pipes[i]);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
err = -EINVAL;
|
|
|
|
|
}
|
|
|
|
@ -4620,22 +4425,6 @@ sh_css_pipe_start(struct ia_css_stream *stream)
|
|
|
|
|
(uint8_t)thread_id, 0, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* in case of PREVIEW mode, check whether QOS acc_pipe is available, then start the qos pipe */
|
|
|
|
|
if (pipe_id == IA_CSS_PIPE_ID_PREVIEW) {
|
|
|
|
|
struct ia_css_pipe *acc_pipe = NULL;
|
|
|
|
|
|
|
|
|
|
acc_pipe = pipe->pipe_settings.preview.acc_pipe;
|
|
|
|
|
|
|
|
|
|
if (acc_pipe) {
|
|
|
|
|
ia_css_pipeline_get_sp_thread_id(ia_css_pipe_get_pipe_num(acc_pipe),
|
|
|
|
|
&thread_id);
|
|
|
|
|
/* by the time we reach here q is initialized and handle is available.*/
|
|
|
|
|
ia_css_bufq_enqueue_psys_event(
|
|
|
|
|
IA_CSS_PSYS_SW_EVENT_START_STREAM,
|
|
|
|
|
(uint8_t)thread_id, 0, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stream->started = true;
|
|
|
|
|
|
|
|
|
|
IA_CSS_LEAVE_ERR_PRIVATE(err);
|
|
|
|
@ -6861,8 +6650,6 @@ sh_css_pipe_load_binaries(struct ia_css_pipe *pipe)
|
|
|
|
|
case IA_CSS_PIPE_ID_YUVPP:
|
|
|
|
|
err = load_yuvpp_binaries(pipe);
|
|
|
|
|
break;
|
|
|
|
|
case IA_CSS_PIPE_ID_ACC:
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
err = -EINVAL;
|
|
|
|
|
break;
|
|
|
|
@ -7755,154 +7542,6 @@ ia_css_stream_end_input_frame(const struct ia_css_stream *stream)
|
|
|
|
|
ia_css_inputfifo_end_frame(stream->config.channel_id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
append_firmware(struct ia_css_fw_info **l, struct ia_css_fw_info *firmware)
|
|
|
|
|
{
|
|
|
|
|
IA_CSS_ENTER_PRIVATE("l = %p, firmware = %p", l, firmware);
|
|
|
|
|
if (!l) {
|
|
|
|
|
IA_CSS_ERROR("NULL fw_info");
|
|
|
|
|
IA_CSS_LEAVE_PRIVATE("");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
while (*l)
|
|
|
|
|
l = &(*l)->next;
|
|
|
|
|
*l = firmware;
|
|
|
|
|
/* when multiple acc extensions are loaded, 'next' can be not NULL */
|
|
|
|
|
/*firmware->next = NULL;*/
|
|
|
|
|
IA_CSS_LEAVE_PRIVATE("");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
remove_firmware(struct ia_css_fw_info **l, struct ia_css_fw_info *firmware)
|
|
|
|
|
{
|
|
|
|
|
assert(*l);
|
|
|
|
|
assert(firmware);
|
|
|
|
|
(void)l;
|
|
|
|
|
(void)firmware;
|
|
|
|
|
ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "remove_firmware() enter:\n");
|
|
|
|
|
|
|
|
|
|
ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "remove_firmware() leave:\n");
|
|
|
|
|
return; /* removing single and multiple firmware is handled in acc_unload_extension() */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int upload_isp_code(struct ia_css_fw_info *firmware)
|
|
|
|
|
{
|
|
|
|
|
ia_css_ptr binary;
|
|
|
|
|
|
|
|
|
|
if (!firmware) {
|
|
|
|
|
IA_CSS_ERROR("NULL input parameter");
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
}
|
|
|
|
|
binary = firmware->info.isp.xmem_addr;
|
|
|
|
|
|
|
|
|
|
if (!binary) {
|
|
|
|
|
unsigned int size = firmware->blob.size;
|
|
|
|
|
const unsigned char *blob;
|
|
|
|
|
const unsigned char *binary_name;
|
|
|
|
|
|
|
|
|
|
binary_name =
|
|
|
|
|
(const unsigned char *)(IA_CSS_EXT_ISP_PROG_NAME(
|
|
|
|
|
firmware));
|
|
|
|
|
blob = binary_name +
|
|
|
|
|
strlen((const char *)binary_name) +
|
|
|
|
|
1;
|
|
|
|
|
binary = sh_css_load_blob(blob, size);
|
|
|
|
|
firmware->info.isp.xmem_addr = binary;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!binary)
|
|
|
|
|
return -ENOMEM;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
acc_load_extension(struct ia_css_fw_info *firmware)
|
|
|
|
|
{
|
|
|
|
|
int err;
|
|
|
|
|
struct ia_css_fw_info *hd = firmware;
|
|
|
|
|
|
|
|
|
|
while (hd) {
|
|
|
|
|
err = upload_isp_code(hd);
|
|
|
|
|
if (err)
|
|
|
|
|
return err;
|
|
|
|
|
hd = hd->next;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!firmware)
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
firmware->loaded = true;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
acc_unload_extension(struct ia_css_fw_info *firmware)
|
|
|
|
|
{
|
|
|
|
|
struct ia_css_fw_info *hd = firmware;
|
|
|
|
|
struct ia_css_fw_info *hdn = NULL;
|
|
|
|
|
|
|
|
|
|
if (!firmware) /* should not happen */
|
|
|
|
|
return;
|
|
|
|
|
/* unload and remove multiple firmwares */
|
|
|
|
|
while (hd) {
|
|
|
|
|
hdn = (hd->next) ? &(*hd->next) : NULL;
|
|
|
|
|
if (hd->info.isp.xmem_addr) {
|
|
|
|
|
hmm_free(hd->info.isp.xmem_addr);
|
|
|
|
|
hd->info.isp.xmem_addr = mmgr_NULL;
|
|
|
|
|
}
|
|
|
|
|
hd->isp_code = NULL;
|
|
|
|
|
hd->next = NULL;
|
|
|
|
|
hd = hdn;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
firmware->loaded = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Load firmware for extension */
|
|
|
|
|
static int
|
|
|
|
|
ia_css_pipe_load_extension(struct ia_css_pipe *pipe,
|
|
|
|
|
struct ia_css_fw_info *firmware)
|
|
|
|
|
{
|
|
|
|
|
int err = 0;
|
|
|
|
|
|
|
|
|
|
IA_CSS_ENTER_PRIVATE("fw = %p pipe = %p", firmware, pipe);
|
|
|
|
|
|
|
|
|
|
if ((!firmware) || (!pipe)) {
|
|
|
|
|
IA_CSS_LEAVE_ERR_PRIVATE(-EINVAL);
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (firmware->info.isp.type == IA_CSS_ACC_OUTPUT)
|
|
|
|
|
append_firmware(&pipe->output_stage, firmware);
|
|
|
|
|
else if (firmware->info.isp.type == IA_CSS_ACC_VIEWFINDER)
|
|
|
|
|
append_firmware(&pipe->vf_stage, firmware);
|
|
|
|
|
err = acc_load_extension(firmware);
|
|
|
|
|
|
|
|
|
|
IA_CSS_LEAVE_ERR_PRIVATE(err);
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Unload firmware for extension */
|
|
|
|
|
static void
|
|
|
|
|
ia_css_pipe_unload_extension(struct ia_css_pipe *pipe,
|
|
|
|
|
struct ia_css_fw_info *firmware)
|
|
|
|
|
{
|
|
|
|
|
IA_CSS_ENTER_PRIVATE("fw = %p pipe = %p", firmware, pipe);
|
|
|
|
|
|
|
|
|
|
if ((!firmware) || (!pipe)) {
|
|
|
|
|
IA_CSS_ERROR("NULL input parameters");
|
|
|
|
|
IA_CSS_LEAVE_PRIVATE("");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (firmware->info.isp.type == IA_CSS_ACC_OUTPUT)
|
|
|
|
|
remove_firmware(&pipe->output_stage, firmware);
|
|
|
|
|
else if (firmware->info.isp.type == IA_CSS_ACC_VIEWFINDER)
|
|
|
|
|
remove_firmware(&pipe->vf_stage, firmware);
|
|
|
|
|
acc_unload_extension(firmware);
|
|
|
|
|
|
|
|
|
|
IA_CSS_LEAVE_PRIVATE("");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
ia_css_pipeline_uses_params(struct ia_css_pipeline *me)
|
|
|
|
|
{
|
|
|
|
@ -7924,35 +7563,6 @@ ia_css_pipeline_uses_params(struct ia_css_pipeline *me)
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
sh_css_pipeline_add_acc_stage(struct ia_css_pipeline *pipeline,
|
|
|
|
|
const void *acc_fw)
|
|
|
|
|
{
|
|
|
|
|
struct ia_css_fw_info *fw = (struct ia_css_fw_info *)acc_fw;
|
|
|
|
|
/* In QoS case, load_extension already called, so skipping */
|
|
|
|
|
int err = 0;
|
|
|
|
|
|
|
|
|
|
if (!fw->loaded)
|
|
|
|
|
err = acc_load_extension(fw);
|
|
|
|
|
|
|
|
|
|
ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE,
|
|
|
|
|
"sh_css_pipeline_add_acc_stage() enter: pipeline=%p, acc_fw=%p\n",
|
|
|
|
|
pipeline, acc_fw);
|
|
|
|
|
|
|
|
|
|
if (!err) {
|
|
|
|
|
struct ia_css_pipeline_stage_desc stage_desc;
|
|
|
|
|
|
|
|
|
|
ia_css_pipe_get_acc_stage_desc(&stage_desc, NULL, fw);
|
|
|
|
|
err = ia_css_pipeline_create_and_add_stage(pipeline,
|
|
|
|
|
&stage_desc,
|
|
|
|
|
NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE,
|
|
|
|
|
"sh_css_pipeline_add_acc_stage() leave: return_err=%d\n", err);
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* @brief Tag a specific frame in continuous capture.
|
|
|
|
|
* Refer to "sh_css_internal.h" for details.
|
|
|
|
@ -8177,26 +7787,6 @@ void ia_css_stream_config_defaults(struct ia_css_stream_config *stream_config)
|
|
|
|
|
stream_config->source.port.rxcount = 0x04040404;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
ia_css_acc_pipe_create(struct ia_css_pipe *pipe)
|
|
|
|
|
{
|
|
|
|
|
int err = 0;
|
|
|
|
|
|
|
|
|
|
if (!pipe) {
|
|
|
|
|
IA_CSS_ERROR("NULL input parameter");
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* There is not meaning for num_execs = 0 semantically. Run at least once. */
|
|
|
|
|
if (pipe->config.acc_num_execs == 0)
|
|
|
|
|
pipe->config.acc_num_execs = 1;
|
|
|
|
|
|
|
|
|
|
if (pipe->config.acc_extension)
|
|
|
|
|
err = ia_css_pipe_load_extension(pipe, pipe->config.acc_extension);
|
|
|
|
|
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int ia_css_pipe_create(const struct ia_css_pipe_config *config,
|
|
|
|
|
struct ia_css_pipe **pipe)
|
|
|
|
|
{
|
|
|
|
@ -8257,23 +7847,6 @@ ia_css_pipe_create_extra(const struct ia_css_pipe_config *config,
|
|
|
|
|
else
|
|
|
|
|
ia_css_pipe_extra_config_defaults(&internal_pipe->extra_config);
|
|
|
|
|
|
|
|
|
|
if (config->mode == IA_CSS_PIPE_MODE_ACC) {
|
|
|
|
|
/*
|
|
|
|
|
* Temporary hack to migrate acceleration to CSS 2.0.
|
|
|
|
|
* In the future the code for all pipe types should be
|
|
|
|
|
* unified.
|
|
|
|
|
*/
|
|
|
|
|
*pipe = internal_pipe;
|
|
|
|
|
if (!internal_pipe->config.acc_extension &&
|
|
|
|
|
internal_pipe->config.num_acc_stages ==
|
|
|
|
|
0) { /* if no acc binary and no standalone stage */
|
|
|
|
|
*pipe = NULL;
|
|
|
|
|
IA_CSS_LEAVE_ERR_PRIVATE(0);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
return ia_css_acc_pipe_create(internal_pipe);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Use config value when dvs_frame_delay setting equal to 2,
|
|
|
|
|
* otherwise always 1 by default
|
|
|
|
@ -8368,15 +7941,6 @@ ia_css_pipe_create_extra(const struct ia_css_pipe_config *config,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (internal_pipe->config.acc_extension) {
|
|
|
|
|
err = ia_css_pipe_load_extension(internal_pipe,
|
|
|
|
|
internal_pipe->config.acc_extension);
|
|
|
|
|
if (err) {
|
|
|
|
|
IA_CSS_LEAVE_ERR_PRIVATE(err);
|
|
|
|
|
kvfree(internal_pipe);
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/* set all info to zeroes first */
|
|
|
|
|
memset(&internal_pipe->info, 0, sizeof(internal_pipe->info));
|
|
|
|
|
|
|
|
|
@ -8524,57 +8088,6 @@ find_pipe(struct ia_css_pipe *pipes[], unsigned int num_pipes,
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
ia_css_acc_stream_create(struct ia_css_stream *stream)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
int err = 0;
|
|
|
|
|
|
|
|
|
|
IA_CSS_ENTER_PRIVATE("stream = %p", stream);
|
|
|
|
|
|
|
|
|
|
if (!stream) {
|
|
|
|
|
IA_CSS_LEAVE_ERR_PRIVATE(-EINVAL);
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < stream->num_pipes; i++) {
|
|
|
|
|
struct ia_css_pipe *pipe = stream->pipes[i];
|
|
|
|
|
|
|
|
|
|
if (!pipe) {
|
|
|
|
|
IA_CSS_LEAVE_ERR_PRIVATE(-EINVAL);
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pipe->stream = stream;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Map SP threads before doing anything. */
|
|
|
|
|
err = map_sp_threads(stream, true);
|
|
|
|
|
if (err) {
|
|
|
|
|
IA_CSS_LEAVE_ERR_PRIVATE(err);
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < stream->num_pipes; i++) {
|
|
|
|
|
struct ia_css_pipe *pipe = stream->pipes[i];
|
|
|
|
|
|
|
|
|
|
assert(pipe);
|
|
|
|
|
ia_css_pipe_map_queue(pipe, true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = create_host_pipeline_structure(stream);
|
|
|
|
|
if (err) {
|
|
|
|
|
IA_CSS_LEAVE_ERR_PRIVATE(err);
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stream->started = false;
|
|
|
|
|
|
|
|
|
|
IA_CSS_LEAVE_ERR_PRIVATE(0);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
metadata_info_init(const struct ia_css_metadata_config *mdc,
|
|
|
|
|
struct ia_css_metadata_info *md)
|
|
|
|
@ -8807,11 +8320,6 @@ ia_css_stream_create(const struct ia_css_stream_config *stream_config,
|
|
|
|
|
goto ERR;
|
|
|
|
|
IA_CSS_LOG("isp_params_configs: %p", curr_stream->isp_params_configs);
|
|
|
|
|
|
|
|
|
|
if (num_pipes == 1 && pipes[0]->config.mode == IA_CSS_PIPE_MODE_ACC) {
|
|
|
|
|
*stream = curr_stream;
|
|
|
|
|
err = ia_css_acc_stream_create(curr_stream);
|
|
|
|
|
goto ERR;
|
|
|
|
|
}
|
|
|
|
|
/* sensor binning */
|
|
|
|
|
if (!spcopyonly) {
|
|
|
|
|
sensor_binning_changed =
|
|
|
|
@ -8832,7 +8340,6 @@ ia_css_stream_create(const struct ia_css_stream_config *stream_config,
|
|
|
|
|
/* Search for the preview pipe and create the copy pipe */
|
|
|
|
|
struct ia_css_pipe *preview_pipe;
|
|
|
|
|
struct ia_css_pipe *video_pipe;
|
|
|
|
|
struct ia_css_pipe *acc_pipe;
|
|
|
|
|
struct ia_css_pipe *capture_pipe = NULL;
|
|
|
|
|
struct ia_css_pipe *copy_pipe = NULL;
|
|
|
|
|
|
|
|
|
@ -8847,11 +8354,7 @@ ia_css_stream_create(const struct ia_css_stream_config *stream_config,
|
|
|
|
|
IA_CSS_PIPE_MODE_PREVIEW, false);
|
|
|
|
|
video_pipe = find_pipe(pipes, num_pipes,
|
|
|
|
|
IA_CSS_PIPE_MODE_VIDEO, false);
|
|
|
|
|
acc_pipe = find_pipe(pipes, num_pipes, IA_CSS_PIPE_MODE_ACC,
|
|
|
|
|
false);
|
|
|
|
|
if (acc_pipe && num_pipes == 2 && curr_stream->cont_capt)
|
|
|
|
|
curr_stream->cont_capt =
|
|
|
|
|
false; /* preview + QoS case will not need cont_capt switch */
|
|
|
|
|
|
|
|
|
|
if (curr_stream->cont_capt) {
|
|
|
|
|
capture_pipe = find_pipe(pipes, num_pipes,
|
|
|
|
|
IA_CSS_PIPE_MODE_CAPTURE,
|
|
|
|
@ -8888,9 +8391,6 @@ ia_css_stream_create(const struct ia_css_stream_config *stream_config,
|
|
|
|
|
}
|
|
|
|
|
if (video_pipe && curr_stream->cont_capt)
|
|
|
|
|
video_pipe->pipe_settings.video.capture_pipe = capture_pipe;
|
|
|
|
|
|
|
|
|
|
if (preview_pipe && acc_pipe)
|
|
|
|
|
preview_pipe->pipe_settings.preview.acc_pipe = acc_pipe;
|
|
|
|
|
}
|
|
|
|
|
for (i = 0; i < num_pipes; i++) {
|
|
|
|
|
curr_pipe = pipes[i];
|
|
|
|
@ -9738,13 +9238,6 @@ void ia_css_pipe_map_queue(struct ia_css_pipe *pipe, bool map)
|
|
|
|
|
if (!pipe->stream->config.continuous)
|
|
|
|
|
ia_css_queue_map(thread_id, IA_CSS_BUFFER_TYPE_OUTPUT_FRAME, map);
|
|
|
|
|
ia_css_queue_map(thread_id, IA_CSS_BUFFER_TYPE_METADATA, map);
|
|
|
|
|
} else if (pipe->mode == IA_CSS_PIPE_ID_ACC) {
|
|
|
|
|
if (need_input_queue)
|
|
|
|
|
ia_css_queue_map(thread_id, IA_CSS_BUFFER_TYPE_INPUT_FRAME, map);
|
|
|
|
|
ia_css_queue_map(thread_id, IA_CSS_BUFFER_TYPE_OUTPUT_FRAME, map);
|
|
|
|
|
ia_css_queue_map(thread_id, IA_CSS_BUFFER_TYPE_PARAMETER_SET, map);
|
|
|
|
|
ia_css_queue_map(thread_id, IA_CSS_BUFFER_TYPE_PER_FRAME_PARAMETER_SET, map);
|
|
|
|
|
ia_css_queue_map(thread_id, IA_CSS_BUFFER_TYPE_METADATA, map);
|
|
|
|
|
} else if (pipe->mode == IA_CSS_PIPE_ID_YUVPP) {
|
|
|
|
|
unsigned int idx;
|
|
|
|
|
|
|
|
|
@ -9795,92 +9288,6 @@ ia_css_unlock_raw_frame(struct ia_css_stream *stream, uint32_t exp_id)
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* @brief Set the state (Enable or Disable) of the Extension stage in the
|
|
|
|
|
* given pipe.
|
|
|
|
|
*/
|
|
|
|
|
int
|
|
|
|
|
ia_css_pipe_set_qos_ext_state(struct ia_css_pipe *pipe, uint32_t fw_handle,
|
|
|
|
|
bool enable)
|
|
|
|
|
{
|
|
|
|
|
unsigned int thread_id;
|
|
|
|
|
struct ia_css_pipeline_stage *stage;
|
|
|
|
|
int err = 0;
|
|
|
|
|
|
|
|
|
|
IA_CSS_ENTER("");
|
|
|
|
|
|
|
|
|
|
/* Parameter Check */
|
|
|
|
|
if (!pipe || !pipe->stream) {
|
|
|
|
|
IA_CSS_ERROR("Invalid Pipe.");
|
|
|
|
|
err = -EINVAL;
|
|
|
|
|
} else if (!(pipe->config.acc_extension)) {
|
|
|
|
|
IA_CSS_ERROR("Invalid Pipe(No Extension Firmware)");
|
|
|
|
|
err = -EINVAL;
|
|
|
|
|
} else if (!sh_css_sp_is_running()) {
|
|
|
|
|
IA_CSS_ERROR("Leaving: queue unavailable.");
|
|
|
|
|
err = -EBUSY;
|
|
|
|
|
} else {
|
|
|
|
|
/* Query the threadid and stage_num for the Extension firmware*/
|
|
|
|
|
ia_css_pipeline_get_sp_thread_id(ia_css_pipe_get_pipe_num(pipe), &thread_id);
|
|
|
|
|
err = ia_css_pipeline_get_stage_from_fw(&pipe->pipeline, fw_handle, &stage);
|
|
|
|
|
if (!err) {
|
|
|
|
|
/* Set the Extension State;. TODO: Add check for stage firmware.type (QOS)*/
|
|
|
|
|
err = ia_css_bufq_enqueue_psys_event(
|
|
|
|
|
(uint8_t)IA_CSS_PSYS_SW_EVENT_STAGE_ENABLE_DISABLE,
|
|
|
|
|
(uint8_t)thread_id,
|
|
|
|
|
(uint8_t)stage->stage_num,
|
|
|
|
|
enable ? 1 : 0);
|
|
|
|
|
if (!err) {
|
|
|
|
|
if (enable)
|
|
|
|
|
SH_CSS_QOS_STAGE_ENABLE(&sh_css_sp_group.pipe[thread_id], stage->stage_num);
|
|
|
|
|
else
|
|
|
|
|
SH_CSS_QOS_STAGE_DISABLE(&sh_css_sp_group.pipe[thread_id], stage->stage_num);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
IA_CSS_LEAVE("err:%d handle:%u enable:%d", err, fw_handle, enable);
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* @brief Get the state (Enable or Disable) of the Extension stage in the
|
|
|
|
|
* given pipe.
|
|
|
|
|
*/
|
|
|
|
|
int
|
|
|
|
|
ia_css_pipe_get_qos_ext_state(struct ia_css_pipe *pipe, uint32_t fw_handle,
|
|
|
|
|
bool *enable)
|
|
|
|
|
{
|
|
|
|
|
struct ia_css_pipeline_stage *stage;
|
|
|
|
|
unsigned int thread_id;
|
|
|
|
|
int err = 0;
|
|
|
|
|
|
|
|
|
|
IA_CSS_ENTER("");
|
|
|
|
|
|
|
|
|
|
/* Parameter Check */
|
|
|
|
|
if (!pipe || !pipe->stream) {
|
|
|
|
|
IA_CSS_ERROR("Invalid Pipe.");
|
|
|
|
|
err = -EINVAL;
|
|
|
|
|
} else if (!(pipe->config.acc_extension)) {
|
|
|
|
|
IA_CSS_ERROR("Invalid Pipe (No Extension Firmware).");
|
|
|
|
|
err = -EINVAL;
|
|
|
|
|
} else if (!sh_css_sp_is_running()) {
|
|
|
|
|
IA_CSS_ERROR("Leaving: queue unavailable.");
|
|
|
|
|
err = -EBUSY;
|
|
|
|
|
} else {
|
|
|
|
|
/* Query the threadid and stage_num corresponding to the Extension firmware*/
|
|
|
|
|
ia_css_pipeline_get_sp_thread_id(ia_css_pipe_get_pipe_num(pipe), &thread_id);
|
|
|
|
|
err = ia_css_pipeline_get_stage_from_fw(&pipe->pipeline, fw_handle, &stage);
|
|
|
|
|
|
|
|
|
|
if (!err) {
|
|
|
|
|
/* Get the Extension State */
|
|
|
|
|
*enable = (SH_CSS_QOS_STAGE_IS_ENABLED(&sh_css_sp_group.pipe[thread_id],
|
|
|
|
|
stage->stage_num)) ? true : false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
IA_CSS_LEAVE("err:%d handle:%u enable:%d", err, fw_handle, *enable);
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
sh_css_hmm_buffer_record_init(void)
|
|
|
|
|
{
|
|
|
|
|