[PATCH 1/2] drm/amdgpu/display: add helper functions to get/set backlight (v2)
Alex Deucher
alexdeucher at gmail.com
Mon May 17 17:38:14 UTC 2021
Ping on this series.
Alex
On Tue, May 11, 2021 at 11:44 AM Alex Deucher <alexander.deucher at amd.com> wrote:
>
> 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
> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> .../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 5df187a6e25f..167c8759fbc9 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -3467,26 +3467,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);
> @@ -3495,7 +3497,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;
> @@ -3506,9 +3508,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);
> @@ -3521,17 +3531,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,
> @@ -3543,8 +3560,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 c6f79c7dfac4..721c8b49730c 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
> @@ -436,6 +436,13 @@ struct amdgpu_display_manager {
> */
> struct list_head da_list;
> struct completion dmub_aux_transfer_done;
> +
> + /**
> + * @brightness:
> + *
> + * cached backlight values.
> + */
> + u32 brightness[AMDGPU_DM_MAX_NUM_EDP];
> };
>
> enum dsc_clock_force_state {
> --
> 2.31.1
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list