bcm27xx: update patches from RPi foundation
[openwrt/staging/luka.git] / target / linux / bcm27xx / patches-5.4 / 950-0677-uapi-bcm2835-isp-Add-bcm2835-isp-uapi-header-file.patch
diff --git a/target/linux/bcm27xx/patches-5.4/950-0677-uapi-bcm2835-isp-Add-bcm2835-isp-uapi-header-file.patch b/target/linux/bcm27xx/patches-5.4/950-0677-uapi-bcm2835-isp-Add-bcm2835-isp-uapi-header-file.patch
new file mode 100644 (file)
index 0000000..9f41783
--- /dev/null
@@ -0,0 +1,337 @@
+From b5d50012157f909eff0e8775c1e040b7dfde0705 Mon Sep 17 00:00:00 2001
+From: Naushir Patuck <naush@raspberrypi.com>
+Date: Thu, 23 Apr 2020 10:18:15 +0100
+Subject: [PATCH] uapi: bcm2835-isp: Add bcm2835-isp uapi header file
+
+This file defines the userland interface to the bcm2835-isp driver
+that will follow in a separate commit.
+
+Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
+---
+ include/uapi/linux/bcm2835-isp.h | 320 +++++++++++++++++++++++++++++++
+ 1 file changed, 320 insertions(+)
+ create mode 100644 include/uapi/linux/bcm2835-isp.h
+
+--- /dev/null
++++ b/include/uapi/linux/bcm2835-isp.h
+@@ -0,0 +1,320 @@
++/* SPDX-License-Identifier: ((GPL-2.0+ WITH Linux-syscall-note) OR BSD-3-Clause) */
++/*
++ * bcm2835-isp.h
++ *
++ * BCM2835 ISP driver - user space header file.
++ *
++ * Copyright © 2019-2020 Raspberry Pi (Trading) Ltd.
++ *
++ * Author: Naushir Patuck (naush@raspberrypi.com)
++ *
++ */
++
++#ifndef __BCM2835_ISP_H_
++#define __BCM2835_ISP_H_
++
++#include <linux/v4l2-controls.h>
++
++#define V4L2_CID_USER_BCM2835_ISP_CC_MATRIX   \
++                              (V4L2_CID_USER_BCM2835_ISP_BASE + 0x0001)
++#define V4L2_CID_USER_BCM2835_ISP_LENS_SHADING        \
++                              (V4L2_CID_USER_BCM2835_ISP_BASE + 0x0002)
++#define V4L2_CID_USER_BCM2835_ISP_BLACK_LEVEL \
++                              (V4L2_CID_USER_BCM2835_ISP_BASE + 0x0003)
++#define V4L2_CID_USER_BCM2835_ISP_GEQ         \
++                              (V4L2_CID_USER_BCM2835_ISP_BASE + 0x0004)
++#define V4L2_CID_USER_BCM2835_ISP_GAMMA               \
++                              (V4L2_CID_USER_BCM2835_ISP_BASE + 0x0005)
++#define V4L2_CID_USER_BCM2835_ISP_DENOISE     \
++                              (V4L2_CID_USER_BCM2835_ISP_BASE + 0x0006)
++#define V4L2_CID_USER_BCM2835_ISP_SHARPEN     \
++                              (V4L2_CID_USER_BCM2835_ISP_BASE + 0x0007)
++#define V4L2_CID_USER_BCM2835_ISP_DPC         \
++                              (V4L2_CID_USER_BCM2835_ISP_BASE + 0x0008)
++
++/*
++ * All structs below are directly mapped onto the equivalent structs in
++ * drivers/staging/vc04_services/vchiq-mmal/mmal-parameters.h
++ * for convenience.
++ */
++
++/**
++ * struct bcm2835_isp_rational - Rational value type.
++ *
++ * @num:      Numerator.
++ * @den:      Denominator.
++ */
++struct bcm2835_isp_rational {
++      __s32 num;
++      __s32 den;
++};
++
++/**
++ * struct bcm2835_isp_ccm - Colour correction matrix.
++ *
++ * @ccm:      3x3 correction matrix coefficients.
++ * @offsets:  1x3 correction offsets.
++ */
++struct bcm2835_isp_ccm {
++      struct bcm2835_isp_rational ccm[3][3];
++      __s32 offsets[3];
++};
++
++/**
++ * struct bcm2835_isp_custom_ccm - Custom CCM applied with the
++ *                               V4L2_CID_USER_BCM2835_ISP_CC_MATRIX ctrl.
++ *
++ * @enabled:  Enable custom CCM.
++ * @ccm:      Custom CCM coefficients and offsets.
++ */
++struct bcm2835_isp_custom_ccm {
++      __u32 enabled;
++      struct bcm2835_isp_ccm ccm;
++};
++
++/**
++ * enum bcm2835_isp_gain_format - format of the gains in the lens shading
++ *                              tables used with the
++ *                              V4L2_CID_USER_BCM2835_ISP_LENS_SHADING ctrl.
++ *
++ * @GAIN_FORMAT_U0P8_1:               Gains are u0.8 format, starting at 1.0
++ * @GAIN_FORMAT_U1P7_0:               Gains are u1.7 format, starting at 0.0
++ * @GAIN_FORMAT_U1P7_1:               Gains are u1.7 format, starting at 1.0
++ * @GAIN_FORMAT_U2P6_0:               Gains are u2.6 format, starting at 0.0
++ * @GAIN_FORMAT_U2P6_1:               Gains are u2.6 format, starting at 1.0
++ * @GAIN_FORMAT_U3P5_0:               Gains are u3.5 format, starting at 0.0
++ * @GAIN_FORMAT_U3P5_1:               Gains are u3.5 format, starting at 1.0
++ * @GAIN_FORMAT_U4P10:                Gains are u4.10 format, starting at 0.0
++ */
++enum bcm2835_isp_gain_format {
++      GAIN_FORMAT_U0P8_1 = 0,
++      GAIN_FORMAT_U1P7_0 = 1,
++      GAIN_FORMAT_U1P7_1 = 2,
++      GAIN_FORMAT_U2P6_0 = 3,
++      GAIN_FORMAT_U2P6_1 = 4,
++      GAIN_FORMAT_U3P5_0 = 5,
++      GAIN_FORMAT_U3P5_1 = 6,
++      GAIN_FORMAT_U4P10  = 7,
++};
++
++/**
++ * struct bcm2835_isp_lens_shading - Lens shading tables supplied with the
++ *                                 V4L2_CID_USER_BCM2835_ISP_LENS_SHADING
++ *                                 ctrl.
++ *
++ * @enabled:          Enable lens shading.
++ * @grid_cell_size:   Size of grid cells in samples (16, 32, 64, 128 or 256).
++ * @grid_width:               Width of lens shading tables in grid cells.
++ * @grid_stride:      Row to row distance (in grid cells) between grid cells
++ *                    in the same horizontal location.
++ * @grid_height:      Height of lens shading tables in grid cells.
++ * @mem_handle_table: Memory handle to the tables.
++ * @ref_transform:    Reference transform - unsupported, please pass zero.
++ * @corner_sampled:   Whether the gains are sampled at the corner points
++ *                    of the grid cells or in the cell centres.
++ * @gain_format:      Format of the gains (see enum &bcm2835_isp_gain_format).
++ */
++struct bcm2835_isp_lens_shading {
++      __u32 enabled;
++      __u32 grid_cell_size;
++      __u32 grid_width;
++      __u32 grid_stride;
++      __u32 grid_height;
++      __u32 mem_handle_table;
++      __u32 ref_transform;
++      __u32 corner_sampled;
++      __u32 gain_format;
++};
++
++/**
++ * struct bcm2835_isp_black_level - Sensor black level set with the
++ *                                V4L2_CID_USER_BCM2835_ISP_BLACK_LEVEL ctrl.
++ *
++ * @enabled:          Enable black level.
++ * @black_level_r:    Black level for red channel.
++ * @black_level_g:    Black level for green channels.
++ * @black_level_b:    Black level for blue channel.
++ */
++struct bcm2835_isp_black_level {
++      __u32 enabled;
++      __u16 black_level_r;
++      __u16 black_level_g;
++      __u16 black_level_b;
++      __u8 pad_[2]; /* Unused */
++};
++
++/**
++ * struct bcm2835_isp_geq - Green equalisation parameters set with the
++ *                        V4L2_CID_USER_BCM2835_ISP_GEQ ctrl.
++ *
++ * @enabled:  Enable green equalisation.
++ * @offset:   Fixed offset of the green equalisation threshold.
++ * @slope:    Slope of the green equalisation threshold.
++ */
++struct bcm2835_isp_geq {
++      __u32 enabled;
++      __u32 offset;
++      struct bcm2835_isp_rational slope;
++};
++
++#define BCM2835_NUM_GAMMA_PTS 33
++
++/**
++ * struct bcm2835_isp_gamma - Gamma parameters set with the
++ *                          V4L2_CID_USER_BCM2835_ISP_GAMMA ctrl.
++ *
++ * @enabled:  Enable gamma adjustment.
++ * @X:                X values of the points defining the gamma curve.
++ *            Values should be scaled to 16 bits.
++ * @Y:                Y values of the points defining the gamma curve.
++ *            Values should be scaled to 16 bits.
++ */
++struct bcm2835_isp_gamma {
++      __u32 enabled;
++      __u16 x[BCM2835_NUM_GAMMA_PTS];
++      __u16 y[BCM2835_NUM_GAMMA_PTS];
++};
++
++/**
++ * struct bcm2835_isp_denoise - Denoise parameters set with the
++ *                            V4L2_CID_USER_BCM2835_ISP_DENOISE ctrl.
++ *
++ * @enabled:  Enable denoise.
++ * @constant: Fixed offset of the noise threshold.
++ * @slope:    Slope of the noise threshold.
++ * @strength: Denoise strength between 0.0 (off) and 1.0 (maximum).
++ */
++struct bcm2835_isp_denoise {
++      __u32 enabled;
++      __u32 constant;
++      struct bcm2835_isp_rational slope;
++      struct bcm2835_isp_rational strength;
++};
++
++/**
++ * struct bcm2835_isp_sharpen - Sharpen parameters set with the
++ *                            V4L2_CID_USER_BCM2835_ISP_SHARPEN ctrl.
++ *
++ * @enabled:  Enable sharpening.
++ * @threshold:        Threshold at which to start sharpening pixels.
++ * @strength: Strength with which pixel sharpening increases.
++ * @limit:    Limit to the amount of sharpening applied.
++ */
++struct bcm2835_isp_sharpen {
++      __u32 enabled;
++      struct bcm2835_isp_rational threshold;
++      struct bcm2835_isp_rational strength;
++      struct bcm2835_isp_rational limit;
++};
++
++/**
++ * enum bcm2835_isp_dpc_mode - defective pixel correction (DPC) strength.
++ *
++ * @DPC_MODE_OFF:             No DPC.
++ * @DPC_MODE_NORMAL:          Normal DPC.
++ * @DPC_MODE_STRONG:          Strong DPC.
++ */
++enum bcm2835_isp_dpc_mode {
++      DPC_MODE_OFF = 0,
++      DPC_MODE_NORMAL = 1,
++      DPC_MODE_STRONG = 2,
++};
++
++/**
++ * struct bcm2835_isp_dpc - Defective pixel correction (DPC) parameters set
++ *                        with the V4L2_CID_USER_BCM2835_ISP_DPC ctrl.
++ *
++ * @enabled:  Enable DPC.
++ * @strength: DPC strength (see enum &bcm2835_isp_dpc_mode).
++ */
++struct bcm2835_isp_dpc {
++      __u32 enabled;
++      __u32 strength;
++};
++
++/*
++ * ISP statistics structures.
++ *
++ * The bcm2835_isp_stats structure is generated at the output of the
++ * statistics node.  Note that this does not directly map onto the statistics
++ * output of the ISP HW.  Instead, the MMAL firmware code maps the HW statistics
++ * to the bcm2835_isp_stats structure.
++ */
++#define DEFAULT_AWB_REGIONS_X 16
++#define DEFAULT_AWB_REGIONS_Y 12
++
++#define NUM_HISTOGRAMS 2
++#define NUM_HISTOGRAM_BINS 128
++#define AWB_REGIONS (DEFAULT_AWB_REGIONS_X * DEFAULT_AWB_REGIONS_Y)
++#define FLOATING_REGIONS 16
++#define AGC_REGIONS 16
++#define FOCUS_REGIONS 12
++
++/**
++ * struct bcm2835_isp_stats_hist - Histogram statistics
++ *
++ * @r_hist:   Red channel histogram.
++ * @g_hist:   Combined green channel histogram.
++ * @b_hist:   Blue channel histogram.
++ */
++struct bcm2835_isp_stats_hist {
++      __u32 r_hist[NUM_HISTOGRAM_BINS];
++      __u32 g_hist[NUM_HISTOGRAM_BINS];
++      __u32 b_hist[NUM_HISTOGRAM_BINS];
++};
++
++/**
++ * struct bcm2835_isp_stats_region - Region sums.
++ *
++ * @counted:  The number of 2x2 bayer tiles accumulated.
++ * @notcounted:       The number of 2x2 bayer tiles not accumulated.
++ * @r_sum:    Total sum of counted pixels in the red channel for a region.
++ * @g_sum:    Total sum of counted pixels in the green channel for a region.
++ * @b_sum:    Total sum of counted pixels in the blue channel for a region.
++ */
++struct bcm2835_isp_stats_region {
++      __u32 counted;
++      __u32 notcounted;
++      __u64 r_sum;
++      __u64 g_sum;
++      __u64 b_sum;
++};
++
++/**
++ * struct bcm2835_isp_stats_focus - Focus statistics.
++ *
++ * @contrast_val:     Focus measure - accumulated output of the focus filter.
++ *                    In the first dimension, index [0] counts pixels below a
++ *                    preset threshold, and index [1] counts pixels above the
++ *                    threshold.  In the second dimension, index [0] uses the
++ *                    first predefined filter, and index [1] uses the second
++ *                    predefined filter.
++ * @contrast_val_num: The number of counted pixels in the above accumulation.
++ */
++struct bcm2835_isp_stats_focus {
++      __u64 contrast_val[2][2];
++      __u32 contrast_val_num[2][2];
++};
++
++/**
++ * struct bcm2835_isp_stats - ISP statistics.
++ *
++ * @version:          Version of the bcm2835_isp_stats structure.
++ * @size:             Size of the bcm2835_isp_stats structure.
++ * @hist:             Histogram statistics for the entire image.
++ * @awb_stats:                Statistics for the regions defined for AWB calculations.
++ * @floating_stats:   Statistics for arbitrarily placed (floating) regions.
++ * @agc_stats:                Statistics for the regions defined for AGC calculations.
++ * @focus_stats:      Focus filter statistics for the focus regions.
++ */
++struct bcm2835_isp_stats {
++      __u32 version;
++      __u32 size;
++      struct bcm2835_isp_stats_hist hist[NUM_HISTOGRAMS];
++      struct bcm2835_isp_stats_region awb_stats[AWB_REGIONS];
++      struct bcm2835_isp_stats_region floating_stats[FLOATING_REGIONS];
++      struct bcm2835_isp_stats_region agc_stats[AGC_REGIONS];
++      struct bcm2835_isp_stats_focus focus_stats[FOCUS_REGIONS];
++};
++
++#endif /* __BCM2835_ISP_H_ */