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 (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 | 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 |
124 | |