blob: d0c0e6b92025d578c16529f1495ccb5bc8244b9f [file] [log] [blame]
/*
* Support for Intel Camera Imaging ISP subsystem.
* Copyright (c) 2015, Intel Corporation.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*/
#ifndef __IA_CSS_PIPE_H__
#define __IA_CSS_PIPE_H__
#include <type_support.h>
#include "ia_css_stream.h"
#include "ia_css_frame.h"
#include "ia_css_pipeline.h"
#include "ia_css_binary.h"
#include "sh_css_legacy.h"
#define PIPE_ENTRY_EMPTY_TOKEN (~0U)
#define PIPE_ENTRY_RESERVED_TOKEN (0x1)
struct ia_css_preview_settings {
struct ia_css_binary copy_binary;
struct ia_css_binary preview_binary;
struct ia_css_binary vf_pp_binary;
/* 2401 only for these two - do we in fact use them for anything real */
struct ia_css_frame *delay_frames[MAX_NUM_DELAY_FRAMES];
struct ia_css_frame *tnr_frames[NUM_TNR_FRAMES];
struct ia_css_pipe *copy_pipe;
struct ia_css_pipe *capture_pipe;
struct ia_css_pipe *acc_pipe;
};
#define IA_CSS_DEFAULT_PREVIEW_SETTINGS \
{ \
IA_CSS_BINARY_DEFAULT_SETTINGS, /* copy_binary */\
IA_CSS_BINARY_DEFAULT_SETTINGS, /* preview_binary */\
IA_CSS_BINARY_DEFAULT_SETTINGS, /* vf_pp_binary */\
{ NULL }, /* dvs_frames */ \
{ NULL }, /* tnr_frames */ \
NULL, /* copy_pipe */\
NULL, /* capture_pipe */\
NULL, /* acc_pipe */\
}
struct ia_css_capture_settings {
struct ia_css_binary copy_binary;
/* we extend primary binary to multiple stages because in ISP2.6.1
* the computation load is too high to fit in one single binary. */
struct ia_css_binary primary_binary[MAX_NUM_PRIMARY_STAGES];
unsigned int num_primary_stage;
struct ia_css_binary pre_isp_binary;
struct ia_css_binary anr_gdc_binary;
struct ia_css_binary post_isp_binary;
struct ia_css_binary capture_pp_binary;
struct ia_css_binary vf_pp_binary;
struct ia_css_binary capture_ldc_binary;
struct ia_css_binary *yuv_scaler_binary;
struct ia_css_frame *delay_frames[MAX_NUM_VIDEO_DELAY_FRAMES];
bool *is_output_stage;
unsigned int num_yuv_scaler;
};
#define IA_CSS_DEFAULT_CAPTURE_SETTINGS \
{ \
IA_CSS_BINARY_DEFAULT_SETTINGS, /* copy_binary */\
{IA_CSS_BINARY_DEFAULT_SETTINGS}, /* primary_binary */\
0, /* num_primary_stage */\
IA_CSS_BINARY_DEFAULT_SETTINGS, /* pre_isp_binary */\
IA_CSS_BINARY_DEFAULT_SETTINGS, /* anr_gdc_binary */\
IA_CSS_BINARY_DEFAULT_SETTINGS, /* post_isp_binary */\
IA_CSS_BINARY_DEFAULT_SETTINGS, /* capture_pp_binary */\
IA_CSS_BINARY_DEFAULT_SETTINGS, /* vf_pp_binary */\
IA_CSS_BINARY_DEFAULT_SETTINGS, /* capture_ldc_binary */\
NULL, /* yuv_scaler_binary */ \
{ NULL }, /* delay_frames[ref_frames] */ \
NULL, /* is_output_stage */ \
0, /* num_yuv_scaler */ \
}
struct ia_css_video_settings {
struct ia_css_binary copy_binary;
struct ia_css_binary video_binary;
struct ia_css_binary vf_pp_binary;
struct ia_css_binary *yuv_scaler_binary;
struct ia_css_frame *delay_frames[MAX_NUM_VIDEO_DELAY_FRAMES];
#ifndef ISP2401
struct ia_css_frame *tnr_frames[NUM_VIDEO_TNR_FRAMES];
#else
struct ia_css_frame *tnr_frames[NUM_TNR_FRAMES];
#endif
struct ia_css_frame *vf_pp_in_frame;
struct ia_css_pipe *copy_pipe;
struct ia_css_pipe *capture_pipe;
bool *is_output_stage;
unsigned int num_yuv_scaler;
};
#define IA_CSS_DEFAULT_VIDEO_SETTINGS \
{ \
IA_CSS_BINARY_DEFAULT_SETTINGS, /* copy_binary */ \
IA_CSS_BINARY_DEFAULT_SETTINGS, /* video_binary */ \
IA_CSS_BINARY_DEFAULT_SETTINGS, /* vf_pp_binary */ \
NULL, /* yuv_scaler_binary */ \
{ NULL }, /* delay_frames */ \
{ NULL }, /* tnr_frames */ \
NULL, /* vf_pp_in_frame */ \
NULL, /* copy_pipe */ \
NULL, /* capture_pipe */ \
NULL, /* is_output_stage */ \
0, /* num_yuv_scaler */ \
}
struct ia_css_yuvpp_settings {
struct ia_css_binary copy_binary;
struct ia_css_binary *yuv_scaler_binary;
struct ia_css_binary *vf_pp_binary;
bool *is_output_stage;
unsigned int num_yuv_scaler;
unsigned int num_vf_pp;
unsigned int num_output;
};
#define IA_CSS_DEFAULT_YUVPP_SETTINGS \
{ \
IA_CSS_BINARY_DEFAULT_SETTINGS, /* copy_binary */ \
NULL, /* yuv_scaler_binary */ \
NULL, /* vf_pp_binary */ \
NULL, /* is_output_stage */ \
0, /* num_yuv_scaler */ \
0, /* num_vf_pp */ \
0, /* num_output */ \
}
struct osys_object;
struct ia_css_pipe {
/* TODO: Remove stop_requested and use stop_requested in the pipeline */
bool stop_requested;
struct ia_css_pipe_config config;
struct ia_css_pipe_extra_config extra_config;
struct ia_css_pipe_info info;
enum ia_css_pipe_id mode;
struct ia_css_shading_table *shading_table;
struct ia_css_pipeline pipeline;
struct ia_css_frame_info output_info[IA_CSS_PIPE_MAX_OUTPUT_STAGE];
struct ia_css_frame_info bds_output_info;
struct ia_css_frame_info vf_output_info[IA_CSS_PIPE_MAX_OUTPUT_STAGE];
struct ia_css_frame_info out_yuv_ds_input_info;
struct ia_css_frame_info vf_yuv_ds_input_info;
struct ia_css_fw_info *output_stage; /* extra output stage */
struct ia_css_fw_info *vf_stage; /* extra vf_stage */
unsigned int required_bds_factor;
unsigned int dvs_frame_delay;
int num_invalid_frames;
bool enable_viewfinder[IA_CSS_PIPE_MAX_OUTPUT_STAGE];
struct ia_css_stream *stream;
struct ia_css_frame in_frame_struct;
struct ia_css_frame out_frame_struct;
struct ia_css_frame vf_frame_struct;
struct ia_css_frame *continuous_frames[NUM_CONTINUOUS_FRAMES];
struct ia_css_metadata *cont_md_buffers[NUM_CONTINUOUS_FRAMES];
union {
struct ia_css_preview_settings preview;
struct ia_css_video_settings video;
struct ia_css_capture_settings capture;
struct ia_css_yuvpp_settings yuvpp;
} pipe_settings;
hrt_vaddress scaler_pp_lut;
struct osys_object *osys_obj;
/* This number is unique per pipe each instance of css. This number is
* reused as pipeline number also. There is a 1-1 mapping between pipe_num
* and sp thread id. Current logic limits pipe_num to
* SH_CSS_MAX_SP_THREADS */
unsigned int pipe_num;
};
#define IA_CSS_DEFAULT_PIPE \
{ \
false, /* stop_requested */ \
DEFAULT_PIPE_CONFIG, /* config */ \
DEFAULT_PIPE_EXTRA_CONFIG, /* extra_config */ \
DEFAULT_PIPE_INFO, /* info */ \
IA_CSS_PIPE_ID_ACC, /* mode (pipe_id) */ \
NULL, /* shading_table */ \
DEFAULT_PIPELINE, /* pipeline */ \
{IA_CSS_BINARY_DEFAULT_FRAME_INFO}, /* output_info */ \
IA_CSS_BINARY_DEFAULT_FRAME_INFO, /* bds_output_info */ \
{IA_CSS_BINARY_DEFAULT_FRAME_INFO}, /* vf_output_info */ \
IA_CSS_BINARY_DEFAULT_FRAME_INFO, /* out_yuv_ds_input_info */ \
IA_CSS_BINARY_DEFAULT_FRAME_INFO, /* vf_yuv_ds_input_info */ \
NULL, /* output_stage */ \
NULL, /* vf_stage */ \
SH_CSS_BDS_FACTOR_1_00, /* required_bds_factor */ \
1, /* dvs_frame_delay */ \
0, /* num_invalid_frames */ \
{true}, /* enable_viewfinder */ \
NULL, /* stream */ \
DEFAULT_FRAME, /* in_frame_struct */ \
DEFAULT_FRAME, /* out_frame_struct */ \
DEFAULT_FRAME, /* vf_frame_struct */ \
{ NULL }, /* continuous_frames */ \
{ NULL }, /* cont_md_buffers */ \
{ IA_CSS_DEFAULT_PREVIEW_SETTINGS }, /* pipe_settings */ \
0, /* scaler_pp_lut */ \
NULL, /* osys object */ \
PIPE_ENTRY_EMPTY_TOKEN, /* pipe_num */\
}
void ia_css_pipe_map_queue(struct ia_css_pipe *pipe, bool map);
enum ia_css_err
sh_css_param_update_isp_params(struct ia_css_pipe *curr_pipe,
struct ia_css_isp_parameters *params,
bool commit, struct ia_css_pipe *pipe);
#endif /* __IA_CSS_PIPE_H__ */