| /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ |
| #ifndef __SAMSUNG_DRM_H__ |
| #define __SAMSUNG_DRM_H__ |
| |
| #if defined(__linux__) |
| #include <linux/types.h> |
| #endif |
| |
| #include "drm.h" |
| |
| #if defined(__cplusplus) |
| extern "C" { |
| #endif |
| |
| #define DRM_SAMSUNG_HDR_EOTF_LUT_LEN 129 |
| |
| /** |
| * struct hdr_eotf_lut - HDR EOTF look up table to set by user-space |
| * |
| * @posx: x coordinate of the boundaries between segments in EOTF |
| * @posy: y coordinate of the boundaries between segments in EOTF |
| * |
| * A hdr_eotf_lut represents a look up table of EOTF(Electro-Optical Transfer |
| * Function). It is used for eotf_lut blob property of a plane object if |
| * a plane supports HDR10 feature. |
| */ |
| struct hdr_eotf_lut { |
| __u16 posx[DRM_SAMSUNG_HDR_EOTF_LUT_LEN]; |
| __u32 posy[DRM_SAMSUNG_HDR_EOTF_LUT_LEN]; |
| }; |
| |
| #define DRM_SAMSUNG_HDR_OETF_LUT_LEN 33 |
| |
| /** |
| * struct hdr_oetf_lut - HDR OETF look up table to set by user-space |
| * |
| * @posx: x coordinate of the boundaries between segments in OETF |
| * @posy: y coordinate of the boundaries between segments in OETF |
| * |
| * A hdr_oetf_lut represents a look up table of OETF(Optical-Electro Transfer |
| * Function). It is used for oetf_lut blob property of a plane object if |
| * a plane supports HDR10 feature. |
| */ |
| struct hdr_oetf_lut { |
| __u16 posx[DRM_SAMSUNG_HDR_OETF_LUT_LEN]; |
| __u16 posy[DRM_SAMSUNG_HDR_OETF_LUT_LEN]; |
| }; |
| |
| #define DRM_SAMSUNG_HDR_GM_DIMENS 3 |
| |
| /** |
| * struct hdr_gm_data - HDR gammut matrix data to set by user-space |
| * |
| * @coeffs: coefficients of a gammut matrix |
| * @offsets: offsets of a gammut matrix |
| * |
| * A hdr_gm_data represents coefficients and offsets of a gammut matrix. |
| * It is used to set a plane property for calculating a gammut matrix |
| * if a plane supports HDR10 feature. |
| */ |
| struct hdr_gm_data { |
| __u32 coeffs[DRM_SAMSUNG_HDR_GM_DIMENS * DRM_SAMSUNG_HDR_GM_DIMENS]; |
| __u32 offsets[DRM_SAMSUNG_HDR_GM_DIMENS]; |
| }; |
| |
| #define DRM_SAMSUNG_HDR_TM_LUT_LEN 33 |
| |
| /** |
| * struct hdr_tm_data - HDR tone mapping data and look up table to set |
| * by user-space. |
| * |
| * @coeff_r: coefficient to be multiplied with R to convert RGB to Y |
| * @coeff_g: coefficient to be multiplied with G to convert RGB to Y |
| * @coeff_b: coefficient to be multiplied with B to convert RGB to Y |
| * @rng_x_min: left boundary of the decreasing range of the ratio function |
| * for adaptive mixing |
| * @rng_x_max: right boundary of the decreasing range of the ratio function |
| * for adaptive mixing |
| * @rng_y_min: minimum ratio for adaptive mixing. |
| * @rng_y_max: maximum ratio for adaptive mixing. |
| * @posx: x coordinate of the boundaries between segments in tone mapping |
| * gain function. |
| * @posy: y coordinate of the boundaries between segments in tone mapping |
| * gain function. |
| * |
| * A hdr_tm_data represents tone mapping data. It is used to set a plane |
| * property for calculating tone mapping if a plane supports HDR10+ feature. |
| */ |
| struct hdr_tm_data { |
| __u16 coeff_r; |
| __u16 coeff_g; |
| __u16 coeff_b; |
| __u16 rng_x_min; |
| __u16 rng_x_max; |
| __u16 rng_y_min; |
| __u16 rng_y_max; |
| __u16 posx[DRM_SAMSUNG_HDR_TM_LUT_LEN]; |
| __u32 posy[DRM_SAMSUNG_HDR_TM_LUT_LEN]; |
| }; |
| |
| #define DRM_SAMSUNG_CGC_LUT_REG_CNT 2457 |
| |
| /** |
| * struct cgc_lut - color gammut control look up table to set by user-space |
| * |
| * @r_values: values for red color |
| * @g_values: values for green color |
| * @b_values: values for blue color |
| * |
| * A cgc_lut represents a look up table of color gammut control. It is used |
| * for cgc_lut blob property of a crtc object if a crtc support color gammut |
| * control. |
| */ |
| struct cgc_lut { |
| __u32 r_values[DRM_SAMSUNG_CGC_LUT_REG_CNT]; |
| __u32 g_values[DRM_SAMSUNG_CGC_LUT_REG_CNT]; |
| __u32 b_values[DRM_SAMSUNG_CGC_LUT_REG_CNT]; |
| }; |
| |
| #define DRM_SAMSUNG_CGC_DMA_LUT_ENTRY_CNT 4913 |
| /** |
| * struct cgc_dma_lut - color gammut control format for cgc dma to set by user-space |
| * |
| * @r_value: value for red color |
| * @g_value: value for green color |
| * @b_value: value for blue color |
| * |
| * A cgc_dma_lut represents a format to support cgc dma. cgc coefficients should be |
| * located in dram according to this format. |
| */ |
| struct cgc_dma_lut { |
| __u16 r_value; |
| __u16 g_value; |
| __u16 b_value; |
| }; |
| |
| #define DRM_SAMSUNG_MATRIX_DIMENS 3 |
| |
| /** |
| * struct exynos_matrix - a matrix data to set by user-space |
| * |
| * @coeffs: coefficients of a matrix |
| * @offsets: offsets of a matrix |
| * |
| * A exynos_matrix represents coefficients and offsets of a matrix. |
| * It is used to set a property for calculating a matrix. |
| */ |
| struct exynos_matrix { |
| __u16 coeffs[DRM_SAMSUNG_MATRIX_DIMENS * DRM_SAMSUNG_MATRIX_DIMENS]; |
| __u16 offsets[DRM_SAMSUNG_MATRIX_DIMENS]; |
| }; |
| |
| struct dpp_size_range { |
| __u32 min; |
| __u32 max; |
| __u32 align; |
| }; |
| |
| struct dpp_restriction { |
| struct dpp_size_range src_f_w; |
| struct dpp_size_range src_f_h; |
| struct dpp_size_range src_w; |
| struct dpp_size_range src_h; |
| __u32 src_x_align; |
| __u32 src_y_align; |
| |
| struct dpp_size_range dst_f_w; |
| struct dpp_size_range dst_f_h; |
| struct dpp_size_range dst_w; |
| struct dpp_size_range dst_h; |
| __u32 dst_x_align; |
| __u32 dst_y_align; |
| |
| struct dpp_size_range blk_w; |
| struct dpp_size_range blk_h; |
| __u32 blk_x_align; |
| __u32 blk_y_align; |
| |
| __u32 src_h_rot_max; /* limit of source img height in case of rotation */ |
| |
| __u32 scale_down; |
| __u32 scale_up; |
| }; |
| |
| struct dpp_ch_restriction { |
| __s32 id; |
| __u64 attr; |
| struct dpp_restriction restriction; |
| }; |
| |
| /** |
| * struct dither_config - a dither configuration data to set by user-space |
| * |
| * @en: enable or disable a dither |
| * @mode: 0 for dither, 1 for 2bits shift |
| * @frame_con: If frame control is on, the temporal dither is used. Otherwise, |
| * the spatial dither is used. If temporal dither is used, a |
| * different dither mask can be used for each frame counter. |
| * @frame_offset: The dithers in DQE use same frame counter. However, if two |
| * dithers set a different frame offsets, each dither can select |
| * a different dither mask according to the different frame |
| * counter + offset. |
| * @table_sel_r/g/b: It can select a different dither mask for each channel. |
| * |
| * A dither_config represents the information necessary for setting up the |
| * dither in DQE. It is used to set a property of a crtc for dither |
| * configuration. |
| */ |
| struct dither_config { |
| __u8 en:1; |
| __u8 mode:1; |
| __u8 frame_con:1; |
| __u8 frame_offset:2; |
| __u8 table_sel_r:1; |
| __u8 table_sel_g:1; |
| __u8 table_sel_b:1; |
| __u32 reserved:24; |
| }; |
| |
| struct attribute_range { |
| __u32 min; |
| __u32 max; |
| }; |
| |
| /** |
| * struct brightness_attribute - brightness attribute data |
| * |
| * @nits: value represents brightness nits range |
| * @level: value represents panel brightness level range |
| * @percentage: value must be between 0 and 100 and be non-decreasing. |
| * This percentage must comply with display configuration |
| * file. |
| * |
| * A brightness_attribute represents brightness attribute data. |
| */ |
| struct brightness_attribute { |
| struct attribute_range nits; |
| struct attribute_range level; |
| struct attribute_range percentage; |
| }; |
| |
| /** |
| * struct brightness_capability - brightness capability query by user-space |
| * |
| * @normal: normal rerepresents the normal brightness attribute. |
| * @hbm: hbm represents the hbm brightness attribute |
| * |
| * A brightness_capability represents normal/hbm brightness attribute. It is |
| * used to query connector property. |
| */ |
| struct brightness_capability { |
| struct brightness_attribute normal; |
| struct brightness_attribute hbm; |
| }; |
| |
| /** |
| * struct tui_hw_buffer - buffer allocation query by user-space |
| * |
| * @fb_physical: the physical address of the buffer allocated |
| * @fb_size: the size of the buffer allocated |
| * |
| * The structure is used to return the parameter of the allocated buffer. |
| */ |
| struct tui_hw_buffer { |
| __u64 fb_physical; |
| __u64 fb_size; |
| } __attribute__((packed)); |
| |
| #define EXYNOS_START_TUI 0x10 |
| #define EXYNOS_FINISH_TUI 0x11 |
| #define EXYNOS_TUI_REQUEST_BUFFER 0x20 |
| #define EXYNOS_TUI_RELEASE_BUFFER 0x21 |
| |
| /** |
| * struct histogram_roi - region of interest for histogram to set by user-space |
| * |
| * @start_x: upper left x position of ROI |
| * @start_y: upper left y position of ROI |
| * @hsize: horizontal size of image |
| * @vsize: vertical size of image |
| * |
| * A histogram_roi sets region of interest on image for gathering histogram |
| * data. It is used to set a property of a crtc. |
| */ |
| struct histogram_roi { |
| __u16 start_x; |
| __u16 start_y; |
| __u16 hsize; |
| __u16 vsize; |
| }; |
| |
| /** |
| * struct histogram_weights - weight for each color component to set by user-space |
| * |
| * @weight_r: histogram weight for red |
| * @weight_g: histogram weight for green |
| * @weight_b: histogram weight for blue |
| * |
| * A histogram_weights sets a weight of each color component for calculating |
| * histogram data. It is used to set a property of a crtc. |
| */ |
| struct histogram_weights { |
| __u16 weight_r; |
| __u16 weight_g; |
| __u16 weight_b; |
| }; |
| |
| #define HISTOGRAM_BIN_COUNT 256 |
| struct histogram_bins { |
| __u16 data[HISTOGRAM_BIN_COUNT]; |
| }; |
| |
| #define EXYNOS_DRM_HISTOGRAM_EVENT 0x80000000 |
| |
| /** |
| * struct exynos_drm_histogram_event - histogram event to wait for user-space |
| * |
| * @base: event header which informs user space event type and length. |
| * @bins: histogram bin data to be sent to user space through using read() |
| * |
| * User space waits for POLLIN event using like poll() or select(). If event |
| * type is EXYNOS_DRM_HISTOGRAM_EVENT, user space can try to read histogram |
| * bin data through "bins". |
| */ |
| struct exynos_drm_histogram_event { |
| struct drm_event base; |
| struct histogram_bins bins; |
| __u32 crtc_id; |
| }; |
| |
| /** |
| * enum exynos_prog_pos - defines programmable positions |
| * |
| * For example, histogram position and writeback path could be |
| * programmable. This enum defines positions for it. |
| */ |
| enum exynos_prog_pos { |
| POST_DQE, |
| PRE_DQE, |
| }; |
| |
| #define EXYNOS_HISTOGRAM_REQUEST 0x0 |
| #define EXYNOS_HISTOGRAM_CANCEL 0x1 |
| |
| #define DRM_IOCTL_EXYNOS_HISTOGRAM_REQUEST DRM_IOW(DRM_COMMAND_BASE + \ |
| EXYNOS_HISTOGRAM_REQUEST, __u32) |
| #define DRM_IOCTL_EXYNOS_HISTOGRAM_CANCEL DRM_IOW(DRM_COMMAND_BASE + \ |
| EXYNOS_HISTOGRAM_CANCEL, __u32) |
| |
| #if defined(__cplusplus) |
| } |
| #endif |
| |
| #endif /* __SAMSUNG_DRM_H__ */ |