Commit ee8ed250 authored by Camille Cho's avatar Camille Cho Committed by Alex Deucher
Browse files

drm/amd/display: Correctly restore user_level



[Why]
BL1_PWM_USER_LEVEL is meant for the user brightness level setting from
OS. However, we update it along with other ABM levels to the real PWM
value which could be ABMed.

[How]
Driver to cache and restore the user brightness level setting so that
DMUB can retrieve the last user setting in ABM config initialization.

Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Reviewed-by: default avatarAnthony Koo <anthony.koo@amd.com>
Acked-by: default avatarRodrigo Siqueira <rodrigo.siqueira@amd.com>
Signed-off-by: default avatarCamille Cho <camille.cho@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent aa5dc053
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -135,7 +135,7 @@ static void dmcu_set_backlight_level(
			0, 1, 80000);
}

static void dce_abm_init(struct abm *abm, uint32_t backlight)
static void dce_abm_init(struct abm *abm, uint32_t backlight, uint32_t user_level)
{
	struct dce_abm *abm_dce = TO_DCE_ABM(abm);

@@ -162,7 +162,7 @@ static void dce_abm_init(struct abm *abm, uint32_t backlight)
			BL1_PWM_TARGET_ABM_LEVEL, backlight);

	REG_UPDATE(BL1_PWM_USER_LEVEL,
			BL1_PWM_USER_LEVEL, backlight);
			BL1_PWM_USER_LEVEL, user_level);

	REG_UPDATE_2(DC_ABM1_LS_MIN_MAX_PIXEL_VALUE_THRES,
			ABM1_LS_MIN_PIXEL_VALUE_THRES, 0,
+2 −2
Original line number Diff line number Diff line
@@ -57,9 +57,9 @@ static unsigned int abm_feature_support(struct abm *abm, unsigned int panel_inst
	return ret;
}

static void dmub_abm_init_ex(struct abm *abm, uint32_t backlight)
static void dmub_abm_init_ex(struct abm *abm, uint32_t backlight, uint32_t user_level)
{
	dmub_abm_init(abm, backlight);
	dmub_abm_init(abm, backlight, user_level);
}

static unsigned int dmub_abm_get_current_backlight_ex(struct abm *abm)
+2 −2
Original line number Diff line number Diff line
@@ -79,7 +79,7 @@ static void dmub_abm_enable_fractional_pwm(struct dc_context *dc)
	dc_wake_and_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
}

void dmub_abm_init(struct abm *abm, uint32_t backlight)
void dmub_abm_init(struct abm *abm, uint32_t backlight, uint32_t user_level)
{
	struct dce_abm *dce_abm = TO_DMUB_ABM(abm);

@@ -106,7 +106,7 @@ void dmub_abm_init(struct abm *abm, uint32_t backlight)
			BL1_PWM_TARGET_ABM_LEVEL, backlight);

	REG_UPDATE(BL1_PWM_USER_LEVEL,
			BL1_PWM_USER_LEVEL, backlight);
			BL1_PWM_USER_LEVEL, user_level);

	REG_UPDATE_2(DC_ABM1_LS_MIN_MAX_PIXEL_VALUE_THRES,
			ABM1_LS_MIN_PIXEL_VALUE_THRES, 0,
+1 −1
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@

struct abm_save_restore;

void dmub_abm_init(struct abm *abm, uint32_t backlight);
void dmub_abm_init(struct abm *abm, uint32_t backlight, uint32_t user_level);
bool dmub_abm_set_level(struct abm *abm, uint32_t level, uint8_t panel_mask);
unsigned int dmub_abm_get_current_backlight(struct abm *abm);
unsigned int dmub_abm_get_target_backlight(struct abm *abm);
+5 −2
Original line number Diff line number Diff line
@@ -2593,6 +2593,7 @@ static void init_hw(struct dc *dc)
	struct dmcu *dmcu;
	struct dce_hwseq *hws = dc->hwseq;
	uint32_t backlight = MAX_BACKLIGHT_LEVEL;
	uint32_t user_level = MAX_BACKLIGHT_LEVEL;

	bp = dc->ctx->dc_bios;
	for (i = 0; i < dc->res_pool->pipe_count; i++) {
@@ -2642,13 +2643,15 @@ static void init_hw(struct dc *dc)
	for (i = 0; i < dc->link_count; i++) {
		struct dc_link *link = dc->links[i];

		if (link->panel_cntl)
		if (link->panel_cntl) {
			backlight = link->panel_cntl->funcs->hw_init(link->panel_cntl);
			user_level = link->panel_cntl->stored_backlight_registers.USER_LEVEL;
		}
	}

	abm = dc->res_pool->abm;
	if (abm != NULL)
		abm->funcs->abm_init(abm, backlight);
		abm->funcs->abm_init(abm, backlight, user_level);

	dmcu = dc->res_pool->dmcu;
	if (dmcu != NULL && abm != NULL)
Loading