Add a new blob properties as well as the create and attach functions
for configuring region of interested (ROI) of secure display.

Signed-off-by: Alan Liu <haoping....@amd.com>
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 10 ++++++
 .../drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c |  4 +++
 .../drm/amd/display/amdgpu_dm/amdgpu_dm_crc.h |  5 +++
 .../amd/display/amdgpu_dm/amdgpu_dm_crtc.c    | 31 +++++++++++++++++++
 include/uapi/drm/drm_mode.h                   | 20 ++++++++++++
 5 files changed, 70 insertions(+)

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 2e2413fd73a4..ee57c659f230 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
@@ -500,6 +500,9 @@ struct amdgpu_display_manager {
         * all crtcs.
         */
        struct secure_display_context *secure_display_ctxs;
+
+       /* properties for secure_display ROI configuration */
+       struct drm_property *secure_display_roi_property;
 #endif
        /**
         * @hpd_rx_offload_wq:
@@ -726,6 +729,13 @@ struct dm_crtc_state {
        struct dc_info_packet vrr_infopacket;
 
        int abm_level;
+
+#ifdef CONFIG_DRM_AMD_SECURE_DISPLAY
+       struct {
+               struct drm_property_blob *roi_blob;
+               bool roi_changed : 1;
+       } secure_display_state;
+#endif
 };
 
 #define to_dm_crtc_state(x) container_of(x, struct dm_crtc_state, base)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c
index 0802f8e8fac5..e7259ec1d644 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c
@@ -546,10 +546,14 @@ amdgpu_dm_crtc_secure_display_create_contexts(struct 
amdgpu_device *adev)
        if (!secure_display_ctxs)
                return NULL;
 
+       if (amdgpu_dm_crtc_create_secure_display_properties(adev))
+               DRM_ERROR("amdgpu: failed to create secure display 
properties.\n");
+
        for (i = 0; i < adev->mode_info.num_crtc; i++) {
                INIT_WORK(&secure_display_ctxs[i].forward_roi_work, 
amdgpu_dm_forward_crc_window);
                INIT_WORK(&secure_display_ctxs[i].notify_ta_work, 
amdgpu_dm_crtc_notify_ta_to_read);
                secure_display_ctxs[i].crtc = &adev->mode_info.crtcs[i]->base;
+               amdgpu_dm_crtc_attach_secure_display_properties(adev, 
&adev->mode_info.crtcs[i]->base);
        }
 
        return secure_display_ctxs;
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.h 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.h
index 748e80ef40d0..66f29e3de9f9 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.h
@@ -97,10 +97,15 @@ bool amdgpu_dm_crc_window_is_activated(struct drm_crtc 
*crtc);
 void amdgpu_dm_crtc_handle_crc_window_irq(struct drm_crtc *crtc);
 struct secure_display_context *amdgpu_dm_crtc_secure_display_create_contexts(
                                                struct amdgpu_device *adev);
+int amdgpu_dm_crtc_create_secure_display_properties(struct amdgpu_device 
*adev);
+void amdgpu_dm_crtc_attach_secure_display_properties(struct amdgpu_device 
*adev,
+                                               struct drm_crtc *crtc);
 #else
 #define amdgpu_dm_crc_window_is_activated(x)
 #define amdgpu_dm_crtc_handle_crc_window_irq(x)
 #define amdgpu_dm_crtc_secure_display_create_contexts(x)
+#define amdgpu_dm_crtc_create_secure_display_properties(x)
+#define amdgpu_dm_crtc_attach_secure_display_properties(x)
 #endif
 
 #endif /* AMD_DAL_DEV_AMDGPU_DM_AMDGPU_DM_CRC_H_ */
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 e3762e806617..4af7ea6fbd65 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
@@ -265,6 +265,10 @@ static struct drm_crtc_state 
*dm_crtc_duplicate_state(struct drm_crtc *crtc)
        state->cm_is_degamma_srgb = cur->cm_is_degamma_srgb;
        state->crc_skip_count = cur->crc_skip_count;
        state->mpo_requested = cur->mpo_requested;
+
+#ifdef CONFIG_DRM_AMD_SECURE_DISPLAY
+       state->secure_display_state = cur->secure_display_state;
+#endif
        /* TODO Duplicate dc_stream after objects are stream object is 
flattened */
 
        return &state->base;
@@ -290,6 +294,33 @@ static void dm_crtc_reset_state(struct drm_crtc *crtc)
        __drm_atomic_helper_crtc_reset(crtc, &state->base);
 }
 
+#ifdef CONFIG_DRM_AMD_SECURE_DISPLAY
+int amdgpu_dm_crtc_create_secure_display_properties(struct amdgpu_device *adev)
+{
+       struct amdgpu_display_manager *dm = &adev->dm;
+       struct drm_device *dev = adev_to_drm(adev);
+       struct drm_property *roi_prop;
+
+       roi_prop = drm_property_create(dev, DRM_MODE_PROP_BLOB,
+                                       "SECURE_DISPLAY_ROI", 0);
+       if (!roi_prop)
+               return -ENOMEM;
+
+       dm->secure_display_roi_property = roi_prop;
+
+       return 0;
+}
+
+void amdgpu_dm_crtc_attach_secure_display_properties(struct amdgpu_device 
*adev,
+                               struct drm_crtc *crtc)
+{
+       struct amdgpu_display_manager *dm = &adev->dm;
+
+       if (dm->secure_display_roi_property)
+               drm_object_attach_property(&crtc->base, 
dm->secure_display_roi_property, 0);
+}
+#endif
+
 #ifdef CONFIG_DEBUG_FS
 static int amdgpu_dm_crtc_late_register(struct drm_crtc *crtc)
 {
diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h
index 46becedf5b2f..98e0a0aaa1c3 100644
--- a/include/uapi/drm/drm_mode.h
+++ b/include/uapi/drm/drm_mode.h
@@ -1303,6 +1303,26 @@ struct drm_mode_rect {
        __s32 y2;
 };
 
+/**
+ * struct drm_roi - The enablement and region of interest (ROI) of secure 
display
+ * @x_start: Horizontal starting coordinate of ROI.
+ * @y_start: Vertical starting coordinate of ROI.
+ * @x_end: Horizontal ending coordinate of ROI.
+ * @y_end: Vertical ending coordinate of ROI.
+ * @secure_display_enable: To enable or disable secure display.
+ *
+ * Userspace uses this structure to configure the region of interest and
+ * enablement for secure display.
+ */
+struct drm_roi {
+       __u32 x_start;
+       __u32 y_start;
+       __u32 x_end;
+       __u32 y_end;
+       __u8 secure_display_enable;
+       __u8 pad[7];
+};
+
 #if defined(__cplusplus)
 }
 #endif
-- 
2.34.1

Reply via email to