| From 10d3d5db48a377841ebd808d0bb8e47e83af4b90 Mon Sep 17 00:00:00 2001 |
| From: Alex Deucher <alexander.deucher@amd.com> |
| Date: Tue, 11 May 2021 11:37:09 -0400 |
| Subject: [PATCH] UPSTREAM: drm/amdgpu/display: add helper functions to get/set |
| backlight (v2) |
| |
| And cache the value. These can be used by the backlight callbacks |
| and modesetting functions. |
| |
| v2: rebase on latest backlight changes. |
| |
| Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/1337 |
| Reviewed-by: Harry Wentland <harry.wentland@amd.com> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| (cherry picked from commit 3d6c91641bc8a883b0c810ac1a919db29ebd5ee7) |
| Signed-off-by: Sean Paul <seanpaul@chromium.org> |
| |
| BUG=b:187300590 |
| TEST=Tested with single/multiple displays, suspend/resume, hotplugs on volteer/trogdor/dedede/zork, build tested on amd64/arm64-generic |
| |
| Change-Id: If793dfb57996cc3eaf15310664bf884183ab8022 |
| --- |
| .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 42 ++++++++++++++----- |
| .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 7 ++++ |
| 2 files changed, 38 insertions(+), 11 deletions(-) |
| |
| 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 43297bda76c8..08ab12357a0b 100644 |
| --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |
| +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |
| @@ -3411,26 +3411,28 @@ static u32 convert_brightness_to_user(const struct amdgpu_dm_backlight_caps *cap |
| max - min); |
| } |
| |
| -static int amdgpu_dm_backlight_update_status(struct backlight_device *bd) |
| +static int amdgpu_dm_backlight_set_level(struct amdgpu_display_manager *dm, |
| + u32 user_brightness) |
| { |
| - struct amdgpu_display_manager *dm = bl_get_data(bd); |
| struct amdgpu_dm_backlight_caps caps; |
| struct dc_link *link[AMDGPU_DM_MAX_NUM_EDP]; |
| - u32 brightness; |
| + u32 brightness[AMDGPU_DM_MAX_NUM_EDP]; |
| bool rc; |
| int i; |
| |
| amdgpu_dm_update_backlight_caps(dm); |
| caps = dm->backlight_caps; |
| |
| - for (i = 0; i < dm->num_of_edps; i++) |
| + for (i = 0; i < dm->num_of_edps; i++) { |
| + dm->brightness[i] = user_brightness; |
| + brightness[i] = convert_brightness_from_user(&caps, dm->brightness[i]); |
| link[i] = (struct dc_link *)dm->backlight_link[i]; |
| + } |
| |
| - brightness = convert_brightness_from_user(&caps, bd->props.brightness); |
| - // Change brightness based on AUX property |
| + /* Change brightness based on AUX property */ |
| if (caps.aux_support) { |
| for (i = 0; i < dm->num_of_edps; i++) { |
| - rc = dc_link_set_backlight_level_nits(link[i], true, brightness, |
| + rc = dc_link_set_backlight_level_nits(link[i], true, brightness[i], |
| AUX_BL_DEFAULT_TRANSITION_TIME_MS); |
| if (!rc) { |
| DRM_ERROR("DM: Failed to update backlight via AUX on eDP[%d]\n", i); |
| @@ -3439,7 +3441,7 @@ static int amdgpu_dm_backlight_update_status(struct backlight_device *bd) |
| } |
| } else { |
| for (i = 0; i < dm->num_of_edps; i++) { |
| - rc = dc_link_set_backlight_level(dm->backlight_link[i], brightness, 0); |
| + rc = dc_link_set_backlight_level(dm->backlight_link[i], brightness[i], 0); |
| if (!rc) { |
| DRM_ERROR("DM: Failed to update backlight on eDP[%d]\n", i); |
| break; |
| @@ -3450,9 +3452,17 @@ static int amdgpu_dm_backlight_update_status(struct backlight_device *bd) |
| return rc ? 0 : 1; |
| } |
| |
| -static int amdgpu_dm_backlight_get_brightness(struct backlight_device *bd) |
| +static int amdgpu_dm_backlight_update_status(struct backlight_device *bd) |
| { |
| struct amdgpu_display_manager *dm = bl_get_data(bd); |
| + |
| + amdgpu_dm_backlight_set_level(dm, bd->props.brightness); |
| + |
| + return 0; |
| +} |
| + |
| +static u32 amdgpu_dm_backlight_get_level(struct amdgpu_display_manager *dm) |
| +{ |
| struct amdgpu_dm_backlight_caps caps; |
| |
| amdgpu_dm_update_backlight_caps(dm); |
| @@ -3465,17 +3475,24 @@ static int amdgpu_dm_backlight_get_brightness(struct backlight_device *bd) |
| |
| rc = dc_link_get_backlight_level_nits(link, &avg, &peak); |
| if (!rc) |
| - return bd->props.brightness; |
| + return dm->brightness[0]; |
| return convert_brightness_to_user(&caps, avg); |
| } else { |
| int ret = dc_link_get_backlight_level(dm->backlight_link[0]); |
| |
| if (ret == DC_ERROR_UNEXPECTED) |
| - return bd->props.brightness; |
| + return dm->brightness[0]; |
| return convert_brightness_to_user(&caps, ret); |
| } |
| } |
| |
| +static int amdgpu_dm_backlight_get_brightness(struct backlight_device *bd) |
| +{ |
| + struct amdgpu_display_manager *dm = bl_get_data(bd); |
| + |
| + return amdgpu_dm_backlight_get_level(dm); |
| +} |
| + |
| static const struct backlight_ops amdgpu_dm_backlight_ops = { |
| .options = BL_CORE_SUSPENDRESUME, |
| .get_brightness = amdgpu_dm_backlight_get_brightness, |
| @@ -3487,8 +3504,11 @@ amdgpu_dm_register_backlight_device(struct amdgpu_display_manager *dm) |
| { |
| char bl_name[16]; |
| struct backlight_properties props = { 0 }; |
| + int i; |
| |
| amdgpu_dm_update_backlight_caps(dm); |
| + for (i = 0; i < dm->num_of_edps; i++) |
| + dm->brightness[i] = AMDGPU_MAX_BL_LEVEL; |
| |
| props.max_brightness = AMDGPU_MAX_BL_LEVEL; |
| props.brightness = AMDGPU_MAX_BL_LEVEL; |
| 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 a65ebe1518ae..1def0b693f1f 100644 |
| --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |
| +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |
| @@ -427,6 +427,13 @@ struct amdgpu_display_manager { |
| * DAL fb memory allocation list, for communication with SMU. |
| */ |
| struct list_head da_list; |
| + |
| + /** |
| + * @brightness: |
| + * |
| + * cached backlight values. |
| + */ |
| + u32 brightness[AMDGPU_DM_MAX_NUM_EDP]; |
| }; |
| |
| enum dsc_clock_force_state { |
| -- |
| 2.17.1 |
| |