Skip to content

Commit 3807756

Browse files
Kaitlyn Tsealexdeucher
authored andcommitted
drm/amd/display: Implement new backlight_level_params structure
[Why] Implement the new backlight_level_params structure as part of the VBAC framework, the information in this structure is needed to be passed down to the DMCUB to identify the backlight control type, to adjust the backlight of the panel and to perform any required conversions from PWM to nits or vice versa. [How] Modified existing functions to include the new backlight_level_params structure. Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> Signed-off-by: Kaitlyn Tse <Kaitlyn.Tse@amd.com> Signed-off-by: Zaeem Mohamed <zaeem.mohamed@amd.com> Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent ebacc13 commit 3807756

20 files changed

Lines changed: 119 additions & 41 deletions

File tree

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4640,7 +4640,12 @@ static void amdgpu_dm_backlight_set_level(struct amdgpu_display_manager *dm,
46404640
if (!rc)
46414641
DRM_DEBUG("DM: Failed to update backlight via AUX on eDP[%d]\n", bl_idx);
46424642
} else {
4643-
rc = dc_link_set_backlight_level(link, brightness, 0);
4643+
struct set_backlight_level_params backlight_level_params = { 0 };
4644+
4645+
backlight_level_params.backlight_pwm_u16_16 = brightness;
4646+
backlight_level_params.transition_time_in_ms = 0;
4647+
4648+
rc = dc_link_set_backlight_level(link, &backlight_level_params);
46444649
if (!rc)
46454650
DRM_DEBUG("DM: Failed to update backlight on eDP[%d]\n", bl_idx);
46464651
}

drivers/gpu/drm/amd/display/dc/core/dc_link_exports.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -430,11 +430,10 @@ bool dc_link_get_backlight_level_nits(struct dc_link *link,
430430
}
431431

432432
bool dc_link_set_backlight_level(const struct dc_link *link,
433-
uint32_t backlight_pwm_u16_16,
434-
uint32_t frame_ramp)
433+
struct set_backlight_level_params *backlight_level_params)
435434
{
436435
return link->dc->link_srv->edp_set_backlight_level(link,
437-
backlight_pwm_u16_16, frame_ramp);
436+
backlight_level_params);
438437
}
439438

440439
bool dc_link_set_backlight_level_nits(struct dc_link *link,

drivers/gpu/drm/amd/display/dc/dc.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ struct dc_dmub_caps {
225225
bool subvp_psr;
226226
bool gecc_enable;
227227
uint8_t fams_ver;
228+
bool aux_backlight_support;
228229
};
229230

230231
struct dc_scl_caps {
@@ -2210,8 +2211,7 @@ void dc_link_edp_panel_backlight_power_on(struct dc_link *link,
22102211
* and 16 bit fractional, where 1.0 is max backlight value.
22112212
*/
22122213
bool dc_link_set_backlight_level(const struct dc_link *dc_link,
2213-
uint32_t backlight_pwm_u16_16,
2214-
uint32_t frame_ramp);
2214+
struct set_backlight_level_params *backlight_level_params);
22152215

22162216
/* Set/get nits-based backlight level of an embedded panel (eDP, LVDS). */
22172217
bool dc_link_set_backlight_level_nits(struct dc_link *link,

drivers/gpu/drm/amd/display/dc/dc_types.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1303,4 +1303,31 @@ struct dc_commit_streams_params {
13031303
enum dc_power_source_type power_source;
13041304
};
13051305

1306+
struct set_backlight_level_params {
1307+
/* backlight in pwm */
1308+
uint32_t backlight_pwm_u16_16;
1309+
/* brightness ramping */
1310+
uint32_t frame_ramp;
1311+
/* backlight control type
1312+
* 0: PWM backlight control
1313+
* 1: VESA AUX backlight control
1314+
* 2: AMD AUX backlight control
1315+
*/
1316+
enum backlight_control_type control_type;
1317+
/* backlight in millinits */
1318+
uint32_t backlight_millinits;
1319+
/* transition time in ms */
1320+
uint32_t transition_time_in_ms;
1321+
/* minimum luminance in nits */
1322+
uint32_t min_luminance;
1323+
/* maximum luminance in nits */
1324+
uint32_t max_luminance;
1325+
/* minimum backlight in pwm */
1326+
uint32_t min_backlight_pwm;
1327+
/* maximum backlight in pwm */
1328+
uint32_t max_backlight_pwm;
1329+
/* AUX HW instance */
1330+
uint8_t aux_inst;
1331+
};
1332+
13061333
#endif /* DC_TYPES_H_ */

drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3143,10 +3143,10 @@ static void dce110_set_cursor_attribute(struct pipe_ctx *pipe_ctx)
31433143
}
31443144

31453145
bool dce110_set_backlight_level(struct pipe_ctx *pipe_ctx,
3146-
struct set_backlight_level_params *params)
3146+
struct set_backlight_level_params *backlight_level_params)
31473147
{
3148-
uint32_t backlight_pwm_u16_16 = params->backlight_pwm_u16_16;
3149-
uint32_t frame_ramp = params->frame_ramp;
3148+
uint32_t backlight_pwm_u16_16 = backlight_level_params->backlight_pwm_u16_16;
3149+
uint32_t frame_ramp = backlight_level_params->frame_ramp;
31503150
struct dc_link *link = pipe_ctx->stream->link;
31513151
struct dc *dc = link->ctx->dc;
31523152
struct abm *abm = pipe_ctx->stream_res.abm;

drivers/gpu/drm/amd/display/dc/hwss/dcn21/dcn21_hwseq.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ void dcn21_PLAT_58856_wa(struct dc_state *context, struct pipe_ctx *pipe_ctx)
137137
pipe_ctx->stream->dpms_off = true;
138138
}
139139

140-
static bool dmub_abm_set_pipe(struct abm *abm, uint32_t otg_inst,
140+
bool dcn21_dmub_abm_set_pipe(struct abm *abm, uint32_t otg_inst,
141141
uint32_t option, uint32_t panel_inst, uint32_t pwrseq_inst)
142142
{
143143
union dmub_rb_cmd cmd;
@@ -199,7 +199,7 @@ void dcn21_set_abm_immediate_disable(struct pipe_ctx *pipe_ctx)
199199
abm->funcs->set_pipe_ex(abm, otg_inst, SET_ABM_PIPE_IMMEDIATELY_DISABLE,
200200
panel_cntl->inst, panel_cntl->pwrseq_inst);
201201
} else {
202-
dmub_abm_set_pipe(abm,
202+
dcn21_dmub_abm_set_pipe(abm,
203203
otg_inst,
204204
SET_ABM_PIPE_IMMEDIATELY_DISABLE,
205205
panel_cntl->inst,
@@ -234,31 +234,31 @@ void dcn21_set_pipe(struct pipe_ctx *pipe_ctx)
234234
panel_cntl->inst,
235235
panel_cntl->pwrseq_inst);
236236
} else {
237-
dmub_abm_set_pipe(abm, otg_inst,
237+
dcn21_dmub_abm_set_pipe(abm, otg_inst,
238238
SET_ABM_PIPE_NORMAL,
239239
panel_cntl->inst,
240240
panel_cntl->pwrseq_inst);
241241
}
242242
}
243243

244244
bool dcn21_set_backlight_level(struct pipe_ctx *pipe_ctx,
245-
struct set_backlight_level_params *params)
245+
struct set_backlight_level_params *backlight_level_params)
246246
{
247247
struct dc_context *dc = pipe_ctx->stream->ctx;
248248
struct abm *abm = pipe_ctx->stream_res.abm;
249249
struct timing_generator *tg = pipe_ctx->stream_res.tg;
250250
struct panel_cntl *panel_cntl = pipe_ctx->stream->link->panel_cntl;
251251
uint32_t otg_inst;
252-
uint32_t backlight_pwm_u16_16 = params->backlight_pwm_u16_16;
253-
uint32_t frame_ramp = params->frame_ramp;
252+
uint32_t backlight_pwm_u16_16 = backlight_level_params->backlight_pwm_u16_16;
253+
uint32_t frame_ramp = backlight_level_params->frame_ramp;
254254

255255
if (!abm || !tg || !panel_cntl)
256256
return false;
257257

258258
otg_inst = tg->inst;
259259

260260
if (dc->dc->res_pool->dmcu) {
261-
dce110_set_backlight_level(pipe_ctx, params);
261+
dce110_set_backlight_level(pipe_ctx, backlight_level_params);
262262
return true;
263263
}
264264

@@ -269,7 +269,7 @@ bool dcn21_set_backlight_level(struct pipe_ctx *pipe_ctx,
269269
panel_cntl->inst,
270270
panel_cntl->pwrseq_inst);
271271
} else {
272-
dmub_abm_set_pipe(abm,
272+
dcn21_dmub_abm_set_pipe(abm,
273273
otg_inst,
274274
SET_ABM_PIPE_NORMAL,
275275
panel_cntl->inst,

drivers/gpu/drm/amd/display/dc/hwss/dcn21/dcn21_hwseq.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ void dcn21_optimize_pwr_state(
4747
void dcn21_PLAT_58856_wa(struct dc_state *context,
4848
struct pipe_ctx *pipe_ctx);
4949

50+
bool dcn21_dmub_abm_set_pipe(struct abm *abm, uint32_t otg_inst,
51+
uint32_t option, uint32_t panel_inst, uint32_t pwrseq_inst);
5052
void dcn21_set_pipe(struct pipe_ctx *pipe_ctx);
5153
void dcn21_set_abm_immediate_disable(struct pipe_ctx *pipe_ctx);
5254
bool dcn21_set_backlight_level(struct pipe_ctx *pipe_ctx,

drivers/gpu/drm/amd/display/dc/hwss/dcn31/dcn31_hwseq.c

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,11 @@
4747
#include "dce/dmub_outbox.h"
4848
#include "link.h"
4949
#include "dcn10/dcn10_hwseq.h"
50+
#include "dcn21/dcn21_hwseq.h"
5051
#include "inc/link_enc_cfg.h"
5152
#include "dcn30/dcn30_vpg.h"
5253
#include "dce/dce_i2c_hw.h"
54+
#include "dce/dmub_abm_lcd.h"
5355

5456
#define DC_LOGGER_INIT(logger)
5557

@@ -638,3 +640,50 @@ void dcn31_set_static_screen_control(struct pipe_ctx **pipe_ctx,
638640
pipe_ctx[i]->stream_res.tg->funcs->set_static_screen_control(pipe_ctx[i]->stream_res.tg,
639641
triggers, params->num_frames);
640642
}
643+
644+
static void dmub_abm_set_backlight(struct dc_context *dc,
645+
struct set_backlight_level_params *backlight_level_params, uint32_t panel_inst)
646+
{
647+
union dmub_rb_cmd cmd;
648+
649+
memset(&cmd, 0, sizeof(cmd));
650+
cmd.abm_set_backlight.header.type = DMUB_CMD__ABM;
651+
cmd.abm_set_backlight.header.sub_type = DMUB_CMD__ABM_SET_BACKLIGHT;
652+
cmd.abm_set_backlight.abm_set_backlight_data.frame_ramp = backlight_level_params->frame_ramp;
653+
cmd.abm_set_backlight.abm_set_backlight_data.backlight_user_level = backlight_level_params->backlight_pwm_u16_16;
654+
cmd.abm_set_backlight.abm_set_backlight_data.backlight_control_type = backlight_level_params->control_type;
655+
cmd.abm_set_backlight.abm_set_backlight_data.min_luminance = backlight_level_params->min_luminance;
656+
cmd.abm_set_backlight.abm_set_backlight_data.max_luminance = backlight_level_params->max_luminance;
657+
cmd.abm_set_backlight.abm_set_backlight_data.min_backlight_pwm = backlight_level_params->min_backlight_pwm;
658+
cmd.abm_set_backlight.abm_set_backlight_data.max_backlight_pwm = backlight_level_params->max_backlight_pwm;
659+
cmd.abm_set_backlight.abm_set_backlight_data.version = DMUB_CMD_ABM_CONTROL_VERSION_1;
660+
cmd.abm_set_backlight.abm_set_backlight_data.panel_mask = (0x01 << panel_inst);
661+
cmd.abm_set_backlight.header.payload_bytes = sizeof(struct dmub_cmd_abm_set_backlight_data);
662+
663+
dc_wake_and_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
664+
}
665+
666+
bool dcn31_set_backlight_level(struct pipe_ctx *pipe_ctx,
667+
struct set_backlight_level_params *backlight_level_params)
668+
{
669+
struct dc_context *dc = pipe_ctx->stream->ctx;
670+
struct abm *abm = pipe_ctx->stream_res.abm;
671+
struct timing_generator *tg = pipe_ctx->stream_res.tg;
672+
struct panel_cntl *panel_cntl = pipe_ctx->stream->link->panel_cntl;
673+
uint32_t otg_inst;
674+
675+
if (!abm || !tg || !panel_cntl)
676+
return false;
677+
678+
otg_inst = tg->inst;
679+
680+
dcn21_dmub_abm_set_pipe(abm,
681+
otg_inst,
682+
SET_ABM_PIPE_NORMAL,
683+
panel_cntl->inst,
684+
panel_cntl->pwrseq_inst);
685+
686+
dmub_abm_set_backlight(dc, backlight_level_params, panel_cntl->inst);
687+
688+
return true;
689+
}

drivers/gpu/drm/amd/display/dc/hwss/dcn31/dcn31_hwseq.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ int dcn31_init_sys_ctx(struct dce_hwseq *hws, struct dc *dc, struct dc_phy_addr_
5151
void dcn31_reset_hw_ctx_wrap(
5252
struct dc *dc,
5353
struct dc_state *context);
54+
bool dcn31_set_backlight_level(struct pipe_ctx *pipe_ctx,
55+
struct set_backlight_level_params *params);
5456
bool dcn31_is_abm_supported(struct dc *dc,
5557
struct dc_state *context, struct dc_stream_state *stream);
5658
void dcn31_init_pipes(struct dc *dc, struct dc_state *context);
@@ -59,5 +61,4 @@ void dcn31_setup_hpo_hw_control(const struct dce_hwseq *hws, bool enable);
5961
void dcn31_set_static_screen_control(struct pipe_ctx **pipe_ctx,
6062
int num_pipes, const struct dc_static_screen_params *params);
6163

62-
6364
#endif /* __DC_HWSS_DCN31_H__ */

drivers/gpu/drm/amd/display/dc/hwss/dcn31/dcn31_init.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ static const struct hw_sequencer_funcs dcn31_funcs = {
9898
.set_flip_control_gsl = dcn20_set_flip_control_gsl,
9999
.get_vupdate_offset_from_vsync = dcn10_get_vupdate_offset_from_vsync,
100100
.calc_vupdate_position = dcn10_calc_vupdate_position,
101-
.set_backlight_level = dcn21_set_backlight_level,
101+
.set_backlight_level = dcn31_set_backlight_level,
102102
.set_abm_immediate_disable = dcn21_set_abm_immediate_disable,
103103
.set_pipe = dcn21_set_pipe,
104104
.enable_lvds_link_output = dce110_enable_lvds_link_output,

0 commit comments

Comments
 (0)