media: raspberrypi: Add support for RP1-CFE
Add support for Raspberry Pi CFE. The CFE is a hardware block that
contains:
- MIPI D-PHY
- MIPI CSI-2 receiver
- Front End ISP (FE)
The driver has been upported from the Raspberry Pi kernel commit
88a681df9623 ("ARM: dts: bcm2712-rpi: Add i2c<n>_pins labels").
Co-developed-by: Naushir Patuck <naush@raspberrypi.com>
Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
committed by
Mauro Carvalho Chehab
parent
1358bb5239
commit
6edb685abb
@@ -0,0 +1,273 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
|
||||
/*
|
||||
* RP1 PiSP Front End Driver Configuration structures
|
||||
*
|
||||
* Copyright (C) 2021 - Raspberry Pi Ltd.
|
||||
*
|
||||
*/
|
||||
#ifndef _UAPI_PISP_FE_CONFIG_
|
||||
#define _UAPI_PISP_FE_CONFIG_
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#include "pisp_common.h"
|
||||
#include "pisp_fe_statistics.h"
|
||||
|
||||
#define PISP_FE_NUM_OUTPUTS 2
|
||||
|
||||
enum pisp_fe_enable {
|
||||
PISP_FE_ENABLE_INPUT = 0x000001,
|
||||
PISP_FE_ENABLE_DECOMPRESS = 0x000002,
|
||||
PISP_FE_ENABLE_DECOMPAND = 0x000004,
|
||||
PISP_FE_ENABLE_BLA = 0x000008,
|
||||
PISP_FE_ENABLE_DPC = 0x000010,
|
||||
PISP_FE_ENABLE_STATS_CROP = 0x000020,
|
||||
PISP_FE_ENABLE_DECIMATE = 0x000040,
|
||||
PISP_FE_ENABLE_BLC = 0x000080,
|
||||
PISP_FE_ENABLE_CDAF_STATS = 0x000100,
|
||||
PISP_FE_ENABLE_AWB_STATS = 0x000200,
|
||||
PISP_FE_ENABLE_RGBY = 0x000400,
|
||||
PISP_FE_ENABLE_LSC = 0x000800,
|
||||
PISP_FE_ENABLE_AGC_STATS = 0x001000,
|
||||
PISP_FE_ENABLE_CROP0 = 0x010000,
|
||||
PISP_FE_ENABLE_DOWNSCALE0 = 0x020000,
|
||||
PISP_FE_ENABLE_COMPRESS0 = 0x040000,
|
||||
PISP_FE_ENABLE_OUTPUT0 = 0x080000,
|
||||
PISP_FE_ENABLE_CROP1 = 0x100000,
|
||||
PISP_FE_ENABLE_DOWNSCALE1 = 0x200000,
|
||||
PISP_FE_ENABLE_COMPRESS1 = 0x400000,
|
||||
PISP_FE_ENABLE_OUTPUT1 = 0x800000
|
||||
};
|
||||
|
||||
#define PISP_FE_ENABLE_CROP(i) (PISP_FE_ENABLE_CROP0 << (4 * (i)))
|
||||
#define PISP_FE_ENABLE_DOWNSCALE(i) (PISP_FE_ENABLE_DOWNSCALE0 << (4 * (i)))
|
||||
#define PISP_FE_ENABLE_COMPRESS(i) (PISP_FE_ENABLE_COMPRESS0 << (4 * (i)))
|
||||
#define PISP_FE_ENABLE_OUTPUT(i) (PISP_FE_ENABLE_OUTPUT0 << (4 * (i)))
|
||||
|
||||
/*
|
||||
* We use the enable flags to show when blocks are "dirty", but we need some
|
||||
* extra ones too.
|
||||
*/
|
||||
enum pisp_fe_dirty {
|
||||
PISP_FE_DIRTY_GLOBAL = 0x0001,
|
||||
PISP_FE_DIRTY_FLOATING = 0x0002,
|
||||
PISP_FE_DIRTY_OUTPUT_AXI = 0x0004
|
||||
};
|
||||
|
||||
struct pisp_fe_global_config {
|
||||
__u32 enables;
|
||||
__u8 bayer_order;
|
||||
__u8 pad[3];
|
||||
} __attribute__((packed));
|
||||
|
||||
struct pisp_fe_input_axi_config {
|
||||
/* burst length minus one, in the range 0..15; OR'd with flags */
|
||||
__u8 maxlen_flags;
|
||||
/* { prot[2:0], cache[3:0] } fields */
|
||||
__u8 cache_prot;
|
||||
/* QoS (only 4 LS bits are used) */
|
||||
__u16 qos;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct pisp_fe_output_axi_config {
|
||||
/* burst length minus one, in the range 0..15; OR'd with flags */
|
||||
__u8 maxlen_flags;
|
||||
/* { prot[2:0], cache[3:0] } fields */
|
||||
__u8 cache_prot;
|
||||
/* QoS (4 bitfields of 4 bits each for different panic levels) */
|
||||
__u16 qos;
|
||||
/* For Panic mode: Output FIFO panic threshold */
|
||||
__u16 thresh;
|
||||
/* For Panic mode: Output FIFO statistics throttle threshold */
|
||||
__u16 throttle;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct pisp_fe_input_config {
|
||||
__u8 streaming;
|
||||
__u8 pad[3];
|
||||
struct pisp_image_format_config format;
|
||||
struct pisp_fe_input_axi_config axi;
|
||||
/* Extra cycles delay before issuing each burst request */
|
||||
__u8 holdoff;
|
||||
__u8 pad2[3];
|
||||
} __attribute__((packed));
|
||||
|
||||
struct pisp_fe_output_config {
|
||||
struct pisp_image_format_config format;
|
||||
__u16 ilines;
|
||||
__u8 pad[2];
|
||||
} __attribute__((packed));
|
||||
|
||||
struct pisp_fe_input_buffer_config {
|
||||
__u32 addr_lo;
|
||||
__u32 addr_hi;
|
||||
__u16 frame_id;
|
||||
__u16 pad;
|
||||
} __attribute__((packed));
|
||||
|
||||
#define PISP_FE_DECOMPAND_LUT_SIZE 65
|
||||
|
||||
struct pisp_fe_decompand_config {
|
||||
__u16 lut[PISP_FE_DECOMPAND_LUT_SIZE];
|
||||
__u16 pad;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct pisp_fe_dpc_config {
|
||||
__u8 coeff_level;
|
||||
__u8 coeff_range;
|
||||
__u8 coeff_range2;
|
||||
#define PISP_FE_DPC_FLAG_FOLDBACK 1
|
||||
#define PISP_FE_DPC_FLAG_VFLAG 2
|
||||
__u8 flags;
|
||||
} __attribute__((packed));
|
||||
|
||||
#define PISP_FE_LSC_LUT_SIZE 16
|
||||
|
||||
struct pisp_fe_lsc_config {
|
||||
__u8 shift;
|
||||
__u8 pad0;
|
||||
__u16 scale;
|
||||
__u16 centre_x;
|
||||
__u16 centre_y;
|
||||
__u16 lut[PISP_FE_LSC_LUT_SIZE];
|
||||
} __attribute__((packed));
|
||||
|
||||
struct pisp_fe_rgby_config {
|
||||
__u16 gain_r;
|
||||
__u16 gain_g;
|
||||
__u16 gain_b;
|
||||
__u8 maxflag;
|
||||
__u8 pad;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct pisp_fe_agc_stats_config {
|
||||
__u16 offset_x;
|
||||
__u16 offset_y;
|
||||
__u16 size_x;
|
||||
__u16 size_y;
|
||||
/* each weight only 4 bits */
|
||||
__u8 weights[PISP_AGC_STATS_NUM_ZONES / 2];
|
||||
__u16 row_offset_x;
|
||||
__u16 row_offset_y;
|
||||
__u16 row_size_x;
|
||||
__u16 row_size_y;
|
||||
__u8 row_shift;
|
||||
__u8 float_shift;
|
||||
__u8 pad1[2];
|
||||
} __attribute__((packed));
|
||||
|
||||
struct pisp_fe_awb_stats_config {
|
||||
__u16 offset_x;
|
||||
__u16 offset_y;
|
||||
__u16 size_x;
|
||||
__u16 size_y;
|
||||
__u8 shift;
|
||||
__u8 pad[3];
|
||||
__u16 r_lo;
|
||||
__u16 r_hi;
|
||||
__u16 g_lo;
|
||||
__u16 g_hi;
|
||||
__u16 b_lo;
|
||||
__u16 b_hi;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct pisp_fe_floating_stats_region {
|
||||
__u16 offset_x;
|
||||
__u16 offset_y;
|
||||
__u16 size_x;
|
||||
__u16 size_y;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct pisp_fe_floating_stats_config {
|
||||
struct pisp_fe_floating_stats_region
|
||||
regions[PISP_FLOATING_STATS_NUM_ZONES];
|
||||
} __attribute__((packed));
|
||||
|
||||
#define PISP_FE_CDAF_NUM_WEIGHTS 8
|
||||
|
||||
struct pisp_fe_cdaf_stats_config {
|
||||
__u16 noise_constant;
|
||||
__u16 noise_slope;
|
||||
__u16 offset_x;
|
||||
__u16 offset_y;
|
||||
__u16 size_x;
|
||||
__u16 size_y;
|
||||
__u16 skip_x;
|
||||
__u16 skip_y;
|
||||
__u32 mode;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct pisp_fe_stats_buffer_config {
|
||||
__u32 addr_lo;
|
||||
__u32 addr_hi;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct pisp_fe_crop_config {
|
||||
__u16 offset_x;
|
||||
__u16 offset_y;
|
||||
__u16 width;
|
||||
__u16 height;
|
||||
} __attribute__((packed));
|
||||
|
||||
enum pisp_fe_downscale_flags {
|
||||
/* downscale the four Bayer components independently... */
|
||||
DOWNSCALE_BAYER = 1,
|
||||
/* ...without trying to preserve their spatial relationship */
|
||||
DOWNSCALE_BIN = 2,
|
||||
};
|
||||
|
||||
struct pisp_fe_downscale_config {
|
||||
__u8 xin;
|
||||
__u8 xout;
|
||||
__u8 yin;
|
||||
__u8 yout;
|
||||
__u8 flags; /* enum pisp_fe_downscale_flags */
|
||||
__u8 pad[3];
|
||||
__u16 output_width;
|
||||
__u16 output_height;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct pisp_fe_output_buffer_config {
|
||||
__u32 addr_lo;
|
||||
__u32 addr_hi;
|
||||
} __attribute__((packed));
|
||||
|
||||
/* Each of the two output channels/branches: */
|
||||
struct pisp_fe_output_branch_config {
|
||||
struct pisp_fe_crop_config crop;
|
||||
struct pisp_fe_downscale_config downscale;
|
||||
struct pisp_compress_config compress;
|
||||
struct pisp_fe_output_config output;
|
||||
__u32 pad;
|
||||
} __attribute__((packed));
|
||||
|
||||
/* And finally one to rule them all: */
|
||||
struct pisp_fe_config {
|
||||
/* I/O configuration: */
|
||||
struct pisp_fe_stats_buffer_config stats_buffer;
|
||||
struct pisp_fe_output_buffer_config output_buffer[PISP_FE_NUM_OUTPUTS];
|
||||
struct pisp_fe_input_buffer_config input_buffer;
|
||||
/* processing configuration: */
|
||||
struct pisp_fe_global_config global;
|
||||
struct pisp_fe_input_config input;
|
||||
struct pisp_decompress_config decompress;
|
||||
struct pisp_fe_decompand_config decompand;
|
||||
struct pisp_bla_config bla;
|
||||
struct pisp_fe_dpc_config dpc;
|
||||
struct pisp_fe_crop_config stats_crop;
|
||||
__u32 spare1; /* placeholder for future decimate configuration */
|
||||
struct pisp_bla_config blc;
|
||||
struct pisp_fe_rgby_config rgby;
|
||||
struct pisp_fe_lsc_config lsc;
|
||||
struct pisp_fe_agc_stats_config agc_stats;
|
||||
struct pisp_fe_awb_stats_config awb_stats;
|
||||
struct pisp_fe_cdaf_stats_config cdaf_stats;
|
||||
struct pisp_fe_floating_stats_config floating_stats;
|
||||
struct pisp_fe_output_axi_config output_axi;
|
||||
struct pisp_fe_output_branch_config ch[PISP_FE_NUM_OUTPUTS];
|
||||
/* non-register fields: */
|
||||
__u32 dirty_flags; /* these use pisp_fe_enable */
|
||||
__u32 dirty_flags_extra; /* these use pisp_fe_dirty */
|
||||
} __attribute__((packed));
|
||||
|
||||
#endif /* _UAPI_PISP_FE_CONFIG_ */
|
||||
@@ -0,0 +1,64 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
|
||||
/*
|
||||
* RP1 PiSP Front End statistics definitions
|
||||
*
|
||||
* Copyright (C) 2021 - Raspberry Pi Ltd.
|
||||
*
|
||||
*/
|
||||
#ifndef _UAPI_PISP_FE_STATISTICS_H_
|
||||
#define _UAPI_PISP_FE_STATISTICS_H_
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#define PISP_FLOATING_STATS_NUM_ZONES 4
|
||||
#define PISP_AGC_STATS_NUM_BINS 1024
|
||||
#define PISP_AGC_STATS_SIZE 16
|
||||
#define PISP_AGC_STATS_NUM_ZONES (PISP_AGC_STATS_SIZE * PISP_AGC_STATS_SIZE)
|
||||
#define PISP_AGC_STATS_NUM_ROW_SUMS 512
|
||||
|
||||
struct pisp_agc_statistics_zone {
|
||||
__u64 Y_sum;
|
||||
__u32 counted;
|
||||
__u32 pad;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct pisp_agc_statistics {
|
||||
__u32 row_sums[PISP_AGC_STATS_NUM_ROW_SUMS];
|
||||
/*
|
||||
* 32-bits per bin means an image (just less than) 16384x16384 pixels
|
||||
* in size can weight every pixel from 0 to 15.
|
||||
*/
|
||||
__u32 histogram[PISP_AGC_STATS_NUM_BINS];
|
||||
struct pisp_agc_statistics_zone floating[PISP_FLOATING_STATS_NUM_ZONES];
|
||||
} __attribute__((packed));
|
||||
|
||||
#define PISP_AWB_STATS_SIZE 32
|
||||
#define PISP_AWB_STATS_NUM_ZONES (PISP_AWB_STATS_SIZE * PISP_AWB_STATS_SIZE)
|
||||
|
||||
struct pisp_awb_statistics_zone {
|
||||
__u32 R_sum;
|
||||
__u32 G_sum;
|
||||
__u32 B_sum;
|
||||
__u32 counted;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct pisp_awb_statistics {
|
||||
struct pisp_awb_statistics_zone zones[PISP_AWB_STATS_NUM_ZONES];
|
||||
struct pisp_awb_statistics_zone floating[PISP_FLOATING_STATS_NUM_ZONES];
|
||||
} __attribute__((packed));
|
||||
|
||||
#define PISP_CDAF_STATS_SIZE 8
|
||||
#define PISP_CDAF_STATS_NUM_FOMS (PISP_CDAF_STATS_SIZE * PISP_CDAF_STATS_SIZE)
|
||||
|
||||
struct pisp_cdaf_statistics {
|
||||
__u64 foms[PISP_CDAF_STATS_NUM_FOMS];
|
||||
__u64 floating[PISP_FLOATING_STATS_NUM_ZONES];
|
||||
} __attribute__((packed));
|
||||
|
||||
struct pisp_statistics {
|
||||
struct pisp_awb_statistics awb;
|
||||
struct pisp_agc_statistics agc;
|
||||
struct pisp_cdaf_statistics cdaf;
|
||||
} __attribute__((packed));
|
||||
|
||||
#endif /* _UAPI_PISP_FE_STATISTICS_H_ */
|
||||
Reference in New Issue
Block a user