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 <linux/math64.h> |
28 | #include <drm/drm_property.h> |
29 | |
30 | struct drm_crtc; |
31 | struct drm_plane; |
32 | |
33 | /** |
34 | * drm_color_lut_extract - clamp and round LUT entries |
35 | * @user_input: input value |
36 | * @bit_precision: number of bits the hw LUT supports |
37 | * |
38 | * Extract a degamma/gamma LUT value provided by user (in the form of |
39 | * &drm_color_lut entries) and round it to the precision supported by the |
40 | * hardware, following OpenGL int<->float conversion rules |
41 | * (see eg. OpenGL 4.6 specification - 2.3.5 Fixed-Point Data Conversions). |
42 | */ |
43 | static inline u32 (u32 user_input, int bit_precision) |
44 | { |
45 | if (bit_precision > 16) |
46 | return DIV_ROUND_CLOSEST_ULL(mul_u32_u32(user_input, (1 << bit_precision) - 1), |
47 | (1 << 16) - 1); |
48 | else |
49 | return DIV_ROUND_CLOSEST(user_input * ((1 << bit_precision) - 1), |
50 | (1 << 16) - 1); |
51 | } |
52 | |
53 | u64 drm_color_ctm_s31_32_to_qm_n(u64 user_input, u32 m, u32 n); |
54 | |
55 | void drm_crtc_enable_color_mgmt(struct drm_crtc *crtc, |
56 | uint degamma_lut_size, |
57 | bool has_ctm, |
58 | uint gamma_lut_size); |
59 | |
60 | int drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc, |
61 | int gamma_size); |
62 | |
63 | /** |
64 | * drm_color_lut_size - calculate the number of entries in the LUT |
65 | * @blob: blob containing the LUT |
66 | * |
67 | * Returns: |
68 | * The number of entries in the color LUT stored in @blob. |
69 | */ |
70 | static inline int drm_color_lut_size(const struct drm_property_blob *blob) |
71 | { |
72 | return blob->length / sizeof(struct drm_color_lut); |
73 | } |
74 | |
75 | enum drm_color_encoding { |
76 | DRM_COLOR_YCBCR_BT601, |
77 | DRM_COLOR_YCBCR_BT709, |
78 | DRM_COLOR_YCBCR_BT2020, |
79 | DRM_COLOR_ENCODING_MAX, |
80 | }; |
81 | |
82 | enum drm_color_range { |
83 | DRM_COLOR_YCBCR_LIMITED_RANGE, |
84 | DRM_COLOR_YCBCR_FULL_RANGE, |
85 | DRM_COLOR_RANGE_MAX, |
86 | }; |
87 | |
88 | int drm_plane_create_color_properties(struct drm_plane *plane, |
89 | u32 supported_encodings, |
90 | u32 supported_ranges, |
91 | enum drm_color_encoding default_encoding, |
92 | enum drm_color_range default_range); |
93 | |
94 | /** |
95 | * enum drm_color_lut_tests - hw-specific LUT tests to perform |
96 | * |
97 | * The drm_color_lut_check() function takes a bitmask of the values here to |
98 | * determine which tests to apply to a userspace-provided LUT. |
99 | */ |
100 | enum drm_color_lut_tests { |
101 | /** |
102 | * @DRM_COLOR_LUT_EQUAL_CHANNELS: |
103 | * |
104 | * Checks whether the entries of a LUT all have equal values for the |
105 | * red, green, and blue channels. Intended for hardware that only |
106 | * accepts a single value per LUT entry and assumes that value applies |
107 | * to all three color components. |
108 | */ |
109 | DRM_COLOR_LUT_EQUAL_CHANNELS = BIT(0), |
110 | |
111 | /** |
112 | * @DRM_COLOR_LUT_NON_DECREASING: |
113 | * |
114 | * Checks whether the entries of a LUT are always flat or increasing |
115 | * (never decreasing). |
116 | */ |
117 | DRM_COLOR_LUT_NON_DECREASING = BIT(1), |
118 | }; |
119 | |
120 | int drm_color_lut_check(const struct drm_property_blob *lut, u32 tests); |
121 | #endif |
122 | |