drm/i915/display: Add func to compare hw/sw gamma lut
Add func intel_color_lut_equal() to compare hw/sw gamma lut values. Since hw/sw gamma lut sizes and lut entries comparison will be different for different gamma modes, add gamma mode dependent checks. v3: -Rebase v4: -Renamed intel_compare_color_lut() to intel_color_lut_equal() [Jani] -Added the default label above the correct label [Jani] -Corrected smatch warn "variable dereferenced before check" [Dan Carpenter] v5: -Added condition (!blob1 && !blob2) return true [Jani] v6: -Made patch11 as patch3 [Jani] v8: -Split patch 3 into 4 patches -Optimized blob check condition [Ville] v9: -Exclude spilt gamma mode (bdw and ivb platforms) as there is exception in way gamma values are written in hardware [Ville] -Added exception made in commit [Uma] -Dropped else, character limit and indentation [Uma] -Added multi segmented gama mode for icl+ platforms [Uma] v10: -Dropped multi segmented mode for icl+ platforms [Jani] -Removed references of sw and hw state in compare code [Jani] -Dropped inline from func [Jani] Signed-off-by: Swati Sharma <swati2.sharma@intel.com> Reviewed-by: Jani Nikula <jani.nikula@intel.com> Signed-off-by: Jani Nikula <jani.nikula@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/1567538578-4489-4-git-send-email-swati2.sharma@intel.com
This commit is contained in:
Родитель
145450f6a4
Коммит
e9c8f59144
|
@ -1431,6 +1431,78 @@ int intel_color_get_gamma_bit_precision(const struct intel_crtc_state *crtc_stat
|
|||
return 0;
|
||||
}
|
||||
|
||||
static bool err_check(struct drm_color_lut *lut1,
|
||||
struct drm_color_lut *lut2, u32 err)
|
||||
{
|
||||
return ((abs((long)lut2->red - lut1->red)) <= err) &&
|
||||
((abs((long)lut2->blue - lut1->blue)) <= err) &&
|
||||
((abs((long)lut2->green - lut1->green)) <= err);
|
||||
}
|
||||
|
||||
static bool intel_color_lut_entry_equal(struct drm_color_lut *lut1,
|
||||
struct drm_color_lut *lut2,
|
||||
int lut_size, u32 err)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < lut_size; i++) {
|
||||
if (!err_check(&lut1[i], &lut2[i], err))
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool intel_color_lut_equal(struct drm_property_blob *blob1,
|
||||
struct drm_property_blob *blob2,
|
||||
u32 gamma_mode, u32 bit_precision)
|
||||
{
|
||||
struct drm_color_lut *lut1, *lut2;
|
||||
int lut_size1, lut_size2;
|
||||
u32 err;
|
||||
|
||||
if (!blob1 != !blob2)
|
||||
return false;
|
||||
|
||||
if (!blob1)
|
||||
return true;
|
||||
|
||||
lut_size1 = drm_color_lut_size(blob1);
|
||||
lut_size2 = drm_color_lut_size(blob2);
|
||||
|
||||
/* check sw and hw lut size */
|
||||
switch (gamma_mode) {
|
||||
case GAMMA_MODE_MODE_8BIT:
|
||||
case GAMMA_MODE_MODE_10BIT:
|
||||
if (lut_size1 != lut_size2)
|
||||
return false;
|
||||
break;
|
||||
default:
|
||||
MISSING_CASE(gamma_mode);
|
||||
return false;
|
||||
}
|
||||
|
||||
lut1 = blob1->data;
|
||||
lut2 = blob2->data;
|
||||
|
||||
err = 0xffff >> bit_precision;
|
||||
|
||||
/* check sw and hw lut entry to be equal */
|
||||
switch (gamma_mode) {
|
||||
case GAMMA_MODE_MODE_8BIT:
|
||||
case GAMMA_MODE_MODE_10BIT:
|
||||
if (!intel_color_lut_entry_equal(lut1, lut2,
|
||||
lut_size2, err))
|
||||
return false;
|
||||
break;
|
||||
default:
|
||||
MISSING_CASE(gamma_mode);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void intel_color_init(struct intel_crtc *crtc)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
|
|
|
@ -6,8 +6,11 @@
|
|||
#ifndef __INTEL_COLOR_H__
|
||||
#define __INTEL_COLOR_H__
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct intel_crtc_state;
|
||||
struct intel_crtc;
|
||||
struct drm_property_blob;
|
||||
|
||||
void intel_color_init(struct intel_crtc *crtc);
|
||||
int intel_color_check(struct intel_crtc_state *crtc_state);
|
||||
|
@ -15,5 +18,8 @@ void intel_color_commit(const struct intel_crtc_state *crtc_state);
|
|||
void intel_color_load_luts(const struct intel_crtc_state *crtc_state);
|
||||
void intel_color_get_config(struct intel_crtc_state *crtc_state);
|
||||
int intel_color_get_gamma_bit_precision(const struct intel_crtc_state *crtc_state);
|
||||
bool intel_color_lut_equal(struct drm_property_blob *blob1,
|
||||
struct drm_property_blob *blob2,
|
||||
u32 gamma_mode, u32 bit_precision);
|
||||
|
||||
#endif /* __INTEL_COLOR_H__ */
|
||||
|
|
Загрузка…
Ссылка в новой задаче