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 /* CSI reveiver has 3 ports. */ 17 #define N_CSI_PORTS (3) 18 19 #include "system_local.h" 20 #include "isys_dma_global.h" /* isys2401_dma_channel, 21 * isys2401_dma_cfg_t 22 */ 23 24 #include "ibuf_ctrl_local.h" /* ibuf_cfg_t, 25 * ibuf_ctrl_cfg_t 26 */ 27 28 #include "isys_stream2mmio.h" /* stream2mmio_cfg_t */ 29 30 #include "csi_rx.h" /* csi_rx_frontend_cfg_t, 31 * csi_rx_backend_cfg_t, 32 * csi_rx_backend_lut_entry_t 33 */ 34 #include "pixelgen.h" 35 36 #define INPUT_SYSTEM_N_STREAM_ID 6 /* maximum number of simultaneous 37 virtual channels supported*/ 38 39 typedef enum { 40 INPUT_SYSTEM_SOURCE_TYPE_UNDEFINED = 0, 41 INPUT_SYSTEM_SOURCE_TYPE_SENSOR, 42 INPUT_SYSTEM_SOURCE_TYPE_TPG, 43 INPUT_SYSTEM_SOURCE_TYPE_PRBS, 44 N_INPUT_SYSTEM_SOURCE_TYPE 45 } input_system_source_type_t; 46 47 typedef enum { 48 INPUT_SYSTEM_POLL_ON_WAIT_FOR_FRAME, 49 INPUT_SYSTEM_POLL_ON_CAPTURE_REQUEST, 50 } input_system_polling_mode_t; 51 52 typedef struct input_system_channel_s input_system_channel_t; 53 struct input_system_channel_s { 54 stream2mmio_ID_t stream2mmio_id; 55 stream2mmio_sid_ID_t stream2mmio_sid_id; 56 57 ibuf_ctrl_ID_t ibuf_ctrl_id; 58 isp2401_ib_buffer_t ib_buffer; 59 60 isys2401_dma_ID_t dma_id; 61 isys2401_dma_channel dma_channel; 62 }; 63 64 typedef struct input_system_channel_cfg_s input_system_channel_cfg_t; 65 struct input_system_channel_cfg_s { 66 stream2mmio_cfg_t stream2mmio_cfg; 67 ibuf_ctrl_cfg_t ibuf_ctrl_cfg; 68 isys2401_dma_cfg_t dma_cfg; 69 isys2401_dma_port_cfg_t dma_src_port_cfg; 70 isys2401_dma_port_cfg_t dma_dest_port_cfg; 71 }; 72 73 typedef struct input_system_input_port_s input_system_input_port_t; 74 struct input_system_input_port_s { 75 input_system_source_type_t source_type; 76 77 struct { 78 csi_rx_frontend_ID_t frontend_id; 79 csi_rx_backend_ID_t backend_id; 80 csi_mipi_packet_type_t packet_type; 81 csi_rx_backend_lut_entry_t backend_lut_entry; 82 } csi_rx; 83 84 struct { 85 csi_mipi_packet_type_t packet_type; 86 csi_rx_backend_lut_entry_t backend_lut_entry; 87 } metadata; 88 89 struct { 90 pixelgen_ID_t pixelgen_id; 91 } pixelgen; 92 }; 93 94 typedef struct input_system_input_port_cfg_s input_system_input_port_cfg_t; 95 struct input_system_input_port_cfg_s { 96 struct { 97 csi_rx_frontend_cfg_t frontend_cfg; 98 csi_rx_backend_cfg_t backend_cfg; 99 csi_rx_backend_cfg_t md_backend_cfg; 100 } csi_rx_cfg; 101 102 struct { 103 pixelgen_tpg_cfg_t tpg_cfg; 104 pixelgen_prbs_cfg_t prbs_cfg; 105 } pixelgen_cfg; 106 }; 107 108 typedef struct isp2401_input_system_cfg_s isp2401_input_system_cfg_t; 109 struct isp2401_input_system_cfg_s { 110 input_system_input_port_ID_t input_port_id; 111 112 input_system_source_type_t mode; 113 114 /* ISP2401 */ 115 input_system_polling_mode_t polling_mode; 116 117 bool online; 118 bool raw_packed; 119 s8 linked_isys_stream_id; 120 121 struct { 122 bool comp_enable; 123 s32 active_lanes; 124 s32 fmt_type; 125 s32 ch_id; 126 s32 comp_predictor; 127 s32 comp_scheme; 128 } csi_port_attr; 129 130 pixelgen_tpg_cfg_t tpg_port_attr; 131 132 pixelgen_prbs_cfg_t prbs_port_attr; 133 134 struct { 135 s32 align_req_in_bytes; 136 s32 bits_per_pixel; 137 s32 pixels_per_line; 138 s32 lines_per_frame; 139 } input_port_resolution; 140 141 struct { 142 s32 left_padding; 143 s32 max_isp_input_width; 144 } output_port_attr; 145 146 struct { 147 bool enable; 148 s32 fmt_type; 149 s32 align_req_in_bytes; 150 s32 bits_per_pixel; 151 s32 pixels_per_line; 152 s32 lines_per_frame; 153 } metadata; 154 }; 155 156 typedef struct virtual_input_system_stream_s virtual_input_system_stream_t; 157 struct virtual_input_system_stream_s { 158 u32 id; /*Used when multiple MIPI data types and/or virtual channels are used. 159 Must be unique within one CSI RX 160 and lower than SH_CSS_MAX_ISYS_CHANNEL_NODES */ 161 u8 enable_metadata; 162 input_system_input_port_t input_port; 163 input_system_channel_t channel; 164 input_system_channel_t md_channel; /* metadata channel */ 165 u8 online; 166 s8 linked_isys_stream_id; 167 u8 valid; 168 169 /* ISP2401 */ 170 input_system_polling_mode_t polling_mode; 171 s32 subscr_index; 172 }; 173 174 typedef struct virtual_input_system_stream_cfg_s 175 virtual_input_system_stream_cfg_t; 176 struct virtual_input_system_stream_cfg_s { 177 u8 enable_metadata; 178 input_system_input_port_cfg_t input_port_cfg; 179 input_system_channel_cfg_t channel_cfg; 180 input_system_channel_cfg_t md_channel_cfg; 181 u8 valid; 182 }; 183 184 #define ISP_INPUT_BUF_START_ADDR 0 185 #define NUM_OF_INPUT_BUF 2 186 #define NUM_OF_LINES_PER_BUF 2 187 #define LINES_OF_ISP_INPUT_BUF (NUM_OF_INPUT_BUF * NUM_OF_LINES_PER_BUF) 188 #define ISP_INPUT_BUF_STRIDE SH_CSS_MAX_SENSOR_WIDTH 189