Commit b09c1fff authored by Leo (Hanghong) Ma's avatar Leo (Hanghong) Ma Committed by Alex Deucher

drm/amd/display: Add support for visual confirm color

[Why]
We want to get the visual confirm color of the bottom-most pipe
for test automation.

[How]
Save the visual confirm color to plane_state before program to MPC;
Reviewed-by: default avatarAnthony Koo <Anthony.Koo@amd.com>
Reviewed-by: default avatarAric Cyr <Aric.Cyr@amd.com>
Acked-by: default avatarBrian Chang <Brian.Chang@amd.com>
Signed-off-by: default avatarLeo (Hanghong) Ma <hanghong.ma@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 36527db3
...@@ -1183,6 +1183,7 @@ struct dc_plane_state { ...@@ -1183,6 +1183,7 @@ struct dc_plane_state {
/* private to dc_surface.c */ /* private to dc_surface.c */
enum dc_irq_source irq_source; enum dc_irq_source irq_source;
struct kref refcount; struct kref refcount;
struct tg_color visual_confirm_color;
}; };
struct dc_plane_info { struct dc_plane_info {
......
...@@ -389,6 +389,37 @@ void dc_dmub_srv_query_caps_cmd(struct dmub_srv *dmub) ...@@ -389,6 +389,37 @@ void dc_dmub_srv_query_caps_cmd(struct dmub_srv *dmub)
} }
} }
void dc_dmub_srv_get_visual_confirm_color_cmd(struct dc *dc, struct pipe_ctx *pipe_ctx)
{
union dmub_rb_cmd cmd = { 0 };
enum dmub_status status;
unsigned int panel_inst = 0;
dc_get_edp_link_panel_inst(dc, pipe_ctx->stream->link, &panel_inst);
memset(&cmd, 0, sizeof(cmd));
// Prepare fw command
cmd.visual_confirm_color.header.type = DMUB_CMD__GET_VISUAL_CONFIRM_COLOR;
cmd.visual_confirm_color.header.sub_type = 0;
cmd.visual_confirm_color.header.ret_status = 1;
cmd.visual_confirm_color.header.payload_bytes = sizeof(struct dmub_cmd_visual_confirm_color_data);
cmd.visual_confirm_color.visual_confirm_color_data.visual_confirm_color.panel_inst = panel_inst;
// Send command to fw
status = dmub_srv_cmd_with_reply_data(dc->ctx->dmub_srv->dmub, &cmd);
ASSERT(status == DMUB_STATUS_OK);
// If command was processed, copy feature caps to dmub srv
if (status == DMUB_STATUS_OK &&
cmd.visual_confirm_color.header.ret_status == 0) {
memcpy(&dc->ctx->dmub_srv->dmub->visual_confirm_color,
&cmd.visual_confirm_color.visual_confirm_color_data,
sizeof(struct dmub_visual_confirm_color));
}
}
#ifdef CONFIG_DRM_AMD_DC_DCN #ifdef CONFIG_DRM_AMD_DC_DCN
/** /**
* *********************************************************************************************** * ***********************************************************************************************
......
...@@ -78,6 +78,7 @@ void dc_dmub_srv_set_drr_manual_trigger_cmd(struct dc *dc, uint32_t tg_inst); ...@@ -78,6 +78,7 @@ void dc_dmub_srv_set_drr_manual_trigger_cmd(struct dc *dc, uint32_t tg_inst);
bool dc_dmub_srv_p_state_delegate(struct dc *dc, bool enable_pstate, struct dc_state *context); bool dc_dmub_srv_p_state_delegate(struct dc *dc, bool enable_pstate, struct dc_state *context);
void dc_dmub_srv_query_caps_cmd(struct dmub_srv *dmub); void dc_dmub_srv_query_caps_cmd(struct dmub_srv *dmub);
void dc_dmub_srv_get_visual_confirm_color_cmd(struct dc *dc, struct pipe_ctx *pipe_ctx);
void dc_dmub_srv_clear_inbox0_ack(struct dc_dmub_srv *dmub_srv); void dc_dmub_srv_clear_inbox0_ack(struct dc_dmub_srv *dmub_srv);
void dc_dmub_srv_wait_for_inbox0_ack(struct dc_dmub_srv *dmub_srv); void dc_dmub_srv_wait_for_inbox0_ack(struct dc_dmub_srv *dmub_srv);
void dc_dmub_srv_send_inbox0_cmd(struct dc_dmub_srv *dmub_srv, union dmub_inbox0_data_register data); void dc_dmub_srv_send_inbox0_cmd(struct dc_dmub_srv *dmub_srv, union dmub_inbox0_data_register data);
......
...@@ -2539,8 +2539,10 @@ void dcn10_update_visual_confirm_color(struct dc *dc, struct pipe_ctx *pipe_ctx, ...@@ -2539,8 +2539,10 @@ void dcn10_update_visual_confirm_color(struct dc *dc, struct pipe_ctx *pipe_ctx,
color_space_to_black_color( color_space_to_black_color(
dc, pipe_ctx->stream->output_color_space, color); dc, pipe_ctx->stream->output_color_space, color);
if (mpc->funcs->set_bg_color) if (mpc->funcs->set_bg_color) {
memcpy(&pipe_ctx->plane_state->visual_confirm_color, color, sizeof(struct tg_color));
mpc->funcs->set_bg_color(mpc, color, mpcc_id); mpc->funcs->set_bg_color(mpc, color, mpcc_id);
}
} }
void dcn10_update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx) void dcn10_update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx)
......
...@@ -2466,8 +2466,10 @@ void dcn20_update_visual_confirm_color(struct dc *dc, struct pipe_ctx *pipe_ctx, ...@@ -2466,8 +2466,10 @@ void dcn20_update_visual_confirm_color(struct dc *dc, struct pipe_ctx *pipe_ctx,
else if (dc->debug.visual_confirm == VISUAL_CONFIRM_SWIZZLE) else if (dc->debug.visual_confirm == VISUAL_CONFIRM_SWIZZLE)
get_surface_tile_visual_confirm_color(pipe_ctx, color); get_surface_tile_visual_confirm_color(pipe_ctx, color);
if (mpc->funcs->set_bg_color) if (mpc->funcs->set_bg_color) {
memcpy(&pipe_ctx->plane_state->visual_confirm_color, color, sizeof(struct tg_color));
mpc->funcs->set_bg_color(mpc, color, mpcc_id); mpc->funcs->set_bg_color(mpc, color, mpcc_id);
}
} }
void dcn20_update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx) void dcn20_update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx)
......
...@@ -441,6 +441,7 @@ struct dmub_srv { ...@@ -441,6 +441,7 @@ struct dmub_srv {
/* Feature capabilities reported by fw */ /* Feature capabilities reported by fw */
struct dmub_feature_caps feature_caps; struct dmub_feature_caps feature_caps;
struct dmub_visual_confirm_color visual_confirm_color;
}; };
/** /**
......
...@@ -246,6 +246,16 @@ struct dmub_feature_caps { ...@@ -246,6 +246,16 @@ struct dmub_feature_caps {
uint8_t reserved[6]; uint8_t reserved[6];
}; };
struct dmub_visual_confirm_color {
/**
* Maximum 10 bits color value
*/
uint16_t color_r_cr;
uint16_t color_g_y;
uint16_t color_b_cb;
uint16_t panel_inst;
};
#if defined(__cplusplus) #if defined(__cplusplus)
} }
#endif #endif
...@@ -644,6 +654,10 @@ enum dmub_cmd_type { ...@@ -644,6 +654,10 @@ enum dmub_cmd_type {
* Command type used to query FW feature caps. * Command type used to query FW feature caps.
*/ */
DMUB_CMD__QUERY_FEATURE_CAPS = 6, DMUB_CMD__QUERY_FEATURE_CAPS = 6,
/**
* Command type used to get visual confirm color.
*/
DMUB_CMD__GET_VISUAL_CONFIRM_COLOR = 8,
/** /**
* Command type used for all PSR commands. * Command type used for all PSR commands.
*/ */
...@@ -2778,6 +2792,31 @@ struct dmub_rb_cmd_query_feature_caps { ...@@ -2778,6 +2792,31 @@ struct dmub_rb_cmd_query_feature_caps {
struct dmub_cmd_query_feature_caps_data query_feature_caps_data; struct dmub_cmd_query_feature_caps_data query_feature_caps_data;
}; };
/**
* Data passed from driver to FW in a DMUB_CMD__GET_VISUAL_CONFIRM_COLOR command.
*/
struct dmub_cmd_visual_confirm_color_data {
/**
* DMUB feature capabilities.
* After DMUB init, driver will query FW capabilities prior to enabling certain features.
*/
struct dmub_visual_confirm_color visual_confirm_color;
};
/**
* Definition of a DMUB_CMD__GET_VISUAL_CONFIRM_COLOR command.
*/
struct dmub_rb_cmd_get_visual_confirm_color {
/**
* Command header.
*/
struct dmub_cmd_header header;
/**
* Data passed from driver to FW in a DMUB_CMD__GET_VISUAL_CONFIRM_COLOR command.
*/
struct dmub_cmd_visual_confirm_color_data visual_confirm_color_data;
};
struct dmub_optc_state { struct dmub_optc_state {
uint32_t v_total_max; uint32_t v_total_max;
uint32_t v_total_min; uint32_t v_total_min;
...@@ -3150,6 +3189,11 @@ union dmub_rb_cmd { ...@@ -3150,6 +3189,11 @@ union dmub_rb_cmd {
* Definition of a DMUB_CMD__QUERY_FEATURE_CAPS command. * Definition of a DMUB_CMD__QUERY_FEATURE_CAPS command.
*/ */
struct dmub_rb_cmd_query_feature_caps query_feature_caps; struct dmub_rb_cmd_query_feature_caps query_feature_caps;
/**
* Definition of a DMUB_CMD__GET_VISUAL_CONFIRM_COLOR command.
*/
struct dmub_rb_cmd_get_visual_confirm_color visual_confirm_color;
struct dmub_rb_cmd_drr_update drr_update; struct dmub_rb_cmd_drr_update drr_update;
struct dmub_rb_cmd_fw_assisted_mclk_switch fw_assisted_mclk_switch; struct dmub_rb_cmd_fw_assisted_mclk_switch fw_assisted_mclk_switch;
......
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