[v8,03/10] drm/i915/display: Add func to compare hw/sw gamma lut
diff mbox series

Message ID 1566800772-18412-4-git-send-email-swati2.sharma@intel.com
State New
Headers show
Series
  • drm/i915: adding state checker for gamma lut value
Related show

Commit Message

Swati Sharma Aug. 26, 2019, 6:26 a.m. UTC
Add func intel_color_lut_equal() to compare hw/sw gamma
lut values. Since hw/sw gamma lut sizes and lut enteries comparsion
will be different for different gamma modes, add gamma mode dependent
checks.

Signed-off-by: Swati Sharma <swati2.sharma@intel.com>
---
 drivers/gpu/drm/i915/display/intel_color.c | 71 ++++++++++++++++++++++++++++++
 drivers/gpu/drm/i915/display/intel_color.h |  6 +++
 2 files changed, 77 insertions(+)

Comments

Shankar, Uma Aug. 28, 2019, 3:22 p.m. UTC | #1
>-----Original Message-----
>From: Sharma, Swati2
>Sent: Monday, August 26, 2019 11:56 AM
>To: intel-gfx@lists.freedesktop.org
>Cc: Nikula, Jani <jani.nikula@intel.com>; Sharma, Shashank
><shashank.sharma@intel.com>; Manna, Animesh <animesh.manna@intel.com>;
>Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; daniel.vetter@ffwll.ch;
>ville.syrjala@linux.intel.com; Shankar, Uma <uma.shankar@intel.com>; Sharma,
>Swati2 <swati2.sharma@intel.com>
>Subject: [v8][PATCH 03/10] 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 enteries comparsion will be different for different gamma

Typo here in entries and comparison.

>modes, add gamma mode dependent checks.

Please keep the revision history of patch as well. Also add what is changed from the
previous version, like limiting to gamma mode alone.

>Signed-off-by: Swati Sharma <swati2.sharma@intel.com>
>---
> drivers/gpu/drm/i915/display/intel_color.c | 71 ++++++++++++++++++++++++++++++
>drivers/gpu/drm/i915/display/intel_color.h |  6 +++
> 2 files changed, 77 insertions(+)
>
>diff --git a/drivers/gpu/drm/i915/display/intel_color.c
>b/drivers/gpu/drm/i915/display/intel_color.c
>index d2c1297..27727a1 100644
>--- a/drivers/gpu/drm/i915/display/intel_color.c
>+++ b/drivers/gpu/drm/i915/display/intel_color.c
>@@ -1450,6 +1450,77 @@ int intel_color_get_gamma_bit_precision(const struct
>intel_crtc_state *crtc_stat
> 	return 0;
> }
>
>+static inline bool err_check(struct drm_color_lut *sw_lut,
>+			     struct drm_color_lut *hw_lut, u32 err) {
>+	return ((abs((long)hw_lut->red - sw_lut->red)) <= err) &&
>+		((abs((long)hw_lut->blue - sw_lut->blue)) <= err) &&
>+		((abs((long)hw_lut->green - sw_lut->green)) <= err); }
>+
>+static inline bool intel_color_lut_entry_equal(struct drm_color_lut *sw_lut,
>+					       struct drm_color_lut *hw_lut,
>+					       int hw_lut_size, u32 err)
>+{
>+	int i;
>+
>+	for (i = 0; i < hw_lut_size; i++) {
>+		if (!err_check(&hw_lut[i], &sw_lut[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 *sw_lut, *hw_lut;
>+	int sw_lut_size, hw_lut_size;
>+	u32 err;
>+
>+	if (!blob1 != !blob2)
>+		return false;
>+
>+	if (!blob1)
>+		return true;
>+
>+	sw_lut_size = drm_color_lut_size(blob1);
>+	hw_lut_size = drm_color_lut_size(blob2);
>+
>+	switch (gamma_mode) {
>+	case GAMMA_MODE_MODE_8BIT:
>+	case GAMMA_MODE_MODE_10BIT:
>+		if (sw_lut_size != hw_lut_size)
>+			return false;
>+		else

You may drop else, just simply put break.

>+			break;
>+	default:
>+		MISSING_CASE(gamma_mode);
>+			return false;
>+	}
>+
>+	sw_lut = blob1->data;
>+	hw_lut = blob2->data;
>+
>+	err = 0xffff >> bit_precision;
>+
>+	switch (gamma_mode) {
>+	case GAMMA_MODE_MODE_8BIT:
>+	case GAMMA_MODE_MODE_10BIT:
>+		if (!intel_color_lut_entry_equal(sw_lut, hw_lut, hw_lut_size, err))

Limit it within 80 characters.

>+				return false;
>+		else
>+				break;

Drop else here as well. Indentation also seems off.

>+	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); diff --git
>a/drivers/gpu/drm/i915/display/intel_color.h
>b/drivers/gpu/drm/i915/display/intel_color.h
>index 0226d3a..173727a 100644
>--- a/drivers/gpu/drm/i915/display/intel_color.h
>+++ b/drivers/gpu/drm/i915/display/intel_color.h
>@@ -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_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__ */
>--
>1.9.1

Patch
diff mbox series

diff --git a/drivers/gpu/drm/i915/display/intel_color.c b/drivers/gpu/drm/i915/display/intel_color.c
index d2c1297..27727a1 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1450,6 +1450,77 @@  int intel_color_get_gamma_bit_precision(const struct intel_crtc_state *crtc_stat
 	return 0;
 }
 
+static inline bool err_check(struct drm_color_lut *sw_lut,
+			     struct drm_color_lut *hw_lut, u32 err)
+{
+	return ((abs((long)hw_lut->red - sw_lut->red)) <= err) &&
+		((abs((long)hw_lut->blue - sw_lut->blue)) <= err) &&
+		((abs((long)hw_lut->green - sw_lut->green)) <= err);
+}
+
+static inline bool intel_color_lut_entry_equal(struct drm_color_lut *sw_lut,
+					       struct drm_color_lut *hw_lut,
+					       int hw_lut_size, u32 err)
+{
+	int i;
+
+	for (i = 0; i < hw_lut_size; i++) {
+		if (!err_check(&hw_lut[i], &sw_lut[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 *sw_lut, *hw_lut;
+	int sw_lut_size, hw_lut_size;
+	u32 err;
+
+	if (!blob1 != !blob2)
+		return false;
+
+	if (!blob1)
+		return true;
+
+	sw_lut_size = drm_color_lut_size(blob1);
+	hw_lut_size = drm_color_lut_size(blob2);
+
+	switch (gamma_mode) {
+	case GAMMA_MODE_MODE_8BIT:
+	case GAMMA_MODE_MODE_10BIT:
+		if (sw_lut_size != hw_lut_size)
+			return false;
+		else
+			break;
+	default:
+		MISSING_CASE(gamma_mode);
+			return false;
+	}
+
+	sw_lut = blob1->data;
+	hw_lut = blob2->data;
+
+	err = 0xffff >> bit_precision;
+
+	switch (gamma_mode) {
+	case GAMMA_MODE_MODE_8BIT:
+	case GAMMA_MODE_MODE_10BIT:
+		if (!intel_color_lut_entry_equal(sw_lut, hw_lut, hw_lut_size, err))
+				return false;
+		else
+				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);
diff --git a/drivers/gpu/drm/i915/display/intel_color.h b/drivers/gpu/drm/i915/display/intel_color.h
index 0226d3a..173727a 100644
--- a/drivers/gpu/drm/i915/display/intel_color.h
+++ b/drivers/gpu/drm/i915/display/intel_color.h
@@ -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_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__ */