Commit 4b0e95d1 authored by Yongqiang Sun's avatar Yongqiang Sun Committed by Alex Deucher

drm/amd/display: Add set backlight to hw sequencer.

[Why & How]
Add set backlight to hw sequencer, dmu communication will
be handled in hw sequencer for new asics.
Signed-off-by: default avatarYongqiang Sun <yongqiang.sun@amd.com>
Reviewed-by: default avatarAnthony Koo <Anthony.Koo@amd.com>
Acked-by: default avatarAurabindo Pillai <aurabindo.pillai@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 8d829836
...@@ -2509,35 +2509,21 @@ bool dc_link_set_backlight_level(const struct dc_link *link, ...@@ -2509,35 +2509,21 @@ bool dc_link_set_backlight_level(const struct dc_link *link,
uint32_t frame_ramp) uint32_t frame_ramp)
{ {
struct dc *dc = link->ctx->dc; struct dc *dc = link->ctx->dc;
struct abm *abm = get_abm_from_stream_res(link);
struct dmcu *dmcu = dc->res_pool->dmcu;
unsigned int controller_id = 0;
bool fw_set_brightness = true;
int i; int i;
DC_LOGGER_INIT(link->ctx->logger);
if (abm == NULL || (abm->funcs->set_backlight_level_pwm == NULL))
return false;
if (dmcu)
fw_set_brightness = dmcu->funcs->is_dmcu_initialized(dmcu);
DC_LOGGER_INIT(link->ctx->logger);
DC_LOG_BACKLIGHT("New Backlight level: %d (0x%X)\n", DC_LOG_BACKLIGHT("New Backlight level: %d (0x%X)\n",
backlight_pwm_u16_16, backlight_pwm_u16_16); backlight_pwm_u16_16, backlight_pwm_u16_16);
if (dc_is_embedded_signal(link->connector_signal)) { if (dc_is_embedded_signal(link->connector_signal)) {
struct pipe_ctx *pipe_ctx = NULL;
for (i = 0; i < MAX_PIPES; i++) { for (i = 0; i < MAX_PIPES; i++) {
if (dc->current_state->res_ctx.pipe_ctx[i].stream) { if (dc->current_state->res_ctx.pipe_ctx[i].stream) {
if (dc->current_state->res_ctx. if (dc->current_state->res_ctx.
pipe_ctx[i].stream->link pipe_ctx[i].stream->link
== link) { == link) {
/* DMCU -1 for all controller id values, pipe_ctx = &dc->current_state->res_ctx.pipe_ctx[i];
* therefore +1 here
*/
controller_id =
dc->current_state->
res_ctx.pipe_ctx[i].stream_res.tg->inst +
1;
/* Disable brightness ramping when the display is blanked /* Disable brightness ramping when the display is blanked
* as it can hang the DMCU * as it can hang the DMCU
...@@ -2547,13 +2533,14 @@ bool dc_link_set_backlight_level(const struct dc_link *link, ...@@ -2547,13 +2533,14 @@ bool dc_link_set_backlight_level(const struct dc_link *link,
} }
} }
} }
abm->funcs->set_backlight_level_pwm(
abm, if (pipe_ctx == NULL)
ASSERT(false);
dc->hwss.set_backlight_level(
pipe_ctx,
backlight_pwm_u16_16, backlight_pwm_u16_16,
frame_ramp, frame_ramp);
controller_id,
link->panel_cntl->inst,
fw_set_brightness);
} }
return true; return true;
......
...@@ -2714,6 +2714,37 @@ void dce110_set_cursor_attribute(struct pipe_ctx *pipe_ctx) ...@@ -2714,6 +2714,37 @@ void dce110_set_cursor_attribute(struct pipe_ctx *pipe_ctx)
pipe_ctx->plane_res.xfm, attributes); pipe_ctx->plane_res.xfm, attributes);
} }
bool dce110_set_backlight_level(struct pipe_ctx *pipe_ctx,
uint32_t backlight_pwm_u16_16,
uint32_t frame_ramp)
{
struct dc_link *link = pipe_ctx->stream->link;
struct dc *dc = link->ctx->dc;
struct abm *abm = pipe_ctx->stream_res.abm;
struct dmcu *dmcu = dc->res_pool->dmcu;
bool fw_set_brightness = true;
/* DMCU -1 for all controller id values,
* therefore +1 here
*/
uint32_t controller_id = pipe_ctx->stream_res.tg->inst + 1;
if (abm == NULL || (abm->funcs->set_backlight_level_pwm == NULL))
return false;
if (dmcu)
fw_set_brightness = dmcu->funcs->is_dmcu_initialized(dmcu);
abm->funcs->set_backlight_level_pwm(
abm,
backlight_pwm_u16_16,
frame_ramp,
controller_id,
link->panel_cntl->inst,
fw_set_brightness);
return true;
}
static const struct hw_sequencer_funcs dce110_funcs = { static const struct hw_sequencer_funcs dce110_funcs = {
.program_gamut_remap = program_gamut_remap, .program_gamut_remap = program_gamut_remap,
.program_output_csc = program_output_csc, .program_output_csc = program_output_csc,
...@@ -2747,7 +2778,8 @@ static const struct hw_sequencer_funcs dce110_funcs = { ...@@ -2747,7 +2778,8 @@ static const struct hw_sequencer_funcs dce110_funcs = {
.edp_power_control = dce110_edp_power_control, .edp_power_control = dce110_edp_power_control,
.edp_wait_for_hpd_ready = dce110_edp_wait_for_hpd_ready, .edp_wait_for_hpd_ready = dce110_edp_wait_for_hpd_ready,
.set_cursor_position = dce110_set_cursor_position, .set_cursor_position = dce110_set_cursor_position,
.set_cursor_attribute = dce110_set_cursor_attribute .set_cursor_attribute = dce110_set_cursor_attribute,
.set_backlight_level = dce110_set_backlight_level,
}; };
static const struct hwseq_private_funcs dce110_private_funcs = { static const struct hwseq_private_funcs dce110_private_funcs = {
......
...@@ -85,5 +85,9 @@ void dce110_edp_wait_for_hpd_ready( ...@@ -85,5 +85,9 @@ void dce110_edp_wait_for_hpd_ready(
struct dc_link *link, struct dc_link *link,
bool power_up); bool power_up);
bool dce110_set_backlight_level(struct pipe_ctx *pipe_ctx,
uint32_t backlight_pwm_u16_16,
uint32_t frame_ramp);
#endif /* __DC_HWSS_DCE110_H__ */ #endif /* __DC_HWSS_DCE110_H__ */
...@@ -71,6 +71,7 @@ static const struct hw_sequencer_funcs dcn10_funcs = { ...@@ -71,6 +71,7 @@ static const struct hw_sequencer_funcs dcn10_funcs = {
.set_clock = dcn10_set_clock, .set_clock = dcn10_set_clock,
.get_clock = dcn10_get_clock, .get_clock = dcn10_get_clock,
.get_vupdate_offset_from_vsync = dcn10_get_vupdate_offset_from_vsync, .get_vupdate_offset_from_vsync = dcn10_get_vupdate_offset_from_vsync,
.set_backlight_level = dce110_set_backlight_level,
}; };
static const struct hwseq_private_funcs dcn10_private_funcs = { static const struct hwseq_private_funcs dcn10_private_funcs = {
......
...@@ -82,6 +82,7 @@ static const struct hw_sequencer_funcs dcn20_funcs = { ...@@ -82,6 +82,7 @@ static const struct hw_sequencer_funcs dcn20_funcs = {
.init_vm_ctx = dcn20_init_vm_ctx, .init_vm_ctx = dcn20_init_vm_ctx,
.set_flip_control_gsl = dcn20_set_flip_control_gsl, .set_flip_control_gsl = dcn20_set_flip_control_gsl,
.get_vupdate_offset_from_vsync = dcn10_get_vupdate_offset_from_vsync, .get_vupdate_offset_from_vsync = dcn10_get_vupdate_offset_from_vsync,
.set_backlight_level = dce110_set_backlight_level,
}; };
static const struct hwseq_private_funcs dcn20_private_funcs = { static const struct hwseq_private_funcs dcn20_private_funcs = {
......
...@@ -91,6 +91,7 @@ static const struct hw_sequencer_funcs dcn21_funcs = { ...@@ -91,6 +91,7 @@ static const struct hw_sequencer_funcs dcn21_funcs = {
.optimize_pwr_state = dcn21_optimize_pwr_state, .optimize_pwr_state = dcn21_optimize_pwr_state,
.exit_optimized_pwr_state = dcn21_exit_optimized_pwr_state, .exit_optimized_pwr_state = dcn21_exit_optimized_pwr_state,
.power_down = dce110_power_down, .power_down = dce110_power_down,
.set_backlight_level = dce110_set_backlight_level,
}; };
static const struct hwseq_private_funcs dcn21_private_funcs = { static const struct hwseq_private_funcs dcn21_private_funcs = {
......
...@@ -191,6 +191,10 @@ struct hw_sequencer_funcs { ...@@ -191,6 +191,10 @@ struct hw_sequencer_funcs {
unsigned int bufSize, unsigned int mask); unsigned int bufSize, unsigned int mask);
void (*clear_status_bits)(struct dc *dc, unsigned int mask); void (*clear_status_bits)(struct dc *dc, unsigned int mask);
bool (*set_backlight_level)(struct pipe_ctx *pipe_ctx,
uint32_t backlight_pwm_u16_16,
uint32_t frame_ramp);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment