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 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 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 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 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 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 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 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 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 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