1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Support for Intel Camera Imaging ISP subsystem.
4 * Copyright (c) 2015, Intel Corporation.
5 */
6
7 #include "ia_css_frame.h"
8 #include "ia_css_types.h"
9 #include "sh_css_defs.h"
10 #include "ia_css_debug.h"
11 #include "assert_support.h"
12 #define IA_CSS_INCLUDE_CONFIGURATIONS
13 #include "ia_css_isp_configs.h"
14 #include "isp.h"
15 #include "isp/modes/interface/isp_types.h"
16
17 #include "ia_css_raw.host.h"
18
19 static const struct ia_css_raw_configuration default_config = {
20 .pipe = (struct sh_css_sp_pipeline *)NULL,
21 };
22
23 /* MW: These areMIPI / ISYS properties, not camera function properties */
24 static enum sh_stream_format
css2isp_stream_format(enum atomisp_input_format from)25 css2isp_stream_format(enum atomisp_input_format from) {
26 switch (from)
27 {
28 case ATOMISP_INPUT_FORMAT_YUV420_8_LEGACY:
29 return sh_stream_format_yuv420_legacy;
30 case ATOMISP_INPUT_FORMAT_YUV420_8:
31 case ATOMISP_INPUT_FORMAT_YUV420_10:
32 case ATOMISP_INPUT_FORMAT_YUV420_16:
33 return sh_stream_format_yuv420;
34 case ATOMISP_INPUT_FORMAT_YUV422_8:
35 case ATOMISP_INPUT_FORMAT_YUV422_10:
36 case ATOMISP_INPUT_FORMAT_YUV422_16:
37 return sh_stream_format_yuv422;
38 case ATOMISP_INPUT_FORMAT_RGB_444:
39 case ATOMISP_INPUT_FORMAT_RGB_555:
40 case ATOMISP_INPUT_FORMAT_RGB_565:
41 case ATOMISP_INPUT_FORMAT_RGB_666:
42 case ATOMISP_INPUT_FORMAT_RGB_888:
43 return sh_stream_format_rgb;
44 case ATOMISP_INPUT_FORMAT_RAW_6:
45 case ATOMISP_INPUT_FORMAT_RAW_7:
46 case ATOMISP_INPUT_FORMAT_RAW_8:
47 case ATOMISP_INPUT_FORMAT_RAW_10:
48 case ATOMISP_INPUT_FORMAT_RAW_12:
49 case ATOMISP_INPUT_FORMAT_RAW_14:
50 case ATOMISP_INPUT_FORMAT_RAW_16:
51 return sh_stream_format_raw;
52 case ATOMISP_INPUT_FORMAT_BINARY_8:
53 default:
54 return sh_stream_format_raw;
55 }
56 }
57
ia_css_raw_config(struct sh_css_isp_raw_isp_config * to,const struct ia_css_raw_configuration * from,unsigned int size)58 int ia_css_raw_config(struct sh_css_isp_raw_isp_config *to,
59 const struct ia_css_raw_configuration *from,
60 unsigned int size)
61 {
62 unsigned int elems_a = ISP_VEC_NELEMS;
63 const struct ia_css_frame_info *in_info = from->in_info;
64 const struct ia_css_frame_info *internal_info = from->internal_info;
65 int ret;
66
67 if (!IS_ISP2401 || !in_info)
68 in_info = internal_info;
69
70 ret = ia_css_dma_configure_from_info(&to->port_b, in_info);
71 if (ret)
72 return ret;
73
74 /* Assume divisiblity here, may need to generalize to fixed point. */
75 assert((in_info->format == IA_CSS_FRAME_FORMAT_RAW_PACKED) ||
76 (elems_a % to->port_b.elems == 0));
77
78 to->width_a_over_b = elems_a / to->port_b.elems;
79 to->inout_port_config = from->pipe->inout_port_config;
80 to->format = in_info->format;
81 to->required_bds_factor = from->pipe->required_bds_factor;
82 to->two_ppc = from->two_ppc;
83 to->stream_format = css2isp_stream_format(from->stream_format);
84 to->deinterleaved = from->deinterleaved;
85
86 if (IS_ISP2401) {
87 to->start_column = in_info->crop_info.start_column;
88 to->start_line = in_info->crop_info.start_line;
89 to->enable_left_padding = from->enable_left_padding;
90 }
91
92 return 0;
93 }
94
ia_css_raw_configure(const struct sh_css_sp_pipeline * pipe,const struct ia_css_binary * binary,const struct ia_css_frame_info * in_info,const struct ia_css_frame_info * internal_info,bool two_ppc,bool deinterleaved)95 int ia_css_raw_configure(const struct sh_css_sp_pipeline *pipe,
96 const struct ia_css_binary *binary,
97 const struct ia_css_frame_info *in_info,
98 const struct ia_css_frame_info *internal_info,
99 bool two_ppc,
100 bool deinterleaved)
101 {
102 u8 enable_left_padding = (uint8_t)((binary->left_padding) ? 1 : 0);
103 struct ia_css_raw_configuration config = default_config;
104
105 config.pipe = pipe;
106 config.in_info = in_info;
107 config.internal_info = internal_info;
108 config.two_ppc = two_ppc;
109 config.stream_format = binary->input_format;
110 config.deinterleaved = deinterleaved;
111 config.enable_left_padding = enable_left_padding;
112
113 return ia_css_configure_raw(binary, &config);
114 }
115