blob: a2a1873aca83e09cddb7257b681cd198738d63db [file] [log] [blame]
/*
* 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_ACC_TYPES_H
#define _IA_CSS_ACC_TYPES_H
/** @file
* This file contains types used for acceleration
*/
#include <system_types.h> /* HAS_IRQ_MAP_VERSION_# */
#include <type_support.h>
#include <platform_support.h>
#include <debug_global.h>
#include "ia_css_types.h"
#include "ia_css_frame_format.h"
/* Should be included without the path.
However, that requires adding the path to numerous makefiles
that have nothing to do with isp parameters.
*/
#include "runtime/isp_param/interface/ia_css_isp_param_types.h"
/* Types for the acceleration API.
* These should be moved to sh_css_internal.h once the old acceleration
* argument handling has been completed.
* After that, interpretation of these structures is no longer needed
* in the kernel and HAL.
*/
/** Type of acceleration.
*/
enum ia_css_acc_type {
IA_CSS_ACC_NONE, /**< Normal binary */
IA_CSS_ACC_OUTPUT, /**< Accelerator stage on output frame */
IA_CSS_ACC_VIEWFINDER, /**< Accelerator stage on viewfinder frame */
IA_CSS_ACC_STANDALONE, /**< Stand-alone acceleration */
};
/** Cells types
*/
enum ia_css_cell_type {
IA_CSS_SP0 = 0,
IA_CSS_SP1,
IA_CSS_ISP,
MAX_NUM_OF_CELLS
};
/** Firmware types.
*/
enum ia_css_fw_type {
ia_css_sp_firmware, /**< Firmware for the SP */
ia_css_isp_firmware, /**< Firmware for the ISP */
ia_css_bootloader_firmware, /**< Firmware for the BootLoader */
ia_css_acc_firmware /**< Firmware for accelrations */
};
struct ia_css_blob_descr;
/** Blob descriptor.
* This structure describes an SP or ISP blob.
* It describes the test, data and bss sections as well as position in a
* firmware file.
* For convenience, it contains dynamic data after loading.
*/
struct ia_css_blob_info {
/**< Static blob data */
uint32_t offset; /**< Blob offset in fw file */
struct ia_css_isp_param_memory_offsets memory_offsets; /**< offset wrt hdr in bytes */
uint32_t prog_name_offset; /**< offset wrt hdr in bytes */
uint32_t size; /**< Size of blob */
uint32_t padding_size; /**< total cummulative of bytes added due to section alignment */
uint32_t icache_source; /**< Position of icache in blob */
uint32_t icache_size; /**< Size of icache section */
uint32_t icache_padding;/**< bytes added due to icache section alignment */
uint32_t text_source; /**< Position of text in blob */
uint32_t text_size; /**< Size of text section */
uint32_t text_padding; /**< bytes added due to text section alignment */
uint32_t data_source; /**< Position of data in blob */
uint32_t data_target; /**< Start of data in SP dmem */
uint32_t data_size; /**< Size of text section */
uint32_t data_padding; /**< bytes added due to data section alignment */
uint32_t bss_target; /**< Start position of bss in SP dmem */
uint32_t bss_size; /**< Size of bss section */
/**< Dynamic data filled by loader */
CSS_ALIGN(const void *code, 8); /**< Code section absolute pointer within fw, code = icache + text */
CSS_ALIGN(const void *data, 8); /**< Data section absolute pointer within fw, data = data + bss */
};
struct ia_css_binary_input_info {
uint32_t min_width;
uint32_t min_height;
uint32_t max_width;
uint32_t max_height;
uint32_t source; /* memory, sensor, variable */
};
struct ia_css_binary_output_info {
uint32_t min_width;
uint32_t min_height;
uint32_t max_width;
uint32_t max_height;
uint32_t num_chunks;
uint32_t variable_format;
};
struct ia_css_binary_internal_info {
uint32_t max_width;
uint32_t max_height;
};
struct ia_css_binary_bds_info {
uint32_t supported_bds_factors;
};
struct ia_css_binary_dvs_info {
uint32_t max_envelope_width;
uint32_t max_envelope_height;
};
struct ia_css_binary_vf_dec_info {
uint32_t is_variable;
uint32_t max_log_downscale;
};
struct ia_css_binary_s3a_info {
uint32_t s3atbl_use_dmem;
uint32_t fixed_s3a_deci_log;
};
/** DPC related binary info */
struct ia_css_binary_dpc_info {
uint32_t bnr_lite; /**< bnr lite enable flag */
};
struct ia_css_binary_iterator_info {
uint32_t num_stripes;
uint32_t row_stripes_height;
uint32_t row_stripes_overlap_lines;
};
struct ia_css_binary_address_info {
uint32_t isp_addresses; /* Address in ISP dmem */
uint32_t main_entry; /* Address of entry fct */
uint32_t in_frame; /* Address in ISP dmem */
uint32_t out_frame; /* Address in ISP dmem */
uint32_t in_data; /* Address in ISP dmem */
uint32_t out_data; /* Address in ISP dmem */
uint32_t sh_dma_cmd_ptr; /* In ISP dmem */
};
struct ia_css_binary_uds_info {
uint16_t bpp;
uint16_t use_bci;
uint16_t use_str;
uint16_t woix;
uint16_t woiy;
uint16_t extra_out_vecs;
uint16_t vectors_per_line_in;
uint16_t vectors_per_line_out;
uint16_t vectors_c_per_line_in;
uint16_t vectors_c_per_line_out;
uint16_t vmem_gdc_in_block_height_y;
uint16_t vmem_gdc_in_block_height_c;
/* uint16_t padding; */
};
struct ia_css_binary_pipeline_info {
uint32_t mode;
uint32_t isp_pipe_version;
uint32_t pipelining;
uint32_t c_subsampling;
uint32_t top_cropping;
uint32_t left_cropping;
uint32_t variable_resolution;
};
struct ia_css_binary_block_info {
uint32_t block_width;
uint32_t block_height;
uint32_t output_block_height;
};
/** Structure describing an ISP binary.
* It describes the capabilities of a binary, like the maximum resolution,
* support features, dma channels, uds features, etc.
* This part is to be used by the SP.
* Future refactoring should move binary properties to ia_css_binary_xinfo,
* thereby making the SP code more binary independent.
*/
struct ia_css_binary_info {
CSS_ALIGN(uint32_t id, 8); /* IA_CSS_BINARY_ID_* */
struct ia_css_binary_pipeline_info pipeline;
struct ia_css_binary_input_info input;
struct ia_css_binary_output_info output;
struct ia_css_binary_internal_info internal;
struct ia_css_binary_bds_info bds;
struct ia_css_binary_dvs_info dvs;
struct ia_css_binary_vf_dec_info vf_dec;
struct ia_css_binary_s3a_info s3a;
struct ia_css_binary_dpc_info dpc_bnr; /**< DPC related binary info */
struct ia_css_binary_iterator_info iterator;
struct ia_css_binary_address_info addresses;
struct ia_css_binary_uds_info uds;
struct ia_css_binary_block_info block;
struct ia_css_isp_param_isp_segments mem_initializers;
/* MW: Packing (related) bools in an integer ?? */
struct {
#ifdef ISP2401
uint8_t luma_only;
uint8_t input_yuv;
uint8_t input_raw;
#endif
uint8_t reduced_pipe;
uint8_t vf_veceven;
uint8_t dis;
uint8_t dvs_envelope;
uint8_t uds;
uint8_t dvs_6axis;
uint8_t block_output;
uint8_t streaming_dma;
uint8_t ds;
uint8_t bayer_fir_6db;
uint8_t raw_binning;
uint8_t continuous;
uint8_t s3a;
uint8_t fpnr;
uint8_t sc;
uint8_t macc;
uint8_t output;
uint8_t ref_frame;
uint8_t tnr;
uint8_t xnr;
uint8_t params;
uint8_t ca_gdc;
uint8_t isp_addresses;
uint8_t in_frame;
uint8_t out_frame;
uint8_t high_speed;
uint8_t dpc;
uint8_t padding[2];
} enable;
struct {
/* DMA channel ID: [0,...,HIVE_ISP_NUM_DMA_CHANNELS> */
uint8_t ref_y_channel;
uint8_t ref_c_channel;
uint8_t tnr_channel;
uint8_t tnr_out_channel;
uint8_t dvs_coords_channel;
uint8_t output_channel;
uint8_t c_channel;
uint8_t vfout_channel;
uint8_t vfout_c_channel;
uint8_t vfdec_bits_per_pixel;
uint8_t claimed_by_isp;
uint8_t padding[2];
} dma;
};
/** Structure describing an ISP binary.
* It describes the capabilities of a binary, like the maximum resolution,
* support features, dma channels, uds features, etc.
*/
struct ia_css_binary_xinfo {
/* Part that is of interest to the SP. */
struct ia_css_binary_info sp;
/* Rest of the binary info, only interesting to the host. */
enum ia_css_acc_type type;
CSS_ALIGN(int32_t num_output_formats, 8);
enum ia_css_frame_format output_formats[IA_CSS_FRAME_FORMAT_NUM];
CSS_ALIGN(int32_t num_vf_formats, 8); /**< number of supported vf formats */
enum ia_css_frame_format vf_formats[IA_CSS_FRAME_FORMAT_NUM]; /**< types of supported vf formats */
uint8_t num_output_pins;
ia_css_ptr xmem_addr;
CSS_ALIGN(const struct ia_css_blob_descr *blob, 8);
CSS_ALIGN(uint32_t blob_index, 8);
CSS_ALIGN(union ia_css_all_memory_offsets mem_offsets, 8);
CSS_ALIGN(struct ia_css_binary_xinfo *next, 8);
};
/** Structure describing the Bootloader (an ISP binary).
* It contains several address, either in ddr, isp_dmem or
* the entry function in icache.
*/
struct ia_css_bl_info {
uint32_t num_dma_cmds; /**< Number of cmds sent by CSS */
uint32_t dma_cmd_list; /**< Dma command list sent by CSS */
uint32_t sw_state; /**< Polled from css */
/* Entry functions */
uint32_t bl_entry; /**< The SP entry function */
};
/** Structure describing the SP binary.
* It contains several address, either in ddr, sp_dmem or
* the entry function in pmem.
*/
struct ia_css_sp_info {
uint32_t init_dmem_data; /**< data sect config, stored to dmem */
uint32_t per_frame_data; /**< Per frame data, stored to dmem */
uint32_t group; /**< Per pipeline data, loaded by dma */
uint32_t output; /**< SP output data, loaded by dmem */
uint32_t host_sp_queue; /**< Host <-> SP queues */
uint32_t host_sp_com;/**< Host <-> SP commands */
uint32_t isp_started; /**< Polled from sensor thread, csim only */
uint32_t sw_state; /**< Polled from css */
uint32_t host_sp_queues_initialized; /**< Polled from the SP */
uint32_t sleep_mode; /**< different mode to halt SP */
uint32_t invalidate_tlb; /**< inform SP to invalidate mmu TLB */
#ifndef ISP2401
uint32_t stop_copy_preview; /**< suspend copy and preview pipe when capture */
#endif
uint32_t debug_buffer_ddr_address; /**< inform SP the address
of DDR debug queue */
uint32_t perf_counter_input_system_error; /**< input system perf
counter array */
#ifdef HAS_WATCHDOG_SP_THREAD_DEBUG
uint32_t debug_wait; /**< thread/pipe post mortem debug */
uint32_t debug_stage; /**< thread/pipe post mortem debug */
uint32_t debug_stripe; /**< thread/pipe post mortem debug */
#endif
uint32_t threads_stack; /**< sp thread's stack pointers */
uint32_t threads_stack_size; /**< sp thread's stack sizes */
uint32_t curr_binary_id; /**< current binary id */
uint32_t raw_copy_line_count; /**< raw copy line counter */
uint32_t ddr_parameter_address; /**< acc param ddrptr, sp dmem */
uint32_t ddr_parameter_size; /**< acc param size, sp dmem */
/* Entry functions */
uint32_t sp_entry; /**< The SP entry function */
uint32_t tagger_frames_addr; /**< Base address of tagger state */
};
/* The following #if is there because this header file is also included
by SP and ISP code but they do not need this data and HIVECC has alignment
issue with the firmware struct/union's.
More permanent solution will be to refactor this include.
*/
#if !defined(__ISP)
/** Accelerator firmware information.
*/
struct ia_css_acc_info {
uint32_t per_frame_data; /**< Dummy for now */
};
/** Firmware information.
*/
union ia_css_fw_union {
struct ia_css_binary_xinfo isp; /**< ISP info */
struct ia_css_sp_info sp; /**< SP info */
struct ia_css_bl_info bl; /**< Bootloader info */
struct ia_css_acc_info acc; /**< Accelerator info */
};
/** Firmware information.
*/
struct ia_css_fw_info {
size_t header_size; /**< size of fw header */
CSS_ALIGN(uint32_t type, 8);
union ia_css_fw_union info; /**< Binary info */
struct ia_css_blob_info blob; /**< Blob info */
/* Dynamic part */
struct ia_css_fw_info *next;
CSS_ALIGN(uint32_t loaded, 8); /**< Firmware has been loaded */
CSS_ALIGN(const uint8_t *isp_code, 8); /**< ISP pointer to code */
/**< Firmware handle between user space and kernel */
CSS_ALIGN(uint32_t handle, 8);
/**< Sections to copy from/to ISP */
struct ia_css_isp_param_css_segments mem_initializers;
/**< Initializer for local ISP memories */
};
struct ia_css_blob_descr {
const unsigned char *blob;
struct ia_css_fw_info header;
const char *name;
union ia_css_all_memory_offsets mem_offsets;
};
struct ia_css_acc_fw;
/** Structure describing the SP binary of a stand-alone accelerator.
*/
struct ia_css_acc_sp {
void (*init)(struct ia_css_acc_fw *); /**< init for crun */
uint32_t sp_prog_name_offset; /**< program name offset wrt hdr in bytes */
uint32_t sp_blob_offset; /**< blob offset wrt hdr in bytes */
void *entry; /**< Address of sp entry point */
uint32_t *css_abort; /**< SP dmem abort flag */
void *isp_code; /**< SP dmem address holding xmem
address of isp code */
struct ia_css_fw_info fw; /**< SP fw descriptor */
const uint8_t *code; /**< ISP pointer of allocated SP code */
};
/** Acceleration firmware descriptor.
* This descriptor descibes either SP code (stand-alone), or
* ISP code (a separate pipeline stage).
*/
struct ia_css_acc_fw_hdr {
enum ia_css_acc_type type; /**< Type of accelerator */
uint32_t isp_prog_name_offset; /**< program name offset wrt
header in bytes */
uint32_t isp_blob_offset; /**< blob offset wrt header
in bytes */
uint32_t isp_size; /**< Size of isp blob */
const uint8_t *isp_code; /**< ISP pointer to code */
struct ia_css_acc_sp sp; /**< Standalone sp code */
/**< Firmware handle between user space and kernel */
uint32_t handle;
struct ia_css_data parameters; /**< Current SP parameters */
};
/** Firmware structure.
* This contains the header and actual blobs.
* For standalone, it contains SP and ISP blob.
* For a pipeline stage accelerator, it contains ISP code only.
* Since its members are variable size, their offsets are described in the
* header and computed using the access macros below.
*/
struct ia_css_acc_fw {
struct ia_css_acc_fw_hdr header; /**< firmware header */
/*
int8_t isp_progname[]; **< ISP program name
int8_t sp_progname[]; **< SP program name, stand-alone only
uint8_t sp_code[]; **< SP blob, stand-alone only
uint8_t isp_code[]; **< ISP blob
*/
};
/* Access macros for firmware */
#define IA_CSS_ACC_OFFSET(t, f, n) ((t)((uint8_t *)(f)+(f->header.n)))
#define IA_CSS_ACC_SP_PROG_NAME(f) IA_CSS_ACC_OFFSET(const char *, f, \
sp.sp_prog_name_offset)
#define IA_CSS_ACC_ISP_PROG_NAME(f) IA_CSS_ACC_OFFSET(const char *, f, \
isp_prog_name_offset)
#define IA_CSS_ACC_SP_CODE(f) IA_CSS_ACC_OFFSET(uint8_t *, f, \
sp.sp_blob_offset)
#define IA_CSS_ACC_SP_DATA(f) (IA_CSS_ACC_SP_CODE(f) + \
(f)->header.sp.fw.blob.data_source)
#define IA_CSS_ACC_ISP_CODE(f) IA_CSS_ACC_OFFSET(uint8_t*, f,\
isp_blob_offset)
#define IA_CSS_ACC_ISP_SIZE(f) ((f)->header.isp_size)
/* Binary name follows header immediately */
#define IA_CSS_EXT_ISP_PROG_NAME(f) ((const char *)(f)+(f)->blob.prog_name_offset)
#define IA_CSS_EXT_ISP_MEM_OFFSETS(f) \
((const struct ia_css_memory_offsets *)((const char *)(f)+(f)->blob.mem_offsets))
#endif /* !defined(__ISP) */
enum ia_css_sp_sleep_mode {
SP_DISABLE_SLEEP_MODE = 0,
SP_SLEEP_AFTER_FRAME = 1 << 0,
SP_SLEEP_AFTER_IRQ = 1 << 1
};
#endif /* _IA_CSS_ACC_TYPES_H */