[PATCH] drm/amd/display: update bios scratch when setting backlight
Alex Deucher
alexdeucher at gmail.com
Wed Nov 24 18:55:31 UTC 2021
On Wed, Nov 24, 2021 at 1:52 PM Harry Wentland <harry.wentland at amd.com> wrote:
>
> On 2021-11-24 11:36, Alex Deucher wrote:
> > Update the bios scratch register when updating the backlight
> > level. Some platforms apparently read this scratch register
> > and do additional operations in their hotkey handlers.
> >
> > Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/1518
> > Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
>
> Maybe dce_driver_set_backlight should handle this but doing this
> in amdgpu also works. I don't know if I have a preference either
> way.
Might be helpful for other OSes unless they handle the bios scratch
registers some other way. Also does dce_driver_set_backlight() handle
OLED and aux controlled backlights?
Alex
>
> Reviewed-by: Harry Wentland <harry.wentland at amd.com>
>
> Harry
>
> > ---
> > drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c | 12 ++++++++++++
> > drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.h | 2 ++
> > drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 4 ++++
> > 3 files changed, 18 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
> > index 96b7bb13a2dd..12a6b1c99c93 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
> > @@ -1569,6 +1569,18 @@ void amdgpu_atombios_scratch_regs_engine_hung(struct amdgpu_device *adev,
> > WREG32(adev->bios_scratch_reg_offset + 3, tmp);
> > }
> >
> > +void amdgpu_atombios_scratch_regs_set_backlight_level(struct amdgpu_device *adev,
> > + u32 backlight_level)
> > +{
> > + u32 tmp = RREG32(adev->bios_scratch_reg_offset + 2);
> > +
> > + tmp &= ~ATOM_S2_CURRENT_BL_LEVEL_MASK;
> > + tmp |= (backlight_level << ATOM_S2_CURRENT_BL_LEVEL_SHIFT) &
> > + ATOM_S2_CURRENT_BL_LEVEL_MASK;
> > +
> > + WREG32(adev->bios_scratch_reg_offset + 2, tmp);
> > +}
> > +
> > bool amdgpu_atombios_scratch_need_asic_init(struct amdgpu_device *adev)
> > {
> > u32 tmp = RREG32(adev->bios_scratch_reg_offset + 7);
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.h
> > index 8cc0222dba19..27e74b1fc260 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.h
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.h
> > @@ -185,6 +185,8 @@ bool amdgpu_atombios_has_gpu_virtualization_table(struct amdgpu_device *adev);
> > void amdgpu_atombios_scratch_regs_lock(struct amdgpu_device *adev, bool lock);
> > void amdgpu_atombios_scratch_regs_engine_hung(struct amdgpu_device *adev,
> > bool hung);
> > +void amdgpu_atombios_scratch_regs_set_backlight_level(struct amdgpu_device *adev,
> > + u32 backlight_level);
> > bool amdgpu_atombios_scratch_need_asic_init(struct amdgpu_device *adev);
> >
> > void amdgpu_atombios_copy_swap(u8 *dst, u8 *src, u8 num_bytes, bool to_le);
> > 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 40a4269770fa..05e4a0952a2b 100644
> > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> > @@ -51,6 +51,7 @@
> > #include <drm/drm_hdcp.h>
> > #endif
> > #include "amdgpu_pm.h"
> > +#include "amdgpu_atombios.h"
> >
> > #include "amd_shared.h"
> > #include "amdgpu_dm_irq.h"
> > @@ -3918,6 +3919,9 @@ static int amdgpu_dm_backlight_set_level(struct amdgpu_display_manager *dm,
> > caps = dm->backlight_caps[bl_idx];
> >
> > dm->brightness[bl_idx] = user_brightness;
> > + /* update scratch register */
> > + if (bl_idx == 0)
> > + amdgpu_atombios_scratch_regs_set_backlight_level(dm->adev, dm->brightness[bl_idx]);
> > brightness = convert_brightness_from_user(&caps, dm->brightness[bl_idx]);
> > link = (struct dc_link *)dm->backlight_link[bl_idx];
> >
> >
>
More information about the amd-gfx
mailing list