Line data Source code
1 : /* 2 : * Copyright (c) 2016 Intel Corporation 3 : * 4 : * Permission to use, copy, modify, distribute, and sell this software and its 5 : * documentation for any purpose is hereby granted without fee, provided that 6 : * the above copyright notice appear in all copies and that both that copyright 7 : * notice and this permission notice appear in supporting documentation, and 8 : * that the name of the copyright holders not be used in advertising or 9 : * publicity pertaining to distribution of the software without specific, 10 : * written prior permission. The copyright holders make no representations 11 : * about the suitability of this software for any purpose. It is provided "as 12 : * is" without express or implied warranty. 13 : * 14 : * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 15 : * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 16 : * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 17 : * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 18 : * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 19 : * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 20 : * OF THIS SOFTWARE. 21 : */ 22 : 23 : #ifndef __DRM_COLOR_MGMT_H__ 24 : #define __DRM_COLOR_MGMT_H__ 25 : 26 : #include <linux/ctype.h> 27 : #include <drm/drm_property.h> 28 : 29 : struct drm_crtc; 30 : struct drm_plane; 31 : 32 : /** 33 : * drm_color_lut_extract - clamp and round LUT entries 34 : * @user_input: input value 35 : * @bit_precision: number of bits the hw LUT supports 36 : * 37 : * Extract a degamma/gamma LUT value provided by user (in the form of 38 : * &drm_color_lut entries) and round it to the precision supported by the 39 : * hardware. 40 : */ 41 : static inline u32 drm_color_lut_extract(u32 user_input, int bit_precision) 42 : { 43 : u32 val = user_input; 44 : u32 max = 0xffff >> (16 - bit_precision); 45 : 46 : /* Round only if we're not using full precision. */ 47 : if (bit_precision < 16) { 48 : val += 1UL << (16 - bit_precision - 1); 49 : val >>= 16 - bit_precision; 50 : } 51 : 52 : return clamp_val(val, 0, max); 53 : } 54 : 55 : u64 drm_color_ctm_s31_32_to_qm_n(u64 user_input, u32 m, u32 n); 56 : 57 : void drm_crtc_enable_color_mgmt(struct drm_crtc *crtc, 58 : uint degamma_lut_size, 59 : bool has_ctm, 60 : uint gamma_lut_size); 61 : 62 : int drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc, 63 : int gamma_size); 64 : 65 : /** 66 : * drm_color_lut_size - calculate the number of entries in the LUT 67 : * @blob: blob containing the LUT 68 : * 69 : * Returns: 70 : * The number of entries in the color LUT stored in @blob. 71 : */ 72 : static inline int drm_color_lut_size(const struct drm_property_blob *blob) 73 : { 74 0 : return blob->length / sizeof(struct drm_color_lut); 75 : } 76 : 77 : enum drm_color_encoding { 78 : DRM_COLOR_YCBCR_BT601, 79 : DRM_COLOR_YCBCR_BT709, 80 : DRM_COLOR_YCBCR_BT2020, 81 : DRM_COLOR_ENCODING_MAX, 82 : }; 83 : 84 : enum drm_color_range { 85 : DRM_COLOR_YCBCR_LIMITED_RANGE, 86 : DRM_COLOR_YCBCR_FULL_RANGE, 87 : DRM_COLOR_RANGE_MAX, 88 : }; 89 : 90 : int drm_plane_create_color_properties(struct drm_plane *plane, 91 : u32 supported_encodings, 92 : u32 supported_ranges, 93 : enum drm_color_encoding default_encoding, 94 : enum drm_color_range default_range); 95 : 96 : /** 97 : * enum drm_color_lut_tests - hw-specific LUT tests to perform 98 : * 99 : * The drm_color_lut_check() function takes a bitmask of the values here to 100 : * determine which tests to apply to a userspace-provided LUT. 101 : */ 102 : enum drm_color_lut_tests { 103 : /** 104 : * @DRM_COLOR_LUT_EQUAL_CHANNELS: 105 : * 106 : * Checks whether the entries of a LUT all have equal values for the 107 : * red, green, and blue channels. Intended for hardware that only 108 : * accepts a single value per LUT entry and assumes that value applies 109 : * to all three color components. 110 : */ 111 : DRM_COLOR_LUT_EQUAL_CHANNELS = BIT(0), 112 : 113 : /** 114 : * @DRM_COLOR_LUT_NON_DECREASING: 115 : * 116 : * Checks whether the entries of a LUT are always flat or increasing 117 : * (never decreasing). 118 : */ 119 : DRM_COLOR_LUT_NON_DECREASING = BIT(1), 120 : }; 121 : 122 : int drm_color_lut_check(const struct drm_property_blob *lut, u32 tests); 123 : #endif