| /* 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. |
| */ |
| |
| #ifndef __IA_CSS_EVENT_PUBLIC_H |
| #define __IA_CSS_EVENT_PUBLIC_H |
| |
| /* @file |
| * This file contains CSS-API events functionality |
| */ |
| |
| #include <type_support.h> /* uint8_t */ |
| #include <ia_css_err.h> /* ia_css_err */ |
| #include <ia_css_types.h> /* ia_css_pipe */ |
| #include <ia_css_timer.h> /* ia_css_timer */ |
| |
| /* The event type, distinguishes the kind of events that |
| * can are generated by the CSS system. |
| * |
| * !!!IMPORTANT!!! KEEP THE FOLLOWING IN SYNC: |
| * 1) "enum ia_css_event_type" (ia_css_event_public.h) |
| * 2) "enum sh_css_sp_event_type" (sh_css_internal.h) |
| * 3) "enum ia_css_event_type event_id_2_event_mask" (event_handler.sp.c) |
| * 4) "enum ia_css_event_type convert_event_sp_to_host_domain" (sh_css.c) |
| */ |
| enum ia_css_event_type { |
| IA_CSS_EVENT_TYPE_OUTPUT_FRAME_DONE = 1 << 0, |
| /** Output frame ready. */ |
| IA_CSS_EVENT_TYPE_SECOND_OUTPUT_FRAME_DONE = 1 << 1, |
| /** Second output frame ready. */ |
| IA_CSS_EVENT_TYPE_VF_OUTPUT_FRAME_DONE = 1 << 2, |
| /** Viewfinder Output frame ready. */ |
| IA_CSS_EVENT_TYPE_SECOND_VF_OUTPUT_FRAME_DONE = 1 << 3, |
| /** Second viewfinder Output frame ready. */ |
| IA_CSS_EVENT_TYPE_3A_STATISTICS_DONE = 1 << 4, |
| /** Indication that 3A statistics are available. */ |
| IA_CSS_EVENT_TYPE_DIS_STATISTICS_DONE = 1 << 5, |
| /** Indication that DIS statistics are available. */ |
| IA_CSS_EVENT_TYPE_PIPELINE_DONE = 1 << 6, |
| /** Pipeline Done event, sent after last pipeline stage. */ |
| IA_CSS_EVENT_TYPE_FRAME_TAGGED = 1 << 7, |
| /** Frame tagged. */ |
| IA_CSS_EVENT_TYPE_INPUT_FRAME_DONE = 1 << 8, |
| /** Input frame ready. */ |
| IA_CSS_EVENT_TYPE_METADATA_DONE = 1 << 9, |
| /** Metadata ready. */ |
| IA_CSS_EVENT_TYPE_LACE_STATISTICS_DONE = 1 << 10, |
| /** Indication that LACE statistics are available. */ |
| IA_CSS_EVENT_TYPE_ACC_STAGE_COMPLETE = 1 << 11, |
| /** Extension stage complete. */ |
| IA_CSS_EVENT_TYPE_TIMER = 1 << 12, |
| /** Timer event for measuring the SP side latencies. It contains the |
| 32-bit timer value from the SP */ |
| IA_CSS_EVENT_TYPE_PORT_EOF = 1 << 13, |
| /** End Of Frame event, sent when in buffered sensor mode. */ |
| IA_CSS_EVENT_TYPE_FW_WARNING = 1 << 14, |
| /** Performance warning encounter by FW */ |
| IA_CSS_EVENT_TYPE_FW_ASSERT = 1 << 15, |
| /** Assertion hit by FW */ |
| }; |
| |
| #define IA_CSS_EVENT_TYPE_NONE 0 |
| |
| /* IA_CSS_EVENT_TYPE_ALL is a mask for all pipe related events. |
| * The other events (such as PORT_EOF) cannot be enabled/disabled |
| * and are hence excluded from this macro. |
| */ |
| #define IA_CSS_EVENT_TYPE_ALL \ |
| (IA_CSS_EVENT_TYPE_OUTPUT_FRAME_DONE | \ |
| IA_CSS_EVENT_TYPE_SECOND_OUTPUT_FRAME_DONE | \ |
| IA_CSS_EVENT_TYPE_VF_OUTPUT_FRAME_DONE | \ |
| IA_CSS_EVENT_TYPE_SECOND_VF_OUTPUT_FRAME_DONE | \ |
| IA_CSS_EVENT_TYPE_3A_STATISTICS_DONE | \ |
| IA_CSS_EVENT_TYPE_DIS_STATISTICS_DONE | \ |
| IA_CSS_EVENT_TYPE_PIPELINE_DONE | \ |
| IA_CSS_EVENT_TYPE_FRAME_TAGGED | \ |
| IA_CSS_EVENT_TYPE_INPUT_FRAME_DONE | \ |
| IA_CSS_EVENT_TYPE_METADATA_DONE | \ |
| IA_CSS_EVENT_TYPE_LACE_STATISTICS_DONE | \ |
| IA_CSS_EVENT_TYPE_ACC_STAGE_COMPLETE) |
| |
| /* The event struct, container for the event type and its related values. |
| * Depending on the event type, either pipe or port will be filled. |
| * Pipeline related events (like buffer/frame events) will return a valid and filled pipe handle. |
| * For non pipeline related events (but i.e. stream specific, like EOF event), the port will be |
| * filled. |
| */ |
| struct ia_css_event { |
| struct ia_css_pipe *pipe; |
| /** Pipe handle on which event happened, NULL for non pipe related |
| events. */ |
| enum ia_css_event_type type; |
| /** Type of Event, always valid/filled. */ |
| u8 port; |
| /** Port number for EOF event (not valid for other events). */ |
| u8 exp_id; |
| /** Exposure id for EOF/FRAME_TAGGED/FW_WARNING event (not valid for other events) |
| The exposure ID is unique only within a logical stream and it is |
| only generated on systems that have an input system (such as 2400 |
| and 2401). |
| Most outputs produced by the CSS are tagged with an exposure ID. |
| This allows users of the CSS API to keep track of which buffer |
| was generated from which sensor output frame. This includes: |
| EOF event, output frames, 3A statistics, DVS statistics and |
| sensor metadata. |
| Exposure IDs start at IA_CSS_MIN_EXPOSURE_ID, increment by one |
| until IA_CSS_MAX_EXPOSURE_ID is reached, after that they wrap |
| around to IA_CSS_MIN_EXPOSURE_ID again. |
| Note that in case frames are dropped, this will not be reflected |
| in the exposure IDs. Therefor applications should not use this |
| to detect frame drops. */ |
| u32 fw_handle; |
| /** Firmware Handle for ACC_STAGE_COMPLETE event (not valid for other |
| events). */ |
| enum ia_css_fw_warning fw_warning; |
| /** Firmware warning code, only for WARNING events. */ |
| u8 fw_assert_module_id; |
| /** Firmware module id, only for ASSERT events, should be logged by driver. */ |
| u16 fw_assert_line_no; |
| /** Firmware line number, only for ASSERT events, should be logged by driver. */ |
| clock_value_t timer_data; |
| /** For storing the full 32-bit of the timer value. Valid only for TIMER |
| event */ |
| u8 timer_code; |
| /** For storing the code of the TIMER event. Valid only for |
| TIMER event */ |
| u8 timer_subcode; |
| /** For storing the subcode of the TIMER event. Valid only |
| for TIMER event */ |
| }; |
| |
| /* @brief Dequeue a PSYS event from the CSS system. |
| * |
| * @param[out] event Pointer to the event struct which will be filled by |
| * this function if an event is available. |
| * @return -ENODATA if no events are |
| * available or |
| * 0 otherwise. |
| * |
| * This function dequeues an event from the PSYS event queue. The queue is |
| * between the Host CPU and the CSS system. This function can be |
| * called after an interrupt has been generated that signalled that a new event |
| * was available and can be used in a polling-like situation where the NO_EVENT |
| * return value is used to determine whether an event was available or not. |
| */ |
| int |
| ia_css_dequeue_psys_event(struct ia_css_event *event); |
| |
| /* @brief Dequeue an event from the CSS system. |
| * |
| * @param[out] event Pointer to the event struct which will be filled by |
| * this function if an event is available. |
| * @return -ENODATA if no events are |
| * available or |
| * 0 otherwise. |
| * |
| * deprecated{Use ia_css_dequeue_psys_event instead}. |
| * Unless the isys event queue is explicitly enabled, this function will |
| * dequeue both isys (EOF) and psys events (all others). |
| */ |
| int |
| ia_css_dequeue_event(struct ia_css_event *event); |
| |
| /* @brief Dequeue an ISYS event from the CSS system. |
| * |
| * @param[out] event Pointer to the event struct which will be filled by |
| * this function if an event is available. |
| * @return -ENODATA if no events are |
| * available or |
| * 0 otherwise. |
| * |
| * This function dequeues an event from the ISYS event queue. The queue is |
| * between host and the CSS system. |
| * Unlike the ia_css_dequeue_event() function, this function can be called |
| * directly from an interrupt service routine (ISR) and it is safe to call |
| * this function in parallel with other CSS API functions (but only one |
| * call to this function should be in flight at any point in time). |
| * |
| * The reason for having the ISYS events separate is to prevent them from |
| * incurring additional latency due to locks being held by other CSS API |
| * functions. |
| */ |
| int |
| ia_css_dequeue_isys_event(struct ia_css_event *event); |
| |
| #endif /* __IA_CSS_EVENT_PUBLIC_H */ |