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 _UAPI_PISP_FE_CONFIG_ 9 #define _UAPI_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 /* _UAPI_PISP_FE_CONFIG_ */ 274