aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/media/atomisp/pci/atomisp2/css2400/runtime/inputfifo/src/inputfifo.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/media/atomisp/pci/atomisp2/css2400/runtime/inputfifo/src/inputfifo.c')
-rw-r--r--drivers/staging/media/atomisp/pci/atomisp2/css2400/runtime/inputfifo/src/inputfifo.c613
1 files changed, 0 insertions, 613 deletions
diff --git a/drivers/staging/media/atomisp/pci/atomisp2/css2400/runtime/inputfifo/src/inputfifo.c b/drivers/staging/media/atomisp/pci/atomisp2/css2400/runtime/inputfifo/src/inputfifo.c
deleted file mode 100644
index 24ca4aaf8df1..000000000000
--- a/drivers/staging/media/atomisp/pci/atomisp2/css2400/runtime/inputfifo/src/inputfifo.c
+++ /dev/null
@@ -1,613 +0,0 @@
-#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
-
-#include "platform_support.h"
-
-#include "ia_css_inputfifo.h"
-
-#include "device_access.h"
-
-#define __INLINE_SP__
-#include "sp.h"
-#define __INLINE_ISP__
-#include "isp.h"
-#define __INLINE_IRQ__
-#include "irq.h"
-#define __INLINE_FIFO_MONITOR__
-#include "fifo_monitor.h"
-
-#define __INLINE_EVENT__
-#include "event_fifo.h"
-#define __INLINE_SP__
-
-#if !defined(HAS_NO_INPUT_SYSTEM)
-#include "input_system.h" /* MIPI_PREDICTOR_NONE,... */
-#endif
-
-#include "assert_support.h"
-
-/* System independent */
-#include "sh_css_internal.h"
-#if !defined(HAS_NO_INPUT_SYSTEM)
-#include "ia_css_isys.h"
-#endif
-
-#define HBLANK_CYCLES (187)
-#define MARKER_CYCLES (6)
-
-#if !defined(HAS_NO_INPUT_SYSTEM)
-#include <hive_isp_css_streaming_to_mipi_types_hrt.h>
-#endif
-
-/* The data type is used to send special cases:
- * yuv420: odd lines (1, 3 etc) are twice as wide as even
- * lines (0, 2, 4 etc).
- * rgb: for two pixels per clock, the R and B values are sent
- * to output_0 while only G is sent to output_1. This means
- * that output_1 only gets half the number of values of output_0.
- * WARNING: This type should also be used for Legacy YUV420.
- * regular: used for all other data types (RAW, YUV422, etc)
- */
-enum inputfifo_mipi_data_type {
- inputfifo_mipi_data_type_regular,
- inputfifo_mipi_data_type_yuv420,
- inputfifo_mipi_data_type_yuv420_legacy,
- inputfifo_mipi_data_type_rgb,
-};
-#if !defined(HAS_NO_INPUT_SYSTEM)
-static unsigned int inputfifo_curr_ch_id, inputfifo_curr_fmt_type;
-#endif
-struct inputfifo_instance {
- unsigned int ch_id;
- enum atomisp_input_format input_format;
- bool two_ppc;
- bool streaming;
- unsigned int hblank_cycles;
- unsigned int marker_cycles;
- unsigned int fmt_type;
- enum inputfifo_mipi_data_type type;
-};
-#if !defined(HAS_NO_INPUT_SYSTEM)
-/*
- * Maintain a basic streaming to Mipi administration with ch_id as index
- * ch_id maps on the "Mipi virtual channel ID" and can have value 0..3
- */
-#define INPUTFIFO_NR_OF_S2M_CHANNELS (4)
-static struct inputfifo_instance
- inputfifo_inst_admin[INPUTFIFO_NR_OF_S2M_CHANNELS];
-
-/* Streaming to MIPI */
-static unsigned inputfifo_wrap_marker(
-/* static inline unsigned inputfifo_wrap_marker( */
- unsigned marker)
-{
- return marker |
- (inputfifo_curr_ch_id << HIVE_STR_TO_MIPI_CH_ID_LSB) |
- (inputfifo_curr_fmt_type << _HIVE_STR_TO_MIPI_FMT_TYPE_LSB);
-}
-
-static inline void
-_sh_css_fifo_snd(unsigned token)
-{
- while (!can_event_send_token(STR2MIPI_EVENT_ID))
- hrt_sleep();
- event_send_token(STR2MIPI_EVENT_ID, token);
- return;
-}
-
-static void inputfifo_send_data_a(
-/* static inline void inputfifo_send_data_a( */
-unsigned int data)
-{
- unsigned int token = (1 << HIVE_STR_TO_MIPI_VALID_A_BIT) |
- (data << HIVE_STR_TO_MIPI_DATA_A_LSB);
- _sh_css_fifo_snd(token);
- return;
-}
-
-
-
-static void inputfifo_send_data_b(
-/* static inline void inputfifo_send_data_b( */
- unsigned int data)
-{
- unsigned int token = (1 << HIVE_STR_TO_MIPI_VALID_B_BIT) |
- (data << _HIVE_STR_TO_MIPI_DATA_B_LSB);
- _sh_css_fifo_snd(token);
- return;
-}
-
-
-
-static void inputfifo_send_data(
-/* static inline void inputfifo_send_data( */
- unsigned int a,
- unsigned int b)
-{
- unsigned int token = ((1 << HIVE_STR_TO_MIPI_VALID_A_BIT) |
- (1 << HIVE_STR_TO_MIPI_VALID_B_BIT) |
- (a << HIVE_STR_TO_MIPI_DATA_A_LSB) |
- (b << _HIVE_STR_TO_MIPI_DATA_B_LSB));
- _sh_css_fifo_snd(token);
- return;
-}
-
-
-
-static void inputfifo_send_sol(void)
-/* static inline void inputfifo_send_sol(void) */
-{
- hrt_data token = inputfifo_wrap_marker(
- 1 << HIVE_STR_TO_MIPI_SOL_BIT);
-
- _sh_css_fifo_snd(token);
- return;
-}
-
-
-
-static void inputfifo_send_eol(void)
-/* static inline void inputfifo_send_eol(void) */
-{
- hrt_data token = inputfifo_wrap_marker(
- 1 << HIVE_STR_TO_MIPI_EOL_BIT);
- _sh_css_fifo_snd(token);
- return;
-}
-
-
-
-static void inputfifo_send_sof(void)
-/* static inline void inputfifo_send_sof(void) */
-{
- hrt_data token = inputfifo_wrap_marker(
- 1 << HIVE_STR_TO_MIPI_SOF_BIT);
-
- _sh_css_fifo_snd(token);
- return;
-}
-
-
-
-static void inputfifo_send_eof(void)
-/* static inline void inputfifo_send_eof(void) */
-{
- hrt_data token = inputfifo_wrap_marker(
- 1 << HIVE_STR_TO_MIPI_EOF_BIT);
- _sh_css_fifo_snd(token);
- return;
-}
-
-
-
-#ifdef __ON__
-static void inputfifo_send_ch_id(
-/* static inline void inputfifo_send_ch_id( */
- unsigned int ch_id)
-{
- hrt_data token;
- inputfifo_curr_ch_id = ch_id & _HIVE_ISP_CH_ID_MASK;
- /* we send an zero marker, this will wrap the ch_id and
- * fmt_type automatically.
- */
- token = inputfifo_wrap_marker(0);
- _sh_css_fifo_snd(token);
- return;
-}
-
-static void inputfifo_send_fmt_type(
-/* static inline void inputfifo_send_fmt_type( */
- unsigned int fmt_type)
-{
- hrt_data token;
- inputfifo_curr_fmt_type = fmt_type & _HIVE_ISP_FMT_TYPE_MASK;
- /* we send an zero marker, this will wrap the ch_id and
- * fmt_type automatically.
- */
- token = inputfifo_wrap_marker(0);
- _sh_css_fifo_snd(token);
- return;
-}
-#endif /* __ON__ */
-
-
-
-static void inputfifo_send_ch_id_and_fmt_type(
-/* static inline
-void inputfifo_send_ch_id_and_fmt_type( */
- unsigned int ch_id,
- unsigned int fmt_type)
-{
- hrt_data token;
- inputfifo_curr_ch_id = ch_id & _HIVE_ISP_CH_ID_MASK;
- inputfifo_curr_fmt_type = fmt_type & _HIVE_ISP_FMT_TYPE_MASK;
- /* we send an zero marker, this will wrap the ch_id and
- * fmt_type automatically.
- */
- token = inputfifo_wrap_marker(0);
- _sh_css_fifo_snd(token);
- return;
-}
-
-
-
-static void inputfifo_send_empty_token(void)
-/* static inline void inputfifo_send_empty_token(void) */
-{
- hrt_data token = inputfifo_wrap_marker(0);
- _sh_css_fifo_snd(token);
- return;
-}
-
-
-
-static void inputfifo_start_frame(
-/* static inline void inputfifo_start_frame( */
- unsigned int ch_id,
- unsigned int fmt_type)
-{
- inputfifo_send_ch_id_and_fmt_type(ch_id, fmt_type);
- inputfifo_send_sof();
- return;
-}
-
-
-
-static void inputfifo_end_frame(
- unsigned int marker_cycles)
-{
- unsigned int i;
- for (i = 0; i < marker_cycles; i++)
- inputfifo_send_empty_token();
- inputfifo_send_eof();
- return;
-}
-
-
-
-static void inputfifo_send_line2(
- const unsigned short *data,
- unsigned int width,
- const unsigned short *data2,
- unsigned int width2,
- unsigned int hblank_cycles,
- unsigned int marker_cycles,
- unsigned int two_ppc,
- enum inputfifo_mipi_data_type type)
-{
- unsigned int i, is_rgb = 0, is_legacy = 0;
-
- assert(data != NULL);
- assert((data2 != NULL) || (width2 == 0));
- if (type == inputfifo_mipi_data_type_rgb)
- is_rgb = 1;
-
- if (type == inputfifo_mipi_data_type_yuv420_legacy)
- is_legacy = 1;
-
- for (i = 0; i < hblank_cycles; i++)
- inputfifo_send_empty_token();
- inputfifo_send_sol();
- for (i = 0; i < marker_cycles; i++)
- inputfifo_send_empty_token();
- for (i = 0; i < width; i++, data++) {
- /* for RGB in two_ppc, we only actually send 2 pixels per
- * clock in the even pixels (0, 2 etc). In the other cycles,
- * we only send 1 pixel, to data[0].
- */
- unsigned int send_two_pixels = two_ppc;
- if ((is_rgb || is_legacy) && (i % 3 == 2))
- send_two_pixels = 0;
- if (send_two_pixels) {
- if (i + 1 == width) {
- /* for jpg (binary) copy, this can occur
- * if the file contains an odd number of bytes.
- */
- inputfifo_send_data(
- data[0], 0);
- } else {
- inputfifo_send_data(
- data[0], data[1]);
- }
- /* Additional increment because we send 2 pixels */
- data++;
- i++;
- } else if (two_ppc && is_legacy) {
- inputfifo_send_data_b(data[0]);
- } else {
- inputfifo_send_data_a(data[0]);
- }
- }
-
- for (i = 0; i < width2; i++, data2++) {
- /* for RGB in two_ppc, we only actually send 2 pixels per
- * clock in the even pixels (0, 2 etc). In the other cycles,
- * we only send 1 pixel, to data2[0].
- */
- unsigned int send_two_pixels = two_ppc;
- if ((is_rgb || is_legacy) && (i % 3 == 2))
- send_two_pixels = 0;
- if (send_two_pixels) {
- if (i + 1 == width2) {
- /* for jpg (binary) copy, this can occur
- * if the file contains an odd number of bytes.
- */
- inputfifo_send_data(
- data2[0], 0);
- } else {
- inputfifo_send_data(
- data2[0], data2[1]);
- }
- /* Additional increment because we send 2 pixels */
- data2++;
- i++;
- } else if (two_ppc && is_legacy) {
- inputfifo_send_data_b(data2[0]);
- } else {
- inputfifo_send_data_a(data2[0]);
- }
- }
- for (i = 0; i < hblank_cycles; i++)
- inputfifo_send_empty_token();
- inputfifo_send_eol();
- return;
-}
-
-
-
-static void
-inputfifo_send_line(const unsigned short *data,
- unsigned int width,
- unsigned int hblank_cycles,
- unsigned int marker_cycles,
- unsigned int two_ppc,
- enum inputfifo_mipi_data_type type)
-{
- assert(data != NULL);
- inputfifo_send_line2(data, width, NULL, 0,
- hblank_cycles,
- marker_cycles,
- two_ppc,
- type);
-}
-
-
-/* Send a frame of data into the input network via the GP FIFO.
- * Parameters:
- * - data: array of 16 bit values that contains all data for the frame.
- * - width: width of a line in number of subpixels, for yuv420 it is the
- * number of Y components per line.
- * - height: height of the frame in number of lines.
- * - ch_id: channel ID.
- * - fmt_type: format type.
- * - hblank_cycles: length of horizontal blanking in cycles.
- * - marker_cycles: number of empty cycles after start-of-line and before
- * end-of-frame.
- * - two_ppc: boolean, describes whether to send one or two pixels per clock
- * cycle. In this mode, we sent pixels N and N+1 in the same cycle,
- * to IF_PRIM_A and IF_PRIM_B respectively. The caller must make
- * sure the input data has been formatted correctly for this.
- * For example, for RGB formats this means that unused values
- * must be inserted.
- * - yuv420: boolean, describes whether (non-legacy) yuv420 data is used. In
- * this mode, the odd lines (1,3,5 etc) are half as long as the
- * even lines (2,4,6 etc).
- * Note that the first line is odd (1) and the second line is even
- * (2).
- *
- * This function does not do any reordering of pixels, the caller must make
- * sure the data is in the righ format. Please refer to the CSS receiver
- * documentation for details on the data formats.
- */
-
-static void inputfifo_send_frame(
- const unsigned short *data,
- unsigned int width,
- unsigned int height,
- unsigned int ch_id,
- unsigned int fmt_type,
- unsigned int hblank_cycles,
- unsigned int marker_cycles,
- unsigned int two_ppc,
- enum inputfifo_mipi_data_type type)
-{
- unsigned int i;
-
- assert(data != NULL);
- inputfifo_start_frame(ch_id, fmt_type);
-
- for (i = 0; i < height; i++) {
- if ((type == inputfifo_mipi_data_type_yuv420) &&
- (i & 1) == 1) {
- inputfifo_send_line(data, 2 * width,
- hblank_cycles,
- marker_cycles,
- two_ppc, type);
- data += 2 * width;
- } else {
- inputfifo_send_line(data, width,
- hblank_cycles,
- marker_cycles,
- two_ppc, type);
- data += width;
- }
- }
- inputfifo_end_frame(marker_cycles);
- return;
-}
-
-
-
-static enum inputfifo_mipi_data_type inputfifo_determine_type(
- enum atomisp_input_format input_format)
-{
- enum inputfifo_mipi_data_type type;
-
- type = inputfifo_mipi_data_type_regular;
- if (input_format == ATOMISP_INPUT_FORMAT_YUV420_8_LEGACY) {
- type =
- inputfifo_mipi_data_type_yuv420_legacy;
- } else if (input_format == ATOMISP_INPUT_FORMAT_YUV420_8 ||
- input_format == ATOMISP_INPUT_FORMAT_YUV420_10 ||
- input_format == ATOMISP_INPUT_FORMAT_YUV420_16) {
- type =
- inputfifo_mipi_data_type_yuv420;
- } else if (input_format >= ATOMISP_INPUT_FORMAT_RGB_444 &&
- input_format <= ATOMISP_INPUT_FORMAT_RGB_888) {
- type =
- inputfifo_mipi_data_type_rgb;
- }
- return type;
-}
-
-
-
-static struct inputfifo_instance *inputfifo_get_inst(
- unsigned int ch_id)
-{
- return &inputfifo_inst_admin[ch_id];
-}
-
-void ia_css_inputfifo_send_input_frame(
- const unsigned short *data,
- unsigned int width,
- unsigned int height,
- unsigned int ch_id,
- enum atomisp_input_format input_format,
- bool two_ppc)
-{
- unsigned int fmt_type, hblank_cycles, marker_cycles;
- enum inputfifo_mipi_data_type type;
-
- assert(data != NULL);
- hblank_cycles = HBLANK_CYCLES;
- marker_cycles = MARKER_CYCLES;
- ia_css_isys_convert_stream_format_to_mipi_format(input_format,
- MIPI_PREDICTOR_NONE,
- &fmt_type);
-
- type = inputfifo_determine_type(input_format);
-
- inputfifo_send_frame(data, width, height,
- ch_id, fmt_type, hblank_cycles, marker_cycles,
- two_ppc, type);
-}
-
-
-
-void ia_css_inputfifo_start_frame(
- unsigned int ch_id,
- enum atomisp_input_format input_format,
- bool two_ppc)
-{
- struct inputfifo_instance *s2mi;
- s2mi = inputfifo_get_inst(ch_id);
-
- s2mi->ch_id = ch_id;
- ia_css_isys_convert_stream_format_to_mipi_format(input_format,
- MIPI_PREDICTOR_NONE,
- &s2mi->fmt_type);
- s2mi->two_ppc = two_ppc;
- s2mi->type = inputfifo_determine_type(input_format);
- s2mi->hblank_cycles = HBLANK_CYCLES;
- s2mi->marker_cycles = MARKER_CYCLES;
- s2mi->streaming = true;
-
- inputfifo_start_frame(ch_id, s2mi->fmt_type);
- return;
-}
-
-
-
-void ia_css_inputfifo_send_line(
- unsigned int ch_id,
- const unsigned short *data,
- unsigned int width,
- const unsigned short *data2,
- unsigned int width2)
-{
- struct inputfifo_instance *s2mi;
-
- assert(data != NULL);
- assert((data2 != NULL) || (width2 == 0));
- s2mi = inputfifo_get_inst(ch_id);
-
-
- /* Set global variables that indicate channel_id and format_type */
- inputfifo_curr_ch_id = (s2mi->ch_id) & _HIVE_ISP_CH_ID_MASK;
- inputfifo_curr_fmt_type = (s2mi->fmt_type) & _HIVE_ISP_FMT_TYPE_MASK;
-
- inputfifo_send_line2(data, width, data2, width2,
- s2mi->hblank_cycles,
- s2mi->marker_cycles,
- s2mi->two_ppc,
- s2mi->type);
-}
-
-
-void ia_css_inputfifo_send_embedded_line(
- unsigned int ch_id,
- enum atomisp_input_format data_type,
- const unsigned short *data,
- unsigned int width)
-{
- struct inputfifo_instance *s2mi;
- unsigned int fmt_type;
-
- assert(data != NULL);
- s2mi = inputfifo_get_inst(ch_id);
- ia_css_isys_convert_stream_format_to_mipi_format(data_type,
- MIPI_PREDICTOR_NONE, &fmt_type);
-
- /* Set format_type for metadata line. */
- inputfifo_curr_fmt_type = fmt_type & _HIVE_ISP_FMT_TYPE_MASK;
-
- inputfifo_send_line(data, width, s2mi->hblank_cycles, s2mi->marker_cycles,
- s2mi->two_ppc, inputfifo_mipi_data_type_regular);
-}
-
-
-void ia_css_inputfifo_end_frame(
- unsigned int ch_id)
-{
- struct inputfifo_instance *s2mi;
- s2mi = inputfifo_get_inst(ch_id);
-
- /* Set global variables that indicate channel_id and format_type */
- inputfifo_curr_ch_id = (s2mi->ch_id) & _HIVE_ISP_CH_ID_MASK;
- inputfifo_curr_fmt_type = (s2mi->fmt_type) & _HIVE_ISP_FMT_TYPE_MASK;
-
- /* Call existing HRT function */
- inputfifo_end_frame(s2mi->marker_cycles);
-
- s2mi->streaming = false;
- return;
-}
-#endif /* #if !defined(HAS_NO_INPUT_SYSTEM) */