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 #ifndef __IA_CSS_IRQ_H 17 #define __IA_CSS_IRQ_H 18 19 /* @file 20 * This file contains information for Interrupts/IRQs from CSS 21 */ 22 23 #include "ia_css_err.h" 24 #include "ia_css_pipe_public.h" 25 #include "ia_css_input_port.h" 26 #include <linux/bits.h> 27 28 /* Interrupt types, these enumerate all supported interrupt types. 29 */ 30 enum ia_css_irq_type { 31 IA_CSS_IRQ_TYPE_EDGE, /** Edge (level) sensitive interrupt */ 32 IA_CSS_IRQ_TYPE_PULSE /** Pulse-shaped interrupt */ 33 }; 34 35 /* Interrupt request type. 36 * When the CSS hardware generates an interrupt, a function in this API 37 * needs to be called to retrieve information about the interrupt. 38 * This interrupt type is part of this information and indicates what 39 * type of information the interrupt signals. 40 * 41 * Note that one interrupt can carry multiple interrupt types. For 42 * example: the online video ISP will generate only 2 interrupts, one to 43 * signal that the statistics (3a and DIS) are ready and one to signal 44 * that all output frames are done (output and viewfinder). 45 * 46 * DEPRECATED, this interface is not portable it should only define user 47 * (SW) interrupts 48 */ 49 enum ia_css_irq_info { 50 IA_CSS_IRQ_INFO_CSS_RECEIVER_ERROR = BIT(0), 51 /** the css receiver has encountered an error */ 52 IA_CSS_IRQ_INFO_CSS_RECEIVER_FIFO_OVERFLOW = BIT(1), 53 /** the FIFO in the csi receiver has overflown */ 54 IA_CSS_IRQ_INFO_CSS_RECEIVER_SOF = BIT(2), 55 /** the css receiver received the start of frame */ 56 IA_CSS_IRQ_INFO_CSS_RECEIVER_EOF = BIT(3), 57 /** the css receiver received the end of frame */ 58 IA_CSS_IRQ_INFO_CSS_RECEIVER_SOL = BIT(4), 59 /** the css receiver received the start of line */ 60 IA_CSS_IRQ_INFO_EVENTS_READY = BIT(5), 61 /** One or more events are available in the PSYS event queue */ 62 IA_CSS_IRQ_INFO_CSS_RECEIVER_EOL = BIT(6), 63 /** the css receiver received the end of line */ 64 IA_CSS_IRQ_INFO_CSS_RECEIVER_SIDEBAND_CHANGED = BIT(7), 65 /** the css receiver received a change in side band signals */ 66 IA_CSS_IRQ_INFO_CSS_RECEIVER_GEN_SHORT_0 = BIT(8), 67 /** generic short packets (0) */ 68 IA_CSS_IRQ_INFO_CSS_RECEIVER_GEN_SHORT_1 = BIT(9), 69 /** generic short packets (1) */ 70 IA_CSS_IRQ_INFO_IF_PRIM_ERROR = BIT(10), 71 /** the primary input formatter (A) has encountered an error */ 72 IA_CSS_IRQ_INFO_IF_PRIM_B_ERROR = BIT(11), 73 /** the primary input formatter (B) has encountered an error */ 74 IA_CSS_IRQ_INFO_IF_SEC_ERROR = BIT(12), 75 /** the secondary input formatter has encountered an error */ 76 IA_CSS_IRQ_INFO_STREAM_TO_MEM_ERROR = BIT(13), 77 /** the stream-to-memory device has encountered an error */ 78 IA_CSS_IRQ_INFO_SW_0 = BIT(14), 79 /** software interrupt 0 */ 80 IA_CSS_IRQ_INFO_SW_1 = BIT(15), 81 /** software interrupt 1 */ 82 IA_CSS_IRQ_INFO_SW_2 = BIT(16), 83 /** software interrupt 2 */ 84 IA_CSS_IRQ_INFO_ISP_BINARY_STATISTICS_READY = BIT(17), 85 /** ISP binary statistics are ready */ 86 IA_CSS_IRQ_INFO_INPUT_SYSTEM_ERROR = BIT(18), 87 /** the input system is in error */ 88 IA_CSS_IRQ_INFO_IF_ERROR = BIT(19), 89 /** the input formatter is in error */ 90 IA_CSS_IRQ_INFO_DMA_ERROR = BIT(20), 91 /** the dma is in error */ 92 IA_CSS_IRQ_INFO_ISYS_EVENTS_READY = BIT(21), 93 /** end-of-frame events are ready in the isys_event queue */ 94 }; 95 96 /* CSS receiver error types. Whenever the CSS receiver has encountered 97 * an error, this enumeration is used to indicate which errors have occurred. 98 * 99 * Note that multiple error flags can be enabled at once and that this is in 100 * fact common (whenever an error occurs, it usually results in multiple 101 * errors). 102 * 103 * DEPRECATED: This interface is not portable, different systems have 104 * different receiver types, or possibly none in case of tests systems. 105 */ 106 enum ia_css_rx_irq_info { 107 IA_CSS_RX_IRQ_INFO_BUFFER_OVERRUN = BIT(0), /** buffer overrun */ 108 IA_CSS_RX_IRQ_INFO_ENTER_SLEEP_MODE = BIT(1), /** entering sleep mode */ 109 IA_CSS_RX_IRQ_INFO_EXIT_SLEEP_MODE = BIT(2), /** exited sleep mode */ 110 IA_CSS_RX_IRQ_INFO_ECC_CORRECTED = BIT(3), /** ECC corrected */ 111 IA_CSS_RX_IRQ_INFO_ERR_SOT = BIT(4), 112 /** Start of transmission */ 113 IA_CSS_RX_IRQ_INFO_ERR_SOT_SYNC = BIT(5), /** SOT sync (??) */ 114 IA_CSS_RX_IRQ_INFO_ERR_CONTROL = BIT(6), /** Control (??) */ 115 IA_CSS_RX_IRQ_INFO_ERR_ECC_DOUBLE = BIT(7), /** Double ECC */ 116 IA_CSS_RX_IRQ_INFO_ERR_CRC = BIT(8), /** CRC error */ 117 IA_CSS_RX_IRQ_INFO_ERR_UNKNOWN_ID = BIT(9), /** Unknown ID */ 118 IA_CSS_RX_IRQ_INFO_ERR_FRAME_SYNC = BIT(10), /** Frame sync error */ 119 IA_CSS_RX_IRQ_INFO_ERR_FRAME_DATA = BIT(11), /** Frame data error */ 120 IA_CSS_RX_IRQ_INFO_ERR_DATA_TIMEOUT = BIT(12), /** Timeout occurred */ 121 IA_CSS_RX_IRQ_INFO_ERR_UNKNOWN_ESC = BIT(13), /** Unknown escape seq. */ 122 IA_CSS_RX_IRQ_INFO_ERR_LINE_SYNC = BIT(14), /** Line Sync error */ 123 IA_CSS_RX_IRQ_INFO_INIT_TIMEOUT = BIT(15), 124 }; 125 126 /* Interrupt info structure. This structure contains information about an 127 * interrupt. This needs to be used after an interrupt is received on the IA 128 * to perform the correct action. 129 */ 130 struct ia_css_irq { 131 enum ia_css_irq_info type; /** Interrupt type. */ 132 unsigned int sw_irq_0_val; /** In case of SW interrupt 0, value. */ 133 unsigned int sw_irq_1_val; /** In case of SW interrupt 1, value. */ 134 unsigned int sw_irq_2_val; /** In case of SW interrupt 2, value. */ 135 struct ia_css_pipe *pipe; 136 /** The image pipe that generated the interrupt. */ 137 }; 138 139 /* @brief Obtain interrupt information. 140 * 141 * @param[out] info Pointer to the interrupt info. The interrupt 142 * information wil be written to this info. 143 * @return If an error is encountered during the interrupt info 144 * and no interrupt could be translated successfully, this 145 * will return IA_CSS_INTERNAL_ERROR. Otherwise 146 * 0. 147 * 148 * This function is expected to be executed after an interrupt has been sent 149 * to the IA from the CSS. This function returns information about the interrupt 150 * which is needed by the IA code to properly handle the interrupt. This 151 * information includes the image pipe, buffer type etc. 152 */ 153 int 154 ia_css_irq_translate(unsigned int *info); 155 156 /* @brief Get CSI receiver error info. 157 * 158 * @param[out] irq_bits Pointer to the interrupt bits. The interrupt 159 * bits will be written this info. 160 * This will be the error bits that are enabled in the CSI 161 * receiver error register. 162 * @return None 163 * 164 * This function should be used whenever a CSI receiver error interrupt is 165 * generated. It provides the detailed information (bits) on the exact error 166 * that occurred. 167 * 168 *@deprecated {this function is DEPRECATED since it only works on CSI port 1. 169 * Use the function below instead and specify the appropriate port.} 170 */ 171 void 172 ia_css_rx_get_irq_info(unsigned int *irq_bits); 173 174 /* @brief Get CSI receiver error info. 175 * 176 * @param[in] port Input port identifier. 177 * @param[out] irq_bits Pointer to the interrupt bits. The interrupt 178 * bits will be written this info. 179 * This will be the error bits that are enabled in the CSI 180 * receiver error register. 181 * @return None 182 * 183 * This function should be used whenever a CSI receiver error interrupt is 184 * generated. It provides the detailed information (bits) on the exact error 185 * that occurred. 186 */ 187 void 188 ia_css_rx_port_get_irq_info(enum mipi_port_id port, unsigned int *irq_bits); 189 190 /* @brief Clear CSI receiver error info. 191 * 192 * @param[in] irq_bits The bits that should be cleared from the CSI receiver 193 * interrupt bits register. 194 * @return None 195 * 196 * This function should be called after ia_css_rx_get_irq_info has been called 197 * and the error bits have been interpreted. It is advised to use the return 198 * value of that function as the argument to this function to make sure no new 199 * error bits get overwritten. 200 * 201 * @deprecated{this function is DEPRECATED since it only works on CSI port 1. 202 * Use the function below instead and specify the appropriate port.} 203 */ 204 void 205 ia_css_rx_clear_irq_info(unsigned int irq_bits); 206 207 /* @brief Clear CSI receiver error info. 208 * 209 * @param[in] port Input port identifier. 210 * @param[in] irq_bits The bits that should be cleared from the CSI receiver 211 * interrupt bits register. 212 * @return None 213 * 214 * This function should be called after ia_css_rx_get_irq_info has been called 215 * and the error bits have been interpreted. It is advised to use the return 216 * value of that function as the argument to this function to make sure no new 217 * error bits get overwritten. 218 */ 219 void 220 ia_css_rx_port_clear_irq_info(enum mipi_port_id port, unsigned int irq_bits); 221 222 /* @brief Enable or disable specific interrupts. 223 * 224 * @param[in] type The interrupt type that will be enabled/disabled. 225 * @param[in] enable enable or disable. 226 * @return Returns IA_CSS_INTERNAL_ERROR if this interrupt 227 * type cannot be enabled/disabled which is true for 228 * CSS internal interrupts. Otherwise returns 229 * 0. 230 */ 231 int 232 ia_css_irq_enable(enum ia_css_irq_info type, bool enable); 233 234 #endif /* __IA_CSS_IRQ_H */ 235