linux/include/drm/drm_color_mgmt.h
<<
>>
Prefs
   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
  29struct drm_crtc;
  30struct 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 */
  41static 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
  55u64 drm_color_ctm_s31_32_to_qm_n(u64 user_input, u32 m, u32 n);
  56
  57void drm_crtc_enable_color_mgmt(struct drm_crtc *crtc,
  58                                uint degamma_lut_size,
  59                                bool has_ctm,
  60                                uint gamma_lut_size);
  61
  62int 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 */
  72static inline int drm_color_lut_size(const struct drm_property_blob *blob)
  73{
  74        return blob->length / sizeof(struct drm_color_lut);
  75}
  76
  77enum 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
  84enum drm_color_range {
  85        DRM_COLOR_YCBCR_LIMITED_RANGE,
  86        DRM_COLOR_YCBCR_FULL_RANGE,
  87        DRM_COLOR_RANGE_MAX,
  88};
  89
  90int 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 */
 102enum 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
 122int drm_color_lut_check(const struct drm_property_blob *lut, u32 tests);
 123#endif
 124