Implement set/get functions as the callback for userspace to get the CRC
result values of the corresponding ROI configuration of secure display.

Signed-off-by: Alan Liu <haoping....@amd.com>
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |  1 +
 .../amd/display/amdgpu_dm/amdgpu_dm_crtc.c    | 38 ++++++++++++++++++-
 2 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
index 74e42257a608..b389b1d1c370 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
@@ -736,6 +736,7 @@ struct dm_crtc_state {
 #ifdef CONFIG_DRM_AMD_SECURE_DISPLAY
        struct {
                struct drm_property_blob *roi_blob;
+               struct drm_property_blob *crc_blob;
                bool roi_changed : 1;
        } secure_display_state;
 #endif
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
index 4457eac8273e..0e9834e0506d 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
@@ -359,6 +359,10 @@ static int amdgpu_dm_crtc_atomic_set_property(struct 
drm_crtc *crtc,
                dm_state->secure_display_state.roi_changed |=
                        drm_property_replace_blob(old_blob, new_blob);
 
+       } else if (property == adev->dm.secure_display_crc_property) {
+               /* don't let user set CRC data */
+               return -EPERM;
+
        } else
                return -EINVAL;
 
@@ -373,12 +377,44 @@ static int amdgpu_dm_crtc_atomic_get_property(struct 
drm_crtc *crtc,
        struct drm_device *dev = crtc->dev;
        struct amdgpu_device *adev = drm_to_adev(dev);
        struct dm_crtc_state *dm_state = to_dm_crtc_state(crtc_state);
+       struct secure_display_context *secure_display_ctx =
+               &adev->dm.secure_display_ctxs[crtc->index];
 
        if (property == adev->dm.secure_display_roi_property)
                *val = (dm_state->secure_display_state.roi_blob)
                        ? dm_state->secure_display_state.roi_blob->base.id : 0;
 
-       else
+       else if (property == adev->dm.secure_display_crc_property) {
+               struct drm_crc *blob_data;
+               struct drm_property_blob *blob;
+               unsigned long flag;
+
+               if (!amdgpu_dm_crc_window_is_activated(crtc)) {
+                       *val = 0;
+                       return 0;
+               }
+
+               /* save new value to blob */
+               blob = drm_property_create_blob(dev,
+                                               sizeof(struct drm_crc),
+                                               NULL);
+               if (IS_ERR(blob)) {
+                       *val = 0;
+                       return -ENOMEM;
+               }
+
+               blob_data = (struct drm_crc *) blob->data;
+               spin_lock_irqsave(&secure_display_ctx->crc.lock, flag);
+               blob_data->crc_r = secure_display_ctx->crc.crc_R;
+               blob_data->crc_g = secure_display_ctx->crc.crc_G;
+               blob_data->crc_b = secure_display_ctx->crc.crc_B;
+               blob_data->frame_count = secure_display_ctx->crc.frame_count;
+               spin_unlock_irqrestore(&secure_display_ctx->crc.lock, flag);
+
+               
drm_property_replace_blob(&dm_state->secure_display_state.crc_blob, blob);
+               *val = blob->base.id;
+
+       } else
                return -EINVAL;
 
        return 0;
-- 
2.34.1

Reply via email to