diff options
Diffstat (limited to 'drivers/staging/media/atomisp/pci/atomisp2/css2400/isp/modes/interface/isp_exprs.h')
-rw-r--r-- | drivers/staging/media/atomisp/pci/atomisp2/css2400/isp/modes/interface/isp_exprs.h | 309 |
1 files changed, 309 insertions, 0 deletions
diff --git a/drivers/staging/media/atomisp/pci/atomisp2/css2400/isp/modes/interface/isp_exprs.h b/drivers/staging/media/atomisp/pci/atomisp2/css2400/isp/modes/interface/isp_exprs.h new file mode 100644 index 0000000..8b59a8c --- /dev/null +++ b/drivers/staging/media/atomisp/pci/atomisp2/css2400/isp/modes/interface/isp_exprs.h @@ -0,0 +1,309 @@ +#ifndef ISP2401 +/* + * 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. + */ +#else +/** +Support for Intel Camera Imaging ISP subsystem. +Copyright (c) 2010 - 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. +*/ +#endif + +#ifndef _COMMON_ISP_EXPRS_H_ +#define _COMMON_ISP_EXPRS_H_ + +/* Binary independent pre-processor expressions */ + +#include "sh_css_defs.h" +#include "isp_const.h" + +#ifdef __HOST +#error "isp_exprs.h: Do not include on HOST, contains ISP specific defines" +#endif + +#ifndef __ISP +#if defined(MODE) +#define MODE aap +#error "isp_exprs.h: is mode independent, but MODE is set" +#endif +#if defined(VARIABLE_RESOLUTION) +#define VARIABLE_RESOLUTION noot +#error "isp_exprs.h: is mode independent, but VARIABLE_RESOLUTION is set" +#endif +#if defined(DECI_FACTOR_LOG2) +#define DECI_FACTOR_LOG2 mies +#error "isp_exprs.h: is mode independent, but DECI_FACTOR_LOG2 is set" +#endif +#endif + +#define LOG_VECTOR_STEP _ISP_LOG_VECTOR_STEP(MODE) +/* should be even and multiple of vf downscaling */ +#define ISP_OUTPUT_CHUNK_LOG_FACTOR (MAX_VF_LOG_DOWNSCALE<=1 ? LOG_VECTOR_STEP : \ + umax(VF_LOG_DOWNSCALE, LOG_VECTOR_STEP)) + +#define CEIL_DIV_CHUNKS(n,c) ((c) == 1 ? (n) \ + : CEIL_SHIFT(CEIL_DIV((n), (c)), ISP_OUTPUT_CHUNK_LOG_FACTOR)<<ISP_OUTPUT_CHUNK_LOG_FACTOR) + + +#define ISP_VARIABLE_INPUT (ISP_INPUT == IA_CSS_BINARY_INPUT_VARIABLE) + +/* Binary independent versions, see isp_defs.h for binary dependent ones */ +#ifndef __ISP +#define IMAGEFORMAT_IS_RAW(fmt) ((fmt) == IA_CSS_FRAME_FORMAT_RAW) + +#define IMAGEFORMAT_IS_RAW_INTERLEAVED(fmt) ((fmt) == IA_CSS_FRAME_FORMAT_RAW) + +#define IMAGEFORMAT_IS_RGB(fmt) ((fmt) == IA_CSS_FRAME_FORMAT_RGBA888 || (fmt) == IA_CSS_FRAME_FORMAT_PLANAR_RGB888 || \ + (fmt) == IA_CSS_FRAME_FORMAT_RGB565) + +#define IMAGEFORMAT_IS_RGB_INTERLEAVED(fmt) ((fmt) == IA_CSS_FRAME_FORMAT_RGBA888 || (fmt) == IA_CSS_FRAME_FORMAT_RGB565) + +#define IMAGEFORMAT_UV_INTERLEAVED(fmt) ((fmt) == IA_CSS_FRAME_FORMAT_NV11 || \ + (fmt) == IA_CSS_FRAME_FORMAT_NV12 || (fmt) == IA_CSS_FRAME_FORMAT_NV21 || \ + (fmt) == IA_CSS_FRAME_FORMAT_NV16 || (fmt) == IA_CSS_FRAME_FORMAT_NV61 || \ + (fmt) == IA_CSS_FRAME_FORMAT_UYVY || (fmt) == IA_CSS_FRAME_FORMAT_YUYV || \ + (fmt) == IA_CSS_FRAME_FORMAT_NV12_16 || (fmt) == IA_CSS_FRAME_FORMAT_NV12_TILEY) + +#define IMAGEFORMAT_YUV_INTERLEAVED(fmt) ((fmt) == IA_CSS_FRAME_FORMAT_UYVY || (fmt) == IA_CSS_FRAME_FORMAT_YUYV) + +#define IMAGEFORMAT_INTERLEAVED(fmt) (IMAGEFORMAT_UV_INTERLEAVED(fmt) || IMAGEFORMAT_IS_RGB_INTERLEAVED(fmt)) + +#define IMAGEFORMAT_SUB_SAMPL_420(fmt) ((fmt) == IA_CSS_FRAME_FORMAT_YUV420 || (fmt) == IA_CSS_FRAME_FORMAT_YV12 || \ + (fmt) == IA_CSS_FRAME_FORMAT_NV12 || (fmt) == IA_CSS_FRAME_FORMAT_NV21 || \ + (fmt) == IA_CSS_FRAME_FORMAT_NV12_16 || (fmt) == IA_CSS_FRAME_FORMAT_NV12TILEY) + +#define IMAGEFORMAT_SUB_SAMPL_422(fmt) ((fmt) == IA_CSS_FRAME_FORMAT_YUV422 || (fmt) == IA_CSS_FRAME_FORMAT_YV16 || \ + (fmt) == IA_CSS_FRAME_FORMAT_NV16 || (fmt) == IA_CSS_FRAME_FORMAT_NV61) + +#define IMAGEFORMAT_SUB_SAMPL_444(fmt) ((fmt) == IA_CSS_FRAME_FORMAT_YUV444) + +#define IMAGEFORMAT_UV_SWAPPED(fmt) ((fmt) == IA_CSS_FRAME_FORMAT_NV21 || (fmt) == IA_CSS_FRAME_FORMAT_NV61) + +#define IMAGEFORMAT_IS_RGBA(fmt) ((fmt) == IA_CSS_FRAME_FORMAT_RGBA888) + +#define IMAGEFORMAT_IS_NV11(fmt) ((fmt) == IA_CSS_FRAME_FORMAT_NV11) + +#define IMAGEFORMAT_IS_16BIT(fmt) ((fmt) == IA_CSS_FRAME_FORMAT_YUV420_16 || (fmt) == IA_CSS_FRAME_FORMAT_NV12_16 || (fmt) == IA_CSS_FRAME_FORMAT_YUV422_16) + +#endif + + +/******** GDCAC settings *******/ +#define GDCAC_BPP ISP_VEC_ELEMBITS /* We use 14 bits per pixel component for the GDCAC mode */ +#define GDC_INPUT_BLOCK_WIDTH 2 /* Two vectors are needed */ +#define GDC_OUTPUT_BLOCK_WIDTH 1 /* One vector is produced */ + +#if ISP_VEC_NELEMS == 16 +/* For 16*16 output block, the distortion fits in 13.312 lines __ALWAYS__ */ +#define GDC_INPUT_BLOCK_HEIGHT 14 +#elif ISP_VEC_NELEMS == 64 +/* For 64*64 output block, the distortion fits in 47. lines __ALWAYS__ */ +#define GDC_INPUT_BLOCK_HEIGHT 48 +#endif +/*******************************/ + + +#define ENABLE_HUP ((isp_input_width - isp_envelope_width) < isp_output_width) +#define ENABLE_VUP ((isp_input_height - isp_envelope_height) < isp_output_height) + +#define ISP_INPUT_WIDTH (ENABLE_DS | ENABLE_HUP ? isp_input_width : ISP_INTERNAL_WIDTH) +#define ISP_INPUT_HEIGHT (ENABLE_DS | ENABLE_VUP ? isp_input_height : isp_internal_height) + +#define DECI_FACTOR_LOG2 (ISP_FIXED_S3A_DECI_LOG ? ISP_FIXED_S3A_DECI_LOG : isp_deci_log_factor) + +#define ISP_S3ATBL_WIDTH \ + _ISP_S3ATBL_ISP_WIDTH(_ISP_S3A_ELEMS_ISP_WIDTH((ENABLE_HUP ? ISP_INTERNAL_WIDTH : ISP_INPUT_WIDTH), ISP_LEFT_CROPPING), \ + DECI_FACTOR_LOG2) +#define S3ATBL_WIDTH_BYTES (sizeof(struct ia_css_3a_output) * ISP_S3ATBL_WIDTH) +#define S3ATBL_WIDTH_SHORTS (S3ATBL_WIDTH_BYTES / sizeof(short)) + +/* should be even?? */ +#define ISP_UV_OUTPUT_CHUNK_VECS CEIL_DIV(ISP_OUTPUT_CHUNK_VECS, 2) + + +#if defined(__ISP) || defined(INIT_VARS) + +#define ISP_USE_IF (ISP_INPUT == IA_CSS_BINARY_INPUT_MEMORY ? 0 : \ + ISP_INPUT == IA_CSS_BINARY_INPUT_SENSOR ? 1 : \ + isp_online) + +#define ISP_DVS_ENVELOPE_WIDTH 0 +#define ISP_DVS_ENVELOPE_HEIGHT 0 + +#define _ISP_INPUT_WIDTH_VECS _ISP_VECS(ISP_INPUT_WIDTH) + +#if !defined(__ISP) || (VARIABLE_RESOLUTION && !__HOST) +#define ISP_INPUT_WIDTH_VECS isp_vectors_per_input_line +#else +#define ISP_INPUT_WIDTH_VECS _ISP_INPUT_WIDTH_VECS +#endif + +#if !defined(__ISP) || VARIABLE_RESOLUTION +#define ISP_INTERNAL_WIDTH_VECS isp_vectors_per_line +#else +#define ISP_INTERNAL_WIDTH_VECS _ISP_INTERNAL_WIDTH_VECS +#endif + +#define _ISP_INTERNAL_HEIGHT __ISP_INTERNAL_HEIGHT(isp_output_height, ISP_TOP_CROPPING, ISP_DVS_ENVELOPE_HEIGHT) + +#define ISP_INTERNAL_HEIGHT isp_internal_height + +#define _ISP_INTERNAL_WIDTH __ISP_INTERNAL_WIDTH(ISP_OUTPUT_WIDTH, ISP_DVS_ENVELOPE_WIDTH, \ + ISP_LEFT_CROPPING, MODE, ISP_C_SUBSAMPLING, \ + OUTPUT_NUM_CHUNKS, ISP_PIPELINING) + +#define ISP_UV_INTERNAL_WIDTH (ISP_INTERNAL_WIDTH / 2) +#define ISP_UV_INTERNAL_HEIGHT (ISP_INTERNAL_HEIGHT / 2) + +#define _ISP_INTERNAL_WIDTH_VECS (_ISP_INTERNAL_WIDTH / ISP_VEC_NELEMS) +#define _ISP_UV_INTERNAL_WIDTH_VECS CEIL_DIV(ISP_UV_INTERNAL_WIDTH, ISP_VEC_NELEMS) + +#define ISP_VF_OUTPUT_WIDTH _ISP_VF_OUTPUT_WIDTH(ISP_VF_OUTPUT_WIDTH_VECS) +#define ISP_VF_OUTPUT_HEIGHT _ISP_VF_OUTPUT_HEIGHT(isp_output_height, VF_LOG_DOWNSCALE) + +#if defined (__ISP) && !VARIABLE_RESOLUTION +#define ISP_INTERNAL_WIDTH _ISP_INTERNAL_WIDTH +#define ISP_VF_OUTPUT_WIDTH_VECS _ISP_VF_OUTPUT_WIDTH_VECS +#else +#define ISP_INTERNAL_WIDTH (VARIABLE_RESOLUTION ? isp_internal_width : _ISP_INTERNAL_WIDTH) +#define ISP_VF_OUTPUT_WIDTH_VECS (VARIABLE_RESOLUTION ? isp_vf_output_width_vecs : _ISP_VF_OUTPUT_WIDTH_VECS) +#endif + +#if defined(__ISP) && !VARIABLE_RESOLUTION +#define ISP_OUTPUT_WIDTH ISP_MAX_OUTPUT_WIDTH +#define VF_LOG_DOWNSCALE MAX_VF_LOG_DOWNSCALE +#else +#define ISP_OUTPUT_WIDTH isp_output_width +#define VF_LOG_DOWNSCALE isp_vf_downscale_bits +#endif + +#if !defined(__ISP) || VARIABLE_RESOLUTION +#define _ISP_MAX_VF_OUTPUT_WIDTH __ISP_MAX_VF_OUTPUT_WIDTH(2*SH_CSS_MAX_VF_WIDTH, ISP_LEFT_CROPPING) +#elif defined(MODE) && MODE == IA_CSS_BINARY_MODE_PRIMARY && ISP_OUTPUT_WIDTH > 3328 +/* Because of vmem issues, should be fixed later */ +#define _ISP_MAX_VF_OUTPUT_WIDTH (SH_CSS_MAX_VF_WIDTH - 2*ISP_VEC_NELEMS + (ISP_LEFT_CROPPING ? 2 * ISP_VEC_NELEMS : 0)) +#else +#define _ISP_MAX_VF_OUTPUT_WIDTH (ISP_VF_OUTPUT_WIDTH + (ISP_LEFT_CROPPING ? (2 >> VF_LOG_DOWNSCALE) * ISP_VEC_NELEMS : 0)) +#endif + +#define ISP_MAX_VF_OUTPUT_VECS CEIL_DIV(_ISP_MAX_VF_OUTPUT_WIDTH, ISP_VEC_NELEMS) + + + +#define ISP_MIN_STRIPE_WIDTH (ISP_PIPELINING * (1<<_ISP_LOG_VECTOR_STEP(MODE))) + +/******* STRIPING-RELATED MACROS *******/ +#define NO_STRIPING (ISP_NUM_STRIPES == 1) + +#if defined(HAS_RES_MGR) + +#define ISP_OUTPUT_CHUNK_VECS ISP_INTERNAL_WIDTH_VECS + +#if defined(__ISP) +#define VECTORS_PER_LINE ISP_INTERNAL_WIDTH_VECS +#else +#define VECTORS_PER_LINE \ + (NO_STRIPING ? ISP_INTERNAL_WIDTH_VECS \ + : ISP_IO_STRIPE_WIDTH_VECS(ISP_INTERNAL_WIDTH_VECS, ISP_LEFT_PADDING_VECS, ISP_NUM_STRIPES, ISP_MIN_STRIPE_WIDTH) ) +#endif + +#define VECTORS_PER_INPUT_LINE \ + (NO_STRIPING ? ISP_INPUT_WIDTH_VECS \ + : ISP_IO_STRIPE_WIDTH_VECS(ISP_INPUT_WIDTH_VECS, ISP_LEFT_PADDING_VECS, ISP_NUM_STRIPES, ISP_MIN_STRIPE_WIDTH) ) + +#else + +#define ISP_OUTPUT_CHUNK_VECS \ + (NO_STRIPING ? CEIL_DIV_CHUNKS(ISP_OUTPUT_VECS_EXTRA_CROP, OUTPUT_NUM_CHUNKS) \ + : ISP_IO_STRIPE_WIDTH_VECS(ISP_OUTPUT_VECS_EXTRA_CROP, ISP_LEFT_PADDING_VECS, ISP_NUM_STRIPES, ISP_MIN_STRIPE_WIDTH) ) + +#define VECTORS_PER_LINE \ + (NO_STRIPING ? ISP_INTERNAL_WIDTH_VECS \ + : ISP_IO_STRIPE_WIDTH_VECS(ISP_INTERNAL_WIDTH_VECS, ISP_LEFT_PADDING_VECS, ISP_NUM_STRIPES, ISP_MIN_STRIPE_WIDTH) ) + +#define VECTORS_PER_INPUT_LINE \ + (NO_STRIPING ? ISP_INPUT_WIDTH_VECS \ + : ISP_IO_STRIPE_WIDTH_VECS(ISP_INPUT_WIDTH_VECS, ISP_LEFT_PADDING_VECS, ISP_NUM_STRIPES, ISP_MIN_STRIPE_WIDTH)+_ISP_EXTRA_PADDING_VECS) + +#endif + +#define ISP_MAX_VF_OUTPUT_STRIPE_VECS \ + (NO_STRIPING ? ISP_MAX_VF_OUTPUT_VECS \ + : CEIL_MUL(CEIL_DIV(ISP_MAX_VF_OUTPUT_VECS, ISP_NUM_STRIPES), 2)) +#define _ISP_VF_OUTPUT_WIDTH_VECS \ + (NO_STRIPING ? __ISP_VF_OUTPUT_WIDTH_VECS(ISP_OUTPUT_WIDTH, VF_LOG_DOWNSCALE) \ + : __ISP_VF_OUTPUT_WIDTH_VECS(CEIL_DIV(ISP_OUTPUT_WIDTH, ISP_NUM_STRIPES), VF_LOG_DOWNSCALE)) + +#define ISP_IO_STRIPE_WIDTH_VECS(width, padding, num_stripes, min_stripe) \ + MAX(CEIL_MUL(padding + CEIL_DIV(width-padding, num_stripes) \ + , 2) \ + , min_stripe) +////////// INPUT & INTERNAL +/* should be even */ +#define INPUT_NUM_CHUNKS OUTPUT_NUM_CHUNKS + +#define INPUT_VECTORS_PER_CHUNK CEIL_DIV_CHUNKS(VECTORS_PER_INPUT_LINE, INPUT_NUM_CHUNKS) + +/* only for ISP code, will be removed: */ +#define VECTORS_PER_FULL_LINE ISP_INTERNAL_WIDTH_VECS +#define VECTORS_PER_INPUT_FULL_LINE ISP_INPUT_WIDTH_VECS + +////////// OUTPUT +/* should at least even and also multiple of vf scaling */ +#define ISP_OUTPUT_VECS_EXTRA_CROP CEIL_DIV(ISP_OUTPUT_WIDTH_EXTRA_CROP, ISP_VEC_NELEMS) + +/* Output is decoupled from input */ +#define ISP_OUTPUT_WIDTH_EXTRA_CROP CEIL_MUL(CEIL_MUL((ENABLE_DVS_ENVELOPE ? ISP_OUTPUT_WIDTH : ISP_INTERNAL_WIDTH), 2*ISP_VEC_NELEMS), \ + ISP_C_SUBSAMPLING * OUTPUT_NUM_CHUNKS * HIVE_ISP_DDR_WORD_BYTES) + +#define ISP_MAX_VF_OUTPUT_CHUNK_VECS \ + (NO_CHUNKING ? ISP_MAX_VF_OUTPUT_STRIPE_VECS \ + : 2*CEIL_DIV(ISP_MAX_VF_OUTPUT_STRIPE_VECS, 2*OUTPUT_NUM_CHUNKS)) + +#define OUTPUT_VECTORS_PER_CHUNK CEIL_DIV_CHUNKS(VECTORS_PER_LINE,OUTPUT_NUM_CHUNKS) + +/* should be even?? */ +#if !defined(HAS_RES_MGR) +#define OUTPUT_C_VECTORS_PER_CHUNK CEIL_DIV(OUTPUT_VECTORS_PER_CHUNK, 2) +#else +#define OUTPUT_C_VECTORS_PER_CHUNK CEIL_DIV(MAX_VECTORS_PER_CHUNK, 2) +#endif + +#ifndef ISP2401 +/**** SCTBL defs *******/ +#define ISP_SCTBL_HEIGHT \ + _ISP_SCTBL_HEIGHT(ISP_INPUT_HEIGHT, DECI_FACTOR_LOG2) + +#endif +/**** UDS defs *********/ +#define UDS_DMACH_STRIDE_B_IN_Y (( ISP_INTERNAL_WIDTH /BITS8_ELEMENTS_PER_XMEM_ADDR)*HIVE_ISP_DDR_WORD_BYTES) +#define UDS_DMACH_STRIDE_B_IN_C (((ISP_INTERNAL_WIDTH/2)/BITS8_ELEMENTS_PER_XMEM_ADDR)*HIVE_ISP_DDR_WORD_BYTES) + +#else /* defined(__ISP) || defined(INIT_VARS) */ + +#define ISP_INTERNAL_WIDTH isp_internal_width +#define ISP_INTERNAL_HEIGHT isp_internal_height + +#endif /* defined(__ISP) || defined(INIT_VARS) */ + +#endif /* _COMMON_ISP_EXPRS_H_ */ + |