On 8/18/25 4:16 PM, Alex Deucher wrote:
> On Wed, Aug 13, 2025 at 7:33 PM Alex Hung <[email protected]> wrote:
>>
>> From: Mario Limonciello <[email protected]>
>>
>> [WHY]
>> If a system has a privacy screen advertised by a driver it should
>> be included in the DRM connector for the eDP panel.
>>
>> [HOW]
>> Detect statically declared privacy screens when creating eDP connector
>> and attach privacy screen DRM properties.
>>
>> Reviewed-by: Harry Wentland <[email protected]>
>> Signed-off-by: Mario Limonciello <[email protected]>
>> Signed-off-by: Alex Hung <[email protected]>
>> ---
>> .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 25 ++++++++++++++++++-
>> 1 file changed, 24 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>> b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>> index e8cfae2bd2ae..176f420effd9 100644
>> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>> @@ -80,6 +80,7 @@
>> #include <linux/component.h>
>> #include <linux/sort.h>
>>
>> +#include <drm/drm_privacy_screen_consumer.h>
>> #include <drm/display/drm_dp_mst_helper.h>
>> #include <drm/display/drm_hdmi_helper.h>
>> #include <drm/drm_atomic.h>
>> @@ -7846,6 +7847,14 @@ amdgpu_dm_connector_atomic_check(struct drm_connector
>> *conn,
>> if (!crtc)
>> return 0;
>>
>> + if (new_con_state->privacy_screen_sw_state !=
>> old_con_state->privacy_screen_sw_state) {
>> + new_crtc_state = drm_atomic_get_crtc_state(state, crtc);
>> + if (IS_ERR(new_crtc_state))
>> + return PTR_ERR(new_crtc_state);
>> +
>> + new_crtc_state->mode_changed = true;
>> + }
>> +
>> if (new_con_state->colorspace != old_con_state->colorspace) {
>> new_crtc_state = drm_atomic_get_crtc_state(state, crtc);
>> if (IS_ERR(new_crtc_state))
>> @@ -8541,6 +8550,18 @@ void amdgpu_dm_connector_init_helper(struct
>> amdgpu_display_manager *dm,
>> if (adev->dm.hdcp_workqueue)
>>
>> drm_connector_attach_content_protection_property(&aconnector->base, true);
>> }
>> +
>> + if (connector_type == DRM_MODE_CONNECTOR_eDP) {
>
> Do the privacy screens exist on any old laptops with LVDS? If so, we
> should add DRM_MODE_CONNECTOR_LVDS here as well.
>
> Alex
At least for AMD laptops I don't think so. They're for newer designs
that would solely be connected eDP.
>
>> + struct drm_privacy_screen *privacy_screen;
>> +
>> + privacy_screen =
>> drm_privacy_screen_get(adev_to_drm(adev)->dev, NULL);
>> + if (!IS_ERR(privacy_screen)) {
>> +
>> drm_connector_attach_privacy_screen_provider(&aconnector->base,
>> +
>> privacy_screen);
>> + } else if (PTR_ERR(privacy_screen) != -ENODEV) {
>> + drm_warn(adev_to_drm(adev), "Error getting
>> privacy-screen\n");
>> + }
>> + }
>> }
>>
>> static int amdgpu_dm_i2c_xfer(struct i2c_adapter *i2c_adap,
>> @@ -10265,7 +10286,7 @@ static void amdgpu_dm_atomic_commit_tail(struct
>> drm_atomic_state *state)
>> unsigned long flags;
>> bool wait_for_vblank = true;
>> struct drm_connector *connector;
>> - struct drm_connector_state *old_con_state, *new_con_state;
>> + struct drm_connector_state *old_con_state = NULL, *new_con_state =
>> NULL;
>> struct dm_crtc_state *dm_old_crtc_state, *dm_new_crtc_state;
>> int crtc_disable_count = 0;
>>
>> @@ -10383,6 +10404,8 @@ static void amdgpu_dm_atomic_commit_tail(struct
>> drm_atomic_state *state)
>> &stream_update);
>> mutex_unlock(&dm->dc_lock);
>> kfree(dummy_updates);
>> +
>> + drm_connector_update_privacy_screen(new_con_state);
>> }
>>
>> /**
>> --
>> 2.43.0
>>