Commit 0baae624 authored by Alvin Lee's avatar Alvin Lee Committed by Alex Deucher

drm/amd/display: Refactor fast update to use new HWSS build sequence

[Description]
- Refactor HW sequencer to use a build / execute sequence
- Also move gamma updates to become fast

v2: squash in build fix ("drm/amd/display: Fix guarding of 'if (dc->debug.visual_confirm)'")
Acked-by: default avatarStylon Wang <stylon.wang@amd.com>
Signed-off-by: default avatarAlvin Lee <alvin.lee2@amd.com>
Reviewed-by: default avatarJun Lei <jun.lei@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 49f26218
This diff is collapsed.
...@@ -896,6 +896,7 @@ struct dc_debug_options { ...@@ -896,6 +896,7 @@ struct dc_debug_options {
bool disable_dp_plus_plus_wa; bool disable_dp_plus_plus_wa;
uint32_t fpo_vactive_min_active_margin_us; uint32_t fpo_vactive_min_active_margin_us;
uint32_t fpo_vactive_max_blank_us; uint32_t fpo_vactive_max_blank_us;
bool enable_legacy_fast_update;
}; };
struct gpu_info_soc_bounding_box_v1_0; struct gpu_info_soc_bounding_box_v1_0;
......
...@@ -401,6 +401,10 @@ static const struct dc_plane_cap plane_cap = { ...@@ -401,6 +401,10 @@ static const struct dc_plane_cap plane_cap = {
} }
}; };
static const struct dc_debug_options debug_defaults = {
.enable_legacy_fast_update = true,
};
#define CTX ctx #define CTX ctx
#define REG(reg) mm ## reg #define REG(reg) mm ## reg
...@@ -1071,6 +1075,7 @@ static bool dce100_resource_construct( ...@@ -1071,6 +1075,7 @@ static bool dce100_resource_construct(
dc->caps.dual_link_dvi = true; dc->caps.dual_link_dvi = true;
dc->caps.disable_dp_clk_share = true; dc->caps.disable_dp_clk_share = true;
dc->caps.extended_aux_timeout_support = false; dc->caps.extended_aux_timeout_support = false;
dc->debug = debug_defaults;
for (i = 0; i < pool->base.pipe_count; i++) { for (i = 0; i < pool->base.pipe_count; i++) {
pool->base.timing_generators[i] = pool->base.timing_generators[i] =
......
...@@ -424,6 +424,10 @@ static const struct dc_plane_cap plane_cap = { ...@@ -424,6 +424,10 @@ static const struct dc_plane_cap plane_cap = {
64 64
}; };
static const struct dc_debug_options debug_defaults = {
.enable_legacy_fast_update = true,
};
static const struct dc_plane_cap underlay_plane_cap = { static const struct dc_plane_cap underlay_plane_cap = {
.type = DC_PLANE_TYPE_DCE_UNDERLAY, .type = DC_PLANE_TYPE_DCE_UNDERLAY,
.per_pixel_alpha = 1, .per_pixel_alpha = 1,
...@@ -1368,6 +1372,7 @@ static bool dce110_resource_construct( ...@@ -1368,6 +1372,7 @@ static bool dce110_resource_construct(
dc->caps.min_horizontal_blanking_period = 80; dc->caps.min_horizontal_blanking_period = 80;
dc->caps.is_apu = true; dc->caps.is_apu = true;
dc->caps.extended_aux_timeout_support = false; dc->caps.extended_aux_timeout_support = false;
dc->debug = debug_defaults;
/************************************************* /*************************************************
* Create resources * * Create resources *
......
...@@ -429,6 +429,10 @@ static const struct dc_plane_cap plane_cap = { ...@@ -429,6 +429,10 @@ static const struct dc_plane_cap plane_cap = {
64 64
}; };
static const struct dc_debug_options debug_defaults = {
.enable_legacy_fast_update = true,
};
#define CTX ctx #define CTX ctx
#define REG(reg) mm ## reg #define REG(reg) mm ## reg
...@@ -1239,6 +1243,7 @@ static bool dce112_resource_construct( ...@@ -1239,6 +1243,7 @@ static bool dce112_resource_construct(
dc->caps.min_horizontal_blanking_period = 80; dc->caps.min_horizontal_blanking_period = 80;
dc->caps.dual_link_dvi = true; dc->caps.dual_link_dvi = true;
dc->caps.extended_aux_timeout_support = false; dc->caps.extended_aux_timeout_support = false;
dc->debug = debug_defaults;
/************************************************* /*************************************************
* Create resources * * Create resources *
......
...@@ -526,6 +526,7 @@ static const struct dc_plane_cap plane_cap = { ...@@ -526,6 +526,7 @@ static const struct dc_plane_cap plane_cap = {
static const struct dc_debug_options debug_defaults = { static const struct dc_debug_options debug_defaults = {
.disable_clock_gate = true, .disable_clock_gate = true,
.enable_legacy_fast_update = true,
}; };
static struct clock_source *dce120_clock_source_create( static struct clock_source *dce120_clock_source_create(
......
...@@ -418,6 +418,10 @@ static const struct dc_plane_cap plane_cap = { ...@@ -418,6 +418,10 @@ static const struct dc_plane_cap plane_cap = {
} }
}; };
static const struct dc_debug_options debug_defaults = {
.enable_legacy_fast_update = true,
};
static const struct dce_dmcu_registers dmcu_regs = { static const struct dce_dmcu_registers dmcu_regs = {
DMCU_DCE80_REG_LIST() DMCU_DCE80_REG_LIST()
}; };
...@@ -969,6 +973,7 @@ static bool dce80_construct( ...@@ -969,6 +973,7 @@ static bool dce80_construct(
dc->caps.min_horizontal_blanking_period = 80; dc->caps.min_horizontal_blanking_period = 80;
dc->caps.dual_link_dvi = true; dc->caps.dual_link_dvi = true;
dc->caps.extended_aux_timeout_support = false; dc->caps.extended_aux_timeout_support = false;
dc->debug = debug_defaults;
/************************************************* /*************************************************
* Create resources * * Create resources *
...@@ -1369,6 +1374,7 @@ static bool dce83_construct( ...@@ -1369,6 +1374,7 @@ static bool dce83_construct(
dc->caps.max_cursor_size = 128; dc->caps.max_cursor_size = 128;
dc->caps.min_horizontal_blanking_period = 80; dc->caps.min_horizontal_blanking_period = 80;
dc->caps.is_apu = true; dc->caps.is_apu = true;
dc->debug = debug_defaults;
/************************************************* /*************************************************
* Create resources * * Create resources *
......
...@@ -553,6 +553,7 @@ static const struct dc_debug_options debug_defaults_drv = { ...@@ -553,6 +553,7 @@ static const struct dc_debug_options debug_defaults_drv = {
.recovery_enabled = false, /*enable this by default after testing.*/ .recovery_enabled = false, /*enable this by default after testing.*/
.max_downscale_src_width = 3840, .max_downscale_src_width = 3840,
.underflow_assert_delay_us = 0xFFFFFFFF, .underflow_assert_delay_us = 0xFFFFFFFF,
.enable_legacy_fast_update = true,
}; };
static const struct dc_debug_options debug_defaults_diags = { static const struct dc_debug_options debug_defaults_diags = {
......
...@@ -722,6 +722,7 @@ static const struct dc_debug_options debug_defaults_drv = { ...@@ -722,6 +722,7 @@ static const struct dc_debug_options debug_defaults_drv = {
.scl_reset_length10 = true, .scl_reset_length10 = true,
.sanity_checks = false, .sanity_checks = false,
.underflow_assert_delay_us = 0xFFFFFFFF, .underflow_assert_delay_us = 0xFFFFFFFF,
.enable_legacy_fast_update = true,
}; };
void dcn20_dpp_destroy(struct dpp **dpp) void dcn20_dpp_destroy(struct dpp **dpp)
......
...@@ -613,6 +613,7 @@ static const struct dc_debug_options debug_defaults_drv = { ...@@ -613,6 +613,7 @@ static const struct dc_debug_options debug_defaults_drv = {
.sanity_checks = false, .sanity_checks = false,
.underflow_assert_delay_us = 0xFFFFFFFF, .underflow_assert_delay_us = 0xFFFFFFFF,
.enable_tri_buf = false, .enable_tri_buf = false,
.enable_legacy_fast_update = true,
}; };
static void dcn201_dpp_destroy(struct dpp **dpp) static void dcn201_dpp_destroy(struct dpp **dpp)
......
...@@ -653,6 +653,7 @@ static const struct dc_debug_options debug_defaults_drv = { ...@@ -653,6 +653,7 @@ static const struct dc_debug_options debug_defaults_drv = {
.usbc_combo_phy_reset_wa = true, .usbc_combo_phy_reset_wa = true,
.dmub_command_table = true, .dmub_command_table = true,
.use_max_lb = true, .use_max_lb = true,
.enable_legacy_fast_update = true,
}; };
static const struct dc_panel_config panel_config_defaults = { static const struct dc_panel_config panel_config_defaults = {
......
...@@ -887,6 +887,7 @@ static const struct dc_debug_options debug_defaults_drv = { ...@@ -887,6 +887,7 @@ static const struct dc_debug_options debug_defaults_drv = {
} }
}, },
.disable_z10 = true, .disable_z10 = true,
.enable_legacy_fast_update = true,
.enable_z9_disable_interface = true, /* Allow support for the PMFW interface for disable Z9*/ .enable_z9_disable_interface = true, /* Allow support for the PMFW interface for disable Z9*/
.dml_hostvm_override = DML_HOSTVM_OVERRIDE_FALSE, .dml_hostvm_override = DML_HOSTVM_OVERRIDE_FALSE,
}; };
......
...@@ -887,6 +887,7 @@ static const struct dc_debug_options debug_defaults_drv = { ...@@ -887,6 +887,7 @@ static const struct dc_debug_options debug_defaults_drv = {
.afmt = true, .afmt = true,
} }
}, },
.enable_legacy_fast_update = true,
.psr_power_use_phy_fsm = 0, .psr_power_use_phy_fsm = 0,
}; };
......
...@@ -884,6 +884,7 @@ static const struct dc_debug_options debug_defaults_drv = { ...@@ -884,6 +884,7 @@ static const struct dc_debug_options debug_defaults_drv = {
.afmt = true, .afmt = true,
} }
}, },
.enable_legacy_fast_update = true,
}; };
static const struct dc_panel_config panel_config_defaults = { static const struct dc_panel_config panel_config_defaults = {
......
...@@ -409,6 +409,30 @@ void dcn32_subvp_pipe_control_lock(struct dc *dc, ...@@ -409,6 +409,30 @@ void dcn32_subvp_pipe_control_lock(struct dc *dc,
} }
} }
void dcn32_subvp_pipe_control_lock_fast(union block_sequence_params *params)
{
struct dc *dc = params->subvp_pipe_control_lock_fast_params.dc;
bool lock = params->subvp_pipe_control_lock_fast_params.lock;
struct pipe_ctx *pipe_ctx = params->subvp_pipe_control_lock_fast_params.pipe_ctx;
bool subvp_immediate_flip = false;
if (pipe_ctx && pipe_ctx->stream && pipe_ctx->plane_state) {
if (pipe_ctx->stream->mall_stream_config.type == SUBVP_MAIN &&
pipe_ctx->plane_state->flip_immediate)
subvp_immediate_flip = true;
}
// Don't need to lock for DRR VSYNC flips -- FW will wait for DRR pending update cleared.
if (subvp_immediate_flip) {
union dmub_inbox0_cmd_lock_hw hw_lock_cmd = { 0 };
hw_lock_cmd.bits.command_code = DMUB_INBOX0_CMD__HW_LOCK;
hw_lock_cmd.bits.hw_lock_client = HW_LOCK_CLIENT_DRIVER;
hw_lock_cmd.bits.lock = lock;
hw_lock_cmd.bits.should_release = !lock;
dmub_hw_lock_mgr_inbox0_cmd(dc->ctx->dmub_srv, hw_lock_cmd);
}
}
bool dcn32_set_mpc_shaper_3dlut( bool dcn32_set_mpc_shaper_3dlut(
struct pipe_ctx *pipe_ctx, const struct dc_stream_state *stream) struct pipe_ctx *pipe_ctx, const struct dc_stream_state *stream)
......
...@@ -84,6 +84,8 @@ void dcn32_subvp_pipe_control_lock(struct dc *dc, ...@@ -84,6 +84,8 @@ void dcn32_subvp_pipe_control_lock(struct dc *dc,
struct pipe_ctx *top_pipe_to_program, struct pipe_ctx *top_pipe_to_program,
bool subvp_prev_use); bool subvp_prev_use);
void dcn32_subvp_pipe_control_lock_fast(union block_sequence_params *params);
void dcn32_unblank_stream(struct pipe_ctx *pipe_ctx, void dcn32_unblank_stream(struct pipe_ctx *pipe_ctx,
struct dc_link_settings *link_settings); struct dc_link_settings *link_settings);
......
...@@ -110,6 +110,7 @@ static const struct hw_sequencer_funcs dcn32_funcs = { ...@@ -110,6 +110,7 @@ static const struct hw_sequencer_funcs dcn32_funcs = {
.enable_phantom_streams = dcn32_enable_phantom_streams, .enable_phantom_streams = dcn32_enable_phantom_streams,
.subvp_pipe_control_lock = dcn32_subvp_pipe_control_lock, .subvp_pipe_control_lock = dcn32_subvp_pipe_control_lock,
.update_visual_confirm_color = dcn10_update_visual_confirm_color, .update_visual_confirm_color = dcn10_update_visual_confirm_color,
.subvp_pipe_control_lock_fast = dcn32_subvp_pipe_control_lock_fast,
.update_phantom_vp_position = dcn32_update_phantom_vp_position, .update_phantom_vp_position = dcn32_update_phantom_vp_position,
.update_dsc_pg = dcn32_update_dsc_pg, .update_dsc_pg = dcn32_update_dsc_pg,
.apply_update_flags_for_phantom = dcn32_apply_update_flags_for_phantom, .apply_update_flags_for_phantom = dcn32_apply_update_flags_for_phantom,
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "dwb.h" #include "dwb.h"
#include "mcif_wb.h" #include "mcif_wb.h"
#include "panel_cntl.h" #include "panel_cntl.h"
#include "dmub/inc/dmub_cmd.h"
#define MAX_CLOCK_SOURCES 7 #define MAX_CLOCK_SOURCES 7
#define MAX_SVP_PHANTOM_STREAMS 2 #define MAX_SVP_PHANTOM_STREAMS 2
...@@ -499,6 +500,11 @@ struct bw_context { ...@@ -499,6 +500,11 @@ struct bw_context {
struct display_mode_lib dml; struct display_mode_lib dml;
}; };
struct dc_dmub_cmd {
union dmub_rb_cmd dmub_cmd;
enum dm_dmub_wait_type wait_type;
};
/** /**
* struct dc_state - The full description of a state requested by users * struct dc_state - The full description of a state requested by users
*/ */
...@@ -547,6 +553,11 @@ struct dc_state { ...@@ -547,6 +553,11 @@ struct dc_state {
*/ */
struct bw_context bw_ctx; struct bw_context bw_ctx;
struct block_sequence block_sequence[50];
unsigned int block_sequence_steps;
struct dc_dmub_cmd dc_dmub_cmd[10];
unsigned int dmub_cmd_count;
/** /**
* @refcount: refcount reference * @refcount: refcount reference
* *
......
...@@ -44,6 +44,112 @@ struct dc_virtual_addr_space_config; ...@@ -44,6 +44,112 @@ struct dc_virtual_addr_space_config;
struct dpp; struct dpp;
struct dce_hwseq; struct dce_hwseq;
struct link_resource; struct link_resource;
struct dc_dmub_cmd;
struct subvp_pipe_control_lock_fast_params {
struct dc *dc;
bool lock;
struct pipe_ctx *pipe_ctx;
};
struct pipe_control_lock_params {
struct dc *dc;
struct pipe_ctx *pipe_ctx;
bool lock;
};
struct set_flip_control_gsl_params {
struct pipe_ctx *pipe_ctx;
bool flip_immediate;
};
struct program_triplebuffer_params {
const struct dc *dc;
struct pipe_ctx *pipe_ctx;
bool enableTripleBuffer;
};
struct update_plane_addr_params {
struct dc *dc;
struct pipe_ctx *pipe_ctx;
};
struct set_input_transfer_func_params {
struct dc *dc;
struct pipe_ctx *pipe_ctx;
struct dc_plane_state *plane_state;
};
struct program_gamut_remap_params {
struct pipe_ctx *pipe_ctx;
};
struct program_manual_trigger_params {
struct pipe_ctx *pipe_ctx;
};
struct send_dmcub_cmd_params {
struct dc_context *ctx;
union dmub_rb_cmd *cmd;
enum dm_dmub_wait_type wait_type;
};
struct setup_dpp_params {
struct pipe_ctx *pipe_ctx;
};
struct program_bias_and_scale_params {
struct pipe_ctx *pipe_ctx;
};
struct set_output_transfer_func_params {
struct dc *dc;
struct pipe_ctx *pipe_ctx;
const struct dc_stream_state *stream;
};
struct update_visual_confirm_params {
struct dc *dc;
struct pipe_ctx *pipe_ctx;
int mpcc_id;
};
union block_sequence_params {
struct update_plane_addr_params update_plane_addr_params;
struct subvp_pipe_control_lock_fast_params subvp_pipe_control_lock_fast_params;
struct pipe_control_lock_params pipe_control_lock_params;
struct set_flip_control_gsl_params set_flip_control_gsl_params;
struct program_triplebuffer_params program_triplebuffer_params;
struct set_input_transfer_func_params set_input_transfer_func_params;
struct program_gamut_remap_params program_gamut_remap_params;
struct program_manual_trigger_params program_manual_trigger_params;
struct send_dmcub_cmd_params send_dmcub_cmd_params;
struct setup_dpp_params setup_dpp_params;
struct program_bias_and_scale_params program_bias_and_scale_params;
struct set_output_transfer_func_params set_output_transfer_func_params;
struct update_visual_confirm_params update_visual_confirm_params;
};
enum block_sequence_func {
DMUB_SUBVP_PIPE_CONTROL_LOCK_FAST = 0,
OPTC_PIPE_CONTROL_LOCK,
HUBP_SET_FLIP_CONTROL_GSL,
HUBP_PROGRAM_TRIPLEBUFFER,
HUBP_UPDATE_PLANE_ADDR,
DPP_SET_INPUT_TRANSFER_FUNC,
DPP_PROGRAM_GAMUT_REMAP,
OPTC_PROGRAM_MANUAL_TRIGGER,
DMUB_SEND_DMCUB_CMD,
DPP_SETUP_DPP,
DPP_PROGRAM_BIAS_AND_SCALE,
DPP_SET_OUTPUT_TRANSFER_FUNC,
MPC_UPDATE_VISUAL_CONFIRM,
};
struct block_sequence {
union block_sequence_params params;
enum block_sequence_func func;
};
struct hw_sequencer_funcs { struct hw_sequencer_funcs {
void (*hardware_release)(struct dc *dc); void (*hardware_release)(struct dc *dc);
...@@ -252,6 +358,7 @@ struct hw_sequencer_funcs { ...@@ -252,6 +358,7 @@ struct hw_sequencer_funcs {
const struct tg_color *solid_color, const struct tg_color *solid_color,
int width, int height, int offset); int width, int height, int offset);
void (*subvp_pipe_control_lock_fast)(union block_sequence_params *params);
void (*z10_restore)(const struct dc *dc); void (*z10_restore)(const struct dc *dc);
void (*z10_save_init)(struct dc *dc); void (*z10_save_init)(struct dc *dc);
...@@ -313,4 +420,23 @@ void get_mclk_switch_visual_confirm_color( ...@@ -313,4 +420,23 @@ void get_mclk_switch_visual_confirm_color(
struct pipe_ctx *pipe_ctx, struct pipe_ctx *pipe_ctx,
struct tg_color *color); struct tg_color *color);
void hwss_execute_sequence(struct dc *dc,
struct block_sequence block_sequence[],
int num_steps);
void hwss_build_fast_sequence(struct dc *dc,
struct dc_dmub_cmd *dc_dmub_cmd,
unsigned int dmub_cmd_count,
struct block_sequence block_sequence[],
int *num_steps,
struct pipe_ctx *pipe_ctx);
void hwss_send_dmcub_cmd(union block_sequence_params *params);
void hwss_program_manual_trigger(union block_sequence_params *params);
void hwss_setup_dpp(union block_sequence_params *params);
void hwss_program_bias_and_scale(union block_sequence_params *params);
#endif /* __DC_HW_SEQUENCER_H__ */ #endif /* __DC_HW_SEQUENCER_H__ */
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