Commit 2563391e authored by Chaitanya Dhere's avatar Chaitanya Dhere Committed by Alex Deucher

drm/amd/display: DML2.1 resynchronization

July update for DML2.1 library from hardware team targeting DCN401
Reviewed-by: default avatarAurabindo Pillai <aurabindo.pillai@amd.com>
Signed-off-by: default avatarJerry Zuo <jerry.zuo@amd.com>
Signed-off-by: default avatarChaitanya Dhere <chaitanya.dhere@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 5d2c102d
...@@ -87,7 +87,6 @@ CFLAGS_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_dpmm/dml2_dpmm_factory.o := $(dml2_c ...@@ -87,7 +87,6 @@ CFLAGS_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_dpmm/dml2_dpmm_factory.o := $(dml2_c
CFLAGS_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_mcg/dml2_mcg_dcn4.o := $(dml2_ccflags) CFLAGS_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_mcg/dml2_mcg_dcn4.o := $(dml2_ccflags)
CFLAGS_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_mcg/dml2_mcg_factory.o := $(dml2_ccflags) CFLAGS_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_mcg/dml2_mcg_factory.o := $(dml2_ccflags)
CFLAGS_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn3.o := $(dml2_ccflags) CFLAGS_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn3.o := $(dml2_ccflags)
CFLAGS_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn4.o := $(dml2_ccflags)
CFLAGS_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn4_fams2.o := $(dml2_ccflags) CFLAGS_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn4_fams2.o := $(dml2_ccflags)
CFLAGS_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_factory.o := $(dml2_ccflags) CFLAGS_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_factory.o := $(dml2_ccflags)
CFLAGS_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_standalone_libraries/lib_float_math.o := $(dml2_ccflags) CFLAGS_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_standalone_libraries/lib_float_math.o := $(dml2_ccflags)
...@@ -110,7 +109,6 @@ CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_dpmm/dml2_dpmm_factory.o := $ ...@@ -110,7 +109,6 @@ CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_dpmm/dml2_dpmm_factory.o := $
CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_mcg/dml2_mcg_dcn4.o := $(dml2_rcflags) CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_mcg/dml2_mcg_dcn4.o := $(dml2_rcflags)
CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_mcg/dml2_mcg_factory.o := $(dml2_rcflags) CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_mcg/dml2_mcg_factory.o := $(dml2_rcflags)
CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn3.o := $(dml2_rcflags) CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn3.o := $(dml2_rcflags)
CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn4.o := $(dml2_rcflags)
CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn4_fams2.o := $(dml2_rcflags) CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn4_fams2.o := $(dml2_rcflags)
CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_factory.o := $(dml2_rcflags) CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_factory.o := $(dml2_rcflags)
CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_standalone_libraries/lib_float_math.o := $(dml2_rcflags) CFLAGS_REMOVE_$(AMDDALPATH)/dc/dml2/dml21/src/dml2_standalone_libraries/lib_float_math.o := $(dml2_rcflags)
...@@ -132,7 +130,6 @@ DML21 += src/dml2_dpmm/dml2_dpmm_factory.o ...@@ -132,7 +130,6 @@ DML21 += src/dml2_dpmm/dml2_dpmm_factory.o
DML21 += src/dml2_mcg/dml2_mcg_dcn4.o DML21 += src/dml2_mcg/dml2_mcg_dcn4.o
DML21 += src/dml2_mcg/dml2_mcg_factory.o DML21 += src/dml2_mcg/dml2_mcg_factory.o
DML21 += src/dml2_pmo/dml2_pmo_dcn3.o DML21 += src/dml2_pmo/dml2_pmo_dcn3.o
DML21 += src/dml2_pmo/dml2_pmo_dcn4.o
DML21 += src/dml2_pmo/dml2_pmo_factory.o DML21 += src/dml2_pmo/dml2_pmo_factory.o
DML21 += src/dml2_pmo/dml2_pmo_dcn4_fams2.o DML21 += src/dml2_pmo/dml2_pmo_dcn4_fams2.o
DML21 += src/dml2_standalone_libraries/lib_float_math.o DML21 += src/dml2_standalone_libraries/lib_float_math.o
......
...@@ -344,6 +344,9 @@ static const struct dml2_ip_capabilities dml2_dcn401_max_ip_caps = { ...@@ -344,6 +344,9 @@ static const struct dml2_ip_capabilities dml2_dcn401_max_ip_caps = {
.config_return_buffer_segment_size_in_kbytes = 64, .config_return_buffer_segment_size_in_kbytes = 64,
.meta_fifo_size_in_kentries = 22, .meta_fifo_size_in_kentries = 22,
.compressed_buffer_segment_size_in_kbytes = 64, .compressed_buffer_segment_size_in_kbytes = 64,
.max_flip_time_us = 80,
.max_flip_time_lines = 32,
.hostvm_mode = 0,
.subvp_drr_scheduling_margin_us = 100, .subvp_drr_scheduling_margin_us = 100,
.subvp_prefetch_end_to_mall_start_us = 15, .subvp_prefetch_end_to_mall_start_us = 15,
.subvp_fw_processing_delay = 15, .subvp_fw_processing_delay = 15,
...@@ -351,14 +354,18 @@ static const struct dml2_ip_capabilities dml2_dcn401_max_ip_caps = { ...@@ -351,14 +354,18 @@ static const struct dml2_ip_capabilities dml2_dcn401_max_ip_caps = {
.fams2 = { .fams2 = {
.max_allow_delay_us = 100 * 1000, .max_allow_delay_us = 100 * 1000,
.scheduling_delay_us = 50, .scheduling_delay_us = 125,
.vertical_interrupt_ack_delay_us = 18, .vertical_interrupt_ack_delay_us = 18,
.allow_programming_delay_us = 18, .allow_programming_delay_us = 18,
.min_allow_width_us = 20, .min_allow_width_us = 20,
.subvp_df_throttle_delay_us = 100, .subvp_df_throttle_delay_us = 100,
.subvp_programming_delay_us = 18, .subvp_programming_delay_us = 200,
.subvp_prefetch_to_mall_delay_us = 18, .subvp_prefetch_to_mall_delay_us = 18,
.drr_programming_delay_us = 18, .drr_programming_delay_us = 35,
.lock_timeout_us = 5000,
.recovery_timeout_us = 5000,
.flip_programming_delay_us = 300,
}, },
}; };
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#ifndef __DML_TOP_H__ #ifndef __DML_TOP_H__
#define __DML_TOP_H__ #define __DML_TOP_H__
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#ifndef __dml2_TOP_DCHUB_REGISTERS_H__ #ifndef __dml2_TOP_DCHUB_REGISTERS_H__
#define __dml2_TOP_DCHUB_REGISTERS_H__ #define __dml2_TOP_DCHUB_REGISTERS_H__
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#ifndef __DML_TOP_DISPLAY_CFG_TYPES_H__ #ifndef __DML_TOP_DISPLAY_CFG_TYPES_H__
#define __DML_TOP_DISPLAY_CFG_TYPES_H__ #define __DML_TOP_DISPLAY_CFG_TYPES_H__
...@@ -478,6 +477,7 @@ struct dml2_display_cfg { ...@@ -478,6 +477,7 @@ struct dml2_display_cfg {
bool max_outstanding_when_urgent_expected_disable; bool max_outstanding_when_urgent_expected_disable;
bool enable_subvp_implicit_pmo; //enables PMO to switch pipe uclk strategy to subvp, and generate phantom programming bool enable_subvp_implicit_pmo; //enables PMO to switch pipe uclk strategy to subvp, and generate phantom programming
unsigned int best_effort_min_active_latency_hiding_us; unsigned int best_effort_min_active_latency_hiding_us;
bool all_streams_blanked;
} overrides; } overrides;
}; };
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#ifndef __DML_TOP_POLICY_TYPES_H__ #ifndef __DML_TOP_POLICY_TYPES_H__
#define __DML_TOP_POLICY_TYPES_H__ #define __DML_TOP_POLICY_TYPES_H__
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#ifndef __DML_TOP_SOC_PARAMETER_TYPES_H__ #ifndef __DML_TOP_SOC_PARAMETER_TYPES_H__
#define __DML_TOP_SOC_PARAMETER_TYPES_H__ #define __DML_TOP_SOC_PARAMETER_TYPES_H__
...@@ -173,6 +172,7 @@ struct dml2_ip_capabilities { ...@@ -173,6 +172,7 @@ struct dml2_ip_capabilities {
unsigned int meta_fifo_size_in_kentries; unsigned int meta_fifo_size_in_kentries;
unsigned int compressed_buffer_segment_size_in_kbytes; unsigned int compressed_buffer_segment_size_in_kbytes;
unsigned int max_flip_time_us; unsigned int max_flip_time_us;
unsigned int max_flip_time_lines;
unsigned int hostvm_mode; unsigned int hostvm_mode;
unsigned int subvp_drr_scheduling_margin_us; unsigned int subvp_drr_scheduling_margin_us;
unsigned int subvp_prefetch_end_to_mall_start_us; unsigned int subvp_prefetch_end_to_mall_start_us;
...@@ -190,6 +190,10 @@ struct dml2_ip_capabilities { ...@@ -190,6 +190,10 @@ struct dml2_ip_capabilities {
unsigned int subvp_programming_delay_us; unsigned int subvp_programming_delay_us;
unsigned int subvp_prefetch_to_mall_delay_us; unsigned int subvp_prefetch_to_mall_delay_us;
unsigned int drr_programming_delay_us; unsigned int drr_programming_delay_us;
unsigned int lock_timeout_us;
unsigned int recovery_timeout_us;
unsigned int flip_programming_delay_us;
} fams2; } fams2;
}; };
......
...@@ -262,6 +262,7 @@ union dml2_global_sync_programming { ...@@ -262,6 +262,7 @@ union dml2_global_sync_programming {
unsigned int vupdate_offset_pixels; unsigned int vupdate_offset_pixels;
unsigned int vupdate_vupdate_width_pixels; unsigned int vupdate_vupdate_width_pixels;
unsigned int vready_offset_pixels; unsigned int vready_offset_pixels;
unsigned int pstate_keepout_start_lines;
} dcn4; } dcn4;
}; };
...@@ -411,6 +412,7 @@ struct dml2_display_cfg_programming { ...@@ -411,6 +412,7 @@ struct dml2_display_cfg_programming {
/* indicates this configuration requires FW to support */ /* indicates this configuration requires FW to support */
bool fams2_required; bool fams2_required;
struct dmub_cmd_fams2_global_config fams2_global_config;
struct { struct {
bool supported_in_blank; // Changing to configurations where this is false requires stutter to be disabled during the transition bool supported_in_blank; // Changing to configurations where this is false requires stutter to be disabled during the transition
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#include "dml2_internal_shared_types.h" #include "dml2_internal_shared_types.h"
#include "dml2_core_shared_types.h" #include "dml2_core_shared_types.h"
#include "dml2_core_dcn4.h" #include "dml2_core_dcn4.h"
...@@ -70,6 +69,7 @@ struct dml2_core_ip_params core_dcn4_ip_caps_base = { ...@@ -70,6 +69,7 @@ struct dml2_core_ip_params core_dcn4_ip_caps_base = {
.max_num_dp2p0_streams = 4, .max_num_dp2p0_streams = 4,
.imall_supported = 1, .imall_supported = 1,
.max_flip_time_us = 80, .max_flip_time_us = 80,
.max_flip_time_lines = 32,
.words_per_channel = 16, .words_per_channel = 16,
.subvp_fw_processing_delay_us = 15, .subvp_fw_processing_delay_us = 15,
...@@ -169,6 +169,7 @@ static void patch_ip_caps_with_explicit_ip_params(struct dml2_ip_capabilities *i ...@@ -169,6 +169,7 @@ static void patch_ip_caps_with_explicit_ip_params(struct dml2_ip_capabilities *i
ip_caps->meta_fifo_size_in_kentries = ip_params->meta_fifo_size_in_kentries; ip_caps->meta_fifo_size_in_kentries = ip_params->meta_fifo_size_in_kentries;
ip_caps->compressed_buffer_segment_size_in_kbytes = ip_params->compressed_buffer_segment_size_in_kbytes; ip_caps->compressed_buffer_segment_size_in_kbytes = ip_params->compressed_buffer_segment_size_in_kbytes;
ip_caps->max_flip_time_us = ip_params->max_flip_time_us; ip_caps->max_flip_time_us = ip_params->max_flip_time_us;
ip_caps->max_flip_time_lines = ip_params->max_flip_time_lines;
ip_caps->hostvm_mode = ip_params->hostvm_mode; ip_caps->hostvm_mode = ip_params->hostvm_mode;
// FIXME_STAGE2: cleanup after adding all dv override to ip_caps // FIXME_STAGE2: cleanup after adding all dv override to ip_caps
...@@ -192,6 +193,7 @@ static void patch_ip_params_with_ip_caps(struct dml2_core_ip_params *ip_params, ...@@ -192,6 +193,7 @@ static void patch_ip_params_with_ip_caps(struct dml2_core_ip_params *ip_params,
ip_params->meta_fifo_size_in_kentries = ip_caps->meta_fifo_size_in_kentries; ip_params->meta_fifo_size_in_kentries = ip_caps->meta_fifo_size_in_kentries;
ip_params->compressed_buffer_segment_size_in_kbytes = ip_caps->compressed_buffer_segment_size_in_kbytes; ip_params->compressed_buffer_segment_size_in_kbytes = ip_caps->compressed_buffer_segment_size_in_kbytes;
ip_params->max_flip_time_us = ip_caps->max_flip_time_us; ip_params->max_flip_time_us = ip_caps->max_flip_time_us;
ip_params->max_flip_time_lines = ip_caps->max_flip_time_lines;
ip_params->hostvm_mode = ip_caps->hostvm_mode; ip_params->hostvm_mode = ip_caps->hostvm_mode;
} }
...@@ -222,6 +224,7 @@ bool core_dcn4_initialize(struct dml2_core_initialize_in_out *in_out) ...@@ -222,6 +224,7 @@ bool core_dcn4_initialize(struct dml2_core_initialize_in_out *in_out)
} }
memcpy(&core->clean_me_up.mode_lib.soc, in_out->soc_bb, sizeof(struct dml2_soc_bb)); memcpy(&core->clean_me_up.mode_lib.soc, in_out->soc_bb, sizeof(struct dml2_soc_bb));
memcpy(&core->clean_me_up.mode_lib.ip_caps, in_out->ip_caps, sizeof(struct dml2_ip_capabilities));
return true; return true;
} }
...@@ -246,10 +249,12 @@ static void create_phantom_plane_from_main_plane(struct dml2_plane_parameters *p ...@@ -246,10 +249,12 @@ static void create_phantom_plane_from_main_plane(struct dml2_plane_parameters *p
phantom->stream_index = phantom_stream_index; phantom->stream_index = phantom_stream_index;
phantom->overrides.refresh_from_mall = dml2_refresh_from_mall_mode_override_force_disable; phantom->overrides.refresh_from_mall = dml2_refresh_from_mall_mode_override_force_disable;
phantom->overrides.legacy_svp_config = dml2_svp_mode_override_phantom_pipe_no_data_return; phantom->overrides.legacy_svp_config = dml2_svp_mode_override_phantom_pipe_no_data_return;
phantom->composition.viewport.plane0.height = (long int unsigned) math_ceil2( phantom->composition.viewport.plane0.height = (long int unsigned) math_min2(math_ceil2(
(double)phantom->composition.viewport.plane0.height * (double)phantom_stream->timing.v_active / (double)main_stream->timing.v_active, 16.0); (double)main->composition.scaler_info.plane0.v_ratio * (double)phantom_stream->timing.v_active, 16.0),
phantom->composition.viewport.plane1.height = (long int unsigned) math_ceil2( (double)main->composition.viewport.plane0.height);
(double)phantom->composition.viewport.plane1.height * (double)phantom_stream->timing.v_active / (double)main_stream->timing.v_active, 16.0); phantom->composition.viewport.plane1.height = (long int unsigned) math_min2(math_ceil2(
(double)main->composition.scaler_info.plane1.v_ratio * (double)phantom_stream->timing.v_active, 16.0),
(double)main->composition.viewport.plane1.height);
phantom->immediate_flip = false; phantom->immediate_flip = false;
phantom->dynamic_meta_data.enable = false; phantom->dynamic_meta_data.enable = false;
phantom->cursor.num_cursors = 0; phantom->cursor.num_cursors = 0;
...@@ -344,6 +349,8 @@ static void pack_mode_programming_params_with_implicit_subvp(struct dml2_core_in ...@@ -344,6 +349,8 @@ static void pack_mode_programming_params_with_implicit_subvp(struct dml2_core_in
// Check if FAMS2 is required // Check if FAMS2 is required
if (display_cfg->stage3.performed && display_cfg->stage3.success) { if (display_cfg->stage3.performed && display_cfg->stage3.success) {
programming->fams2_required = display_cfg->stage3.fams2_required; programming->fams2_required = display_cfg->stage3.fams2_required;
dml2_core_calcs_get_global_fams2_programming(&core->clean_me_up.mode_lib, display_cfg, &programming->fams2_global_config);
} }
// Only loop over all the main streams (the implicit svp streams will be packed as part of the main stream) // Only loop over all the main streams (the implicit svp streams will be packed as part of the main stream)
...@@ -641,20 +648,20 @@ bool core_dcn4_mode_programming(struct dml2_core_mode_programming_in_out *in_out ...@@ -641,20 +648,20 @@ bool core_dcn4_mode_programming(struct dml2_core_mode_programming_in_out *in_out
for (plane_index = 0; plane_index < in_out->programming->display_config.num_planes; plane_index++) { for (plane_index = 0; plane_index < in_out->programming->display_config.num_planes; plane_index++) {
in_out->programming->plane_programming[plane_index].num_dpps_required = core->clean_me_up.mode_lib.mp.NoOfDPP[plane_index]; in_out->programming->plane_programming[plane_index].num_dpps_required = core->clean_me_up.mode_lib.mp.NoOfDPP[plane_index];
if (in_out->programming->display_config.plane_descriptors->overrides.legacy_svp_config == dml2_svp_mode_override_main_pipe) if (in_out->programming->display_config.plane_descriptors[plane_index].overrides.legacy_svp_config == dml2_svp_mode_override_main_pipe)
in_out->programming->plane_programming[plane_index].uclk_pstate_support_method = dml2_uclk_pstate_support_method_fw_subvp_phantom; in_out->programming->plane_programming[plane_index].uclk_pstate_support_method = dml2_uclk_pstate_support_method_fw_subvp_phantom;
else if (in_out->programming->display_config.plane_descriptors->overrides.legacy_svp_config == dml2_svp_mode_override_phantom_pipe) else if (in_out->programming->display_config.plane_descriptors[plane_index].overrides.legacy_svp_config == dml2_svp_mode_override_phantom_pipe)
in_out->programming->plane_programming[plane_index].uclk_pstate_support_method = dml2_uclk_pstate_support_method_fw_subvp_phantom; in_out->programming->plane_programming[plane_index].uclk_pstate_support_method = dml2_uclk_pstate_support_method_fw_subvp_phantom;
else if (in_out->programming->display_config.plane_descriptors->overrides.legacy_svp_config == dml2_svp_mode_override_phantom_pipe_no_data_return) else if (in_out->programming->display_config.plane_descriptors[plane_index].overrides.legacy_svp_config == dml2_svp_mode_override_phantom_pipe_no_data_return)
in_out->programming->plane_programming[plane_index].uclk_pstate_support_method = dml2_uclk_pstate_support_method_fw_subvp_phantom; in_out->programming->plane_programming[plane_index].uclk_pstate_support_method = dml2_uclk_pstate_support_method_fw_subvp_phantom;
else { else {
if (core->clean_me_up.mode_lib.mp.MaxActiveDRAMClockChangeLatencySupported[plane_index] >= core->clean_me_up.mode_lib.soc.power_management_parameters.dram_clk_change_blackout_us) if (core->clean_me_up.mode_lib.mp.MaxActiveDRAMClockChangeLatencySupported[plane_index] >= core->clean_me_up.mode_lib.soc.power_management_parameters.dram_clk_change_blackout_us)
in_out->programming->plane_programming[plane_index].uclk_pstate_support_method = dml2_uclk_pstate_support_method_vactive; in_out->programming->plane_programming[plane_index].uclk_pstate_support_method = dml2_uclk_pstate_support_method_vactive;
else if (core->clean_me_up.mode_lib.mp.TWait[plane_index] >= core->clean_me_up.mode_lib.soc.power_management_parameters.dram_clk_change_blackout_us) else if (core->clean_me_up.mode_lib.mp.TWait[plane_index] >= core->clean_me_up.mode_lib.soc.power_management_parameters.dram_clk_change_blackout_us)
in_out->programming->plane_programming[plane_index].uclk_pstate_support_method = dml2_uclk_pstate_support_method_vblank; in_out->programming->plane_programming[plane_index].uclk_pstate_support_method = dml2_uclk_pstate_support_method_vblank;
else else
in_out->programming->plane_programming[plane_index].uclk_pstate_support_method = dml2_uclk_pstate_support_method_not_supported; in_out->programming->plane_programming[plane_index].uclk_pstate_support_method = dml2_uclk_pstate_support_method_not_supported;
} }
dml2_core_calcs_get_mall_allocation(&core->clean_me_up.mode_lib, &in_out->programming->plane_programming[plane_index].surface_size_mall_bytes, dml_internal_pipe_index); dml2_core_calcs_get_mall_allocation(&core->clean_me_up.mode_lib, &in_out->programming->plane_programming[plane_index].surface_size_mall_bytes, dml_internal_pipe_index);
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#ifndef __DML2_CORE_DCN4_H__ #ifndef __DML2_CORE_DCN4_H__
#define __DML2_CORE_DCN4_H__ #define __DML2_CORE_DCN4_H__
bool core_dcn4_initialize(struct dml2_core_initialize_in_out *in_out); bool core_dcn4_initialize(struct dml2_core_initialize_in_out *in_out);
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#ifndef __DML2_CORE_DCN4_CALCS_H__ #ifndef __DML2_CORE_DCN4_CALCS_H__
#define __DML2_CORE_DCN4_CALCS_H__ #define __DML2_CORE_DCN4_CALCS_H__
...@@ -30,6 +29,7 @@ void dml2_core_calcs_get_informative(const struct dml2_core_internal_display_mod ...@@ -30,6 +29,7 @@ void dml2_core_calcs_get_informative(const struct dml2_core_internal_display_mod
void dml2_core_calcs_get_stream_support_info(const struct dml2_display_cfg *display_cfg, const struct dml2_core_internal_display_mode_lib *mode_lib, struct core_stream_support_info *out, int plane_index); void dml2_core_calcs_get_stream_support_info(const struct dml2_display_cfg *display_cfg, const struct dml2_core_internal_display_mode_lib *mode_lib, struct core_stream_support_info *out, int plane_index);
void dml2_core_calcs_get_mall_allocation(struct dml2_core_internal_display_mode_lib *mode_lib, unsigned int *out, int pipe_index); void dml2_core_calcs_get_mall_allocation(struct dml2_core_internal_display_mode_lib *mode_lib, unsigned int *out, int pipe_index);
void dml2_core_calcs_get_stream_fams2_programming(const struct dml2_core_internal_display_mode_lib *mode_lib, const struct display_configuation_with_meta *display_cfg, struct dmub_fams2_stream_static_state *fams2_programming, enum dml2_uclk_pstate_support_method pstate_method, int plane_index); void dml2_core_calcs_get_stream_fams2_programming(const struct dml2_core_internal_display_mode_lib *mode_lib, const struct display_configuation_with_meta *display_cfg, struct dmub_fams2_stream_static_state *fams2_programming, enum dml2_uclk_pstate_support_method pstate_method, int plane_index);
void dml2_core_calcs_get_global_fams2_programming(const struct dml2_core_internal_display_mode_lib *mode_lib, const struct display_configuation_with_meta *display_cfg, struct dmub_cmd_fams2_global_config *fams2_global_config);
void dml2_core_calcs_get_dpte_row_height(unsigned int *dpte_row_height, struct dml2_core_internal_display_mode_lib *mode_lib, bool is_plane1, enum dml2_source_format_class SourcePixelFormat, enum dml2_swizzle_mode SurfaceTiling, enum dml2_rotation_angle ScanDirection, unsigned int pitch, unsigned int GPUVMMinPageSizeKBytes); void dml2_core_calcs_get_dpte_row_height(unsigned int *dpte_row_height, struct dml2_core_internal_display_mode_lib *mode_lib, bool is_plane1, enum dml2_source_format_class SourcePixelFormat, enum dml2_swizzle_mode SurfaceTiling, enum dml2_rotation_angle ScanDirection, unsigned int pitch, unsigned int GPUVMMinPageSizeKBytes);
void dml2_core_calcs_cursor_dlg_reg(struct dml2_cursor_dlg_regs *cursor_dlg_regs, const struct dml2_get_cursor_dlg_reg *p); void dml2_core_calcs_cursor_dlg_reg(struct dml2_cursor_dlg_regs *cursor_dlg_regs, const struct dml2_get_cursor_dlg_reg *p);
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#include "dml2_core_factory.h" #include "dml2_core_factory.h"
#include "dml2_core_dcn4.h" #include "dml2_core_dcn4.h"
#include "dml2_external_lib_deps.h" #include "dml2_external_lib_deps.h"
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#ifndef __DML2_CORE_FACTORY_H__ #ifndef __DML2_CORE_FACTORY_H__
#define __DML2_CORE_FACTORY_H__ #define __DML2_CORE_FACTORY_H__
......
...@@ -2242,11 +2242,15 @@ bool dml2_core_shared_mode_support(struct dml2_core_calcs_mode_support_ex *in_ou ...@@ -2242,11 +2242,15 @@ bool dml2_core_shared_mode_support(struct dml2_core_calcs_mode_support_ex *in_ou
} }
double min_return_bw_for_latency = mode_lib->ms.support.urg_bandwidth_available_min_latency[dml2_core_internal_soc_state_sys_active]; double min_return_bw_for_latency = mode_lib->ms.support.urg_bandwidth_available_min_latency[dml2_core_internal_soc_state_sys_active];
if (mode_lib->soc.qos_parameters.qos_type == dml2_qos_param_type_dcn3)
s->ReorderingBytes = (unsigned int)(mode_lib->soc.clk_table.dram_config.channel_count * math_max3(mode_lib->soc.qos_parameters.qos_params.dcn3.urgent_out_of_order_return_per_channel_pixel_only_bytes,
mode_lib->soc.qos_parameters.qos_params.dcn3.urgent_out_of_order_return_per_channel_pixel_and_vm_bytes,
mode_lib->soc.qos_parameters.qos_params.dcn3.urgent_out_of_order_return_per_channel_vm_only_bytes));
CalculateExtraLatency( CalculateExtraLatency(
display_cfg, display_cfg,
mode_lib->ip.rob_buffer_size_kbytes, mode_lib->ip.rob_buffer_size_kbytes,
0, //mode_lib->soc.round_trip_ping_latency_dcfclk_cycles, mode_lib->soc.qos_parameters.qos_params.dcn3.loaded_round_trip_latency_fclk_cycles,
s->ReorderingBytes, s->ReorderingBytes,
mode_lib->ms.DCFCLK, mode_lib->ms.DCFCLK,
mode_lib->ms.FabricClock, mode_lib->ms.FabricClock,
...@@ -5050,7 +5054,7 @@ static void calculate_mcache_row_bytes( ...@@ -5050,7 +5054,7 @@ static void calculate_mcache_row_bytes(
unsigned int meta_per_mvmpg_per_channel_ub = 0; unsigned int meta_per_mvmpg_per_channel_ub = 0;
if (p->gpuvm_enable) { if (p->gpuvm_enable) {
meta_per_mvmpg_per_channel = (float)vmpg_bytes / 256 / p->num_chans; meta_per_mvmpg_per_channel = (float)vmpg_bytes / (float)256 / p->num_chans;
//but using the est_blk_per_vmpg between 2 and 4, to be not as pessimestic //but using the est_blk_per_vmpg between 2 and 4, to be not as pessimestic
if (p->surf_vert && vmpg_bytes > blk_bytes) { if (p->surf_vert && vmpg_bytes > blk_bytes) {
...@@ -5059,7 +5063,7 @@ static void calculate_mcache_row_bytes( ...@@ -5059,7 +5063,7 @@ static void calculate_mcache_row_bytes(
*p->dcc_dram_bw_nom_overhead_factor = 1 + math_max2(1.0 / 256.0, math_ceil2(meta_per_mvmpg_per_channel, p->mem_word_bytes) / (256 * meta_per_mvmpg_per_channel)); // dcc_dr_oh_nom *p->dcc_dram_bw_nom_overhead_factor = 1 + math_max2(1.0 / 256.0, math_ceil2(meta_per_mvmpg_per_channel, p->mem_word_bytes) / (256 * meta_per_mvmpg_per_channel)); // dcc_dr_oh_nom
} else { } else {
meta_per_mvmpg_per_channel = (float)blk_bytes / 256 / p->num_chans; meta_per_mvmpg_per_channel = (float)blk_bytes / (float)256 / p->num_chans;
if (!p->surf_vert) if (!p->surf_vert)
*p->dcc_dram_bw_nom_overhead_factor = 1 + 1.0 / 256.0; *p->dcc_dram_bw_nom_overhead_factor = 1 + 1.0 / 256.0;
...@@ -7165,7 +7169,7 @@ static void calculate_tdlut_setting( ...@@ -7165,7 +7169,7 @@ static void calculate_tdlut_setting(
*p->tdlut_bytes_per_group = tdlut_bytes_per_line * tdlut_mpc_width; *p->tdlut_bytes_per_group = tdlut_bytes_per_line * tdlut_mpc_width;
//the delivery cycles is DispClk cycles per line * number of lines * number of slices //the delivery cycles is DispClk cycles per line * number of lines * number of slices
tdlut_delivery_cycles = (unsigned int)math_ceil2(tdlut_mpc_width / 2.0, 1) * tdlut_mpc_width * tdlut_mpc_width; tdlut_delivery_cycles = (unsigned int)math_ceil2(tdlut_mpc_width / 2.0, 1) * tdlut_mpc_width * tdlut_mpc_width;
tdlut_drain_rate = tdlut_bytes_per_line * p->dispclk_mhz / 9.0; tdlut_drain_rate = tdlut_bytes_per_line * p->dispclk_mhz / math_ceil2(tdlut_mpc_width/2.0, 1);
} else { } else {
//tdlut_addressing_mode = tdlut_simple_linear, 3dlut width should be 4*1229=4916 elements //tdlut_addressing_mode = tdlut_simple_linear, 3dlut width should be 4*1229=4916 elements
*p->tdlut_bytes_per_frame = (unsigned int)math_ceil2(tdlut_width * tdlut_bpe, 256); *p->tdlut_bytes_per_frame = (unsigned int)math_ceil2(tdlut_width * tdlut_bpe, 256);
...@@ -7501,11 +7505,14 @@ static void CalculateExtraLatency( ...@@ -7501,11 +7505,14 @@ static void CalculateExtraLatency(
#ifdef __DML_VBA_DEBUG__ #ifdef __DML_VBA_DEBUG__
dml2_printf("DML::%s: qos_type=%u\n", __func__, qos_type); dml2_printf("DML::%s: qos_type=%u\n", __func__, qos_type);
dml2_printf("DML::%s: hostvm_mode=%u\n", __func__, hostvm_mode);
dml2_printf("DML::%s: Tex_trips=%u\n", __func__, Tex_trips);
dml2_printf("DML::%s: max_oustanding_when_urgent_expected=%u\n", __func__, max_oustanding_when_urgent_expected); dml2_printf("DML::%s: max_oustanding_when_urgent_expected=%u\n", __func__, max_oustanding_when_urgent_expected);
dml2_printf("DML::%s: FabricClock=%f\n", __func__, FabricClock); dml2_printf("DML::%s: FabricClock=%f\n", __func__, FabricClock);
dml2_printf("DML::%s: DCFCLK=%f\n", __func__, DCFCLK); dml2_printf("DML::%s: DCFCLK=%f\n", __func__, DCFCLK);
dml2_printf("DML::%s: ReturnBW=%f\n", __func__, ReturnBW); dml2_printf("DML::%s: ReturnBW=%f\n", __func__, ReturnBW);
dml2_printf("DML::%s: RoundTripPingLatencyCycles=%u\n", __func__, RoundTripPingLatencyCycles); dml2_printf("DML::%s: RoundTripPingLatencyCycles=%u\n", __func__, RoundTripPingLatencyCycles);
dml2_printf("DML::%s: ReorderingBytes=%u\n", __func__, ReorderingBytes);
dml2_printf("DML::%s: Tarb=%f\n", __func__, Tarb); dml2_printf("DML::%s: Tarb=%f\n", __func__, Tarb);
dml2_printf("DML::%s: ExtraLatency=%f\n", __func__, *ExtraLatency); dml2_printf("DML::%s: ExtraLatency=%f\n", __func__, *ExtraLatency);
dml2_printf("DML::%s: ExtraLatency_sr=%f\n", __func__, *ExtraLatency_sr); dml2_printf("DML::%s: ExtraLatency_sr=%f\n", __func__, *ExtraLatency_sr);
...@@ -7739,7 +7746,6 @@ static bool CalculatePrefetchSchedule(struct dml2_core_internal_scratch *scratch ...@@ -7739,7 +7746,6 @@ static bool CalculatePrefetchSchedule(struct dml2_core_internal_scratch *scratch
s->max_Tsw = (math_max2(p->PrefetchSourceLinesY, p->PrefetchSourceLinesC) * s->LineTime); s->max_Tsw = (math_max2(p->PrefetchSourceLinesY, p->PrefetchSourceLinesC) * s->LineTime);
s->prefetch_sw_bytes = p->PrefetchSourceLinesY * p->swath_width_luma_ub * p->myPipe->BytePerPixelY + p->PrefetchSourceLinesC * p->swath_width_chroma_ub * p->myPipe->BytePerPixelC; s->prefetch_sw_bytes = p->PrefetchSourceLinesY * p->swath_width_luma_ub * p->myPipe->BytePerPixelY + p->PrefetchSourceLinesC * p->swath_width_chroma_ub * p->myPipe->BytePerPixelC;
s->prefetch_bw_pr = s->prefetch_bw_pr * p->mall_prefetch_sdp_overhead_factor; s->prefetch_bw_pr = s->prefetch_bw_pr * p->mall_prefetch_sdp_overhead_factor;
s->prefetch_sw_bytes = s->prefetch_sw_bytes * p->mall_prefetch_sdp_overhead_factor; s->prefetch_sw_bytes = s->prefetch_sw_bytes * p->mall_prefetch_sdp_overhead_factor;
s->prefetch_bw_oto = math_max2(s->prefetch_bw_pr, s->prefetch_sw_bytes / s->max_Tsw); s->prefetch_bw_oto = math_max2(s->prefetch_bw_pr, s->prefetch_sw_bytes / s->max_Tsw);
...@@ -9304,6 +9310,10 @@ static void CalculateMetaAndPTETimes(struct dml2_core_shared_CalculateMetaAndPTE ...@@ -9304,6 +9310,10 @@ static void CalculateMetaAndPTETimes(struct dml2_core_shared_CalculateMetaAndPTE
dpte_groups_per_row_luma_ub = (unsigned int)(math_ceil2((double)p->dpte_row_width_luma_ub[k] / (double)dpte_group_width_luma, 1.0)); dpte_groups_per_row_luma_ub = (unsigned int)(math_ceil2((double)p->dpte_row_width_luma_ub[k] / (double)dpte_group_width_luma, 1.0));
} }
if (dpte_groups_per_row_luma_ub <= 2) {
dpte_groups_per_row_luma_ub = dpte_groups_per_row_luma_ub + 1;
}
dml2_printf("DML::%s: k=%u, use_one_row_for_frame = %u\n", __func__, k, p->use_one_row_for_frame[k]); dml2_printf("DML::%s: k=%u, use_one_row_for_frame = %u\n", __func__, k, p->use_one_row_for_frame[k]);
dml2_printf("DML::%s: k=%u, dpte_group_bytes = %u\n", __func__, k, p->dpte_group_bytes[k]); dml2_printf("DML::%s: k=%u, dpte_group_bytes = %u\n", __func__, k, p->dpte_group_bytes[k]);
dml2_printf("DML::%s: k=%u, PTERequestSizeY = %u\n", __func__, k, p->PTERequestSizeY[k]); dml2_printf("DML::%s: k=%u, PTERequestSizeY = %u\n", __func__, k, p->PTERequestSizeY[k]);
...@@ -9332,6 +9342,9 @@ static void CalculateMetaAndPTETimes(struct dml2_core_shared_CalculateMetaAndPTE ...@@ -9332,6 +9342,9 @@ static void CalculateMetaAndPTETimes(struct dml2_core_shared_CalculateMetaAndPTE
} else { } else {
dpte_groups_per_row_chroma_ub = (unsigned int)(math_ceil2((double)p->dpte_row_width_chroma_ub[k] / (double)dpte_group_width_chroma, 1.0)); dpte_groups_per_row_chroma_ub = (unsigned int)(math_ceil2((double)p->dpte_row_width_chroma_ub[k] / (double)dpte_group_width_chroma, 1.0));
} }
if (dpte_groups_per_row_chroma_ub <= 2) {
dpte_groups_per_row_chroma_ub = dpte_groups_per_row_chroma_ub + 1;
}
dml2_printf("DML::%s: k=%u, dpte_row_width_chroma_ub = %u\n", __func__, k, p->dpte_row_width_chroma_ub[k]); dml2_printf("DML::%s: k=%u, dpte_row_width_chroma_ub = %u\n", __func__, k, p->dpte_row_width_chroma_ub[k]);
dml2_printf("DML::%s: k=%u, dpte_group_width_chroma = %u\n", __func__, k, dpte_group_width_chroma); dml2_printf("DML::%s: k=%u, dpte_group_width_chroma = %u\n", __func__, k, dpte_group_width_chroma);
dml2_printf("DML::%s: k=%u, dpte_groups_per_row_chroma_ub = %u\n", __func__, k, dpte_groups_per_row_chroma_ub); dml2_printf("DML::%s: k=%u, dpte_groups_per_row_chroma_ub = %u\n", __func__, k, dpte_groups_per_row_chroma_ub);
...@@ -9451,6 +9464,14 @@ static void CalculateVMGroupAndRequestTimes( ...@@ -9451,6 +9464,14 @@ static void CalculateVMGroupAndRequestTimes(
double line_time = display_cfg->stream_descriptors[display_cfg->plane_descriptors[k].stream_index].timing.h_total / pixel_clock_mhz; double line_time = display_cfg->stream_descriptors[display_cfg->plane_descriptors[k].stream_index].timing.h_total / pixel_clock_mhz;
if (num_group_per_lower_vm_stage_flip <= 2) {
num_group_per_lower_vm_stage_flip = num_group_per_lower_vm_stage_flip + 1;
}
if (num_group_per_lower_vm_stage_pref <= 2) {
num_group_per_lower_vm_stage_pref = num_group_per_lower_vm_stage_pref + 1;
}
TimePerVMGroupVBlank[k] = dst_y_per_vm_vblank[k] * line_time / num_group_per_lower_vm_stage_pref; TimePerVMGroupVBlank[k] = dst_y_per_vm_vblank[k] * line_time / num_group_per_lower_vm_stage_pref;
TimePerVMGroupFlip[k] = dst_y_per_vm_flip[k] * line_time / num_group_per_lower_vm_stage_flip; TimePerVMGroupFlip[k] = dst_y_per_vm_flip[k] * line_time / num_group_per_lower_vm_stage_flip;
TimePerVMRequestVBlank[k] = dst_y_per_vm_vblank[k] * line_time / num_req_per_lower_vm_stage_pref; TimePerVMRequestVBlank[k] = dst_y_per_vm_vblank[k] * line_time / num_req_per_lower_vm_stage_pref;
...@@ -10388,11 +10409,16 @@ bool dml2_core_shared_mode_programming(struct dml2_core_calcs_mode_programming_e ...@@ -10388,11 +10409,16 @@ bool dml2_core_shared_mode_programming(struct dml2_core_calcs_mode_programming_e
calculate_tdlut_setting(&mode_lib->scratch, calculate_tdlut_setting_params); calculate_tdlut_setting(&mode_lib->scratch, calculate_tdlut_setting_params);
} }
if (mode_lib->soc.qos_parameters.qos_type == dml2_qos_param_type_dcn3)
s->ReorderingBytes = (unsigned int)(mode_lib->soc.clk_table.dram_config.channel_count * math_max3(mode_lib->soc.qos_parameters.qos_params.dcn3.urgent_out_of_order_return_per_channel_pixel_only_bytes,
mode_lib->soc.qos_parameters.qos_params.dcn3.urgent_out_of_order_return_per_channel_pixel_and_vm_bytes,
mode_lib->soc.qos_parameters.qos_params.dcn3.urgent_out_of_order_return_per_channel_vm_only_bytes));
CalculateExtraLatency( CalculateExtraLatency(
display_cfg, display_cfg,
mode_lib->ip.rob_buffer_size_kbytes, mode_lib->ip.rob_buffer_size_kbytes,
0, //mode_lib->soc.round_trip_ping_latency_dcfclk_cycles, mode_lib->soc.qos_parameters.qos_params.dcn3.loaded_round_trip_latency_fclk_cycles,
s->ReorderBytes, s->ReorderingBytes,
mode_lib->mp.Dcfclk, mode_lib->mp.Dcfclk,
mode_lib->mp.FabricClock, mode_lib->mp.FabricClock,
mode_lib->ip.pixel_chunk_size_kbytes, mode_lib->ip.pixel_chunk_size_kbytes,
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#ifndef __DML2_CORE_SHARED_H__ #ifndef __DML2_CORE_SHARED_H__
#define __DML2_CORE_SHARED_H__ #define __DML2_CORE_SHARED_H__
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#ifndef __DML2_CORE_SHARED_TYPES_H__ #ifndef __DML2_CORE_SHARED_TYPES_H__
#define __DML2_CORE_SHARED_TYPES_H__ #define __DML2_CORE_SHARED_TYPES_H__
...@@ -70,6 +69,7 @@ struct dml2_core_ip_params { ...@@ -70,6 +69,7 @@ struct dml2_core_ip_params {
unsigned int words_per_channel; unsigned int words_per_channel;
bool imall_supported; bool imall_supported;
unsigned int max_flip_time_us; unsigned int max_flip_time_us;
unsigned int max_flip_time_lines;
unsigned int subvp_swath_height_margin_lines; unsigned int subvp_swath_height_margin_lines;
unsigned int subvp_fw_processing_delay_us; unsigned int subvp_fw_processing_delay_us;
unsigned int subvp_pstate_allow_width_us; unsigned int subvp_pstate_allow_width_us;
...@@ -782,6 +782,7 @@ struct dml2_core_internal_mode_program { ...@@ -782,6 +782,7 @@ struct dml2_core_internal_mode_program {
unsigned int VUpdateOffsetPix[DML2_MAX_PLANES]; unsigned int VUpdateOffsetPix[DML2_MAX_PLANES];
unsigned int VUpdateWidthPix[DML2_MAX_PLANES]; unsigned int VUpdateWidthPix[DML2_MAX_PLANES];
unsigned int VReadyOffsetPix[DML2_MAX_PLANES]; unsigned int VReadyOffsetPix[DML2_MAX_PLANES];
unsigned int pstate_keepout_dst_lines[DML2_MAX_PLANES];
// Latency and Support // Latency and Support
double MaxActiveFCLKChangeLatencySupported; double MaxActiveFCLKChangeLatencySupported;
...@@ -975,7 +976,7 @@ struct dml2_core_calcs_mode_programming_locals { ...@@ -975,7 +976,7 @@ struct dml2_core_calcs_mode_programming_locals {
unsigned int DSCFormatFactor; unsigned int DSCFormatFactor;
struct dml2_core_internal_DmlPipe SurfaceParameters[DML2_MAX_PLANES]; struct dml2_core_internal_DmlPipe SurfaceParameters[DML2_MAX_PLANES];
unsigned int ReorderBytes; unsigned int ReorderingBytes;
double HostVMInefficiencyFactor; double HostVMInefficiencyFactor;
double HostVMInefficiencyFactorPrefetch; double HostVMInefficiencyFactorPrefetch;
unsigned int TotalDCCActiveDPP; unsigned int TotalDCCActiveDPP;
...@@ -2010,6 +2011,7 @@ struct dml2_core_internal_scratch { ...@@ -2010,6 +2011,7 @@ struct dml2_core_internal_scratch {
struct dml2_core_internal_display_mode_lib { struct dml2_core_internal_display_mode_lib {
struct dml2_core_ip_params ip; struct dml2_core_ip_params ip;
struct dml2_soc_bb soc; struct dml2_soc_bb soc;
struct dml2_ip_capabilities ip_caps;
//@brief Mode Support and Mode programming struct //@brief Mode Support and Mode programming struct
// Used to hold input; intermediate and output of the calculations // Used to hold input; intermediate and output of the calculations
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#include "dml2_dpmm_dcn4.h" #include "dml2_dpmm_dcn4.h"
#include "dml2_internal_shared_types.h" #include "dml2_internal_shared_types.h"
#include "dml_top_types.h" #include "dml_top_types.h"
...@@ -181,7 +180,7 @@ static bool add_margin_and_round_to_dfs_grainularity(double clock_khz, double ma ...@@ -181,7 +180,7 @@ static bool add_margin_and_round_to_dfs_grainularity(double clock_khz, double ma
clock_khz *= 1.0 + margin; clock_khz *= 1.0 + margin;
divider = (unsigned int)((int)DFS_DIVIDER_RANGE_SCALE_FACTOR * (vco_freq_khz / clock_khz)); divider = (unsigned int)(DFS_DIVIDER_RANGE_SCALE_FACTOR * (vco_freq_khz / clock_khz));
/* we want to floor here to get higher clock than required rather than lower */ /* we want to floor here to get higher clock than required rather than lower */
if (divider < DFS_DIVIDER_RANGE_2_START) { if (divider < DFS_DIVIDER_RANGE_2_START) {
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#ifndef __DML2_DPMM_DCN4_H__ #ifndef __DML2_DPMM_DCN4_H__
#define __DML2_DPMM_DCN4_H__ #define __DML2_DPMM_DCN4_H__
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#include "dml2_dpmm_factory.h" #include "dml2_dpmm_factory.h"
#include "dml2_dpmm_dcn4.h" #include "dml2_dpmm_dcn4.h"
#include "dml2_external_lib_deps.h" #include "dml2_external_lib_deps.h"
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#ifndef __DML2_DPMM_FACTORY_H__ #ifndef __DML2_DPMM_FACTORY_H__
#define __DML2_DPMM_FACTORY_H__ #define __DML2_DPMM_FACTORY_H__
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#include "dml2_mcg_dcn4.h" #include "dml2_mcg_dcn4.h"
#include "dml_top_soc_parameter_types.h" #include "dml_top_soc_parameter_types.h"
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#ifndef __DML2_MCG_DCN4_H__ #ifndef __DML2_MCG_DCN4_H__
#define __DML2_MCG_DCN4_H__ #define __DML2_MCG_DCN4_H__
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#include "dml2_mcg_factory.h" #include "dml2_mcg_factory.h"
#include "dml2_mcg_dcn4.h" #include "dml2_mcg_dcn4.h"
#include "dml2_external_lib_deps.h" #include "dml2_external_lib_deps.h"
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#ifndef __DML2_MCG_FACTORY_H__ #ifndef __DML2_MCG_FACTORY_H__
#define __DML2_MCG_FACTORY_H__ #define __DML2_MCG_FACTORY_H__
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#include "dml2_pmo_factory.h" #include "dml2_pmo_factory.h"
#include "dml2_pmo_dcn3.h" #include "dml2_pmo_dcn3.h"
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#ifndef __DML2_PMO_DCN3_H__ #ifndef __DML2_PMO_DCN3_H__
#define __DML2_PMO_DCN3_H__ #define __DML2_PMO_DCN3_H__
......
// SPDX-License-Identifier: MIT
//
// Copyright 2024 Advanced Micro Devices, Inc.
#ifndef __DML2_PMO_DCN4_H__
#define __DML2_PMO_DCN4_H__
#include "dml2_internal_shared_types.h"
bool pmo_dcn4_initialize(struct dml2_pmo_initialize_in_out *in_out);
bool pmo_dcn4_optimize_dcc_mcache(struct dml2_pmo_optimize_dcc_mcache_in_out *in_out);
bool pmo_dcn4_init_for_vmin(struct dml2_pmo_init_for_vmin_in_out *in_out);
bool pmo_dcn4_test_for_vmin(struct dml2_pmo_test_for_vmin_in_out *in_out);
bool pmo_dcn4_optimize_for_vmin(struct dml2_pmo_optimize_for_vmin_in_out *in_out);
bool pmo_dcn4_init_for_pstate_support(struct dml2_pmo_init_for_pstate_support_in_out *in_out);
bool pmo_dcn4_test_for_pstate_support(struct dml2_pmo_test_for_pstate_support_in_out *in_out);
bool pmo_dcn4_optimize_for_pstate_support(struct dml2_pmo_optimize_for_pstate_support_in_out *in_out);
bool pmo_dcn4_unit_test(void);
#endif
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#ifndef __DML2_PMO_FAMS2_DCN4_H__ #ifndef __DML2_PMO_FAMS2_DCN4_H__
#define __DML2_PMO_FAMS2_DCN4_H__ #define __DML2_PMO_FAMS2_DCN4_H__
......
...@@ -2,10 +2,8 @@ ...@@ -2,10 +2,8 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#include "dml2_pmo_factory.h" #include "dml2_pmo_factory.h"
#include "dml2_pmo_dcn4_fams2.h" #include "dml2_pmo_dcn4_fams2.h"
#include "dml2_pmo_dcn4.h"
#include "dml2_pmo_dcn3.h" #include "dml2_pmo_dcn3.h"
#include "dml2_external_lib_deps.h" #include "dml2_external_lib_deps.h"
...@@ -35,8 +33,8 @@ bool dml2_pmo_create(enum dml2_project_id project_id, struct dml2_pmo_instance * ...@@ -35,8 +33,8 @@ bool dml2_pmo_create(enum dml2_project_id project_id, struct dml2_pmo_instance *
switch (project_id) { switch (project_id) {
case dml2_project_dcn4x_stage1: case dml2_project_dcn4x_stage1:
out->initialize = pmo_dcn4_initialize; out->initialize = pmo_dcn4_fams2_initialize;
out->optimize_dcc_mcache = pmo_dcn4_optimize_dcc_mcache; out->optimize_dcc_mcache = pmo_dcn4_fams2_optimize_dcc_mcache;
result = true; result = true;
break; break;
case dml2_project_dcn4x_stage2: case dml2_project_dcn4x_stage2:
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#ifndef __DML2_PMO_FACTORY_H__ #ifndef __DML2_PMO_FACTORY_H__
#define __DML2_PMO_FACTORY_H__ #define __DML2_PMO_FACTORY_H__
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#include "lib_float_math.h" #include "lib_float_math.h"
#define ASSERT(condition) #define ASSERT(condition)
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#ifndef __LIB_FLOAT_MATH_H__ #ifndef __LIB_FLOAT_MATH_H__
#define __LIB_FLOAT_MATH_H__ #define __LIB_FLOAT_MATH_H__
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#include "dml2_top_optimization.h" #include "dml2_top_optimization.h"
#include "dml2_internal_shared_types.h" #include "dml2_internal_shared_types.h"
#include "dml_top_mcache.h" #include "dml_top_mcache.h"
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#ifndef __DML2_TOP_OPTIMIZATION_H__ #ifndef __DML2_TOP_OPTIMIZATION_H__
#define __DML2_TOP_OPTIMIZATION_H__ #define __DML2_TOP_OPTIMIZATION_H__
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#include "dml2_internal_shared_types.h" #include "dml2_internal_shared_types.h"
#include "dml_top.h" #include "dml_top.h"
#include "dml2_mcg_factory.h" #include "dml2_mcg_factory.h"
...@@ -28,6 +27,7 @@ bool dml2_initialize_instance(struct dml2_initialize_instance_in_out *in_out) ...@@ -28,6 +27,7 @@ bool dml2_initialize_instance(struct dml2_initialize_instance_in_out *in_out)
bool result = false; bool result = false;
memset(l, 0, sizeof(struct dml2_initialize_instance_locals)); memset(l, 0, sizeof(struct dml2_initialize_instance_locals));
memset(dml, 0, sizeof(struct dml2_instance));
memcpy(&dml->ip_caps, &in_out->ip_caps, sizeof(struct dml2_ip_capabilities)); memcpy(&dml->ip_caps, &in_out->ip_caps, sizeof(struct dml2_ip_capabilities));
memcpy(&dml->soc_bbox, &in_out->soc_bb, sizeof(struct dml2_soc_bb)); memcpy(&dml->soc_bbox, &in_out->soc_bb, sizeof(struct dml2_soc_bb));
...@@ -96,14 +96,12 @@ bool dml2_check_mode_supported(struct dml2_check_mode_supported_in_out *in_out) ...@@ -96,14 +96,12 @@ bool dml2_check_mode_supported(struct dml2_check_mode_supported_in_out *in_out)
{ {
struct dml2_instance *dml = (struct dml2_instance *)in_out->dml2_instance; struct dml2_instance *dml = (struct dml2_instance *)in_out->dml2_instance;
struct dml2_check_mode_supported_locals *l = &dml->scratch.check_mode_supported_locals; struct dml2_check_mode_supported_locals *l = &dml->scratch.check_mode_supported_locals;
/* Borrow the build_mode_programming_locals programming struct for DPMM call. */ struct dml2_display_cfg_programming *dpmm_programming = &dml->dpmm_instance.dpmm_scratch.programming;
struct dml2_display_cfg_programming *dpmm_programming = dml->scratch.build_mode_programming_locals.mode_programming_params.programming;
bool result = false; bool result = false;
bool mcache_success = false; bool mcache_success = false;
if (dpmm_programming) memset(dpmm_programming, 0, sizeof(struct dml2_display_cfg_programming));
memset(dpmm_programming, 0, sizeof(struct dml2_display_cfg_programming));
setup_unoptimized_display_config_with_meta(dml, &l->base_display_config_with_meta, in_out->display_config); setup_unoptimized_display_config_with_meta(dml, &l->base_display_config_with_meta, in_out->display_config);
...@@ -130,7 +128,7 @@ bool dml2_check_mode_supported(struct dml2_check_mode_supported_in_out *in_out) ...@@ -130,7 +128,7 @@ bool dml2_check_mode_supported(struct dml2_check_mode_supported_in_out *in_out)
/* /*
* Call DPMM to map all requirements to minimum clock state * Call DPMM to map all requirements to minimum clock state
*/ */
if (result && dpmm_programming) { if (result) {
l->dppm_map_mode_params.min_clk_table = &dml->min_clk_table; l->dppm_map_mode_params.min_clk_table = &dml->min_clk_table;
l->dppm_map_mode_params.display_cfg = &l->base_display_config_with_meta; l->dppm_map_mode_params.display_cfg = &l->base_display_config_with_meta;
l->dppm_map_mode_params.programming = dpmm_programming; l->dppm_map_mode_params.programming = dpmm_programming;
...@@ -140,9 +138,8 @@ bool dml2_check_mode_supported(struct dml2_check_mode_supported_in_out *in_out) ...@@ -140,9 +138,8 @@ bool dml2_check_mode_supported(struct dml2_check_mode_supported_in_out *in_out)
} }
in_out->is_supported = mcache_success; in_out->is_supported = mcache_success;
result = result && in_out->is_supported;
return result; return true;
} }
bool dml2_build_mode_programming(struct dml2_build_mode_programming_in_out *in_out) bool dml2_build_mode_programming(struct dml2_build_mode_programming_in_out *in_out)
...@@ -268,24 +265,15 @@ bool dml2_build_mode_programming(struct dml2_build_mode_programming_in_out *in_o ...@@ -268,24 +265,15 @@ bool dml2_build_mode_programming(struct dml2_build_mode_programming_in_out *in_o
vmin_success = dml2_top_optimization_perform_optimization_phase(&l->optimization_phase_locals, &l->vmin_phase); vmin_success = dml2_top_optimization_perform_optimization_phase(&l->optimization_phase_locals, &l->vmin_phase);
if (l->optimized_display_config_with_meta.stage4.performed) { if (vmin_success) {
/*
* when performed is true, optimization has applied to
* optimized_display_config_with_meta and it has passed mode
* support. However it may or may not pass the test function to
* reach actual Vmin. As long as voltage is optimized even if it
* doesn't reach Vmin level, there is still power benefit so in
* this case we will still copy this optimization into base
* display config.
*/
memcpy(&l->base_display_config_with_meta, &l->optimized_display_config_with_meta, sizeof(struct display_configuation_with_meta)); memcpy(&l->base_display_config_with_meta, &l->optimized_display_config_with_meta, sizeof(struct display_configuation_with_meta));
l->base_display_config_with_meta.stage4.success = vmin_success; l->base_display_config_with_meta.stage4.success = true;
} }
/* /*
* Phase 5: Optimize for Stutter * Phase 5: Optimize for Stutter
*/ */
memset(&l->stutter_phase, 0, sizeof(struct optimization_phase_params)); memset(&l->vmin_phase, 0, sizeof(struct optimization_phase_params));
l->stutter_phase.dml = dml; l->stutter_phase.dml = dml;
l->stutter_phase.display_config = &l->base_display_config_with_meta; l->stutter_phase.display_config = &l->base_display_config_with_meta;
l->stutter_phase.init_function = dml2_top_optimization_init_function_stutter; l->stutter_phase.init_function = dml2_top_optimization_init_function_stutter;
...@@ -298,7 +286,7 @@ bool dml2_build_mode_programming(struct dml2_build_mode_programming_in_out *in_o ...@@ -298,7 +286,7 @@ bool dml2_build_mode_programming(struct dml2_build_mode_programming_in_out *in_o
if (stutter_success) { if (stutter_success) {
memcpy(&l->base_display_config_with_meta, &l->optimized_display_config_with_meta, sizeof(struct display_configuation_with_meta)); memcpy(&l->base_display_config_with_meta, &l->optimized_display_config_with_meta, sizeof(struct display_configuation_with_meta));
l->base_display_config_with_meta.stage5.success = true; l->base_display_config_with_meta.stage4.success = true;
} }
/* /*
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#include "dml2_debug.h" #include "dml2_debug.h"
#include "dml_top_mcache.h" #include "dml_top_mcache.h"
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#ifndef __DML_TOP_MCACHE_H__ #ifndef __DML_TOP_MCACHE_H__
#define __DML_TOP_MCACHE_H__ #define __DML_TOP_MCACHE_H__
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#include "dml2_debug.h" #include "dml2_debug.h"
int dml2_printf(const char *format, ...) int dml2_printf(const char *format, ...)
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#ifndef __DML2_DEBUG_H__ #ifndef __DML2_DEBUG_H__
#define __DML2_DEBUG_H__ #define __DML2_DEBUG_H__
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// //
// Copyright 2024 Advanced Micro Devices, Inc. // Copyright 2024 Advanced Micro Devices, Inc.
#ifndef __DML2_INTERNAL_SHARED_TYPES_H__ #ifndef __DML2_INTERNAL_SHARED_TYPES_H__
#define __DML2_INTERNAL_SHARED_TYPES_H__ #define __DML2_INTERNAL_SHARED_TYPES_H__
...@@ -107,10 +106,16 @@ struct dml2_dpmm_map_watermarks_params_in_out { ...@@ -107,10 +106,16 @@ struct dml2_dpmm_map_watermarks_params_in_out {
struct dml2_display_cfg_programming *programming; struct dml2_display_cfg_programming *programming;
}; };
struct dml2_dpmm_scratch {
struct dml2_display_cfg_programming programming;
};
struct dml2_dpmm_instance { struct dml2_dpmm_instance {
bool (*map_mode_to_soc_dpm)(struct dml2_dpmm_map_mode_to_soc_dpm_params_in_out *in_out); bool (*map_mode_to_soc_dpm)(struct dml2_dpmm_map_mode_to_soc_dpm_params_in_out *in_out);
bool (*map_watermarks)(struct dml2_dpmm_map_watermarks_params_in_out *in_out); bool (*map_watermarks)(struct dml2_dpmm_map_watermarks_params_in_out *in_out);
bool (*unit_test)(void); bool (*unit_test)(void);
struct dml2_dpmm_scratch dpmm_scratch;
}; };
/* /*
...@@ -266,6 +271,7 @@ struct dml2_fams2_meta { ...@@ -266,6 +271,7 @@ struct dml2_fams2_meta {
unsigned int contention_delay_otg_vlines; unsigned int contention_delay_otg_vlines;
unsigned int min_allow_width_otg_vlines; unsigned int min_allow_width_otg_vlines;
unsigned int nom_vtotal; unsigned int nom_vtotal;
unsigned int vblank_start;
double nom_refresh_rate_hz; double nom_refresh_rate_hz;
double nom_frame_time_us; double nom_frame_time_us;
unsigned int max_vtotal; unsigned int max_vtotal;
...@@ -594,7 +600,7 @@ struct dml2_pmo_optimize_for_stutter_in_out { ...@@ -594,7 +600,7 @@ struct dml2_pmo_optimize_for_stutter_in_out {
struct display_configuation_with_meta *optimized_display_config; struct display_configuation_with_meta *optimized_display_config;
}; };
enum dml2_pmo_pstate_strategy { enum dml2_pmo_pstate_method {
dml2_pmo_pstate_strategy_na = 0, dml2_pmo_pstate_strategy_na = 0,
/* hw exclusive modes */ /* hw exclusive modes */
dml2_pmo_pstate_strategy_vactive = 1, dml2_pmo_pstate_strategy_vactive = 1,
...@@ -612,6 +618,11 @@ enum dml2_pmo_pstate_strategy { ...@@ -612,6 +618,11 @@ enum dml2_pmo_pstate_strategy {
dml2_pmo_pstate_strategy_reserved_fw_drr_var = 22, dml2_pmo_pstate_strategy_reserved_fw_drr_var = 22,
}; };
struct dml2_pmo_pstate_strategy {
enum dml2_pmo_pstate_method per_stream_pstate_method[DML2_MAX_PLANES];
bool allow_state_increase;
};
#define PMO_NO_DRR_STRATEGY_MASK (((1 << (dml2_pmo_pstate_strategy_reserved_fw - dml2_pmo_pstate_strategy_na + 1)) - 1) << dml2_pmo_pstate_strategy_na) #define PMO_NO_DRR_STRATEGY_MASK (((1 << (dml2_pmo_pstate_strategy_reserved_fw - dml2_pmo_pstate_strategy_na + 1)) - 1) << dml2_pmo_pstate_strategy_na)
#define PMO_DRR_STRATEGY_MASK (((1 << (dml2_pmo_pstate_strategy_reserved_fw_drr_var - dml2_pmo_pstate_strategy_fw_vactive_drr + 1)) - 1) << dml2_pmo_pstate_strategy_fw_vactive_drr) #define PMO_DRR_STRATEGY_MASK (((1 << (dml2_pmo_pstate_strategy_reserved_fw_drr_var - dml2_pmo_pstate_strategy_fw_vactive_drr + 1)) - 1) << dml2_pmo_pstate_strategy_fw_vactive_drr)
#define PMO_DRR_CLAMPED_STRATEGY_MASK (((1 << (dml2_pmo_pstate_strategy_reserved_fw_drr_clamped - dml2_pmo_pstate_strategy_fw_vactive_drr + 1)) - 1) << dml2_pmo_pstate_strategy_fw_vactive_drr) #define PMO_DRR_CLAMPED_STRATEGY_MASK (((1 << (dml2_pmo_pstate_strategy_reserved_fw_drr_clamped - dml2_pmo_pstate_strategy_fw_vactive_drr + 1)) - 1) << dml2_pmo_pstate_strategy_fw_vactive_drr)
...@@ -634,8 +645,7 @@ struct dml2_pmo_scratch { ...@@ -634,8 +645,7 @@ struct dml2_pmo_scratch {
int stream_mask; int stream_mask;
} pmo_dcn3; } pmo_dcn3;
struct { struct {
enum dml2_pmo_pstate_strategy per_stream_pstate_strategy[DML2_MAX_PLANES][DML2_PMO_PSTATE_CANDIDATE_LIST_SIZE]; struct dml2_pmo_pstate_strategy pstate_strategy_candidates[DML2_PMO_PSTATE_CANDIDATE_LIST_SIZE];
bool allow_state_increase_for_strategy[DML2_PMO_PSTATE_CANDIDATE_LIST_SIZE];
int num_pstate_candidates; int num_pstate_candidates;
int cur_pstate_candidate; int cur_pstate_candidate;
...@@ -661,6 +671,7 @@ struct dml2_pmo_scratch { ...@@ -661,6 +671,7 @@ struct dml2_pmo_scratch {
unsigned int num_timing_groups; unsigned int num_timing_groups;
unsigned int synchronized_timing_group_masks[DML2_MAX_PLANES]; unsigned int synchronized_timing_group_masks[DML2_MAX_PLANES];
bool group_is_drr_enabled[DML2_MAX_PLANES]; bool group_is_drr_enabled[DML2_MAX_PLANES];
bool group_is_drr_active[DML2_MAX_PLANES];
double group_line_time_us[DML2_MAX_PLANES]; double group_line_time_us[DML2_MAX_PLANES];
/* scheduling check locals */ /* scheduling check locals */
...@@ -676,10 +687,10 @@ struct dml2_pmo_init_data { ...@@ -676,10 +687,10 @@ struct dml2_pmo_init_data {
union { union {
struct { struct {
/* populated once during initialization */ /* populated once during initialization */
enum dml2_pmo_pstate_strategy expanded_strategy_list_1_display[PMO_DCN4_MAX_BASE_STRATEGIES * 2][PMO_DCN4_MAX_DISPLAYS]; struct dml2_pmo_pstate_strategy expanded_strategy_list_1_display[PMO_DCN4_MAX_BASE_STRATEGIES * 2];
enum dml2_pmo_pstate_strategy expanded_strategy_list_2_display[PMO_DCN4_MAX_BASE_STRATEGIES * 2 * 2][PMO_DCN4_MAX_DISPLAYS]; struct dml2_pmo_pstate_strategy expanded_strategy_list_2_display[PMO_DCN4_MAX_BASE_STRATEGIES * 4 * 4];
enum dml2_pmo_pstate_strategy expanded_strategy_list_3_display[PMO_DCN4_MAX_BASE_STRATEGIES * 6 * 2][PMO_DCN4_MAX_DISPLAYS]; struct dml2_pmo_pstate_strategy expanded_strategy_list_3_display[PMO_DCN4_MAX_BASE_STRATEGIES * 6 * 6 * 6];
enum dml2_pmo_pstate_strategy expanded_strategy_list_4_display[PMO_DCN4_MAX_BASE_STRATEGIES * 24 * 2][PMO_DCN4_MAX_DISPLAYS]; struct dml2_pmo_pstate_strategy expanded_strategy_list_4_display[PMO_DCN4_MAX_BASE_STRATEGIES * 8 * 8 * 8 * 8];
unsigned int num_expanded_strategies_per_list[PMO_DCN4_MAX_DISPLAYS]; unsigned int num_expanded_strategies_per_list[PMO_DCN4_MAX_DISPLAYS];
} pmo_dcn4; } pmo_dcn4;
}; };
......
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