| // SPDX-License-Identifier: GPL-2.0 |
| /* |
| * 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. |
| */ |
| |
| #include "ia_css_util.h" |
| #include <ia_css_frame.h> |
| #include <assert_support.h> |
| #include <math_support.h> |
| |
| /* for ia_css_binary_max_vf_width() */ |
| #include "ia_css_binary.h" |
| |
| /* MW: Table look-up ??? */ |
| unsigned int ia_css_util_input_format_bpp( |
| enum atomisp_input_format format, |
| bool two_ppc) |
| { |
| unsigned int rval = 0; |
| |
| switch (format) { |
| case ATOMISP_INPUT_FORMAT_YUV420_8_LEGACY: |
| case ATOMISP_INPUT_FORMAT_YUV420_8: |
| case ATOMISP_INPUT_FORMAT_YUV422_8: |
| case ATOMISP_INPUT_FORMAT_RGB_888: |
| case ATOMISP_INPUT_FORMAT_RAW_8: |
| case ATOMISP_INPUT_FORMAT_BINARY_8: |
| case ATOMISP_INPUT_FORMAT_EMBEDDED: |
| rval = 8; |
| break; |
| case ATOMISP_INPUT_FORMAT_YUV420_10: |
| case ATOMISP_INPUT_FORMAT_YUV422_10: |
| case ATOMISP_INPUT_FORMAT_RAW_10: |
| rval = 10; |
| break; |
| case ATOMISP_INPUT_FORMAT_YUV420_16: |
| case ATOMISP_INPUT_FORMAT_YUV422_16: |
| rval = 16; |
| break; |
| case ATOMISP_INPUT_FORMAT_RGB_444: |
| rval = 4; |
| break; |
| case ATOMISP_INPUT_FORMAT_RGB_555: |
| rval = 5; |
| break; |
| case ATOMISP_INPUT_FORMAT_RGB_565: |
| rval = 65; |
| break; |
| case ATOMISP_INPUT_FORMAT_RGB_666: |
| case ATOMISP_INPUT_FORMAT_RAW_6: |
| rval = 6; |
| break; |
| case ATOMISP_INPUT_FORMAT_RAW_7: |
| rval = 7; |
| break; |
| case ATOMISP_INPUT_FORMAT_RAW_12: |
| rval = 12; |
| break; |
| case ATOMISP_INPUT_FORMAT_RAW_14: |
| if (two_ppc) |
| rval = 14; |
| else |
| rval = 12; |
| break; |
| case ATOMISP_INPUT_FORMAT_RAW_16: |
| if (two_ppc) |
| rval = 16; |
| else |
| rval = 12; |
| break; |
| default: |
| rval = 0; |
| break; |
| } |
| return rval; |
| } |
| |
| int ia_css_util_check_vf_info( |
| const struct ia_css_frame_info *const info) |
| { |
| int err; |
| unsigned int max_vf_width; |
| |
| assert(info); |
| err = ia_css_frame_check_info(info); |
| if (err) |
| return err; |
| max_vf_width = ia_css_binary_max_vf_width(); |
| if (max_vf_width != 0 && info->res.width > max_vf_width * 2) |
| return -EINVAL; |
| return 0; |
| } |
| |
| int ia_css_util_check_vf_out_info( |
| const struct ia_css_frame_info *const out_info, |
| const struct ia_css_frame_info *const vf_info) |
| { |
| int err; |
| |
| assert(out_info); |
| assert(vf_info); |
| |
| err = ia_css_frame_check_info(out_info); |
| if (err) |
| return err; |
| err = ia_css_util_check_vf_info(vf_info); |
| if (err) |
| return err; |
| return 0; |
| } |
| |
| int ia_css_util_check_res(unsigned int width, unsigned int height) |
| { |
| /* height can be odd number for jpeg/embedded data from ISYS2401 */ |
| if (((width == 0) || |
| (height == 0) || |
| IS_ODD(width))) { |
| return -EINVAL; |
| } |
| return 0; |
| } |
| |
| /* ISP2401 */ |
| bool ia_css_util_res_leq(struct ia_css_resolution a, struct ia_css_resolution b) |
| { |
| return a.width <= b.width && a.height <= b.height; |
| } |
| |
| /* ISP2401 */ |
| bool ia_css_util_resolution_is_zero(const struct ia_css_resolution resolution) |
| { |
| return (resolution.width == 0) || (resolution.height == 0); |
| } |
| |
| /* ISP2401 */ |
| bool ia_css_util_resolution_is_even(const struct ia_css_resolution resolution) |
| { |
| return IS_EVEN(resolution.height) && IS_EVEN(resolution.width); |
| } |
| |
| bool ia_css_util_is_input_format_raw(enum atomisp_input_format format) |
| { |
| return ((format == ATOMISP_INPUT_FORMAT_RAW_6) || |
| (format == ATOMISP_INPUT_FORMAT_RAW_7) || |
| (format == ATOMISP_INPUT_FORMAT_RAW_8) || |
| (format == ATOMISP_INPUT_FORMAT_RAW_10) || |
| (format == ATOMISP_INPUT_FORMAT_RAW_12)); |
| /* raw_14 and raw_16 are not supported as input formats to the ISP. |
| * They can only be copied to a frame in memory using the |
| * copy binary. |
| */ |
| } |
| |
| bool ia_css_util_is_input_format_yuv(enum atomisp_input_format format) |
| { |
| return format == ATOMISP_INPUT_FORMAT_YUV420_8_LEGACY || |
| format == ATOMISP_INPUT_FORMAT_YUV420_8 || |
| format == ATOMISP_INPUT_FORMAT_YUV420_10 || |
| format == ATOMISP_INPUT_FORMAT_YUV420_16 || |
| format == ATOMISP_INPUT_FORMAT_YUV422_8 || |
| format == ATOMISP_INPUT_FORMAT_YUV422_10 || |
| format == ATOMISP_INPUT_FORMAT_YUV422_16; |
| } |
| |
| int ia_css_util_check_input( |
| const struct ia_css_stream_config *const stream_config, |
| bool must_be_raw, |
| bool must_be_yuv) |
| { |
| assert(stream_config); |
| |
| if (!stream_config) |
| return -EINVAL; |
| |
| if (stream_config->input_config.effective_res.width == 0 || |
| stream_config->input_config.effective_res.height == 0) |
| return -EINVAL; |
| if (must_be_raw && |
| !ia_css_util_is_input_format_raw(stream_config->input_config.format)) |
| return -EINVAL; |
| |
| if (must_be_yuv && |
| !ia_css_util_is_input_format_yuv(stream_config->input_config.format)) |
| return -EINVAL; |
| |
| return 0; |
| } |