zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

pisp_fe_config.h (6941B) - Raw


      1 /* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
      2 /*
      3  * RP1 PiSP Front End Driver Configuration structures
      4  *
      5  * Copyright (C) 2021 - Raspberry Pi Ltd.
      6  *
      7  */
      8 #ifndef _PISP_FE_CONFIG_
      9 #define _PISP_FE_CONFIG_
     10 
     11 #include <linux/types.h>
     12 
     13 #include "pisp_common.h"
     14 #include "pisp_fe_statistics.h"
     15 
     16 #define PISP_FE_NUM_OUTPUTS 2
     17 
     18 enum pisp_fe_enable {
     19 	PISP_FE_ENABLE_INPUT = 0x000001,
     20 	PISP_FE_ENABLE_DECOMPRESS = 0x000002,
     21 	PISP_FE_ENABLE_DECOMPAND = 0x000004,
     22 	PISP_FE_ENABLE_BLA = 0x000008,
     23 	PISP_FE_ENABLE_DPC = 0x000010,
     24 	PISP_FE_ENABLE_STATS_CROP = 0x000020,
     25 	PISP_FE_ENABLE_DECIMATE = 0x000040,
     26 	PISP_FE_ENABLE_BLC = 0x000080,
     27 	PISP_FE_ENABLE_CDAF_STATS = 0x000100,
     28 	PISP_FE_ENABLE_AWB_STATS = 0x000200,
     29 	PISP_FE_ENABLE_RGBY = 0x000400,
     30 	PISP_FE_ENABLE_LSC = 0x000800,
     31 	PISP_FE_ENABLE_AGC_STATS = 0x001000,
     32 	PISP_FE_ENABLE_CROP0 = 0x010000,
     33 	PISP_FE_ENABLE_DOWNSCALE0 = 0x020000,
     34 	PISP_FE_ENABLE_COMPRESS0 = 0x040000,
     35 	PISP_FE_ENABLE_OUTPUT0 = 0x080000,
     36 	PISP_FE_ENABLE_CROP1 = 0x100000,
     37 	PISP_FE_ENABLE_DOWNSCALE1 = 0x200000,
     38 	PISP_FE_ENABLE_COMPRESS1 = 0x400000,
     39 	PISP_FE_ENABLE_OUTPUT1 = 0x800000
     40 };
     41 
     42 #define PISP_FE_ENABLE_CROP(i) (PISP_FE_ENABLE_CROP0 << (4 * (i)))
     43 #define PISP_FE_ENABLE_DOWNSCALE(i) (PISP_FE_ENABLE_DOWNSCALE0 << (4 * (i)))
     44 #define PISP_FE_ENABLE_COMPRESS(i) (PISP_FE_ENABLE_COMPRESS0 << (4 * (i)))
     45 #define PISP_FE_ENABLE_OUTPUT(i) (PISP_FE_ENABLE_OUTPUT0 << (4 * (i)))
     46 
     47 /*
     48  * We use the enable flags to show when blocks are "dirty", but we need some
     49  * extra ones too.
     50  */
     51 enum pisp_fe_dirty {
     52 	PISP_FE_DIRTY_GLOBAL = 0x0001,
     53 	PISP_FE_DIRTY_FLOATING = 0x0002,
     54 	PISP_FE_DIRTY_OUTPUT_AXI = 0x0004
     55 };
     56 
     57 struct pisp_fe_global_config {
     58 	__u32 enables;
     59 	__u8 bayer_order;
     60 	__u8 pad[3];
     61 } __attribute__((packed));
     62 
     63 struct pisp_fe_input_axi_config {
     64 	/* burst length minus one, in the range 0..15; OR'd with flags */
     65 	__u8 maxlen_flags;
     66 	/* { prot[2:0], cache[3:0] } fields */
     67 	__u8 cache_prot;
     68 	/* QoS (only 4 LS bits are used) */
     69 	__u16 qos;
     70 } __attribute__((packed));
     71 
     72 struct pisp_fe_output_axi_config {
     73 	/* burst length minus one, in the range 0..15; OR'd with flags */
     74 	__u8 maxlen_flags;
     75 	/* { prot[2:0], cache[3:0] } fields */
     76 	__u8 cache_prot;
     77 	/* QoS (4 bitfields of 4 bits each for different panic levels) */
     78 	__u16 qos;
     79 	/*  For Panic mode: Output FIFO panic threshold */
     80 	__u16 thresh;
     81 	/*  For Panic mode: Output FIFO statistics throttle threshold */
     82 	__u16 throttle;
     83 } __attribute__((packed));
     84 
     85 struct pisp_fe_input_config {
     86 	__u8 streaming;
     87 	__u8 pad[3];
     88 	struct pisp_image_format_config format;
     89 	struct pisp_fe_input_axi_config axi;
     90 	/* Extra cycles delay before issuing each burst request */
     91 	__u8 holdoff;
     92 	__u8 pad2[3];
     93 } __attribute__((packed));
     94 
     95 struct pisp_fe_output_config {
     96 	struct pisp_image_format_config format;
     97 	__u16 ilines;
     98 	__u8 pad[2];
     99 } __attribute__((packed));
    100 
    101 struct pisp_fe_input_buffer_config {
    102 	__u32 addr_lo;
    103 	__u32 addr_hi;
    104 	__u16 frame_id;
    105 	__u16 pad;
    106 } __attribute__((packed));
    107 
    108 #define PISP_FE_DECOMPAND_LUT_SIZE 65
    109 
    110 struct pisp_fe_decompand_config {
    111 	__u16 lut[PISP_FE_DECOMPAND_LUT_SIZE];
    112 	__u16 pad;
    113 } __attribute__((packed));
    114 
    115 struct pisp_fe_dpc_config {
    116 	__u8 coeff_level;
    117 	__u8 coeff_range;
    118 	__u8 coeff_range2;
    119 #define PISP_FE_DPC_FLAG_FOLDBACK 1
    120 #define PISP_FE_DPC_FLAG_VFLAG 2
    121 	__u8 flags;
    122 } __attribute__((packed));
    123 
    124 #define PISP_FE_LSC_LUT_SIZE 16
    125 
    126 struct pisp_fe_lsc_config {
    127 	__u8 shift;
    128 	__u8 pad0;
    129 	__u16 scale;
    130 	__u16 centre_x;
    131 	__u16 centre_y;
    132 	__u16 lut[PISP_FE_LSC_LUT_SIZE];
    133 } __attribute__((packed));
    134 
    135 struct pisp_fe_rgby_config {
    136 	__u16 gain_r;
    137 	__u16 gain_g;
    138 	__u16 gain_b;
    139 	__u8 maxflag;
    140 	__u8 pad;
    141 } __attribute__((packed));
    142 
    143 struct pisp_fe_agc_stats_config {
    144 	__u16 offset_x;
    145 	__u16 offset_y;
    146 	__u16 size_x;
    147 	__u16 size_y;
    148 	/* each weight only 4 bits */
    149 	__u8 weights[PISP_AGC_STATS_NUM_ZONES / 2];
    150 	__u16 row_offset_x;
    151 	__u16 row_offset_y;
    152 	__u16 row_size_x;
    153 	__u16 row_size_y;
    154 	__u8 row_shift;
    155 	__u8 float_shift;
    156 	__u8 pad1[2];
    157 } __attribute__((packed));
    158 
    159 struct pisp_fe_awb_stats_config {
    160 	__u16 offset_x;
    161 	__u16 offset_y;
    162 	__u16 size_x;
    163 	__u16 size_y;
    164 	__u8 shift;
    165 	__u8 pad[3];
    166 	__u16 r_lo;
    167 	__u16 r_hi;
    168 	__u16 g_lo;
    169 	__u16 g_hi;
    170 	__u16 b_lo;
    171 	__u16 b_hi;
    172 } __attribute__((packed));
    173 
    174 struct pisp_fe_floating_stats_region {
    175 	__u16 offset_x;
    176 	__u16 offset_y;
    177 	__u16 size_x;
    178 	__u16 size_y;
    179 } __attribute__((packed));
    180 
    181 struct pisp_fe_floating_stats_config {
    182 	struct pisp_fe_floating_stats_region
    183 		regions[PISP_FLOATING_STATS_NUM_ZONES];
    184 } __attribute__((packed));
    185 
    186 #define PISP_FE_CDAF_NUM_WEIGHTS 8
    187 
    188 struct pisp_fe_cdaf_stats_config {
    189 	__u16 noise_constant;
    190 	__u16 noise_slope;
    191 	__u16 offset_x;
    192 	__u16 offset_y;
    193 	__u16 size_x;
    194 	__u16 size_y;
    195 	__u16 skip_x;
    196 	__u16 skip_y;
    197 	__u32 mode;
    198 } __attribute__((packed));
    199 
    200 struct pisp_fe_stats_buffer_config {
    201 	__u32 addr_lo;
    202 	__u32 addr_hi;
    203 } __attribute__((packed));
    204 
    205 struct pisp_fe_crop_config {
    206 	__u16 offset_x;
    207 	__u16 offset_y;
    208 	__u16 width;
    209 	__u16 height;
    210 } __attribute__((packed));
    211 
    212 enum pisp_fe_downscale_flags {
    213 	/* downscale the four Bayer components independently... */
    214 	DOWNSCALE_BAYER = 1,
    215 	/* ...without trying to preserve their spatial relationship */
    216 	DOWNSCALE_BIN = 2,
    217 };
    218 
    219 struct pisp_fe_downscale_config {
    220 	__u8 xin;
    221 	__u8 xout;
    222 	__u8 yin;
    223 	__u8 yout;
    224 	__u8 flags; /* enum pisp_fe_downscale_flags */
    225 	__u8 pad[3];
    226 	__u16 output_width;
    227 	__u16 output_height;
    228 } __attribute__((packed));
    229 
    230 struct pisp_fe_output_buffer_config {
    231 	__u32 addr_lo;
    232 	__u32 addr_hi;
    233 } __attribute__((packed));
    234 
    235 /* Each of the two output channels/branches: */
    236 struct pisp_fe_output_branch_config {
    237 	struct pisp_fe_crop_config crop;
    238 	struct pisp_fe_downscale_config downscale;
    239 	struct pisp_compress_config compress;
    240 	struct pisp_fe_output_config output;
    241 	__u32 pad;
    242 } __attribute__((packed));
    243 
    244 /* And finally one to rule them all: */
    245 struct pisp_fe_config {
    246 	/* I/O configuration: */
    247 	struct pisp_fe_stats_buffer_config stats_buffer;
    248 	struct pisp_fe_output_buffer_config output_buffer[PISP_FE_NUM_OUTPUTS];
    249 	struct pisp_fe_input_buffer_config input_buffer;
    250 	/* processing configuration: */
    251 	struct pisp_fe_global_config global;
    252 	struct pisp_fe_input_config input;
    253 	struct pisp_decompress_config decompress;
    254 	struct pisp_fe_decompand_config decompand;
    255 	struct pisp_bla_config bla;
    256 	struct pisp_fe_dpc_config dpc;
    257 	struct pisp_fe_crop_config stats_crop;
    258 	__u32 spare1; /* placeholder for future decimate configuration */
    259 	struct pisp_bla_config blc;
    260 	struct pisp_fe_rgby_config rgby;
    261 	struct pisp_fe_lsc_config lsc;
    262 	struct pisp_fe_agc_stats_config agc_stats;
    263 	struct pisp_fe_awb_stats_config awb_stats;
    264 	struct pisp_fe_cdaf_stats_config cdaf_stats;
    265 	struct pisp_fe_floating_stats_config floating_stats;
    266 	struct pisp_fe_output_axi_config output_axi;
    267 	struct pisp_fe_output_branch_config ch[PISP_FE_NUM_OUTPUTS];
    268 	/* non-register fields: */
    269 	__u32 dirty_flags; /* these use pisp_fe_enable */
    270 	__u32 dirty_flags_extra; /* these use pisp_fe_dirty */
    271 } __attribute__((packed));
    272 
    273 #endif /* _PISP_FE_CONFIG_ */