Handle histogram caps and histogram config property in i915 driver. Fill
the histogram hardware capability and act upon the histogram config
property to enable/disable histogram in i915.

Signed-off-by: Arun R Murthy <[email protected]>
---
 drivers/gpu/drm/i915/display/intel_crtc.c    |  7 +++++++
 drivers/gpu/drm/i915/display/intel_display.c | 15 +++++++++++++++
 2 files changed, 22 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_crtc.c 
b/drivers/gpu/drm/i915/display/intel_crtc.c
index 
2fe645860385df9b64aedc408dc5908b475a0b40..036a347d7540d33faa3f7d7588dc860e6b717a56
 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc.c
+++ b/drivers/gpu/drm/i915/display/intel_crtc.c
@@ -17,6 +17,7 @@
 #include "icl_dsi.h"
 #include "intel_atomic.h"
 #include "intel_color.h"
+#include "intel_color_pipeline.h"
 #include "intel_crtc.h"
 #include "intel_cursor.h"
 #include "intel_display_debugfs.h"
@@ -26,6 +27,7 @@
 #include "intel_drrs.h"
 #include "intel_dsi.h"
 #include "intel_fifo_underrun.h"
+#include "intel_histogram.h"
 #include "intel_parent.h"
 #include "intel_pipe_crc.h"
 #include "intel_plane.h"
@@ -215,6 +217,7 @@ static struct intel_crtc *intel_crtc_alloc(void)
 static void intel_crtc_free(struct intel_crtc *crtc)
 {
        intel_crtc_destroy_state(&crtc->base, crtc->base.state);
+       intel_histogram_finish(crtc);
        kfree(crtc);
 }
 
@@ -387,6 +390,10 @@ int intel_crtc_init(struct intel_display *display, enum 
pipe pipe)
                                                BIT(DRM_SCALING_FILTER_DEFAULT) 
|
                                                
BIT(DRM_SCALING_FILTER_NEAREST_NEIGHBOR));
 
+       intel_histogram_init(crtc);
+       if (intel_color_pipeline_crtc_init(&crtc->base))
+               drm_err(display->drm, "Failed to initialize histogram 
properties\n");
+
        intel_color_crtc_init(crtc);
        intel_drrs_crtc_init(crtc);
        intel_crtc_crc_init(crtc);
diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index 
e5ce47efc809604cf6f7f01bdc9c679d608be3ef..191a830009e78a31e1ad3d9ca8e0596e1a1ff71e
 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -99,6 +99,7 @@
 #include "intel_flipq.h"
 #include "intel_frontbuffer.h"
 #include "intel_hdmi.h"
+#include "intel_histogram.h"
 #include "intel_hotplug.h"
 #include "intel_link_bw.h"
 #include "intel_lt_phy.h"
@@ -4252,6 +4253,7 @@ static int intel_crtc_atomic_check(struct 
intel_atomic_state *state,
        struct intel_display *display = to_intel_display(crtc);
        struct intel_crtc_state *crtc_state =
                intel_atomic_get_new_crtc_state(state, crtc);
+       struct drm_colorop *colorop = crtc_state->uapi.color_pipeline;
        int ret;
 
        if (DISPLAY_VER(display) < 5 && !display->platform.g4x &&
@@ -4313,6 +4315,12 @@ static int intel_crtc_atomic_check(struct 
intel_atomic_state *state,
        if (ret)
                return ret;
 
+       if (colorop->state->histogram_updated) {
+               ret = intel_histogram_atomic_check(crtc);
+               if (ret)
+                       return ret;
+       }
+
        return 0;
 }
 
@@ -7547,6 +7555,8 @@ static void intel_atomic_commit_tail(struct 
intel_atomic_state *state)
        intel_dbuf_post_plane_update(state);
 
        for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state, 
new_crtc_state, i) {
+               struct drm_colorop *colorop = 
new_crtc_state->uapi.color_pipeline;
+
                intel_post_plane_update(state, crtc);
 
                intel_modeset_put_crtc_power_domains(crtc, 
&put_domains[crtc->pipe]);
@@ -7564,6 +7574,11 @@ static void intel_atomic_commit_tail(struct 
intel_atomic_state *state)
                 */
                old_crtc_state->dsb_color = 
fetch_and_zero(&new_crtc_state->dsb_color);
                old_crtc_state->dsb_commit = 
fetch_and_zero(&new_crtc_state->dsb_commit);
+
+               if (colorop->state->histogram_updated)
+                       intel_histogram_update(crtc,
+                                              (struct drm_histogram_config *)
+                                              
colorop->state->histogram_enable->data);
        }
 
        /* Underruns don't always raise interrupts, so check manually */

-- 
2.25.1

Reply via email to