User can provide the selective fetch co-ordinates for global histogram
using crtc blob property. This patch adds the crtc blob property.
The selective fetch can be done only on the y co-ordinate and cannot be
done on the x co-ordinate.

Signed-off-by: Arun R Murthy <arun.r.mur...@intel.com>
---
 drivers/gpu/drm/i915/display/intel_crtc.c     | 45 +++++++++++++++++++
 .../drm/i915/display/intel_display_types.h    |  3 ++
 2 files changed, 48 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_crtc.c 
b/drivers/gpu/drm/i915/display/intel_crtc.c
index 501bcf732aba..2a9dcf3b1a19 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc.c
+++ b/drivers/gpu/drm/i915/display/intel_crtc.c
@@ -236,6 +236,9 @@ int intel_crtc_get_property(struct drm_crtc *crtc,
        else if (property == intel_crtc->global_hist_property)
                *val = (intel_crtc_state->global_hist) ?
                        intel_crtc_state->global_hist->base.id : 0;
+       else if (property == intel_crtc->global_hist_sf_clips_property)
+               *val = (intel_crtc_state->global_hist_sf_clips) ?
+                       intel_crtc_state->global_hist_sf_clips->base.id : 0;
        else {
                drm_err(&i915->drm,
                               "Unknown property [PROP:%d:%s]\n",
@@ -306,6 +309,18 @@ int intel_crtc_set_property(struct drm_crtc *crtc,
                return 0;
        }
 
+       if (property == intel_crtc->global_hist_sf_clips_property) {
+               intel_atomic_replace_property_blob_from_id(crtc->dev,
+                                       &intel_crtc_state->global_hist_sf_clips,
+                                       val,
+                                       -1,
+                                       sizeof(struct drm_rect),
+                                       &replaced);
+               if (replaced)
+                       intel_crtc_state->global_hist_sf_clips_updates = true;
+               return 0;
+       }
+
        drm_dbg_atomic(&i915->drm, "Unknown property [PROP:%d:%s]\n",
                       property->base.id, property->name);
        return -EINVAL;
@@ -903,11 +918,41 @@ void intel_attach_global_hist_property(struct intel_crtc 
*intel_crtc)
        drm_object_attach_property(&crtc->base, prop, blob->base.id);
 }
 
+/**
+ * intel_attach_global_hist_sf_seg_property() - selective fetch segment 
property
+ * @intel_crtc: pointer to struct intel_crtc on which global histogram is 
enabled
+ *
+ * "Global Histogram SF CLIPS" is the crtc porperty used to provide the
+ * co-ordinates of the damage clips.
+ */
+void intel_attach_global_hist_sf_seg_property(struct intel_crtc * intel_crtc)
+{
+       struct drm_crtc *crtc = &intel_crtc->base;
+       struct drm_device *dev = crtc->dev;
+       struct drm_property *prop;
+       struct drm_property_blob *blob;
+
+       prop = intel_crtc->global_hist_sf_clips_property;
+       if (prop == NULL) {
+               prop = drm_property_create(dev,
+                       DRM_MODE_PROP_ATOMIC | DRM_MODE_PROP_BLOB,
+                       "Global Histogram SF CLIPS", 0);
+               if (prop == NULL)
+                       return;
+               intel_crtc->global_hist_sf_clips_property = prop;
+       }
+       blob = drm_property_create_blob(dev, sizeof(struct drm_rect *), NULL);
+       intel_crtc->config->global_hist_sf_clips = blob;
+
+       drm_object_attach_property(&crtc->base, prop, blob->base.id);
+}
+
 int intel_crtc_add_property(struct intel_crtc *intel_crtc)
 {
        intel_attach_global_hist_en_property(intel_crtc);
        intel_attach_global_hist_property(intel_crtc);
        intel_attach_global_iet_property(intel_crtc);
+       intel_attach_global_hist_sf_seg_property(intel_crtc);
 
        return 0;
 }
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h 
b/drivers/gpu/drm/i915/display/intel_display_types.h
index 15d28e2305da..703593d4a52f 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1371,8 +1371,10 @@ struct intel_crtc_state {
        int global_hist_en;
        struct drm_property_blob *global_iet;
        struct drm_property_blob *global_hist;
+       struct drm_property_blob *global_hist_sf_clips;
        bool global_iet_changed;
        bool global_hist_en_changed;
+       bool global_hist_sf_clips_updates;
 };
 
 enum intel_pipe_crc_source {
@@ -1480,6 +1482,7 @@ struct intel_crtc {
        struct drm_property *global_hist_en_property;
        struct drm_property *global_iet_property;
        struct drm_property *global_hist_property;
+       struct drm_property *global_hist_sf_clips_property;
 #ifdef CONFIG_DEBUG_FS
        struct intel_pipe_crc pipe_crc;
        u32 cpu_fifo_underrun_count;
-- 
2.25.1

Reply via email to