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