mirror of
https://github.com/torvalds/linux.git
synced 2026-05-23 06:31:58 +02:00
drm/amd/display: replace fast_validate with enum dc_validate_mode
[Why] The boolean fast_validate is used as an input parameter in multiple functions. To support more scenarios, we are replacing it with enum dc_validate_mode. [How] The enum dc_validate_mode introduces three possible values: 1) DC_VALIDATE_MODE_AND_PROGRAMMING: Apply the mode to hardware 2) DC_VALIDATE_MODE_ONLY: Check whether the mode can be supported 3) DC_VALIDATE_MODE_AND_STATE_INDEX: Check if the mode can be supported, and determine the optimal voltage level needed to support it. Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> Signed-off-by: Yan Li <yan.li@amd.com> Signed-off-by: Wayne Lin <wayne.lin@amd.com> Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
d42b2331e1
commit
269c1d1443
|
|
@ -7520,7 +7520,7 @@ static enum dc_status dm_validate_stream_and_context(struct dc *dc,
|
|||
dc_result = DC_FAIL_ATTACH_SURFACES;
|
||||
|
||||
if (dc_result == DC_OK)
|
||||
dc_result = dc_validate_global_state(dc, dc_state, true);
|
||||
dc_result = dc_validate_global_state(dc, dc_state, DC_VALIDATE_MODE_ONLY);
|
||||
|
||||
cleanup:
|
||||
if (dc_state)
|
||||
|
|
@ -12142,7 +12142,7 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
|
|||
drm_dbg_atomic(dev, "MST drm_dp_mst_atomic_check() failed\n");
|
||||
goto fail;
|
||||
}
|
||||
status = dc_validate_global_state(dc, dm_state->context, true);
|
||||
status = dc_validate_global_state(dc, dm_state->context, DC_VALIDATE_MODE_ONLY);
|
||||
if (status != DC_OK) {
|
||||
drm_dbg_atomic(dev, "DC global validation failure: %s (%d)",
|
||||
dc_status_to_str(status), status);
|
||||
|
|
|
|||
|
|
@ -2377,7 +2377,7 @@ enum dc_status dc_commit_streams(struct dc *dc, struct dc_commit_streams_params
|
|||
|
||||
context->power_source = params->power_source;
|
||||
|
||||
res = dc_validate_with_context(dc, set, params->stream_count, context, false);
|
||||
res = dc_validate_with_context(dc, set, params->stream_count, context, DC_VALIDATE_MODE_AND_PROGRAMMING);
|
||||
|
||||
/*
|
||||
* Only update link encoder to stream assignment after bandwidth validation passed.
|
||||
|
|
@ -3300,7 +3300,8 @@ static void copy_stream_update_to_stream(struct dc *dc,
|
|||
if (dsc_validate_context) {
|
||||
stream->timing.dsc_cfg = *update->dsc_config;
|
||||
stream->timing.flags.DSC = enable_dsc;
|
||||
if (dc->res_pool->funcs->validate_bandwidth(dc, dsc_validate_context, true) != DC_OK) {
|
||||
if (dc->res_pool->funcs->validate_bandwidth(dc, dsc_validate_context,
|
||||
DC_VALIDATE_MODE_ONLY) != DC_OK) {
|
||||
stream->timing.dsc_cfg = old_dsc_cfg;
|
||||
stream->timing.flags.DSC = old_dsc_enabled;
|
||||
update->dsc_config = NULL;
|
||||
|
|
@ -3522,7 +3523,7 @@ static bool update_planes_and_stream_state(struct dc *dc,
|
|||
}
|
||||
|
||||
if (update_type == UPDATE_TYPE_FULL) {
|
||||
if (dc->res_pool->funcs->validate_bandwidth(dc, context, false) != DC_OK) {
|
||||
if (dc->res_pool->funcs->validate_bandwidth(dc, context, DC_VALIDATE_MODE_AND_PROGRAMMING) != DC_OK) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
goto fail;
|
||||
}
|
||||
|
|
@ -4628,7 +4629,8 @@ static struct dc_state *create_minimal_transition_state(struct dc *dc,
|
|||
|
||||
backup_and_set_minimal_pipe_split_policy(dc, base_context, policy);
|
||||
/* commit minimal state */
|
||||
if (dc->res_pool->funcs->validate_bandwidth(dc, minimal_transition_context, false) == DC_OK) {
|
||||
if (dc->res_pool->funcs->validate_bandwidth(dc, minimal_transition_context,
|
||||
DC_VALIDATE_MODE_AND_PROGRAMMING) == DC_OK) {
|
||||
/* prevent underflow and corruption when reconfiguring pipes */
|
||||
force_vsync_flip_in_minimal_transition_context(minimal_transition_context);
|
||||
} else {
|
||||
|
|
@ -5151,7 +5153,7 @@ static bool update_planes_and_stream_v1(struct dc *dc,
|
|||
copy_stream_update_to_stream(dc, context, stream, stream_update);
|
||||
|
||||
if (update_type >= UPDATE_TYPE_FULL) {
|
||||
if (dc->res_pool->funcs->validate_bandwidth(dc, context, false) != DC_OK) {
|
||||
if (dc->res_pool->funcs->validate_bandwidth(dc, context, DC_VALIDATE_MODE_AND_PROGRAMMING) != DC_OK) {
|
||||
DC_ERROR("Mode validation failed for stream update!\n");
|
||||
dc_state_release(context);
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -4053,7 +4053,7 @@ static bool add_all_planes_for_stream(
|
|||
* @set: An array of dc_validation_set with all the current streams reference
|
||||
* @set_count: Total of streams
|
||||
* @context: New context
|
||||
* @fast_validate: Enable or disable fast validation
|
||||
* @validate_mode: identify the validation mode
|
||||
*
|
||||
* This function updates the potential new stream in the context object. It
|
||||
* creates multiple lists for the add, remove, and unchanged streams. In
|
||||
|
|
@ -4068,7 +4068,7 @@ enum dc_status dc_validate_with_context(struct dc *dc,
|
|||
const struct dc_validation_set set[],
|
||||
int set_count,
|
||||
struct dc_state *context,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
struct dc_stream_state *unchanged_streams[MAX_PIPES] = { 0 };
|
||||
struct dc_stream_state *del_streams[MAX_PIPES] = { 0 };
|
||||
|
|
@ -4242,7 +4242,7 @@ enum dc_status dc_validate_with_context(struct dc *dc,
|
|||
dc_state_set_stream_subvp_cursor_limit(context->streams[i], context, false);
|
||||
}
|
||||
|
||||
res = dc_validate_global_state(dc, context, fast_validate);
|
||||
res = dc_validate_global_state(dc, context, validate_mode);
|
||||
|
||||
/* calculate pixel rate divider after deciding pxiel clock & odm combine */
|
||||
if ((dc->hwss.calculate_pix_rate_divider) && (res == DC_OK)) {
|
||||
|
|
@ -4299,7 +4299,7 @@ static void decide_hblank_borrow(struct pipe_ctx *pipe_ctx)
|
|||
*
|
||||
* @dc: dc struct for this driver
|
||||
* @new_ctx: state to be validated
|
||||
* @fast_validate: set to true if only yes/no to support matters
|
||||
* @validate_mode: identify the validation mode
|
||||
*
|
||||
* Checks hardware resource availability and bandwidth requirement.
|
||||
*
|
||||
|
|
@ -4309,7 +4309,7 @@ static void decide_hblank_borrow(struct pipe_ctx *pipe_ctx)
|
|||
enum dc_status dc_validate_global_state(
|
||||
struct dc *dc,
|
||||
struct dc_state *new_ctx,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
enum dc_status result = DC_ERROR_UNEXPECTED;
|
||||
int i, j;
|
||||
|
|
@ -4368,7 +4368,7 @@ enum dc_status dc_validate_global_state(
|
|||
result = resource_build_scaling_params_for_context(dc, new_ctx);
|
||||
|
||||
if (result == DC_OK)
|
||||
result = dc->res_pool->funcs->validate_bandwidth(dc, new_ctx, fast_validate);
|
||||
result = dc->res_pool->funcs->validate_bandwidth(dc, new_ctx, validate_mode);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1804,19 +1804,15 @@ enum dc_status dc_validate_with_context(struct dc *dc,
|
|||
const struct dc_validation_set set[],
|
||||
int set_count,
|
||||
struct dc_state *context,
|
||||
bool fast_validate);
|
||||
enum dc_validate_mode validate_mode);
|
||||
|
||||
bool dc_set_generic_gpio_for_stereo(bool enable,
|
||||
struct gpio_service *gpio_service);
|
||||
|
||||
/*
|
||||
* fast_validate: we return after determining if we can support the new state,
|
||||
* but before we populate the programming info
|
||||
*/
|
||||
enum dc_status dc_validate_global_state(
|
||||
struct dc *dc,
|
||||
struct dc_state *new_ctx,
|
||||
bool fast_validate);
|
||||
enum dc_validate_mode validate_mode);
|
||||
|
||||
bool dc_acquire_release_mpc_3dlut(
|
||||
struct dc *dc, bool acquire,
|
||||
|
|
|
|||
|
|
@ -1370,4 +1370,12 @@ struct set_backlight_level_params {
|
|||
uint8_t aux_inst;
|
||||
};
|
||||
|
||||
enum dc_validate_mode {
|
||||
/* validate the mode and program HW */
|
||||
DC_VALIDATE_MODE_AND_PROGRAMMING = 0,
|
||||
/* only validate the mode */
|
||||
DC_VALIDATE_MODE_ONLY = 1,
|
||||
/* validate the mode and get the max state (voltage level) */
|
||||
DC_VALIDATE_MODE_AND_STATE_INDEX = 2,
|
||||
};
|
||||
#endif /* DC_TYPES_H_ */
|
||||
|
|
|
|||
|
|
@ -748,7 +748,7 @@ static unsigned int get_highest_allowed_voltage_level(bool is_vmin_only_asic)
|
|||
bool dcn_validate_bandwidth(
|
||||
struct dc *dc,
|
||||
struct dc_state *context,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
/*
|
||||
* we want a breakdown of the various stages of validation, which the
|
||||
|
|
@ -1119,7 +1119,7 @@ bool dcn_validate_bandwidth(
|
|||
|
||||
BW_VAL_TRACE_END_VOLTAGE_LEVEL();
|
||||
|
||||
if (v->voltage_level != number_of_states_plus_one && !fast_validate) {
|
||||
if (v->voltage_level != number_of_states_plus_one && validate_mode == DC_VALIDATE_MODE_AND_PROGRAMMING) {
|
||||
float bw_consumed = v->total_bandwidth_consumed_gbyte_per_second;
|
||||
|
||||
if (bw_consumed < v->fabric_and_dram_bandwidth_vmin0p65)
|
||||
|
|
@ -1286,7 +1286,7 @@ bool dcn_validate_bandwidth(
|
|||
}
|
||||
} else if (v->voltage_level == number_of_states_plus_one) {
|
||||
BW_VAL_TRACE_SKIP(fail);
|
||||
} else if (fast_validate) {
|
||||
} else if (validate_mode != DC_VALIDATE_MODE_AND_PROGRAMMING) {
|
||||
BW_VAL_TRACE_SKIP(fast);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1315,7 +1315,7 @@ static void swizzle_to_dml_params(
|
|||
int dcn20_populate_dml_pipes_from_context(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
int pipe_cnt, i;
|
||||
bool synchronized_vblank = true;
|
||||
|
|
@ -1733,7 +1733,7 @@ void dcn20_calculate_wm(struct dc *dc, struct dc_state *context,
|
|||
int *out_pipe_cnt,
|
||||
int *pipe_split_from,
|
||||
int vlevel,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
int pipe_cnt, i, pipe_idx;
|
||||
|
||||
|
|
@ -1780,10 +1780,10 @@ void dcn20_calculate_wm(struct dc *dc, struct dc_state *context,
|
|||
if (pipe_cnt != pipe_idx) {
|
||||
if (dc->res_pool->funcs->populate_dml_pipes)
|
||||
pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc,
|
||||
context, pipes, fast_validate);
|
||||
context, pipes, validate_mode);
|
||||
else
|
||||
pipe_cnt = dcn20_populate_dml_pipes_from_context(dc,
|
||||
context, pipes, fast_validate);
|
||||
context, pipes, validate_mode);
|
||||
}
|
||||
|
||||
*out_pipe_cnt = pipe_cnt;
|
||||
|
|
@ -2027,7 +2027,7 @@ void dcn20_patch_bounding_box(struct dc *dc, struct _vcs_dpi_soc_bounding_box_st
|
|||
}
|
||||
|
||||
static bool dcn20_validate_bandwidth_internal(struct dc *dc, struct dc_state *context,
|
||||
bool fast_validate, display_e2e_pipe_params_st *pipes)
|
||||
enum dc_validate_mode validate_mode, display_e2e_pipe_params_st *pipes)
|
||||
{
|
||||
bool out = false;
|
||||
|
||||
|
|
@ -2040,7 +2040,7 @@ static bool dcn20_validate_bandwidth_internal(struct dc *dc, struct dc_state *co
|
|||
|
||||
BW_VAL_TRACE_COUNT();
|
||||
|
||||
out = dcn20_fast_validate_bw(dc, context, pipes, &pipe_cnt, pipe_split_from, &vlevel, fast_validate);
|
||||
out = dcn20_fast_validate_bw(dc, context, pipes, &pipe_cnt, pipe_split_from, &vlevel, validate_mode);
|
||||
|
||||
if (pipe_cnt == 0)
|
||||
goto validate_out;
|
||||
|
|
@ -2050,12 +2050,12 @@ static bool dcn20_validate_bandwidth_internal(struct dc *dc, struct dc_state *co
|
|||
|
||||
BW_VAL_TRACE_END_VOLTAGE_LEVEL();
|
||||
|
||||
if (fast_validate) {
|
||||
if (validate_mode != DC_VALIDATE_MODE_AND_PROGRAMMING) {
|
||||
BW_VAL_TRACE_SKIP(fast);
|
||||
goto validate_out;
|
||||
}
|
||||
|
||||
dcn20_calculate_wm(dc, context, pipes, &pipe_cnt, pipe_split_from, vlevel, fast_validate);
|
||||
dcn20_calculate_wm(dc, context, pipes, &pipe_cnt, pipe_split_from, vlevel, validate_mode);
|
||||
dcn20_calculate_dlg_params(dc, context, pipes, pipe_cnt, vlevel);
|
||||
|
||||
BW_VAL_TRACE_END_WATERMARKS();
|
||||
|
|
@ -2077,7 +2077,7 @@ static bool dcn20_validate_bandwidth_internal(struct dc *dc, struct dc_state *co
|
|||
}
|
||||
|
||||
bool dcn20_validate_bandwidth_fp(struct dc *dc, struct dc_state *context,
|
||||
bool fast_validate, display_e2e_pipe_params_st *pipes)
|
||||
enum dc_validate_mode validate_mode, display_e2e_pipe_params_st *pipes)
|
||||
{
|
||||
bool voltage_supported = false;
|
||||
bool full_pstate_supported = false;
|
||||
|
|
@ -2095,12 +2095,11 @@ bool dcn20_validate_bandwidth_fp(struct dc *dc, struct dc_state *context,
|
|||
/*Unsafe due to current pipe merge and split logic*/
|
||||
ASSERT(context != dc->current_state);
|
||||
|
||||
if (fast_validate) {
|
||||
return dcn20_validate_bandwidth_internal(dc, context, true, pipes);
|
||||
}
|
||||
if (validate_mode != DC_VALIDATE_MODE_AND_PROGRAMMING)
|
||||
return dcn20_validate_bandwidth_internal(dc, context, validate_mode, pipes);
|
||||
|
||||
// Best case, we support full UCLK switch latency
|
||||
voltage_supported = dcn20_validate_bandwidth_internal(dc, context, false, pipes);
|
||||
voltage_supported = dcn20_validate_bandwidth_internal(dc, context, DC_VALIDATE_MODE_AND_PROGRAMMING, pipes);
|
||||
full_pstate_supported = context->bw_ctx.bw.dcn.clk.p_state_change_support;
|
||||
|
||||
if (context->bw_ctx.dml.soc.dummy_pstate_latency_us == 0 ||
|
||||
|
|
@ -2113,7 +2112,7 @@ bool dcn20_validate_bandwidth_fp(struct dc *dc, struct dc_state *context,
|
|||
context->bw_ctx.dml.soc.dram_clock_change_latency_us = context->bw_ctx.dml.soc.dummy_pstate_latency_us;
|
||||
|
||||
memset(pipes, 0, dc->res_pool->pipe_count * sizeof(display_e2e_pipe_params_st));
|
||||
voltage_supported = dcn20_validate_bandwidth_internal(dc, context, false, pipes);
|
||||
voltage_supported = dcn20_validate_bandwidth_internal(dc, context, DC_VALIDATE_MODE_AND_PROGRAMMING, pipes);
|
||||
dummy_pstate_supported = context->bw_ctx.bw.dcn.clk.p_state_change_support;
|
||||
|
||||
if (voltage_supported && (dummy_pstate_supported || !(context->stream_count))) {
|
||||
|
|
@ -2156,14 +2155,14 @@ void dcn20_fpu_adjust_dppclk(struct vba_vars_st *v,
|
|||
int dcn21_populate_dml_pipes_from_context(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
uint32_t pipe_cnt;
|
||||
int i;
|
||||
|
||||
dc_assert_fp_enabled();
|
||||
|
||||
pipe_cnt = dcn20_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);
|
||||
pipe_cnt = dcn20_populate_dml_pipes_from_context(dc, context, pipes, validate_mode);
|
||||
|
||||
for (i = 0; i < pipe_cnt; i++) {
|
||||
|
||||
|
|
@ -2239,7 +2238,7 @@ static void dcn21_calculate_wm(struct dc *dc, struct dc_state *context,
|
|||
int *out_pipe_cnt,
|
||||
int *pipe_split_from,
|
||||
int vlevel_req,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
int pipe_cnt, i, pipe_idx;
|
||||
int vlevel, vlevel_max;
|
||||
|
|
@ -2281,10 +2280,10 @@ static void dcn21_calculate_wm(struct dc *dc, struct dc_state *context,
|
|||
if (pipe_cnt != pipe_idx) {
|
||||
if (dc->res_pool->funcs->populate_dml_pipes)
|
||||
pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc,
|
||||
context, pipes, fast_validate);
|
||||
context, pipes, validate_mode);
|
||||
else
|
||||
pipe_cnt = dcn21_populate_dml_pipes_from_context(dc,
|
||||
context, pipes, fast_validate);
|
||||
context, pipes, validate_mode);
|
||||
}
|
||||
|
||||
*out_pipe_cnt = pipe_cnt;
|
||||
|
|
@ -2319,7 +2318,7 @@ static void dcn21_calculate_wm(struct dc *dc, struct dc_state *context,
|
|||
}
|
||||
|
||||
bool dcn21_validate_bandwidth_fp(struct dc *dc, struct dc_state *context,
|
||||
bool fast_validate, display_e2e_pipe_params_st *pipes)
|
||||
enum dc_validate_mode validate_mode, display_e2e_pipe_params_st *pipes)
|
||||
{
|
||||
bool out = false;
|
||||
|
||||
|
|
@ -2337,7 +2336,7 @@ bool dcn21_validate_bandwidth_fp(struct dc *dc, struct dc_state *context,
|
|||
/*Unsafe due to current pipe merge and split logic*/
|
||||
ASSERT(context != dc->current_state);
|
||||
|
||||
out = dcn21_fast_validate_bw(dc, context, pipes, &pipe_cnt, pipe_split_from, &vlevel, fast_validate);
|
||||
out = dcn21_fast_validate_bw(dc, context, pipes, &pipe_cnt, pipe_split_from, &vlevel, validate_mode);
|
||||
|
||||
if (pipe_cnt == 0)
|
||||
goto validate_out;
|
||||
|
|
@ -2347,12 +2346,12 @@ bool dcn21_validate_bandwidth_fp(struct dc *dc, struct dc_state *context,
|
|||
|
||||
BW_VAL_TRACE_END_VOLTAGE_LEVEL();
|
||||
|
||||
if (fast_validate) {
|
||||
if (validate_mode != DC_VALIDATE_MODE_AND_PROGRAMMING) {
|
||||
BW_VAL_TRACE_SKIP(fast);
|
||||
goto validate_out;
|
||||
}
|
||||
|
||||
dcn21_calculate_wm(dc, context, pipes, &pipe_cnt, pipe_split_from, vlevel, fast_validate);
|
||||
dcn21_calculate_wm(dc, context, pipes, &pipe_cnt, pipe_split_from, vlevel, validate_mode);
|
||||
dcn20_calculate_dlg_params(dc, context, pipes, pipe_cnt, vlevel);
|
||||
|
||||
BW_VAL_TRACE_END_WATERMARKS();
|
||||
|
|
|
|||
|
|
@ -44,14 +44,14 @@ void dcn20_calculate_dlg_params(struct dc *dc,
|
|||
int dcn20_populate_dml_pipes_from_context(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
bool fast_validate);
|
||||
enum dc_validate_mode validate_mode);
|
||||
void dcn20_calculate_wm(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
int *out_pipe_cnt,
|
||||
int *pipe_split_from,
|
||||
int vlevel,
|
||||
bool fast_validate);
|
||||
enum dc_validate_mode validate_mode);
|
||||
void dcn20_cap_soc_clocks(struct _vcs_dpi_soc_bounding_box_st *bb,
|
||||
struct pp_smu_nv_clock_table max_clocks);
|
||||
void dcn20_update_bounding_box(struct dc *dc,
|
||||
|
|
@ -62,7 +62,7 @@ void dcn20_update_bounding_box(struct dc *dc,
|
|||
void dcn20_patch_bounding_box(struct dc *dc,
|
||||
struct _vcs_dpi_soc_bounding_box_st *bb);
|
||||
bool dcn20_validate_bandwidth_fp(struct dc *dc, struct dc_state *context,
|
||||
bool fast_validate, display_e2e_pipe_params_st *pipes);
|
||||
enum dc_validate_mode validate_mode, display_e2e_pipe_params_st *pipes);
|
||||
void dcn20_fpu_set_wm_ranges(int i,
|
||||
struct pp_smu_wm_range_sets *ranges,
|
||||
struct _vcs_dpi_soc_bounding_box_st *loaded_bb);
|
||||
|
|
@ -75,9 +75,9 @@ void dcn20_fpu_adjust_dppclk(struct vba_vars_st *v,
|
|||
int dcn21_populate_dml_pipes_from_context(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
bool fast_validate);
|
||||
bool dcn21_validate_bandwidth_fp(struct dc *dc, struct dc_state *context, bool
|
||||
fast_validate, display_e2e_pipe_params_st *pipes);
|
||||
enum dc_validate_mode validate_mode);
|
||||
bool dcn21_validate_bandwidth_fp(struct dc *dc, struct dc_state *context, enum
|
||||
dc_validate_mode, display_e2e_pipe_params_st *pipes);
|
||||
void dcn21_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params);
|
||||
|
||||
void dcn21_clk_mgr_set_bw_params_wm_table(struct clk_bw_params *bw_params);
|
||||
|
|
|
|||
|
|
@ -339,7 +339,8 @@ void dcn30_fpu_calculate_wm_and_dlg(
|
|||
* newly found dummy_latency_index
|
||||
*/
|
||||
context->bw_ctx.dml.soc.dram_clock_change_latency_us = dc->clk_mgr->bw_params->wm_table.nv_entries[WM_A].dml_input.pstate_latency_us;
|
||||
dcn30_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, false, true);
|
||||
dcn30_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel,
|
||||
DC_VALIDATE_MODE_AND_PROGRAMMING, true);
|
||||
maxMpcComb = context->bw_ctx.dml.vba.maxMpcComb;
|
||||
dcfclk = context->bw_ctx.dml.vba.DCFCLKState[vlevel][context->bw_ctx.dml.vba.maxMpcComb];
|
||||
pstate_en = context->bw_ctx.dml.vba.DRAMClockChangeSupport[vlevel][maxMpcComb] != dm_dram_clock_change_unsupported;
|
||||
|
|
@ -630,7 +631,8 @@ int dcn30_find_dummy_latency_index_for_fw_based_mclk_switch(struct dc *dc,
|
|||
while (dummy_latency_index < max_latency_table_entries) {
|
||||
context->bw_ctx.dml.soc.dram_clock_change_latency_us =
|
||||
dc->clk_mgr->bw_params->dummy_pstate_table[dummy_latency_index].dummy_pstate_latency_us;
|
||||
dcn30_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, false, true);
|
||||
dcn30_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel,
|
||||
DC_VALIDATE_MODE_AND_PROGRAMMING, true);
|
||||
|
||||
if (context->bw_ctx.dml.soc.allow_dram_self_refresh_or_dram_clock_change_in_vblank ==
|
||||
dm_allow_self_refresh_and_mclk_switch)
|
||||
|
|
|
|||
|
|
@ -55,5 +55,5 @@ int dcn_get_approx_det_segs_required_for_pstate(
|
|||
int dcn31x_populate_dml_pipes_from_context(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
bool fast_validate);
|
||||
enum dc_validate_mode validate_mode);
|
||||
#endif /* __DCN31_FPU_H__*/
|
||||
|
|
|
|||
|
|
@ -306,7 +306,7 @@ static unsigned int get_vertical_back_porch(struct dc_crtc_timing *timing)
|
|||
|
||||
int dcn314_populate_dml_pipes_from_context_fpu(struct dc *dc, struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
int i, pipe_cnt;
|
||||
struct resource_context *res_ctx = &context->res_ctx;
|
||||
|
|
@ -316,7 +316,7 @@ int dcn314_populate_dml_pipes_from_context_fpu(struct dc *dc, struct dc_state *c
|
|||
|
||||
dc_assert_fp_enabled();
|
||||
|
||||
dcn31x_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);
|
||||
dcn31x_populate_dml_pipes_from_context(dc, context, pipes, validate_mode);
|
||||
|
||||
for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
struct dc_crtc_timing *timing;
|
||||
|
|
|
|||
|
|
@ -35,6 +35,6 @@
|
|||
void dcn314_update_bw_bounding_box_fpu(struct dc *dc, struct clk_bw_params *bw_params);
|
||||
int dcn314_populate_dml_pipes_from_context_fpu(struct dc *dc, struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
bool fast_validate);
|
||||
enum dc_validate_mode validate_mode);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -290,7 +290,7 @@ int dcn32_find_dummy_latency_index_for_fw_based_mclk_switch(struct dc *dc,
|
|||
vba->DRAMClockChangeSupport[vlevel][context->bw_ctx.dml.vba.maxMpcComb] = temp_clock_change_support;
|
||||
context->bw_ctx.dml.soc.dram_clock_change_latency_us =
|
||||
dc->clk_mgr->bw_params->dummy_pstate_table[dummy_latency_index].dummy_pstate_latency_us;
|
||||
dcn32_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, false);
|
||||
dcn32_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, DC_VALIDATE_MODE_AND_PROGRAMMING);
|
||||
|
||||
/* for subvp + DRR case, if subvp pipes are still present we support pstate */
|
||||
if (vba->DRAMClockChangeSupport[vlevel][vba->maxMpcComb] == dm_dram_clock_change_unsupported &&
|
||||
|
|
@ -1479,7 +1479,7 @@ static bool dcn32_full_validate_bw_helper(struct dc *dc,
|
|||
|
||||
/* Conditions for setting up phantom pipes for SubVP:
|
||||
* 1. Not force disable SubVP
|
||||
* 2. Full update (i.e. !fast_validate)
|
||||
* 2. Full update (i.e. DC_VALIDATE_MODE_AND_PROGRAMMING)
|
||||
* 3. Enough pipes are available to support SubVP (TODO: Which pipes will use VACTIVE / VBLANK / SUBVP?)
|
||||
* 4. Display configuration passes validation
|
||||
* 5. (Config doesn't support MCLK in VACTIVE/VBLANK || dc->debug.force_subvp_mclk_switch)
|
||||
|
|
@ -1517,7 +1517,8 @@ static bool dcn32_full_validate_bw_helper(struct dc *dc,
|
|||
|
||||
dc->res_pool->funcs->add_phantom_pipes(dc, context, pipes, *pipe_cnt, dc_pipe_idx);
|
||||
|
||||
*pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, false);
|
||||
*pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes,
|
||||
DC_VALIDATE_MODE_AND_PROGRAMMING);
|
||||
// Populate dppclk to trigger a recalculate in dml_get_voltage_level
|
||||
// so the phantom pipe DLG params can be assigned correctly.
|
||||
pipes[0].clks_cfg.dppclk_mhz = get_dppclk_calculated(&context->bw_ctx.dml, pipes, *pipe_cnt, 0);
|
||||
|
|
@ -1560,7 +1561,8 @@ static bool dcn32_full_validate_bw_helper(struct dc *dc,
|
|||
dc_state_remove_phantom_streams_and_planes(dc, context);
|
||||
dc_state_release_phantom_streams_and_planes(dc, context);
|
||||
vba->DRAMClockChangeSupport[*vlevel][vba->maxMpcComb] = dm_dram_clock_change_unsupported;
|
||||
*pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, false);
|
||||
*pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes,
|
||||
DC_VALIDATE_MODE_AND_PROGRAMMING);
|
||||
|
||||
*vlevel = dml_get_voltage_level(&context->bw_ctx.dml, pipes, *pipe_cnt);
|
||||
/* This may adjust vlevel and maxMpcComb */
|
||||
|
|
@ -2138,7 +2140,7 @@ bool dcn32_internal_validate_bw(struct dc *dc,
|
|||
display_e2e_pipe_params_st *pipes,
|
||||
int *pipe_cnt_out,
|
||||
int *vlevel_out,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
bool out = false;
|
||||
bool repopulate_pipes = false;
|
||||
|
|
@ -2162,7 +2164,7 @@ bool dcn32_internal_validate_bw(struct dc *dc,
|
|||
|
||||
for (i = 0; i < context->stream_count; i++)
|
||||
resource_update_pipes_for_stream_with_slice_count(context, dc->current_state, dc->res_pool, context->streams[i], 1);
|
||||
pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, fast_validate);
|
||||
pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, validate_mode);
|
||||
|
||||
if (!pipe_cnt) {
|
||||
out = true;
|
||||
|
|
@ -2172,13 +2174,13 @@ bool dcn32_internal_validate_bw(struct dc *dc,
|
|||
dml_log_pipe_params(&context->bw_ctx.dml, pipes, pipe_cnt);
|
||||
context->bw_ctx.dml.soc.max_vratio_pre = dcn32_determine_max_vratio_prefetch(dc, context);
|
||||
|
||||
if (!fast_validate) {
|
||||
if (validate_mode == DC_VALIDATE_MODE_AND_PROGRAMMING) {
|
||||
if (!dcn32_full_validate_bw_helper(dc, context, pipes, &vlevel, split, merge,
|
||||
&pipe_cnt, &repopulate_pipes))
|
||||
goto validate_fail;
|
||||
}
|
||||
|
||||
if (fast_validate ||
|
||||
if (validate_mode != DC_VALIDATE_MODE_AND_PROGRAMMING ||
|
||||
(dc->debug.dml_disallow_alternate_prefetch_modes &&
|
||||
(vlevel == context->bw_ctx.dml.soc.num_states ||
|
||||
vba->DRAMClockChangeSupport[vlevel][vba->maxMpcComb] == dm_dram_clock_change_unsupported))) {
|
||||
|
|
@ -2195,7 +2197,7 @@ bool dcn32_internal_validate_bw(struct dc *dc,
|
|||
context->bw_ctx.dml.soc.allow_for_pstate_or_stutter_in_vblank_final =
|
||||
dm_prefetch_support_none;
|
||||
|
||||
context->bw_ctx.dml.validate_max_state = fast_validate;
|
||||
context->bw_ctx.dml.validate_max_state = (validate_mode != DC_VALIDATE_MODE_AND_PROGRAMMING);
|
||||
vlevel = dml_get_voltage_level(&context->bw_ctx.dml, pipes, pipe_cnt);
|
||||
|
||||
context->bw_ctx.dml.validate_max_state = false;
|
||||
|
|
@ -2247,7 +2249,7 @@ bool dcn32_internal_validate_bw(struct dc *dc,
|
|||
int flag_vlevel = vlevel;
|
||||
int i;
|
||||
|
||||
pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, fast_validate);
|
||||
pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, validate_mode);
|
||||
if (!dc->config.enable_windowed_mpo_odm)
|
||||
dcn32_update_dml_pipes_odm_policy_based_on_context(dc, context, pipes);
|
||||
|
||||
|
|
@ -2343,7 +2345,7 @@ void dcn32_calculate_wm_and_dlg_fpu(struct dc *dc, struct dc_state *context,
|
|||
}
|
||||
context->bw_ctx.dml.soc.dram_clock_change_latency_us =
|
||||
dc->clk_mgr->bw_params->wm_table.nv_entries[WM_A].dml_input.pstate_latency_us;
|
||||
dcn32_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, false);
|
||||
dcn32_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, DC_VALIDATE_MODE_AND_PROGRAMMING);
|
||||
maxMpcComb = context->bw_ctx.dml.vba.maxMpcComb;
|
||||
if (is_subvp_p_drr) {
|
||||
context->bw_ctx.dml.vba.DRAMClockChangeSupport[vlevel][maxMpcComb] = dm_dram_clock_change_vblank_w_mall_sub_vp;
|
||||
|
|
@ -2389,7 +2391,8 @@ void dcn32_calculate_wm_and_dlg_fpu(struct dc *dc, struct dc_state *context,
|
|||
context->bw_ctx.dml.soc.fclk_change_latency_us =
|
||||
dc->clk_mgr->bw_params->dummy_pstate_table[dummy_latency_index].dummy_pstate_latency_us;
|
||||
}
|
||||
dcn32_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel_temp, false);
|
||||
dcn32_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel_temp,
|
||||
DC_VALIDATE_MODE_AND_PROGRAMMING);
|
||||
if (vlevel_temp < vlevel) {
|
||||
vlevel = vlevel_temp;
|
||||
maxMpcComb = context->bw_ctx.dml.vba.maxMpcComb;
|
||||
|
|
@ -2410,7 +2413,8 @@ void dcn32_calculate_wm_and_dlg_fpu(struct dc *dc, struct dc_state *context,
|
|||
stream_status->fpo_in_use = false;
|
||||
}
|
||||
context->bw_ctx.dml.soc.fclk_change_latency_us = dc->clk_mgr->bw_params->wm_table.nv_entries[WM_A].dml_input.fclk_change_latency_us;
|
||||
dcn32_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, false);
|
||||
dcn32_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel,
|
||||
DC_VALIDATE_MODE_AND_PROGRAMMING);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ bool dcn32_internal_validate_bw(struct dc *dc,
|
|||
display_e2e_pipe_params_st *pipes,
|
||||
int *pipe_cnt_out,
|
||||
int *vlevel_out,
|
||||
bool fast_validate);
|
||||
enum dc_validate_mode validate_mode);
|
||||
|
||||
void dcn32_calculate_wm_and_dlg_fpu(struct dc *dc, struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
|
|
|
|||
|
|
@ -437,7 +437,7 @@ static unsigned int get_vertical_back_porch(struct dc_crtc_timing *timing)
|
|||
int dcn35_populate_dml_pipes_from_context_fpu(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
int i, pipe_cnt;
|
||||
struct resource_context *res_ctx = &context->res_ctx;
|
||||
|
|
@ -446,7 +446,7 @@ int dcn35_populate_dml_pipes_from_context_fpu(struct dc *dc,
|
|||
const unsigned int max_allowed_vblank_nom = 1023;
|
||||
|
||||
dcn31_populate_dml_pipes_from_context(dc, context, pipes,
|
||||
fast_validate);
|
||||
validate_mode);
|
||||
|
||||
for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
struct dc_crtc_timing *timing;
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ void dcn35_update_bw_bounding_box_fpu(struct dc *dc,
|
|||
int dcn35_populate_dml_pipes_from_context_fpu(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
bool fast_validate);
|
||||
enum dc_validate_mode validate_mode);
|
||||
|
||||
void dcn35_decide_zstate_support(struct dc *dc, struct dc_state *context);
|
||||
|
||||
|
|
|
|||
|
|
@ -470,7 +470,7 @@ static unsigned int get_vertical_back_porch(struct dc_crtc_timing *timing)
|
|||
int dcn351_populate_dml_pipes_from_context_fpu(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
int i, pipe_cnt;
|
||||
struct resource_context *res_ctx = &context->res_ctx;
|
||||
|
|
@ -479,7 +479,7 @@ int dcn351_populate_dml_pipes_from_context_fpu(struct dc *dc,
|
|||
const unsigned int max_allowed_vblank_nom = 1023;
|
||||
|
||||
dcn31_populate_dml_pipes_from_context(dc, context, pipes,
|
||||
fast_validate);
|
||||
validate_mode);
|
||||
|
||||
for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
struct dc_crtc_timing *timing;
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ void dcn351_update_bw_bounding_box_fpu(struct dc *dc,
|
|||
int dcn351_populate_dml_pipes_from_context_fpu(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
bool fast_validate);
|
||||
enum dc_validate_mode validate_mode);
|
||||
|
||||
void dcn351_decide_zstate_support(struct dc *dc, struct dc_state *context);
|
||||
|
||||
|
|
|
|||
|
|
@ -326,12 +326,13 @@ static bool dml21_check_mode_support(const struct dc *in_dc, struct dc_state *co
|
|||
return true;
|
||||
}
|
||||
|
||||
bool dml21_validate(const struct dc *in_dc, struct dc_state *context, struct dml2_context *dml_ctx, bool fast_validate)
|
||||
bool dml21_validate(const struct dc *in_dc, struct dc_state *context, struct dml2_context *dml_ctx,
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
bool out = false;
|
||||
|
||||
/* Use dml_validate_only for fast_validate path */
|
||||
if (fast_validate)
|
||||
/* Use dml21_check_mode_support for DC_VALIDATE_MODE_ONLY and DC_VALIDATE_MODE_AND_STATE_INDEX path */
|
||||
if (validate_mode != DC_VALIDATE_MODE_AND_PROGRAMMING)
|
||||
out = dml21_check_mode_support(in_dc, context, dml_ctx);
|
||||
else
|
||||
out = dml21_mode_check_and_programming(in_dc, context, dml_ctx);
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ struct dc;
|
|||
struct dc_state;
|
||||
struct dml2_configuration_options;
|
||||
struct dml2_context;
|
||||
enum dc_validate_mode;
|
||||
|
||||
/**
|
||||
* dml2_create - Creates dml21_context.
|
||||
|
|
@ -39,16 +40,17 @@ void dml21_reinit(const struct dc *in_dc, struct dml2_context **dml_ctx, const s
|
|||
* dml21_validate - Determines if a display configuration is supported or not.
|
||||
* @in_dc: dc.
|
||||
* @context: dc_state to be validated.
|
||||
* @fast_validate: Fast validate will not populate context.res_ctx.
|
||||
* @validate_mode: DC_VALIDATE_MODE_ONLY and DC_VALIDATE_MODE_AND_STATE_INDEX
|
||||
* will not populate context.res_ctx.
|
||||
*
|
||||
* Based on fast_validate option internally would call:
|
||||
*
|
||||
* -dml21_mode_check_and_programming - for non fast_validate option
|
||||
* -dml21_mode_check_and_programming - for DC_VALIDATE_MODE_AND_PROGRAMMING option
|
||||
* Calculates if dc_state can be supported on the input display
|
||||
* configuration. If supported, generates the necessary HW
|
||||
* programming for the new dc_state.
|
||||
*
|
||||
* -dml21_check_mode_support - for fast_validate option
|
||||
* -dml21_check_mode_support - for DC_VALIDATE_MODE_ONLY and DC_VALIDATE_MODE_AND_STATE_INDEX option
|
||||
* Calculates if dc_state can be supported for the input display
|
||||
* config.
|
||||
|
||||
|
|
@ -56,7 +58,8 @@ void dml21_reinit(const struct dc *in_dc, struct dml2_context **dml_ctx, const s
|
|||
* separate dc_states for validation.
|
||||
* Return: True if mode is supported, false otherwise.
|
||||
*/
|
||||
bool dml21_validate(const struct dc *in_dc, struct dc_state *context, struct dml2_context *dml_ctx, bool fast_validate);
|
||||
bool dml21_validate(const struct dc *in_dc, struct dc_state *context, struct dml2_context *dml_ctx,
|
||||
enum dc_validate_mode validate_mode);
|
||||
|
||||
/* Prepare hubp mcache_regs for hubp mcache ID and split coordinate programming */
|
||||
void dml21_prepare_mcache_programming(struct dc *in_dc, struct dc_state *context, struct dml2_context *dml_ctx);
|
||||
|
|
|
|||
|
|
@ -868,7 +868,7 @@ bool dml2_svp_remove_all_phantom_pipes(struct dml2_context *ctx, struct dc_state
|
|||
|
||||
/* Conditions for setting up phantom pipes for SubVP:
|
||||
* 1. Not force disable SubVP
|
||||
* 2. Full update (i.e. !fast_validate)
|
||||
* 2. Full update (i.e. DC_VALIDATE_MODE_AND_PROGRAMMING)
|
||||
* 3. Enough pipes are available to support SubVP (TODO: Which pipes will use VACTIVE / VBLANK / SUBVP?)
|
||||
* 4. Display configuration passes validation
|
||||
* 5. (Config doesn't support MCLK in VACTIVE/VBLANK || dc->debug.force_subvp_mclk_switch)
|
||||
|
|
|
|||
|
|
@ -721,7 +721,8 @@ static void dml2_apply_debug_options(const struct dc *dc, struct dml2_context *d
|
|||
}
|
||||
}
|
||||
|
||||
bool dml2_validate(const struct dc *in_dc, struct dc_state *context, struct dml2_context *dml2, bool fast_validate)
|
||||
bool dml2_validate(const struct dc *in_dc, struct dc_state *context, struct dml2_context *dml2,
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
bool out = false;
|
||||
|
||||
|
|
@ -731,14 +732,14 @@ bool dml2_validate(const struct dc *in_dc, struct dc_state *context, struct dml2
|
|||
|
||||
/* DML2.1 validation path */
|
||||
if (dml2->architecture == dml2_architecture_21) {
|
||||
out = dml21_validate(in_dc, context, dml2, fast_validate);
|
||||
out = dml21_validate(in_dc, context, dml2, validate_mode);
|
||||
return out;
|
||||
}
|
||||
|
||||
DC_FP_START();
|
||||
|
||||
/* Use dml_validate_only for fast_validate path */
|
||||
if (fast_validate)
|
||||
/* Use dml_validate_only for DC_VALIDATE_MODE_ONLY and DC_VALIDATE_MODE_AND_STATE_INDEX path */
|
||||
if (validate_mode != DC_VALIDATE_MODE_AND_PROGRAMMING)
|
||||
out = dml2_validate_only(context);
|
||||
else
|
||||
out = dml2_validate_and_build_resource(in_dc, context);
|
||||
|
|
|
|||
|
|
@ -272,7 +272,7 @@ void dml2_reinit(const struct dc *in_dc,
|
|||
* dml2_validate - Determines if a display configuration is supported or not.
|
||||
* @in_dc: dc.
|
||||
* @context: dc_state to be validated.
|
||||
* @fast_validate: Fast validate will not populate context.res_ctx.
|
||||
* @validate_mode: DC_VALIDATE_MODE_ONLY and DC_VALIDATE_MODE_AND_STATE_INDEX will not populate context.res_ctx.
|
||||
*
|
||||
* DML1.0 compatible interface for validation.
|
||||
*
|
||||
|
|
@ -295,7 +295,7 @@ void dml2_reinit(const struct dc *in_dc,
|
|||
bool dml2_validate(const struct dc *in_dc,
|
||||
struct dc_state *context,
|
||||
struct dml2_context *dml2,
|
||||
bool fast_validate);
|
||||
enum dc_validate_mode validate_mode);
|
||||
|
||||
/*
|
||||
* dml2_extract_dram_and_fclk_change_support - Extracts the FCLK and UCLK change support info.
|
||||
|
|
|
|||
|
|
@ -2484,7 +2484,7 @@ bool dcn20_update_bandwidth(
|
|||
struct dce_hwseq *hws = dc->hwseq;
|
||||
|
||||
/* recalculate DML parameters */
|
||||
if (dc->res_pool->funcs->validate_bandwidth(dc, context, false) != DC_OK)
|
||||
if (dc->res_pool->funcs->validate_bandwidth(dc, context, DC_VALIDATE_MODE_AND_PROGRAMMING) != DC_OK)
|
||||
return false;
|
||||
|
||||
/* apply updated bandwidth parameters */
|
||||
|
|
|
|||
|
|
@ -2383,7 +2383,7 @@ bool dcn401_update_bandwidth(
|
|||
struct dce_hwseq *hws = dc->hwseq;
|
||||
|
||||
/* recalculate DML parameters */
|
||||
if (dc->res_pool->funcs->validate_bandwidth(dc, context, false) != DC_OK)
|
||||
if (dc->res_pool->funcs->validate_bandwidth(dc, context, DC_VALIDATE_MODE_AND_PROGRAMMING) != DC_OK)
|
||||
return false;
|
||||
|
||||
/* apply updated bandwidth parameters */
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@ struct resource_funcs {
|
|||
enum dc_status (*validate_bandwidth)(
|
||||
struct dc *dc,
|
||||
struct dc_state *context,
|
||||
bool fast_validate);
|
||||
enum dc_validate_mode validate_mode);
|
||||
void (*calculate_wm_and_dlg)(
|
||||
struct dc *dc, struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
|
|
@ -107,7 +107,7 @@ struct resource_funcs {
|
|||
struct dc *dc,
|
||||
struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
bool fast_validate);
|
||||
enum dc_validate_mode validate_mode);
|
||||
|
||||
/*
|
||||
* Algorithm for assigning available link encoders to links.
|
||||
|
|
|
|||
|
|
@ -622,7 +622,7 @@ extern const struct dcn_ip_params dcn10_ip_defaults;
|
|||
bool dcn_validate_bandwidth(
|
||||
struct dc *dc,
|
||||
struct dc_state *context,
|
||||
bool fast_validate);
|
||||
enum dc_validate_mode validate_mode);
|
||||
|
||||
void dcn_get_soc_clks(
|
||||
struct dc *dc,
|
||||
|
|
|
|||
|
|
@ -839,7 +839,7 @@ static enum dc_status build_mapped_resource(
|
|||
static enum dc_status dce100_validate_bandwidth(
|
||||
struct dc *dc,
|
||||
struct dc_state *context,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
int i;
|
||||
bool at_least_one_pipe = false;
|
||||
|
|
|
|||
|
|
@ -963,7 +963,7 @@ static enum dc_status build_mapped_resource(
|
|||
static enum dc_status dce110_validate_bandwidth(
|
||||
struct dc *dc,
|
||||
struct dc_state *context,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
|
|
|
|||
|
|
@ -886,7 +886,7 @@ static enum dc_status build_mapped_resource(
|
|||
enum dc_status dce112_validate_bandwidth(
|
||||
struct dc *dc,
|
||||
struct dc_state *context,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ enum dc_status dce112_validate_with_context(
|
|||
enum dc_status dce112_validate_bandwidth(
|
||||
struct dc *dc,
|
||||
struct dc_state *context,
|
||||
bool fast_validate);
|
||||
enum dc_validate_mode validate_mode);
|
||||
|
||||
enum dc_status dce112_add_stream_to_ctx(
|
||||
struct dc *dc,
|
||||
|
|
|
|||
|
|
@ -866,7 +866,7 @@ static void dce60_resource_destruct(struct dce110_resource_pool *pool)
|
|||
static enum dc_status dce60_validate_bandwidth(
|
||||
struct dc *dc,
|
||||
struct dc_state *context,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
int i;
|
||||
bool at_least_one_pipe = false;
|
||||
|
|
|
|||
|
|
@ -872,7 +872,7 @@ static void dce80_resource_destruct(struct dce110_resource_pool *pool)
|
|||
static enum dc_status dce80_validate_bandwidth(
|
||||
struct dc *dc,
|
||||
struct dc_state *context,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
int i;
|
||||
bool at_least_one_pipe = false;
|
||||
|
|
|
|||
|
|
@ -1129,12 +1129,12 @@ static void dcn10_destroy_resource_pool(struct resource_pool **pool)
|
|||
static enum dc_status dcn10_validate_bandwidth(
|
||||
struct dc *dc,
|
||||
struct dc_state *context,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
bool voltage_supported;
|
||||
|
||||
DC_FP_START();
|
||||
voltage_supported = dcn_validate_bandwidth(dc, context, fast_validate);
|
||||
voltage_supported = dcn_validate_bandwidth(dc, context, validate_mode);
|
||||
DC_FP_END();
|
||||
|
||||
return voltage_supported ? DC_OK : DC_FAIL_BANDWIDTH_VALIDATE;
|
||||
|
|
|
|||
|
|
@ -2007,7 +2007,7 @@ bool dcn20_fast_validate_bw(
|
|||
int *pipe_cnt_out,
|
||||
int *pipe_split_from,
|
||||
int *vlevel_out,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
bool out = false;
|
||||
int split[MAX_PIPES] = { 0 };
|
||||
|
|
@ -2021,7 +2021,7 @@ bool dcn20_fast_validate_bw(
|
|||
dcn20_merge_pipes_for_validate(dc, context);
|
||||
|
||||
DC_FP_START();
|
||||
pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, fast_validate);
|
||||
pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, validate_mode);
|
||||
DC_FP_END();
|
||||
|
||||
*pipe_cnt_out = pipe_cnt;
|
||||
|
|
@ -2125,7 +2125,7 @@ bool dcn20_fast_validate_bw(
|
|||
}
|
||||
|
||||
enum dc_status dcn20_validate_bandwidth(struct dc *dc, struct dc_state *context,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
bool voltage_supported;
|
||||
display_e2e_pipe_params_st *pipes;
|
||||
|
|
@ -2135,7 +2135,7 @@ enum dc_status dcn20_validate_bandwidth(struct dc *dc, struct dc_state *context,
|
|||
return DC_FAIL_BANDWIDTH_VALIDATE;
|
||||
|
||||
DC_FP_START();
|
||||
voltage_supported = dcn20_validate_bandwidth_fp(dc, context, fast_validate, pipes);
|
||||
voltage_supported = dcn20_validate_bandwidth_fp(dc, context, validate_mode, pipes);
|
||||
DC_FP_END();
|
||||
|
||||
kfree(pipes);
|
||||
|
|
|
|||
|
|
@ -119,7 +119,7 @@ void dcn20_set_mcif_arb_params(
|
|||
struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
int pipe_cnt);
|
||||
enum dc_status dcn20_validate_bandwidth(struct dc *dc, struct dc_state *context, bool fast_validate);
|
||||
enum dc_status dcn20_validate_bandwidth(struct dc *dc, struct dc_state *context, enum dc_validate_mode validate_mode);
|
||||
void dcn20_merge_pipes_for_validate(
|
||||
struct dc *dc,
|
||||
struct dc_state *context);
|
||||
|
|
@ -158,7 +158,7 @@ bool dcn20_fast_validate_bw(
|
|||
int *pipe_cnt_out,
|
||||
int *pipe_split_from,
|
||||
int *vlevel_out,
|
||||
bool fast_validate);
|
||||
enum dc_validate_mode validate_mode);
|
||||
|
||||
enum dc_status dcn20_build_mapped_resource(const struct dc *dc, struct dc_state *context, struct dc_stream_state *stream);
|
||||
enum dc_status dcn20_add_stream_to_ctx(struct dc *dc, struct dc_state *new_ctx, struct dc_stream_state *dc_stream);
|
||||
|
|
|
|||
|
|
@ -769,7 +769,7 @@ bool dcn21_fast_validate_bw(struct dc *dc,
|
|||
int *pipe_cnt_out,
|
||||
int *pipe_split_from,
|
||||
int *vlevel_out,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
bool out = false;
|
||||
int split[MAX_PIPES] = { 0 };
|
||||
|
|
@ -783,7 +783,7 @@ bool dcn21_fast_validate_bw(struct dc *dc,
|
|||
dcn20_merge_pipes_for_validate(dc, context);
|
||||
|
||||
DC_FP_START();
|
||||
pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, fast_validate);
|
||||
pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, validate_mode);
|
||||
DC_FP_END();
|
||||
|
||||
*pipe_cnt_out = pipe_cnt;
|
||||
|
|
@ -924,7 +924,7 @@ bool dcn21_fast_validate_bw(struct dc *dc,
|
|||
* dcn20_validate_bandwidth in dcn20_resource.c.
|
||||
*/
|
||||
static enum dc_status dcn21_validate_bandwidth(struct dc *dc, struct dc_state *context,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
bool voltage_supported;
|
||||
display_e2e_pipe_params_st *pipes;
|
||||
|
|
@ -934,7 +934,7 @@ static enum dc_status dcn21_validate_bandwidth(struct dc *dc, struct dc_state *c
|
|||
return DC_FAIL_BANDWIDTH_VALIDATE;
|
||||
|
||||
DC_FP_START();
|
||||
voltage_supported = dcn21_validate_bandwidth_fp(dc, context, fast_validate, pipes);
|
||||
voltage_supported = dcn21_validate_bandwidth_fp(dc, context, validate_mode, pipes);
|
||||
DC_FP_END();
|
||||
|
||||
kfree(pipes);
|
||||
|
|
|
|||
|
|
@ -51,6 +51,6 @@ bool dcn21_fast_validate_bw(
|
|||
int *pipe_cnt_out,
|
||||
int *pipe_split_from,
|
||||
int *vlevel_out,
|
||||
bool fast_validate);
|
||||
enum dc_validate_mode validate_mode);
|
||||
|
||||
#endif /* _DCN21_RESOURCE_H_ */
|
||||
|
|
|
|||
|
|
@ -1319,13 +1319,13 @@ static struct clock_source *dcn30_clock_source_create(
|
|||
int dcn30_populate_dml_pipes_from_context(
|
||||
struct dc *dc, struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
int i, pipe_cnt;
|
||||
struct resource_context *res_ctx = &context->res_ctx;
|
||||
|
||||
DC_FP_START();
|
||||
dcn20_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);
|
||||
dcn20_populate_dml_pipes_from_context(dc, context, pipes, validate_mode);
|
||||
DC_FP_END();
|
||||
|
||||
for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
|
|
@ -1627,7 +1627,7 @@ noinline bool dcn30_internal_validate_bw(
|
|||
display_e2e_pipe_params_st *pipes,
|
||||
int *pipe_cnt_out,
|
||||
int *vlevel_out,
|
||||
bool fast_validate,
|
||||
enum dc_validate_mode validate_mode,
|
||||
bool allow_self_refresh_only)
|
||||
{
|
||||
bool out = false;
|
||||
|
|
@ -1646,7 +1646,7 @@ noinline bool dcn30_internal_validate_bw(
|
|||
context->bw_ctx.dml.vba.VoltageLevel = 0;
|
||||
context->bw_ctx.dml.vba.DRAMClockChangeSupport[0][0] = dm_dram_clock_change_vactive;
|
||||
dc->res_pool->funcs->update_soc_for_wm_a(dc, context);
|
||||
pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, fast_validate);
|
||||
pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, validate_mode);
|
||||
|
||||
if (!pipe_cnt) {
|
||||
out = true;
|
||||
|
|
@ -1655,7 +1655,7 @@ noinline bool dcn30_internal_validate_bw(
|
|||
|
||||
dml_log_pipe_params(&context->bw_ctx.dml, pipes, pipe_cnt);
|
||||
|
||||
if (!fast_validate || !allow_self_refresh_only) {
|
||||
if (validate_mode == DC_VALIDATE_MODE_AND_PROGRAMMING || !allow_self_refresh_only) {
|
||||
/*
|
||||
* DML favors voltage over p-state, but we're more interested in
|
||||
* supporting p-state over voltage. We can't support p-state in
|
||||
|
|
@ -1669,7 +1669,7 @@ noinline bool dcn30_internal_validate_bw(
|
|||
vlevel = dcn20_validate_apply_pipe_split_flags(dc, context, vlevel, split, merge);
|
||||
}
|
||||
if (allow_self_refresh_only &&
|
||||
(fast_validate || vlevel == context->bw_ctx.dml.soc.num_states ||
|
||||
(validate_mode != DC_VALIDATE_MODE_AND_PROGRAMMING || vlevel == context->bw_ctx.dml.soc.num_states ||
|
||||
vba->DRAMClockChangeSupport[vlevel][vba->maxMpcComb] == dm_dram_clock_change_unsupported)) {
|
||||
/*
|
||||
* If mode is unsupported or there's still no p-state support
|
||||
|
|
@ -1678,7 +1678,7 @@ noinline bool dcn30_internal_validate_bw(
|
|||
* We don't actually support prefetch mode 2, so require that we
|
||||
* at least support prefetch mode 1.
|
||||
*/
|
||||
context->bw_ctx.dml.validate_max_state = fast_validate;
|
||||
context->bw_ctx.dml.validate_max_state = (validate_mode != DC_VALIDATE_MODE_AND_PROGRAMMING);
|
||||
context->bw_ctx.dml.soc.allow_dram_self_refresh_or_dram_clock_change_in_vblank =
|
||||
dm_allow_self_refresh;
|
||||
|
||||
|
|
@ -1865,7 +1865,7 @@ noinline bool dcn30_internal_validate_bw(
|
|||
}
|
||||
|
||||
if (repopulate_pipes)
|
||||
pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, fast_validate);
|
||||
pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, validate_mode);
|
||||
context->bw_ctx.dml.vba.VoltageLevel = vlevel;
|
||||
*vlevel_out = vlevel;
|
||||
*pipe_cnt_out = pipe_cnt;
|
||||
|
|
@ -2037,7 +2037,7 @@ void dcn30_calculate_wm_and_dlg(
|
|||
|
||||
enum dc_status dcn30_validate_bandwidth(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
bool out = false;
|
||||
|
||||
|
|
@ -2055,7 +2055,7 @@ enum dc_status dcn30_validate_bandwidth(struct dc *dc,
|
|||
goto validate_fail;
|
||||
|
||||
DC_FP_START();
|
||||
out = dcn30_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, fast_validate, true);
|
||||
out = dcn30_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, validate_mode, true);
|
||||
DC_FP_END();
|
||||
|
||||
if (pipe_cnt == 0)
|
||||
|
|
@ -2066,7 +2066,7 @@ enum dc_status dcn30_validate_bandwidth(struct dc *dc,
|
|||
|
||||
BW_VAL_TRACE_END_VOLTAGE_LEVEL();
|
||||
|
||||
if (fast_validate) {
|
||||
if (validate_mode != DC_VALIDATE_MODE_AND_PROGRAMMING) {
|
||||
BW_VAL_TRACE_SKIP(fast);
|
||||
goto validate_out;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -57,14 +57,14 @@ unsigned int dcn30_calc_max_scaled_time(
|
|||
unsigned int urgent_watermark);
|
||||
|
||||
enum dc_status dcn30_validate_bandwidth(struct dc *dc, struct dc_state *context,
|
||||
bool fast_validate);
|
||||
enum dc_validate_mode validate_mode);
|
||||
bool dcn30_internal_validate_bw(
|
||||
struct dc *dc,
|
||||
struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
int *pipe_cnt_out,
|
||||
int *vlevel_out,
|
||||
bool fast_validate,
|
||||
enum dc_validate_mode validate_mode,
|
||||
bool allow_self_refresh_only);
|
||||
void dcn30_calculate_wm_and_dlg(
|
||||
struct dc *dc, struct dc_state *context,
|
||||
|
|
@ -78,7 +78,7 @@ void dcn30_populate_dml_writeback_from_context(
|
|||
int dcn30_populate_dml_pipes_from_context(
|
||||
struct dc *dc, struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
bool fast_validate);
|
||||
enum dc_validate_mode validate_mode);
|
||||
|
||||
bool dcn30_acquire_post_bldn_3dlut(
|
||||
struct resource_context *res_ctx,
|
||||
|
|
|
|||
|
|
@ -1616,14 +1616,14 @@ static bool is_dual_plane(enum surface_pixel_format format)
|
|||
int dcn31x_populate_dml_pipes_from_context(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
uint32_t pipe_cnt;
|
||||
int i;
|
||||
|
||||
dc_assert_fp_enabled();
|
||||
|
||||
pipe_cnt = dcn20_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);
|
||||
pipe_cnt = dcn20_populate_dml_pipes_from_context(dc, context, pipes, validate_mode);
|
||||
|
||||
for (i = 0; i < pipe_cnt; i++) {
|
||||
pipes[i].pipe.src.gpuvm = 1;
|
||||
|
|
@ -1641,7 +1641,7 @@ int dcn31x_populate_dml_pipes_from_context(struct dc *dc,
|
|||
int dcn31_populate_dml_pipes_from_context(
|
||||
struct dc *dc, struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
int i, pipe_cnt;
|
||||
struct resource_context *res_ctx = &context->res_ctx;
|
||||
|
|
@ -1649,7 +1649,7 @@ int dcn31_populate_dml_pipes_from_context(
|
|||
bool upscaled = false;
|
||||
|
||||
DC_FP_START();
|
||||
dcn31x_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);
|
||||
dcn31x_populate_dml_pipes_from_context(dc, context, pipes, validate_mode);
|
||||
DC_FP_END();
|
||||
|
||||
for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
|
|
@ -1760,7 +1760,7 @@ dcn31_set_mcif_arb_params(struct dc *dc,
|
|||
|
||||
enum dc_status dcn31_validate_bandwidth(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
bool out = false;
|
||||
|
||||
|
|
@ -1778,19 +1778,19 @@ enum dc_status dcn31_validate_bandwidth(struct dc *dc,
|
|||
goto validate_fail;
|
||||
|
||||
DC_FP_START();
|
||||
out = dcn30_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, fast_validate, true);
|
||||
out = dcn30_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, validate_mode, true);
|
||||
DC_FP_END();
|
||||
|
||||
// Disable fast_validate to set min dcfclk in calculate_wm_and_dlg
|
||||
// Disable DC_VALIDATE_MODE_ONLY and DC_VALIDATE_MODE_AND_STATE_INDEX to set min dcfclk in calculate_wm_and_dlg
|
||||
if (pipe_cnt == 0)
|
||||
fast_validate = false;
|
||||
validate_mode = DC_VALIDATE_MODE_AND_PROGRAMMING;
|
||||
|
||||
if (!out)
|
||||
goto validate_fail;
|
||||
|
||||
BW_VAL_TRACE_END_VOLTAGE_LEVEL();
|
||||
|
||||
if (fast_validate) {
|
||||
if (validate_mode != DC_VALIDATE_MODE_AND_PROGRAMMING) {
|
||||
BW_VAL_TRACE_SKIP(fast);
|
||||
goto validate_out;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ struct dcn31_resource_pool {
|
|||
|
||||
enum dc_status dcn31_validate_bandwidth(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
bool fast_validate);
|
||||
enum dc_validate_mode validate_mode);
|
||||
void dcn31_calculate_wm_and_dlg(
|
||||
struct dc *dc, struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
|
|
@ -48,7 +48,7 @@ void dcn31_calculate_wm_and_dlg(
|
|||
int dcn31_populate_dml_pipes_from_context(
|
||||
struct dc *dc, struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
bool fast_validate);
|
||||
enum dc_validate_mode validate_mode);
|
||||
void
|
||||
dcn31_populate_dml_writeback_from_context(struct dc *dc,
|
||||
struct resource_context *res_ctx,
|
||||
|
|
|
|||
|
|
@ -1667,12 +1667,12 @@ static struct clock_source *dcn31_clock_source_create(
|
|||
static int dcn314_populate_dml_pipes_from_context(
|
||||
struct dc *dc, struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
int pipe_cnt;
|
||||
|
||||
DC_FP_START();
|
||||
pipe_cnt = dcn314_populate_dml_pipes_from_context_fpu(dc, context, pipes, fast_validate);
|
||||
pipe_cnt = dcn314_populate_dml_pipes_from_context_fpu(dc, context, pipes, validate_mode);
|
||||
DC_FP_END();
|
||||
|
||||
return pipe_cnt;
|
||||
|
|
@ -1696,7 +1696,7 @@ static void dcn314_get_panel_config_defaults(struct dc_panel_config *panel_confi
|
|||
|
||||
enum dc_status dcn314_validate_bandwidth(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
bool out = false;
|
||||
|
||||
|
|
@ -1715,19 +1715,19 @@ enum dc_status dcn314_validate_bandwidth(struct dc *dc,
|
|||
|
||||
DC_FP_START();
|
||||
// do not support self refresh only
|
||||
out = dcn30_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, fast_validate, false);
|
||||
out = dcn30_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, validate_mode, false);
|
||||
DC_FP_END();
|
||||
|
||||
// Disable fast_validate to set min dcfclk in calculate_wm_and_dlg
|
||||
// Disable DC_VALIDATE_MODE_ONLY and DC_VALIDATE_MODE_AND_STATE_INDEX to set min dcfclk in calculate_wm_and_dlg
|
||||
if (pipe_cnt == 0)
|
||||
fast_validate = false;
|
||||
validate_mode = DC_VALIDATE_MODE_AND_PROGRAMMING;
|
||||
|
||||
if (!out)
|
||||
goto validate_fail;
|
||||
|
||||
BW_VAL_TRACE_END_VOLTAGE_LEVEL();
|
||||
|
||||
if (fast_validate) {
|
||||
if (validate_mode != DC_VALIDATE_MODE_AND_PROGRAMMING) {
|
||||
BW_VAL_TRACE_SKIP(fast);
|
||||
goto validate_out;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ struct dcn314_resource_pool {
|
|||
|
||||
enum dc_status dcn314_validate_bandwidth(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
bool fast_validate);
|
||||
enum dc_validate_mode validate_mode);
|
||||
|
||||
struct resource_pool *dcn314_create_resource_pool(
|
||||
const struct dc_init_data *init_data,
|
||||
|
|
|
|||
|
|
@ -1664,7 +1664,7 @@ static bool allow_pixel_rate_crb(struct dc *dc, struct dc_state *context)
|
|||
static int dcn315_populate_dml_pipes_from_context(
|
||||
struct dc *dc, struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
int i, pipe_cnt, crb_idx, crb_pipes;
|
||||
struct resource_context *res_ctx = &context->res_ctx;
|
||||
|
|
@ -1674,7 +1674,7 @@ static int dcn315_populate_dml_pipes_from_context(
|
|||
bool pixel_rate_crb = allow_pixel_rate_crb(dc, context);
|
||||
|
||||
DC_FP_START();
|
||||
dcn31x_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);
|
||||
dcn31x_populate_dml_pipes_from_context(dc, context, pipes, validate_mode);
|
||||
DC_FP_END();
|
||||
|
||||
for (i = 0, pipe_cnt = 0, crb_pipes = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
|
|
|
|||
|
|
@ -1610,7 +1610,7 @@ static bool is_dual_plane(enum surface_pixel_format format)
|
|||
static int dcn316_populate_dml_pipes_from_context(
|
||||
struct dc *dc, struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
int i, pipe_cnt;
|
||||
struct resource_context *res_ctx = &context->res_ctx;
|
||||
|
|
@ -1618,7 +1618,7 @@ static int dcn316_populate_dml_pipes_from_context(
|
|||
const int max_usable_det = context->bw_ctx.dml.ip.config_return_buffer_size_in_kbytes - DCN3_16_MIN_COMPBUF_SIZE_KB;
|
||||
|
||||
DC_FP_START();
|
||||
dcn31x_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);
|
||||
dcn31x_populate_dml_pipes_from_context(dc, context, pipes, validate_mode);
|
||||
DC_FP_END();
|
||||
|
||||
for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
|
|
|
|||
|
|
@ -1742,7 +1742,7 @@ void dcn32_add_phantom_pipes(struct dc *dc, struct dc_state *context,
|
|||
}
|
||||
}
|
||||
|
||||
static bool dml1_validate(struct dc *dc, struct dc_state *context, bool fast_validate)
|
||||
static bool dml1_validate(struct dc *dc, struct dc_state *context, enum dc_validate_mode validate_mode)
|
||||
{
|
||||
bool out = false;
|
||||
|
||||
|
|
@ -1767,7 +1767,7 @@ static bool dml1_validate(struct dc *dc, struct dc_state *context, bool fast_val
|
|||
goto validate_fail;
|
||||
|
||||
DC_FP_START();
|
||||
out = dcn32_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, fast_validate);
|
||||
out = dcn32_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, validate_mode);
|
||||
DC_FP_END();
|
||||
|
||||
if (pipe_cnt == 0)
|
||||
|
|
@ -1778,7 +1778,7 @@ static bool dml1_validate(struct dc *dc, struct dc_state *context, bool fast_val
|
|||
|
||||
BW_VAL_TRACE_END_VOLTAGE_LEVEL();
|
||||
|
||||
if (fast_validate) {
|
||||
if (validate_mode != DC_VALIDATE_MODE_AND_PROGRAMMING) {
|
||||
BW_VAL_TRACE_SKIP(fast);
|
||||
goto validate_out;
|
||||
}
|
||||
|
|
@ -1809,7 +1809,7 @@ static bool dml1_validate(struct dc *dc, struct dc_state *context, bool fast_val
|
|||
|
||||
enum dc_status dcn32_validate_bandwidth(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
unsigned int i;
|
||||
enum dc_status status;
|
||||
|
|
@ -1827,11 +1827,11 @@ enum dc_status dcn32_validate_bandwidth(struct dc *dc,
|
|||
if (dc->debug.using_dml2)
|
||||
status = dml2_validate(dc, context,
|
||||
context->power_source == DC_POWER_SOURCE_DC ? context->bw_ctx.dml2_dc_power_source : context->bw_ctx.dml2,
|
||||
fast_validate) ? DC_OK : DC_FAIL_BANDWIDTH_VALIDATE;
|
||||
validate_mode) ? DC_OK : DC_FAIL_BANDWIDTH_VALIDATE;
|
||||
else
|
||||
status = dml1_validate(dc, context, fast_validate) ? DC_OK : DC_FAIL_BANDWIDTH_VALIDATE;
|
||||
status = dml1_validate(dc, context, validate_mode) ? DC_OK : DC_FAIL_BANDWIDTH_VALIDATE;
|
||||
|
||||
if (!fast_validate && status == DC_OK && dc_state_is_subvp_in_use(context)) {
|
||||
if (validate_mode == DC_VALIDATE_MODE_AND_PROGRAMMING && status == DC_OK && dc_state_is_subvp_in_use(context)) {
|
||||
/* check new stream configuration still supports cursor if subvp used */
|
||||
for (i = 0; i < context->stream_count; i++) {
|
||||
stream = context->streams[i];
|
||||
|
|
@ -1846,14 +1846,14 @@ enum dc_status dcn32_validate_bandwidth(struct dc *dc,
|
|||
};
|
||||
}
|
||||
|
||||
if (!fast_validate && status == DC_FAIL_HW_CURSOR_SUPPORT) {
|
||||
if (validate_mode == DC_VALIDATE_MODE_AND_PROGRAMMING && status == DC_FAIL_HW_CURSOR_SUPPORT) {
|
||||
/* attempt to validate again with subvp disabled due to cursor */
|
||||
if (dc->debug.using_dml2)
|
||||
status = dml2_validate(dc, context,
|
||||
context->power_source == DC_POWER_SOURCE_DC ? context->bw_ctx.dml2_dc_power_source : context->bw_ctx.dml2,
|
||||
fast_validate) ? DC_OK : DC_FAIL_BANDWIDTH_VALIDATE;
|
||||
validate_mode) ? DC_OK : DC_FAIL_BANDWIDTH_VALIDATE;
|
||||
else
|
||||
status = dml1_validate(dc, context, fast_validate) ? DC_OK : DC_FAIL_BANDWIDTH_VALIDATE;
|
||||
status = dml1_validate(dc, context, validate_mode) ? DC_OK : DC_FAIL_BANDWIDTH_VALIDATE;
|
||||
}
|
||||
|
||||
return status;
|
||||
|
|
@ -1862,7 +1862,7 @@ enum dc_status dcn32_validate_bandwidth(struct dc *dc,
|
|||
int dcn32_populate_dml_pipes_from_context(
|
||||
struct dc *dc, struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
int i, pipe_cnt;
|
||||
struct resource_context *res_ctx = &context->res_ctx;
|
||||
|
|
@ -1878,7 +1878,7 @@ int dcn32_populate_dml_pipes_from_context(
|
|||
int num_subvp_none = 0;
|
||||
int odm_slice_count;
|
||||
|
||||
dcn20_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);
|
||||
dcn20_populate_dml_pipes_from_context(dc, context, pipes, validate_mode);
|
||||
|
||||
/* For single display subvp, look for subvp main so if we have phantom
|
||||
* pipe, we can set odm policy to match main pipe
|
||||
|
|
@ -1960,7 +1960,7 @@ int dcn32_populate_dml_pipes_from_context(
|
|||
/* Only populate DML input with subvp info for full updates.
|
||||
* This is just a workaround -- needs a proper fix.
|
||||
*/
|
||||
if (!fast_validate) {
|
||||
if (validate_mode == DC_VALIDATE_MODE_AND_PROGRAMMING) {
|
||||
switch (dc_state_get_pipe_subvp_type(context, pipe)) {
|
||||
case SUBVP_MAIN:
|
||||
pipes[pipe_cnt].pipe.src.use_mall_for_pstate_change = dm_use_mall_pstate_change_sub_viewport;
|
||||
|
|
|
|||
|
|
@ -100,12 +100,12 @@ void dcn32_add_phantom_pipes(struct dc *dc,
|
|||
|
||||
enum dc_status dcn32_validate_bandwidth(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
bool fast_validate);
|
||||
enum dc_validate_mode validate_mode);
|
||||
|
||||
int dcn32_populate_dml_pipes_from_context(
|
||||
struct dc *dc, struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
bool fast_validate);
|
||||
enum dc_validate_mode validate_mode);
|
||||
|
||||
void dcn32_calculate_wm_and_dlg(
|
||||
struct dc *dc, struct dc_state *context,
|
||||
|
|
|
|||
|
|
@ -1734,15 +1734,15 @@ static void dcn35_get_panel_config_defaults(struct dc_panel_config *panel_config
|
|||
|
||||
static enum dc_status dcn35_validate_bandwidth(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
bool out = false;
|
||||
|
||||
out = dml2_validate(dc, context,
|
||||
context->power_source == DC_POWER_SOURCE_DC ? context->bw_ctx.dml2_dc_power_source : context->bw_ctx.dml2,
|
||||
fast_validate);
|
||||
validate_mode);
|
||||
|
||||
if (fast_validate)
|
||||
if (validate_mode != DC_VALIDATE_MODE_AND_PROGRAMMING)
|
||||
return out ? DC_OK : DC_FAIL_BANDWIDTH_VALIDATE;
|
||||
|
||||
DC_FP_START();
|
||||
|
|
|
|||
|
|
@ -1714,15 +1714,15 @@ static void dcn35_get_panel_config_defaults(struct dc_panel_config *panel_config
|
|||
|
||||
static enum dc_status dcn351_validate_bandwidth(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
bool out = false;
|
||||
|
||||
out = dml2_validate(dc, context,
|
||||
context->power_source == DC_POWER_SOURCE_DC ? context->bw_ctx.dml2_dc_power_source : context->bw_ctx.dml2,
|
||||
fast_validate);
|
||||
validate_mode);
|
||||
|
||||
if (fast_validate)
|
||||
if (validate_mode != DC_VALIDATE_MODE_AND_PROGRAMMING)
|
||||
return out ? DC_OK : DC_FAIL_BANDWIDTH_VALIDATE;
|
||||
|
||||
DC_FP_START();
|
||||
|
|
|
|||
|
|
@ -1715,15 +1715,15 @@ static void dcn35_get_panel_config_defaults(struct dc_panel_config *panel_config
|
|||
|
||||
static enum dc_status dcn35_validate_bandwidth(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
bool out = false;
|
||||
|
||||
out = dml2_validate(dc, context,
|
||||
context->power_source == DC_POWER_SOURCE_DC ? context->bw_ctx.dml2_dc_power_source : context->bw_ctx.dml2,
|
||||
fast_validate);
|
||||
validate_mode);
|
||||
|
||||
if (fast_validate)
|
||||
if (validate_mode != DC_VALIDATE_MODE_AND_PROGRAMMING)
|
||||
return out ? DC_OK : DC_FAIL_BANDWIDTH_VALIDATE;
|
||||
|
||||
DC_FP_START();
|
||||
|
|
|
|||
|
|
@ -1644,7 +1644,7 @@ enum dc_status dcn401_patch_unknown_plane_state(struct dc_plane_state *plane_sta
|
|||
|
||||
enum dc_status dcn401_validate_bandwidth(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
bool fast_validate)
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
unsigned int i;
|
||||
enum dc_status status = DC_OK;
|
||||
|
|
@ -1662,9 +1662,9 @@ enum dc_status dcn401_validate_bandwidth(struct dc *dc,
|
|||
if (dc->debug.using_dml2)
|
||||
status = dml2_validate(dc, context,
|
||||
context->power_source == DC_POWER_SOURCE_DC ? context->bw_ctx.dml2_dc_power_source : context->bw_ctx.dml2,
|
||||
fast_validate) ? DC_OK : DC_FAIL_BANDWIDTH_VALIDATE;
|
||||
validate_mode) ? DC_OK : DC_FAIL_BANDWIDTH_VALIDATE;
|
||||
|
||||
if (!fast_validate && status == DC_OK && dc_state_is_subvp_in_use(context)) {
|
||||
if (validate_mode == DC_VALIDATE_MODE_AND_PROGRAMMING && status == DC_OK && dc_state_is_subvp_in_use(context)) {
|
||||
/* check new stream configuration still supports cursor if subvp used */
|
||||
for (i = 0; i < context->stream_count; i++) {
|
||||
stream = context->streams[i];
|
||||
|
|
@ -1679,12 +1679,12 @@ enum dc_status dcn401_validate_bandwidth(struct dc *dc,
|
|||
};
|
||||
}
|
||||
|
||||
if (!fast_validate && status == DC_FAIL_HW_CURSOR_SUPPORT) {
|
||||
if (validate_mode == DC_VALIDATE_MODE_AND_PROGRAMMING && status == DC_FAIL_HW_CURSOR_SUPPORT) {
|
||||
/* attempt to validate again with subvp disabled due to cursor */
|
||||
if (dc->debug.using_dml2)
|
||||
status = dml2_validate(dc, context,
|
||||
context->power_source == DC_POWER_SOURCE_DC ? context->bw_ctx.dml2_dc_power_source : context->bw_ctx.dml2,
|
||||
fast_validate) ? DC_OK : DC_FAIL_BANDWIDTH_VALIDATE;
|
||||
validate_mode) ? DC_OK : DC_FAIL_BANDWIDTH_VALIDATE;
|
||||
}
|
||||
|
||||
return status;
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ enum dc_status dcn401_patch_unknown_plane_state(struct dc_plane_state *plane_sta
|
|||
|
||||
enum dc_status dcn401_validate_bandwidth(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
bool fast_validate);
|
||||
enum dc_validate_mode validate_mode);
|
||||
|
||||
void dcn401_prepare_mcache_programming(struct dc *dc, struct dc_state *context);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user