On Tue Nov 11 16:15:57 2025 +0000, Daniel Scally wrote:
> Add structures describing the ISP parameters to mali-c55-config.h
> 
> Tested-by: Lad Prabhakar <[email protected]>
> Acked-by: Nayden Kanchev  <[email protected]>
> Co-developed-by: Jacopo Mondi <[email protected]>
> Signed-off-by: Jacopo Mondi <[email protected]>
> Signed-off-by: Daniel Scally <[email protected]>
> Signed-off-by: Hans Verkuil <[email protected]>

Patch committed.

Thanks,
Hans Verkuil

 include/uapi/linux/media/arm/mali-c55-config.h | 598 +++++++++++++++++++++++++
 1 file changed, 598 insertions(+)

---

diff --git a/include/uapi/linux/media/arm/mali-c55-config.h 
b/include/uapi/linux/media/arm/mali-c55-config.h
index e31fb8ffa10a..109082c5694f 100644
--- a/include/uapi/linux/media/arm/mali-c55-config.h
+++ b/include/uapi/linux/media/arm/mali-c55-config.h
@@ -10,6 +10,7 @@
 
 #include <linux/types.h>
 #include <linux/v4l2-controls.h>
+#include <linux/media/v4l2-isp.h>
 
 #define V4L2_CID_MALI_C55_CAPABILITIES (V4L2_CID_USER_MALI_C55_BASE + 0x0)
 #define MALI_C55_GPS_PONG              (1U << 0)
@@ -193,4 +194,601 @@ struct mali_c55_stats_buffer {
        __u32 reserved3[15];
 } __attribute__((packed));
 
+/**
+ * enum mali_c55_param_buffer_version - Mali-C55 parameters block versioning
+ *
+ * @MALI_C55_PARAM_BUFFER_V1: First version of Mali-C55 parameters block
+ */
+enum mali_c55_param_buffer_version {
+       MALI_C55_PARAM_BUFFER_V1,
+};
+
+/**
+ * enum mali_c55_param_block_type - Enumeration of Mali-C55 parameter blocks
+ *
+ * This enumeration defines the types of Mali-C55 parameters block. Each block
+ * configures a specific processing block of the Mali-C55 ISP. The block
+ * type allows the driver to correctly interpret the parameters block data.
+ *
+ * It is the responsibility of userspace to correctly set the type of each
+ * parameters block.
+ *
+ * @MALI_C55_PARAM_BLOCK_SENSOR_OFFS: Sensor pre-shading black level offset
+ * @MALI_C55_PARAM_BLOCK_AEXP_HIST: Auto-exposure 1024-bin histogram
+ *                                 configuration
+ * @MALI_C55_PARAM_BLOCK_AEXP_IHIST: Post-Iridix auto-exposure 1024-bin
+ *                                  histogram configuration
+ * @MALI_C55_PARAM_BLOCK_AEXP_HIST_WEIGHTS: Auto-exposure 1024-bin histogram
+ *                                         weighting
+ * @MALI_C55_PARAM_BLOCK_AEXP_IHIST_WEIGHTS: Post-Iridix auto-exposure 1024-bin
+ *                                          histogram weighting
+ * @MALI_C55_PARAM_BLOCK_DIGITAL_GAIN: Digital gain
+ * @MALI_C55_PARAM_BLOCK_AWB_GAINS: Auto-white balance gains
+ * @MALI_C55_PARAM_BLOCK_AWB_CONFIG: Auto-white balance statistics config
+ * @MALI_C55_PARAM_BLOCK_AWB_GAINS_AEXP: Auto-white balance gains for AEXP-0 
tap
+ * @MALI_C55_PARAM_MESH_SHADING_CONFIG : Mesh shading tables configuration
+ * @MALI_C55_PARAM_MESH_SHADING_SELECTION: Mesh shading table selection
+ */
+enum mali_c55_param_block_type {
+       MALI_C55_PARAM_BLOCK_SENSOR_OFFS,
+       MALI_C55_PARAM_BLOCK_AEXP_HIST,
+       MALI_C55_PARAM_BLOCK_AEXP_IHIST,
+       MALI_C55_PARAM_BLOCK_AEXP_HIST_WEIGHTS,
+       MALI_C55_PARAM_BLOCK_AEXP_IHIST_WEIGHTS,
+       MALI_C55_PARAM_BLOCK_DIGITAL_GAIN,
+       MALI_C55_PARAM_BLOCK_AWB_GAINS,
+       MALI_C55_PARAM_BLOCK_AWB_CONFIG,
+       MALI_C55_PARAM_BLOCK_AWB_GAINS_AEXP,
+       MALI_C55_PARAM_MESH_SHADING_CONFIG,
+       MALI_C55_PARAM_MESH_SHADING_SELECTION,
+};
+
+/**
+ * struct mali_c55_params_sensor_off_preshading - offset subtraction for each
+ *                                               color channel
+ *
+ * Provides removal of the sensor black level from the sensor data. Separate
+ * offsets are provided for each of the four Bayer component color channels
+ * which are defaulted to R, Gr, Gb, B.
+ *
+ * header.type should be set to MALI_C55_PARAM_BLOCK_SENSOR_OFFS from
+ * :c:type:`mali_c55_param_block_type` for this block.
+ *
+ * @header: The Mali-C55 parameters block header
+ * @chan00: Offset for color channel 00 (default: R)
+ * @chan01: Offset for color channel 01 (default: Gr)
+ * @chan10: Offset for color channel 10 (default: Gb)
+ * @chan11: Offset for color channel 11 (default: B)
+ */
+struct mali_c55_params_sensor_off_preshading {
+       struct v4l2_isp_params_block_header header;
+       __u32 chan00;
+       __u32 chan01;
+       __u32 chan10;
+       __u32 chan11;
+};
+
+/**
+ * enum mali_c55_aexp_hist_tap_points - Tap points for the AEXP histogram
+ * @MALI_C55_AEXP_HIST_TAP_WB: After static white balance
+ * @MALI_C55_AEXP_HIST_TAP_FS: After WDR Frame Stitch
+ * @MALI_C55_AEXP_HIST_TAP_TPG: After the test pattern generator
+ */
+enum mali_c55_aexp_hist_tap_points {
+       MALI_C55_AEXP_HIST_TAP_WB = 0,
+       MALI_C55_AEXP_HIST_TAP_FS,
+       MALI_C55_AEXP_HIST_TAP_TPG,
+};
+
+/**
+ * enum mali_c55_aexp_skip_x - Horizontal pixel skipping
+ * @MALI_C55_AEXP_SKIP_X_EVERY_2ND: Collect every 2nd pixel horizontally
+ * @MALI_C55_AEXP_SKIP_X_EVERY_3RD: Collect every 3rd pixel horizontally
+ * @MALI_C55_AEXP_SKIP_X_EVERY_4TH: Collect every 4th pixel horizontally
+ * @MALI_C55_AEXP_SKIP_X_EVERY_5TH: Collect every 5th pixel horizontally
+ * @MALI_C55_AEXP_SKIP_X_EVERY_8TH: Collect every 8th pixel horizontally
+ * @MALI_C55_AEXP_SKIP_X_EVERY_9TH: Collect every 9th pixel horizontally
+ */
+enum mali_c55_aexp_skip_x {
+       MALI_C55_AEXP_SKIP_X_EVERY_2ND,
+       MALI_C55_AEXP_SKIP_X_EVERY_3RD,
+       MALI_C55_AEXP_SKIP_X_EVERY_4TH,
+       MALI_C55_AEXP_SKIP_X_EVERY_5TH,
+       MALI_C55_AEXP_SKIP_X_EVERY_8TH,
+       MALI_C55_AEXP_SKIP_X_EVERY_9TH
+};
+
+/**
+ * enum mali_c55_aexp_skip_y - Vertical pixel skipping
+ * @MALI_C55_AEXP_SKIP_Y_ALL: Collect every single pixel vertically
+ * @MALI_C55_AEXP_SKIP_Y_EVERY_2ND: Collect every 2nd pixel vertically
+ * @MALI_C55_AEXP_SKIP_Y_EVERY_3RD: Collect every 3rd pixel vertically
+ * @MALI_C55_AEXP_SKIP_Y_EVERY_4TH: Collect every 4th pixel vertically
+ * @MALI_C55_AEXP_SKIP_Y_EVERY_5TH: Collect every 5th pixel vertically
+ * @MALI_C55_AEXP_SKIP_Y_EVERY_8TH: Collect every 8th pixel vertically
+ * @MALI_C55_AEXP_SKIP_Y_EVERY_9TH: Collect every 9th pixel vertically
+ */
+enum mali_c55_aexp_skip_y {
+       MALI_C55_AEXP_SKIP_Y_ALL,
+       MALI_C55_AEXP_SKIP_Y_EVERY_2ND,
+       MALI_C55_AEXP_SKIP_Y_EVERY_3RD,
+       MALI_C55_AEXP_SKIP_Y_EVERY_4TH,
+       MALI_C55_AEXP_SKIP_Y_EVERY_5TH,
+       MALI_C55_AEXP_SKIP_Y_EVERY_8TH,
+       MALI_C55_AEXP_SKIP_Y_EVERY_9TH
+};
+
+/**
+ * enum mali_c55_aexp_row_column_offset - Start from the first or second row or
+ *                                       column
+ * @MALI_C55_AEXP_FIRST_ROW_OR_COL:    Start from the first row / column
+ * @MALI_C55_AEXP_SECOND_ROW_OR_COL:   Start from the second row / column
+ */
+enum mali_c55_aexp_row_column_offset {
+       MALI_C55_AEXP_FIRST_ROW_OR_COL = 1,
+       MALI_C55_AEXP_SECOND_ROW_OR_COL = 2,
+};
+
+/**
+ * enum mali_c55_aexp_hist_plane_mode - Mode for the AEXP Histograms
+ * @MALI_C55_AEXP_HIST_COMBINED: All color planes in one 1024-bin histogram
+ * @MALI_C55_AEXP_HIST_SEPARATE: Each color plane in one 256-bin histogram 
with a bin width of 16
+ * @MALI_C55_AEXP_HIST_FOCUS_00: Top left plane in the first bank, rest in 
second bank
+ * @MALI_C55_AEXP_HIST_FOCUS_01: Top right plane in the first bank, rest in 
second bank
+ * @MALI_C55_AEXP_HIST_FOCUS_10: Bottom left plane in the first bank, rest in 
second bank
+ * @MALI_C55_AEXP_HIST_FOCUS_11: Bottom right plane in the first bank, rest in 
second bank
+ *
+ * In the "focus" modes statistics are collected into two 512-bin histograms
+ * with a bin width of 8. One colour plane is in the first histogram with the
+ * remainder combined into the second. The four options represent which of the
+ * four positions in a bayer pattern are the focused plane.
+ */
+enum mali_c55_aexp_hist_plane_mode {
+       MALI_C55_AEXP_HIST_COMBINED = 0,
+       MALI_C55_AEXP_HIST_SEPARATE = 1,
+       MALI_C55_AEXP_HIST_FOCUS_00 = 4,
+       MALI_C55_AEXP_HIST_FOCUS_01 = 5,
+       MALI_C55_AEXP_HIST_FOCUS_10 = 6,
+       MALI_C55_AEXP_HIST_FOCUS_11 = 7,
+};
+
+/**
+ * struct mali_c55_params_aexp_hist - configuration for AEXP metering hists
+ *
+ * This struct allows users to configure the 1024-bin AEXP histograms. Broadly
+ * speaking the parameters allow you to mask particular regions of the image 
and
+ * to select different kinds of histogram.
+ *
+ * The skip_x, offset_x, skip_y and offset_y fields allow users to ignore or
+ * mask pixels in the frame by their position relative to the top left pixel.
+ * First, the skip_y, offset_x and offset_y fields define which of the pixels
+ * within each 2x2 region will be counted in the statistics.
+ *
+ * If skip_y == 0 then two pixels from each covered region will be counted. If
+ * both offset_x and offset_y are zero, then the two left-most pixels in each
+ * 2x2 pixel region will be counted. Setting offset_x = 1 will discount the top
+ * left pixel and count the top right pixel. Setting offset_y = 1 will discount
+ * the bottom left pixel and count the bottom right pixel.
+ *
+ * If skip_y != 0 then only a single pixel from each region covered by the
+ * pattern will be counted. In this case offset_x controls whether the pixel
+ * that's counted is in the left (if offset_x == 0) or right (if offset_x == 1)
+ * column and offset_y controls whether the pixel that's counted is in the top
+ * (if offset_y == 0) or bottom (if offset_y == 1) row.
+ *
+ * The skip_x and skip_y fields control how the 2x2 pixel region is repeated
+ * across the image data. The first instance of the region is always in the top
+ * left of the image data. The skip_x field controls how many pixels are 
ignored
+ * in the x direction before the pixel masking region is repeated. The skip_y
+ * field controls how many pixels are ignored in the y direction before the
+ * pixel masking region is repeated.
+ *
+ * These fields can be used to reduce the number of pixels counted for the
+ * statistics, but it's important to be careful to configure them correctly.
+ * Some combinations of values will result in colour components from the input
+ * data being ignored entirely, for example in the following configuration:
+ *
+ * skip_x = 0
+ * offset_x = 0
+ * skip_y = 0
+ * offset_y = 0
+ *
+ * Only the R and Gb components of RGGB data that was input would be collected.
+ * Similarly in the following configuration:
+ *
+ * skip_x = 0
+ * offset_x = 0
+ * skip_y = 1
+ * offset_y = 1
+ *
+ * Only the Gb component of RGGB data that was input would be collected. To
+ * correct things such that all 4 colour components were included it would be
+ * necessary to set the skip_x and skip_y fields in a way that resulted in all
+ * four colour components being collected:
+ *
+ * skip_x = 1
+ * offset_x = 0
+ * skip_y = 1
+ * offset_y = 1
+ *
+ * header.type should be set to one of either MALI_C55_PARAM_BLOCK_AEXP_HIST or
+ * MALI_C55_PARAM_BLOCK_AEXP_IHIST from :c:type:`mali_c55_param_block_type`.
+ *
+ * @header:            The Mali-C55 parameters block header
+ * @skip_x:            Horizontal decimation. See enum mali_c55_aexp_skip_x
+ * @offset_x:          Skip the first column, or not. See enum 
mali_c55_aexp_row_column_offset
+ * @skip_y:            Vertical decimation. See enum mali_c55_aexp_skip_y
+ * @offset_y:          Skip the first row, or not. See enum 
mali_c55_aexp_row_column_offset
+ * @scale_bottom:      Scale pixels in bottom half of intensity range: 0=1x 
,1=2x, 2=4x, 4=8x, 4=16x
+ * @scale_top:         scale pixels in top half of intensity range: 0=1x 
,1=2x, 2=4x, 4=8x, 4=16x
+ * @plane_mode:                Plane separation mode. See enum 
mali_c55_aexp_hist_plane_mode
+ * @tap_point:         Tap point for histogram from enum 
mali_c55_aexp_hist_tap_points.
+ *                     This parameter is unused for the post-Iridix Histogram
+ */
+struct mali_c55_params_aexp_hist {
+       struct v4l2_isp_params_block_header header;
+       __u8 skip_x;
+       __u8 offset_x;
+       __u8 skip_y;
+       __u8 offset_y;
+       __u8 scale_bottom;
+       __u8 scale_top;
+       __u8 plane_mode;
+       __u8 tap_point;
+};
+
+/**
+ * struct mali_c55_params_aexp_weights - Array of weights for AEXP metering
+ *
+ * This struct allows users to configure the weighting for both of the 1024-bin
+ * AEXP histograms. The pixel data collected for each zone is multiplied by the
+ * corresponding weight from this array, which may be zero if the intention is
+ * to mask off the zone entirely.
+ *
+ * header.type should be set to one of either 
MALI_C55_PARAM_BLOCK_AEXP_HIST_WEIGHTS
+ * or MALI_C55_PARAM_BLOCK_AEXP_IHIST_WEIGHTS from 
:c:type:`mali_c55_param_block_type`.
+ *
+ * @header:            The Mali-C55 parameters block header
+ * @nodes_used_horiz:  Number of active zones horizontally [0..15]
+ * @nodes_used_vert:   Number of active zones vertically [0..15]
+ * @zone_weights:      Zone weighting. Index is row*col where 0,0 is the top
+ *                     left zone continuing in raster order. Each zone can be
+ *                     weighted in the range [0..15]. The number of rows and
+ *                     columns is defined by @nodes_used_vert and
+ *                     @nodes_used_horiz
+ */
+struct mali_c55_params_aexp_weights {
+       struct v4l2_isp_params_block_header header;
+       __u8 nodes_used_horiz;
+       __u8 nodes_used_vert;
+       __u8 zone_weights[MALI_C55_MAX_ZONES];
+};
+
+/**
+ * struct mali_c55_params_digital_gain - Digital gain value
+ *
+ * This struct carries a digital gain value to set in the ISP.
+ *
+ * header.type should be set to MALI_C55_PARAM_BLOCK_DIGITAL_GAIN from
+ * :c:type:`mali_c55_param_block_type` for this block.
+ *
+ * @header:    The Mali-C55 parameters block header
+ * @gain:      The digital gain value to apply, in Q5.8 format.
+ */
+struct mali_c55_params_digital_gain {
+       struct v4l2_isp_params_block_header header;
+       __u16 gain;
+};
+
+/**
+ * enum mali_c55_awb_stats_mode - Statistics mode for AWB
+ * @MALI_C55_AWB_MODE_GRBR: Statistics collected as Green/Red and Blue/Red 
ratios
+ * @MALI_C55_AWB_MODE_RGBG: Statistics collected as Red/Green and Blue/Green 
ratios
+ */
+enum mali_c55_awb_stats_mode {
+       MALI_C55_AWB_MODE_GRBR = 0,
+       MALI_C55_AWB_MODE_RGBG,
+};
+
+/**
+ * struct mali_c55_params_awb_gains - Gain settings for auto white balance
+ *
+ * This struct allows users to configure the gains for auto-white balance. 
There
+ * are four gain settings corresponding to each colour channel in the bayer
+ * domain. Although named generically, the association between the gain applied
+ * and the colour channel is done automatically within the ISP depending on the
+ * input format, and so the following mapping always holds true::
+ *
+ *     gain00 = R
+ *     gain01 = Gr
+ *     gain10 = Gb
+ *     gain11 = B
+ *
+ * All of the gains are stored in Q4.8 format.
+ *
+ * header.type should be set to one of either MALI_C55_PARAM_BLOCK_AWB_GAINS or
+ * MALI_C55_PARAM_BLOCK_AWB_GAINS_AEXP from 
:c:type:`mali_c55_param_block_type`.
+ *
+ * @header:    The Mali-C55 parameters block header
+ * @gain00:    Multiplier for colour channel 00
+ * @gain01:    Multiplier for colour channel 01
+ * @gain10:    Multiplier for colour channel 10
+ * @gain11:    Multiplier for colour channel 11
+ */
+struct mali_c55_params_awb_gains {
+       struct v4l2_isp_params_block_header header;
+       __u16 gain00;
+       __u16 gain01;
+       __u16 gain10;
+       __u16 gain11;
+};
+
+/**
+ * enum mali_c55_params_awb_tap_points - Tap points for the AWB statistics
+ * @MALI_C55_AWB_STATS_TAP_PF: Immediately after the Purple Fringe block
+ * @MALI_C55_AWB_STATS_TAP_CNR: Immediately after the CNR block
+ */
+enum mali_c55_params_awb_tap_points {
+       MALI_C55_AWB_STATS_TAP_PF = 0,
+       MALI_C55_AWB_STATS_TAP_CNR,
+};
+
+/**
+ * struct mali_c55_params_awb_config - Stats settings for auto-white balance
+ *
+ * This struct allows the configuration of the statistics generated for auto
+ * white balance. Pixel intensity limits can be set to exclude overly bright or
+ * dark regions of an image from the statistics entirely. Colour ratio minima
+ * and maxima can be set to discount pixels who's ratios fall outside the
+ * defined boundaries; there are two sets of registers to do this - the
+ * "min/max" ratios which bound a region and the "high/low" ratios which 
further
+ * trim the upper and lower ratios. For example with the boundaries configured
+ * as follows, only pixels whos colour ratios falls into the region marked "A"
+ * would be counted::
+ *
+ *                                                               cr_high
+ *         2.0 |                                                   |
+ *             |               cb_max --> _________________________v_____
+ *         1.8 |                         |                         \    |
+ *             |                         |                          \   |
+ *         1.6 |                         |                           \  |
+ *             |                         |                            \ |
+ *      c  1.4 |               cb_low -->|\              A             \|<--  
cb_high
+ *      b      |                         | \                            |
+ *         1.2 |                         |  \                           |
+ *      r      |                         |   \                          |
+ *      a  1.0 |              cb_min --> |____\_________________________|
+ *      t      |                         ^    ^                         ^
+ *      i  0.8 |                         |    |                         |
+ *      o      |                      cr_min  |                       cr_max
+ *      s  0.6 |                              |
+ *             |                             cr_low
+ *         0.4 |
+ *             |
+ *         0.2 |
+ *             |
+ *         0.0 |_______________________________________________________________
+ *             0.0   0.2   0.4   0.6   0.8   1.0   1.2   1.4   1.6   1.8   2.0
+ *                                        cr ratios
+ *
+ * header.type should be set to MALI_C55_PARAM_BLOCK_AWB_CONFIG from
+ * :c:type:`mali_c55_param_block_type` for this block.
+ *
+ * @header:            The Mali-C55 parameters block header
+ * @tap_point:         The tap point from enum mali_c55_params_awb_tap_points
+ * @stats_mode:                AWB statistics collection mode, see 
:c:type:`mali_c55_awb_stats_mode`
+ * @white_level:       Upper pixel intensity (I.E. raw pixel values) limit
+ * @black_level:       Lower pixel intensity (I.E. raw pixel values) limit
+ * @cr_max:            Maximum R/G ratio (Q4.8 format)
+ * @cr_min:            Minimum R/G ratio (Q4.8 format)
+ * @cb_max:            Maximum B/G ratio (Q4.8 format)
+ * @cb_min:            Minimum B/G ratio (Q4.8 format)
+ * @nodes_used_horiz:  Number of active zones horizontally [0..15]
+ * @nodes_used_vert:   Number of active zones vertically [0..15]
+ * @cr_high:           R/G ratio trim high (Q4.8 format)
+ * @cr_low:            R/G ratio trim low (Q4.8 format)
+ * @cb_high:           B/G ratio trim high (Q4.8 format)
+ * @cb_low:            B/G ratio trim low (Q4.8 format)
+ */
+struct mali_c55_params_awb_config {
+       struct v4l2_isp_params_block_header header;
+       __u8 tap_point;
+       __u8 stats_mode;
+       __u16 white_level;
+       __u16 black_level;
+       __u16 cr_max;
+       __u16 cr_min;
+       __u16 cb_max;
+       __u16 cb_min;
+       __u8 nodes_used_horiz;
+       __u8 nodes_used_vert;
+       __u16 cr_high;
+       __u16 cr_low;
+       __u16 cb_high;
+       __u16 cb_low;
+};
+
+#define MALI_C55_NUM_MESH_SHADING_ELEMENTS 3072
+
+/**
+ * struct mali_c55_params_mesh_shading_config - Mesh shading configuration
+ *
+ * The mesh shading correction module allows programming a separate table of
+ * either 16x16 or 32x32 node coefficients for 3 different light sources. The
+ * final correction coefficients applied are computed by blending the
+ * coefficients from two tables together.
+ *
+ * A page of 1024 32-bit integers is associated to each colour channel, with
+ * pages stored consecutively in memory. Each 32-bit integer packs 3 8-bit
+ * correction coefficients for a single node, one for each of the three light
+ * sources. The 8 most significant bits are unused. The following table
+ * describes the layout::
+ *
+ *     +----------- Page (Colour Plane) 0 -------------+
+ *     | @mesh[i]  | Mesh Point | Bits  | Light Source |
+ *     +-----------+------------+-------+--------------+
+ *     |         0 |        0,0 | 16,23 | LS2          |
+ *     |           |            | 08-15 | LS1          |
+ *     |           |            | 00-07 | LS0          |
+ *     +-----------+------------+-------+--------------+
+ *     |         1 |        0,1 | 16,23 | LS2          |
+ *     |           |            | 08-15 | LS1          |
+ *     |           |            | 00-07 | LS0          |
+ *     +-----------+------------+-------+--------------+
+ *     |       ... |        ... | ...   | ...          |
+ *     +-----------+------------+-------+--------------+
+ *     |      1023 |      31,31 | 16,23 | LS2          |
+ *     |           |            | 08-15 | LS1          |
+ *     |           |            | 00-07 | LS0          |
+ *     +----------- Page (Colour Plane) 1 -------------+
+ *     | @mesh[i]  | Mesh Point | Bits  | Light Source |
+ *     +-----------+------------+-------+--------------+
+ *     |      1024 |        0,0 | 16,23 | LS2          |
+ *     |           |            | 08-15 | LS1          |
+ *     |           |            | 00-07 | LS0          |
+ *     +-----------+------------+-------+--------------+
+ *     |      1025 |        0,1 | 16,23 | LS2          |
+ *     |           |            | 08-15 | LS1          |
+ *     |           |            | 00-07 | LS0          |
+ *     +-----------+------------+-------+--------------+
+ *     |       ... |        ... | ...   | ...          |
+ *     +-----------+------------+-------+--------------+
+ *     |      2047 |      31,31 | 16,23 | LS2          |
+ *     |           |            | 08-15 | LS1          |
+ *     |           |            | 00-07 | LS0          |
+ *     +----------- Page (Colour Plane) 2 -------------+
+ *     | @mesh[i]  | Mesh Point | Bits  | Light Source |
+ *     +-----------+------------+-------+--------------+
+ *     |      2048 |        0,0 | 16,23 | LS2          |
+ *     |           |            | 08-15 | LS1          |
+ *     |           |            | 00-07 | LS0          |
+ *     +-----------+------------+-------+--------------+
+ *     |      2049 |        0,1 | 16,23 | LS2          |
+ *     |           |            | 08-15 | LS1          |
+ *     |           |            | 00-07 | LS0          |
+ *     +-----------+------------+-------+--------------+
+ *     |       ... |        ... | ...   | ...          |
+ *     +-----------+------------+-------+--------------+
+ *     |      3071 |      31,31 | 16,23 | LS2          |
+ *     |           |            | 08-15 | LS1          |
+ *     |           |            | 00-07 | LS0          |
+ *     +-----------+------------+-------+--------------+
+ *
+ * The @mesh_scale member determines the precision and minimum and maximum 
gain.
+ * For example if @mesh_scale is 0 and therefore selects 0 - 2x gain, a value 
of
+ * 0 in a coefficient means 0.0 gain, a value of 128 means 1.0 gain and 255
+ * means 2.0 gain.
+ *
+ * header.type should be set to MALI_C55_PARAM_MESH_SHADING_CONFIG from
+ * :c:type:`mali_c55_param_block_type` for this block.
+ *
+ * @header:            The Mali-C55 parameters block header
+ * @mesh_show:         Output the mesh data rather than image data
+ * @mesh_scale:                Set the precision and maximum gain range of 
mesh shading
+ *                             - 0 = 0-2x gain
+ *                             - 1 = 0-4x gain
+ *                             - 2 = 0-8x gain
+ *                             - 3 = 0-16x gain
+ *                             - 4 = 1-2x gain
+ *                             - 5 = 1-3x gain
+ *                             - 6 = 1-5x gain
+ *                             - 7 = 1-9x gain
+ * @mesh_page_r:       Mesh page select for red colour plane [0..2]
+ * @mesh_page_g:       Mesh page select for green colour plane [0..2]
+ * @mesh_page_b:       Mesh page select for blue colour plane [0..2]
+ * @mesh_width:                Number of horizontal nodes minus 1 [15,31]
+ * @mesh_height:       Number of vertical nodes minus 1 [15,31]
+ * @mesh:              Mesh shading correction tables
+ */
+struct mali_c55_params_mesh_shading_config {
+       struct v4l2_isp_params_block_header header;
+       __u8 mesh_show;
+       __u8 mesh_scale;
+       __u8 mesh_page_r;
+       __u8 mesh_page_g;
+       __u8 mesh_page_b;
+       __u8 mesh_width;
+       __u8 mesh_height;
+       __u32 mesh[MALI_C55_NUM_MESH_SHADING_ELEMENTS];
+};
+
+/** enum mali_c55_params_mesh_alpha_bank - Mesh shading table bank selection
+ * @MALI_C55_MESH_ALPHA_BANK_LS0_AND_LS1 - Select Light Sources 0 and 1
+ * @MALI_C55_MESH_ALPHA_BANK_LS1_AND_LS2 - Select Light Sources 1 and 2
+ * @MALI_C55_MESH_ALPHA_BANK_LS0_AND_LS2 - Select Light Sources 0 and 2
+ */
+enum mali_c55_params_mesh_alpha_bank {
+       MALI_C55_MESH_ALPHA_BANK_LS0_AND_LS1 = 0,
+       MALI_C55_MESH_ALPHA_BANK_LS1_AND_LS2 = 1,
+       MALI_C55_MESH_ALPHA_BANK_LS0_AND_LS2 = 4
+};
+
+/**
+ * struct mali_c55_params_mesh_shading_selection - Mesh table selection
+ *
+ * The module computes the final correction coefficients by blending the ones
+ * from two light source tables, which are selected (independently for each
+ * colour channel) by the @mesh_alpha_bank_r/g/b fields.
+ *
+ * The final blended coefficients for each node are calculated using the
+ * following equation:
+ *
+ *     Final coefficient = (a * LS\ :sub:`b`\ + (256 - a) * LS\ :sub:`a`\) / 
256
+ *
+ * Where a is the @mesh_alpha_r/g/b value, and LS\ :sub:`a`\ and LS\ :sub:`b`\
+ * are the node cofficients for the two tables selected by the
+ * @mesh_alpha_bank_r/g/b value.
+ *
+ * The scale of the applied correction may also be controlled by tuning the
+ * @mesh_strength member. This is a modifier to the final coefficients which 
can
+ * be used to globally reduce the gains applied.
+ *
+ * header.type should be set to MALI_C55_PARAM_MESH_SHADING_SELECTION from
+ * :c:type:`mali_c55_param_block_type` for this block.
+ *
+ * @header:            The Mali-C55 parameters block header
+ * @mesh_alpha_bank_r: Red mesh table select (c:type:`enum 
mali_c55_params_mesh_alpha_bank`)
+ * @mesh_alpha_bank_g: Green mesh table select (c:type:`enum 
mali_c55_params_mesh_alpha_bank`)
+ * @mesh_alpha_bank_b: Blue mesh table select (c:type:`enum 
mali_c55_params_mesh_alpha_bank`)
+ * @mesh_alpha_r:      Blend coefficient for R [0..255]
+ * @mesh_alpha_g:      Blend coefficient for G [0..255]
+ * @mesh_alpha_b:      Blend coefficient for B [0..255]
+ * @mesh_strength:     Mesh strength in Q4.12 format [0..4096]
+ */
+struct mali_c55_params_mesh_shading_selection {
+       struct v4l2_isp_params_block_header header;
+       __u8 mesh_alpha_bank_r;
+       __u8 mesh_alpha_bank_g;
+       __u8 mesh_alpha_bank_b;
+       __u8 mesh_alpha_r;
+       __u8 mesh_alpha_g;
+       __u8 mesh_alpha_b;
+       __u16 mesh_strength;
+};
+
+/**
+ * define MALI_C55_PARAMS_MAX_SIZE - Maximum size of all Mali C55 Parameters
+ *
+ * Though the parameters for the Mali-C55 are passed as optional blocks, the
+ * driver still needs to know the absolute maximum size so that it can allocate
+ * a buffer sized appropriately to accommodate userspace attempting to set all
+ * possible parameters in a single frame.
+ *
+ * Some structs are in this list multiple times. Where that's the case, it just
+ * reflects the fact that the same struct can be used with multiple different
+ * header types from :c:type:`mali_c55_param_block_type`.
+ */
+#define MALI_C55_PARAMS_MAX_SIZE                               \
+       (sizeof(struct mali_c55_params_sensor_off_preshading) + \
+       sizeof(struct mali_c55_params_aexp_hist) +              \
+       sizeof(struct mali_c55_params_aexp_weights) +           \
+       sizeof(struct mali_c55_params_aexp_hist) +              \
+       sizeof(struct mali_c55_params_aexp_weights) +           \
+       sizeof(struct mali_c55_params_digital_gain) +           \
+       sizeof(struct mali_c55_params_awb_gains) +              \
+       sizeof(struct mali_c55_params_awb_config) +             \
+       sizeof(struct mali_c55_params_awb_gains) +              \
+       sizeof(struct mali_c55_params_mesh_shading_config) +    \
+       sizeof(struct mali_c55_params_mesh_shading_selection))
+
 #endif /* __UAPI_MALI_C55_CONFIG_H */
_______________________________________________
linuxtv-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to