1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Support for Intel Camera Imaging ISP subsystem.
4  * Copyright (c) 2015, Intel Corporation.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  */
15 
16 #include "ia_css_frame.h"
17 #include "ia_css_debug.h"
18 #define IA_CSS_INCLUDE_CONFIGURATIONS
19 #include "ia_css_isp_configs.h"
20 #include "ia_css_output.host.h"
21 #include "isp.h"
22 
23 #include "assert_support.h"
24 
25 const struct ia_css_output_config default_output_config = {
26 	0,
27 	0
28 };
29 
30 static const struct ia_css_output_configuration default_output_configuration = {
31 	.info = (struct ia_css_frame_info *)NULL,
32 };
33 
34 static const struct ia_css_output0_configuration default_output0_configuration
35 	= {
36 	.info = (struct ia_css_frame_info *)NULL,
37 };
38 
39 static const struct ia_css_output1_configuration default_output1_configuration
40 	= {
41 	.info = (struct ia_css_frame_info *)NULL,
42 };
43 
44 void
ia_css_output_encode(struct sh_css_isp_output_params * to,const struct ia_css_output_config * from,unsigned int size)45 ia_css_output_encode(
46     struct sh_css_isp_output_params *to,
47     const struct ia_css_output_config *from,
48     unsigned int size)
49 {
50 	(void)size;
51 	to->enable_hflip = from->enable_hflip;
52 	to->enable_vflip = from->enable_vflip;
53 }
54 
ia_css_output_config(struct sh_css_isp_output_isp_config * to,const struct ia_css_output_configuration * from,unsigned int size)55 int ia_css_output_config(struct sh_css_isp_output_isp_config *to,
56 			 const struct ia_css_output_configuration  *from,
57 			 unsigned int size)
58 {
59 	unsigned int elems_a = ISP_VEC_NELEMS;
60 	int ret;
61 
62 	ret = ia_css_dma_configure_from_info(&to->port_b, from->info);
63 	if (ret)
64 		return ret;
65 
66 	to->width_a_over_b = elems_a / to->port_b.elems;
67 	to->height = from->info ? from->info->res.height : 0;
68 	to->enable = from->info != NULL;
69 	ia_css_frame_info_to_frame_sp_info(&to->info, from->info);
70 
71 	/* Assume divisiblity here, may need to generalize to fixed point. */
72 	if (elems_a % to->port_b.elems != 0)
73 		return -EINVAL;
74 
75 	return 0;
76 }
77 
ia_css_output0_config(struct sh_css_isp_output_isp_config * to,const struct ia_css_output0_configuration * from,unsigned int size)78 int ia_css_output0_config(struct sh_css_isp_output_isp_config       *to,
79 			  const struct ia_css_output0_configuration *from,
80 			  unsigned int size)
81 {
82 	return ia_css_output_config(to, (const struct ia_css_output_configuration *)from, size);
83 }
84 
ia_css_output1_config(struct sh_css_isp_output_isp_config * to,const struct ia_css_output1_configuration * from,unsigned int size)85 int ia_css_output1_config(struct sh_css_isp_output_isp_config       *to,
86 		          const struct ia_css_output1_configuration *from,
87 			  unsigned int size)
88 {
89 	return ia_css_output_config(to, (const struct ia_css_output_configuration *)from, size);
90 }
91 
ia_css_output_configure(const struct ia_css_binary * binary,const struct ia_css_frame_info * info)92 int ia_css_output_configure(const struct ia_css_binary     *binary,
93 			    const struct ia_css_frame_info *info)
94 {
95 	if (info) {
96 		struct ia_css_output_configuration config =
97 			    default_output_configuration;
98 
99 		config.info = info;
100 
101 		return ia_css_configure_output(binary, &config);
102 	}
103 	return 0;
104 }
105 
ia_css_output0_configure(const struct ia_css_binary * binary,const struct ia_css_frame_info * info)106 int ia_css_output0_configure(const struct ia_css_binary    *binary,
107 			    const struct ia_css_frame_info *info)
108 {
109 	if (info) {
110 		struct ia_css_output0_configuration config =
111 			    default_output0_configuration;
112 
113 		config.info = info;
114 
115 		return ia_css_configure_output0(binary, &config);
116 	}
117 	return 0;
118 }
119 
ia_css_output1_configure(const struct ia_css_binary * binary,const struct ia_css_frame_info * info)120 int ia_css_output1_configure(const struct ia_css_binary     *binary,
121 			     const struct ia_css_frame_info *info)
122 {
123 	if (info) {
124 		struct ia_css_output1_configuration config =
125 			    default_output1_configuration;
126 
127 		config.info = info;
128 
129 		return ia_css_configure_output1(binary, &config);
130 	}
131 	return 0;
132 }
133 
134 void
ia_css_output_dump(const struct sh_css_isp_output_params * output,unsigned int level)135 ia_css_output_dump(
136     const struct sh_css_isp_output_params *output,
137     unsigned int level)
138 {
139 	if (!output) return;
140 	ia_css_debug_dtrace(level, "Horizontal Output Flip:\n");
141 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
142 			    "enable", output->enable_hflip);
143 	ia_css_debug_dtrace(level, "Vertical Output Flip:\n");
144 	ia_css_debug_dtrace(level, "\t%-32s = %d\n",
145 			    "enable", output->enable_vflip);
146 }
147 
148 void
ia_css_output_debug_dtrace(const struct ia_css_output_config * config,unsigned int level)149 ia_css_output_debug_dtrace(
150     const struct ia_css_output_config *config,
151     unsigned int level)
152 {
153 	ia_css_debug_dtrace(level,
154 			    "config.enable_hflip=%d",
155 			    config->enable_hflip);
156 	ia_css_debug_dtrace(level,
157 			    "config.enable_vflip=%d",
158 			    config->enable_vflip);
159 }
160