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.deuc...@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. Reviewed-by: Harry Wentland <harry.wentl...@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]; > >