sync with OpenBSD -current
This commit is contained in:
parent
086d8cf2c2
commit
e53750f3c3
87 changed files with 852 additions and 180 deletions
|
@ -2205,6 +2205,8 @@ retry_init:
|
|||
pm_runtime_mark_last_busy(ddev->dev);
|
||||
pm_runtime_put_autosuspend(ddev->dev);
|
||||
|
||||
pci_wake_from_d3(pdev, TRUE);
|
||||
|
||||
/*
|
||||
* For runpm implemented via BACO, PMFW will handle the
|
||||
* timing for BACO in and out:
|
||||
|
|
|
@ -82,6 +82,10 @@ MODULE_FIRMWARE("amdgpu/gc_11_0_4_me.bin");
|
|||
MODULE_FIRMWARE("amdgpu/gc_11_0_4_mec.bin");
|
||||
MODULE_FIRMWARE("amdgpu/gc_11_0_4_rlc.bin");
|
||||
|
||||
static const struct soc15_reg_golden golden_settings_gc_11_0[] = {
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, regTCP_CNTL, 0x20000000, 0x20000000)
|
||||
};
|
||||
|
||||
static const struct soc15_reg_golden golden_settings_gc_11_0_1[] =
|
||||
{
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, regCGTT_GS_NGG_CLK_CTRL, 0x9fff8fff, 0x00000010),
|
||||
|
@ -274,6 +278,10 @@ static void gfx_v11_0_init_golden_registers(struct amdgpu_device *adev)
|
|||
default:
|
||||
break;
|
||||
}
|
||||
soc15_program_register_sequence(adev,
|
||||
golden_settings_gc_11_0,
|
||||
(const u32)ARRAY_SIZE(golden_settings_gc_11_0));
|
||||
|
||||
}
|
||||
|
||||
static void gfx_v11_0_write_data_to_reg(struct amdgpu_ring *ring, int eng_sel,
|
||||
|
|
|
@ -6151,7 +6151,7 @@ int amdgpu_dm_connector_atomic_set_property(struct drm_connector *connector,
|
|||
dm_new_state->underscan_enable = val;
|
||||
ret = 0;
|
||||
} else if (property == adev->mode_info.abm_level_property) {
|
||||
dm_new_state->abm_level = val;
|
||||
dm_new_state->abm_level = val ?: ABM_LEVEL_IMMEDIATE_DISABLE;
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
|
@ -6196,7 +6196,8 @@ int amdgpu_dm_connector_atomic_get_property(struct drm_connector *connector,
|
|||
*val = dm_state->underscan_enable;
|
||||
ret = 0;
|
||||
} else if (property == adev->mode_info.abm_level_property) {
|
||||
*val = dm_state->abm_level;
|
||||
*val = (dm_state->abm_level != ABM_LEVEL_IMMEDIATE_DISABLE) ?
|
||||
dm_state->abm_level : 0;
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
|
@ -6276,7 +6277,8 @@ void amdgpu_dm_connector_funcs_reset(struct drm_connector *connector)
|
|||
state->pbn = 0;
|
||||
|
||||
if (connector->connector_type == DRM_MODE_CONNECTOR_eDP)
|
||||
state->abm_level = amdgpu_dm_abm_level;
|
||||
state->abm_level = amdgpu_dm_abm_level ?:
|
||||
ABM_LEVEL_IMMEDIATE_DISABLE;
|
||||
|
||||
__drm_atomic_helper_connector_reset(connector, &state->base);
|
||||
}
|
||||
|
|
|
@ -499,9 +499,12 @@ enum dcn_zstate_support_state {
|
|||
DCN_ZSTATE_SUPPORT_ALLOW_Z10_ONLY,
|
||||
DCN_ZSTATE_SUPPORT_DISALLOW,
|
||||
};
|
||||
/*
|
||||
* For any clocks that may differ per pipe
|
||||
* only the max is stored in this structure
|
||||
|
||||
/**
|
||||
* dc_clocks - DC pipe clocks
|
||||
*
|
||||
* For any clocks that may differ per pipe only the max is stored in this
|
||||
* structure
|
||||
*/
|
||||
struct dc_clocks {
|
||||
int dispclk_khz;
|
||||
|
@ -528,6 +531,16 @@ struct dc_clocks {
|
|||
bool prev_p_state_change_support;
|
||||
bool fclk_prev_p_state_change_support;
|
||||
int num_ways;
|
||||
|
||||
/**
|
||||
* @fw_based_mclk_switching
|
||||
*
|
||||
* DC has a mechanism that leverage the variable refresh rate to switch
|
||||
* memory clock in cases that we have a large latency to achieve the
|
||||
* memory clock change and a short vblank window. DC has some
|
||||
* requirements to enable this feature, and this field describes if the
|
||||
* system support or not such a feature.
|
||||
*/
|
||||
bool fw_based_mclk_switching;
|
||||
bool fw_based_mclk_switching_shut_down;
|
||||
int prev_num_ways;
|
||||
|
|
|
@ -202,7 +202,18 @@ struct dc_stream_state {
|
|||
bool use_vsc_sdp_for_colorimetry;
|
||||
bool ignore_msa_timing_param;
|
||||
|
||||
/**
|
||||
* @allow_freesync:
|
||||
*
|
||||
* It say if Freesync is enabled or not.
|
||||
*/
|
||||
bool allow_freesync;
|
||||
|
||||
/**
|
||||
* @vrr_active_variable:
|
||||
*
|
||||
* It describes if VRR is in use.
|
||||
*/
|
||||
bool vrr_active_variable;
|
||||
bool freesync_on_desktop;
|
||||
|
||||
|
|
|
@ -308,7 +308,10 @@ bool cm_helper_convert_to_custom_float(
|
|||
#define NUMBER_REGIONS 32
|
||||
#define NUMBER_SW_SEGMENTS 16
|
||||
|
||||
bool cm_helper_translate_curve_to_hw_format(
|
||||
#define DC_LOGGER \
|
||||
ctx->logger
|
||||
|
||||
bool cm_helper_translate_curve_to_hw_format(struct dc_context *ctx,
|
||||
const struct dc_transfer_func *output_tf,
|
||||
struct pwl_params *lut_params, bool fixpoint)
|
||||
{
|
||||
|
@ -482,10 +485,18 @@ bool cm_helper_translate_curve_to_hw_format(
|
|||
rgb->delta_green = dc_fixpt_sub(rgb_plus_1->green, rgb->green);
|
||||
rgb->delta_blue = dc_fixpt_sub(rgb_plus_1->blue, rgb->blue);
|
||||
|
||||
|
||||
if (fixpoint == true) {
|
||||
rgb->delta_red_reg = dc_fixpt_clamp_u0d10(rgb->delta_red);
|
||||
rgb->delta_green_reg = dc_fixpt_clamp_u0d10(rgb->delta_green);
|
||||
rgb->delta_blue_reg = dc_fixpt_clamp_u0d10(rgb->delta_blue);
|
||||
uint32_t red_clamp = dc_fixpt_clamp_u0d14(rgb->delta_red);
|
||||
uint32_t green_clamp = dc_fixpt_clamp_u0d14(rgb->delta_green);
|
||||
uint32_t blue_clamp = dc_fixpt_clamp_u0d14(rgb->delta_blue);
|
||||
|
||||
if (red_clamp >> 10 || green_clamp >> 10 || blue_clamp >> 10)
|
||||
DC_LOG_WARNING("Losing delta precision while programming shaper LUT.");
|
||||
|
||||
rgb->delta_red_reg = red_clamp & 0x3ff;
|
||||
rgb->delta_green_reg = green_clamp & 0x3ff;
|
||||
rgb->delta_blue_reg = blue_clamp & 0x3ff;
|
||||
rgb->red_reg = dc_fixpt_clamp_u0d14(rgb->red);
|
||||
rgb->green_reg = dc_fixpt_clamp_u0d14(rgb->green);
|
||||
rgb->blue_reg = dc_fixpt_clamp_u0d14(rgb->blue);
|
||||
|
|
|
@ -106,6 +106,7 @@ bool cm_helper_convert_to_custom_float(
|
|||
bool fixpoint);
|
||||
|
||||
bool cm_helper_translate_curve_to_hw_format(
|
||||
struct dc_context *ctx,
|
||||
const struct dc_transfer_func *output_tf,
|
||||
struct pwl_params *lut_params, bool fixpoint);
|
||||
|
||||
|
|
|
@ -1867,7 +1867,7 @@ bool dcn10_set_output_transfer_func(struct dc *dc, struct pipe_ctx *pipe_ctx,
|
|||
/* dcn10_translate_regamma_to_hw_format takes 750us, only do it when full
|
||||
* update.
|
||||
*/
|
||||
else if (cm_helper_translate_curve_to_hw_format(
|
||||
else if (cm_helper_translate_curve_to_hw_format(dc->ctx,
|
||||
stream->out_transfer_func,
|
||||
&dpp->regamma_params, false)) {
|
||||
dpp->funcs->dpp_program_regamma_pwl(
|
||||
|
|
|
@ -843,7 +843,7 @@ bool dcn20_set_output_transfer_func(struct dc *dc, struct pipe_ctx *pipe_ctx,
|
|||
params = &stream->out_transfer_func->pwl;
|
||||
else if (pipe_ctx->stream->out_transfer_func->type ==
|
||||
TF_TYPE_DISTRIBUTED_POINTS &&
|
||||
cm_helper_translate_curve_to_hw_format(
|
||||
cm_helper_translate_curve_to_hw_format(dc->ctx,
|
||||
stream->out_transfer_func,
|
||||
&mpc->blender_params, false))
|
||||
params = &mpc->blender_params;
|
||||
|
@ -872,7 +872,7 @@ bool dcn20_set_blend_lut(
|
|||
if (plane_state->blend_tf->type == TF_TYPE_HWPWL)
|
||||
blend_lut = &plane_state->blend_tf->pwl;
|
||||
else if (plane_state->blend_tf->type == TF_TYPE_DISTRIBUTED_POINTS) {
|
||||
cm_helper_translate_curve_to_hw_format(
|
||||
cm_helper_translate_curve_to_hw_format(plane_state->ctx,
|
||||
plane_state->blend_tf,
|
||||
&dpp_base->regamma_params, false);
|
||||
blend_lut = &dpp_base->regamma_params;
|
||||
|
@ -894,7 +894,7 @@ bool dcn20_set_shaper_3dlut(
|
|||
if (plane_state->in_shaper_func->type == TF_TYPE_HWPWL)
|
||||
shaper_lut = &plane_state->in_shaper_func->pwl;
|
||||
else if (plane_state->in_shaper_func->type == TF_TYPE_DISTRIBUTED_POINTS) {
|
||||
cm_helper_translate_curve_to_hw_format(
|
||||
cm_helper_translate_curve_to_hw_format(plane_state->ctx,
|
||||
plane_state->in_shaper_func,
|
||||
&dpp_base->shaper_params, true);
|
||||
shaper_lut = &dpp_base->shaper_params;
|
||||
|
|
|
@ -280,7 +280,7 @@ bool dwb3_ogam_set_input_transfer_func(
|
|||
dwb_ogam_lut = kzalloc(sizeof(*dwb_ogam_lut), GFP_KERNEL);
|
||||
|
||||
if (dwb_ogam_lut) {
|
||||
cm_helper_translate_curve_to_hw_format(
|
||||
cm_helper_translate_curve_to_hw_format(dwbc->ctx,
|
||||
in_transfer_func_dwb_ogam,
|
||||
dwb_ogam_lut, false);
|
||||
|
||||
|
|
|
@ -91,8 +91,8 @@ bool dcn30_set_blend_lut(
|
|||
return result;
|
||||
}
|
||||
|
||||
static bool dcn30_set_mpc_shaper_3dlut(
|
||||
struct pipe_ctx *pipe_ctx, const struct dc_stream_state *stream)
|
||||
static bool dcn30_set_mpc_shaper_3dlut(struct pipe_ctx *pipe_ctx,
|
||||
const struct dc_stream_state *stream)
|
||||
{
|
||||
struct dpp *dpp_base = pipe_ctx->plane_res.dpp;
|
||||
int mpcc_id = pipe_ctx->plane_res.hubp->inst;
|
||||
|
@ -104,19 +104,18 @@ static bool dcn30_set_mpc_shaper_3dlut(
|
|||
const struct pwl_params *shaper_lut = NULL;
|
||||
//get the shaper lut params
|
||||
if (stream->func_shaper) {
|
||||
if (stream->func_shaper->type == TF_TYPE_HWPWL)
|
||||
if (stream->func_shaper->type == TF_TYPE_HWPWL) {
|
||||
shaper_lut = &stream->func_shaper->pwl;
|
||||
else if (stream->func_shaper->type == TF_TYPE_DISTRIBUTED_POINTS) {
|
||||
cm_helper_translate_curve_to_hw_format(
|
||||
stream->func_shaper,
|
||||
&dpp_base->shaper_params, true);
|
||||
} else if (stream->func_shaper->type == TF_TYPE_DISTRIBUTED_POINTS) {
|
||||
cm_helper_translate_curve_to_hw_format(stream->ctx, stream->func_shaper,
|
||||
&dpp_base->shaper_params, true);
|
||||
shaper_lut = &dpp_base->shaper_params;
|
||||
}
|
||||
}
|
||||
|
||||
if (stream->lut3d_func &&
|
||||
stream->lut3d_func->state.bits.initialized == 1 &&
|
||||
stream->lut3d_func->state.bits.rmu_idx_valid == 1) {
|
||||
stream->lut3d_func->state.bits.initialized == 1 &&
|
||||
stream->lut3d_func->state.bits.rmu_idx_valid == 1) {
|
||||
if (stream->lut3d_func->state.bits.rmu_mux_num == 0)
|
||||
mpcc_id_projected = stream->lut3d_func->state.bits.mpc_rmu0_mux;
|
||||
else if (stream->lut3d_func->state.bits.rmu_mux_num == 1)
|
||||
|
@ -125,20 +124,22 @@ static bool dcn30_set_mpc_shaper_3dlut(
|
|||
mpcc_id_projected = stream->lut3d_func->state.bits.mpc_rmu2_mux;
|
||||
if (mpcc_id_projected != mpcc_id)
|
||||
BREAK_TO_DEBUGGER();
|
||||
/*find the reason why logical layer assigned a differant mpcc_id into acquire_post_bldn_3dlut*/
|
||||
/* find the reason why logical layer assigned a different
|
||||
* mpcc_id into acquire_post_bldn_3dlut
|
||||
*/
|
||||
acquired_rmu = mpc->funcs->acquire_rmu(mpc, mpcc_id,
|
||||
stream->lut3d_func->state.bits.rmu_mux_num);
|
||||
stream->lut3d_func->state.bits.rmu_mux_num);
|
||||
if (acquired_rmu != stream->lut3d_func->state.bits.rmu_mux_num)
|
||||
BREAK_TO_DEBUGGER();
|
||||
result = mpc->funcs->program_3dlut(mpc,
|
||||
&stream->lut3d_func->lut_3d,
|
||||
stream->lut3d_func->state.bits.rmu_mux_num);
|
||||
result = mpc->funcs->program_shaper(mpc, shaper_lut,
|
||||
stream->lut3d_func->state.bits.rmu_mux_num);
|
||||
} else
|
||||
/*loop through the available mux and release the requested mpcc_id*/
|
||||
mpc->funcs->release_rmu(mpc, mpcc_id);
|
||||
|
||||
result = mpc->funcs->program_3dlut(mpc, &stream->lut3d_func->lut_3d,
|
||||
stream->lut3d_func->state.bits.rmu_mux_num);
|
||||
result = mpc->funcs->program_shaper(mpc, shaper_lut,
|
||||
stream->lut3d_func->state.bits.rmu_mux_num);
|
||||
} else {
|
||||
// loop through the available mux and release the requested mpcc_id
|
||||
mpc->funcs->release_rmu(mpc, mpcc_id);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -884,7 +884,7 @@ static const struct dc_plane_cap plane_cap = {
|
|||
static const struct dc_debug_options debug_defaults_drv = {
|
||||
.disable_z10 = false,
|
||||
.enable_z9_disable_interface = true,
|
||||
.minimum_z8_residency_time = 2000,
|
||||
.minimum_z8_residency_time = 2100,
|
||||
.psr_skip_crtc_disable = true,
|
||||
.disable_dmcu = true,
|
||||
.force_abm_enable = false,
|
||||
|
|
|
@ -530,7 +530,7 @@ static bool dcn32_set_mpc_shaper_3dlut(
|
|||
if (stream->func_shaper->type == TF_TYPE_HWPWL)
|
||||
shaper_lut = &stream->func_shaper->pwl;
|
||||
else if (stream->func_shaper->type == TF_TYPE_DISTRIBUTED_POINTS) {
|
||||
cm_helper_translate_curve_to_hw_format(
|
||||
cm_helper_translate_curve_to_hw_format(stream->ctx,
|
||||
stream->func_shaper,
|
||||
&dpp_base->shaper_params, true);
|
||||
shaper_lut = &dpp_base->shaper_params;
|
||||
|
@ -566,8 +566,7 @@ bool dcn32_set_mcm_luts(
|
|||
if (plane_state->blend_tf->type == TF_TYPE_HWPWL)
|
||||
lut_params = &plane_state->blend_tf->pwl;
|
||||
else if (plane_state->blend_tf->type == TF_TYPE_DISTRIBUTED_POINTS) {
|
||||
cm_helper_translate_curve_to_hw_format(
|
||||
plane_state->blend_tf,
|
||||
cm3_helper_translate_curve_to_hw_format(plane_state->blend_tf,
|
||||
&dpp_base->regamma_params, false);
|
||||
lut_params = &dpp_base->regamma_params;
|
||||
}
|
||||
|
@ -581,8 +580,7 @@ bool dcn32_set_mcm_luts(
|
|||
else if (plane_state->in_shaper_func->type == TF_TYPE_DISTRIBUTED_POINTS) {
|
||||
// TODO: dpp_base replace
|
||||
ASSERT(false);
|
||||
cm_helper_translate_curve_to_hw_format(
|
||||
plane_state->in_shaper_func,
|
||||
cm3_helper_translate_curve_to_hw_format(plane_state->in_shaper_func,
|
||||
&dpp_base->shaper_params, true);
|
||||
lut_params = &dpp_base->shaper_params;
|
||||
}
|
||||
|
|
|
@ -29,6 +29,13 @@
|
|||
#define DC__PRESENT 1
|
||||
#define DC__PRESENT__1 1
|
||||
#define DC__NUM_DPP 4
|
||||
|
||||
/**
|
||||
* @DC__VOLTAGE_STATES:
|
||||
*
|
||||
* Define the maximum amount of states supported by the ASIC. Every ASIC has a
|
||||
* specific number of states; this macro defines the maximum number of states.
|
||||
*/
|
||||
#define DC__VOLTAGE_STATES 20
|
||||
#define DC__NUM_DPP__4 1
|
||||
#define DC__NUM_DPP__0_PRESENT 1
|
||||
|
|
|
@ -948,10 +948,8 @@ static enum dcn_zstate_support_state decide_zstate_support(struct dc *dc, struc
|
|||
{
|
||||
int plane_count;
|
||||
int i;
|
||||
unsigned int min_dst_y_next_start_us;
|
||||
|
||||
plane_count = 0;
|
||||
min_dst_y_next_start_us = 0;
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
if (context->res_ctx.pipe_ctx[i].plane_state)
|
||||
plane_count++;
|
||||
|
@ -973,26 +971,15 @@ static enum dcn_zstate_support_state decide_zstate_support(struct dc *dc, struc
|
|||
else if (context->stream_count == 1 && context->streams[0]->signal == SIGNAL_TYPE_EDP) {
|
||||
struct dc_link *link = context->streams[0]->sink->link;
|
||||
struct dc_stream_status *stream_status = &context->stream_status[0];
|
||||
struct dc_stream_state *current_stream = context->streams[0];
|
||||
int minmum_z8_residency = dc->debug.minimum_z8_residency_time > 0 ? dc->debug.minimum_z8_residency_time : 1000;
|
||||
bool allow_z8 = context->bw_ctx.dml.vba.StutterPeriod > (double)minmum_z8_residency;
|
||||
bool is_pwrseq0 = link->link_index == 0;
|
||||
bool isFreesyncVideo;
|
||||
|
||||
isFreesyncVideo = current_stream->adjust.v_total_min == current_stream->adjust.v_total_max;
|
||||
isFreesyncVideo = isFreesyncVideo && current_stream->timing.v_total < current_stream->adjust.v_total_min;
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
if (context->res_ctx.pipe_ctx[i].stream == current_stream && isFreesyncVideo) {
|
||||
min_dst_y_next_start_us = context->res_ctx.pipe_ctx[i].dlg_regs.min_dst_y_next_start_us;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Don't support multi-plane configurations */
|
||||
if (stream_status->plane_count > 1)
|
||||
return DCN_ZSTATE_SUPPORT_DISALLOW;
|
||||
|
||||
if (is_pwrseq0 && (context->bw_ctx.dml.vba.StutterPeriod > 5000.0 || min_dst_y_next_start_us > 5000))
|
||||
if (is_pwrseq0 && context->bw_ctx.dml.vba.StutterPeriod > 5000.0)
|
||||
return DCN_ZSTATE_SUPPORT_ALLOW;
|
||||
else if (is_pwrseq0 && link->psr_settings.psr_version == DC_PSR_VERSION_1 && !link->panel_config.psr.disable_psr)
|
||||
return allow_z8 ? DCN_ZSTATE_SUPPORT_ALLOW_Z8_Z10_ONLY : DCN_ZSTATE_SUPPORT_ALLOW_Z10_ONLY;
|
||||
|
|
|
@ -1788,6 +1788,7 @@ void dcn32_calculate_wm_and_dlg_fpu(struct dc *dc, struct dc_state *context,
|
|||
int i, pipe_idx, vlevel_temp = 0;
|
||||
double dcfclk = dcn3_2_soc.clock_limits[0].dcfclk_mhz;
|
||||
double dcfclk_from_validation = context->bw_ctx.dml.vba.DCFCLKState[vlevel][context->bw_ctx.dml.vba.maxMpcComb];
|
||||
double dram_speed_from_validation = context->bw_ctx.dml.vba.DRAMSpeed;
|
||||
double dcfclk_from_fw_based_mclk_switching = dcfclk_from_validation;
|
||||
bool pstate_en = context->bw_ctx.dml.vba.DRAMClockChangeSupport[vlevel][context->bw_ctx.dml.vba.maxMpcComb] !=
|
||||
dm_dram_clock_change_unsupported;
|
||||
|
@ -1921,7 +1922,7 @@ void dcn32_calculate_wm_and_dlg_fpu(struct dc *dc, struct dc_state *context,
|
|||
}
|
||||
|
||||
if (dc->clk_mgr->bw_params->wm_table.nv_entries[WM_C].valid) {
|
||||
min_dram_speed_mts = context->bw_ctx.dml.vba.DRAMSpeed;
|
||||
min_dram_speed_mts = dram_speed_from_validation;
|
||||
min_dram_speed_mts_margin = 160;
|
||||
|
||||
context->bw_ctx.dml.soc.dram_clock_change_latency_us =
|
||||
|
|
|
@ -105,14 +105,39 @@ enum source_macro_tile_size {
|
|||
enum cursor_bpp {
|
||||
dm_cur_2bit = 0, dm_cur_32bit = 1, dm_cur_64bit = 2
|
||||
};
|
||||
|
||||
/**
|
||||
* @enum clock_change_support - It represents possible reasons to change the DRAM clock.
|
||||
*
|
||||
* DC may change the DRAM clock during its execution, and this enum tracks all
|
||||
* the available methods. Note that every ASIC has their specific way to deal
|
||||
* with these clock switch.
|
||||
*/
|
||||
enum clock_change_support {
|
||||
/**
|
||||
* @dm_dram_clock_change_uninitialized: If you see this, we might have
|
||||
* a code initialization issue
|
||||
*/
|
||||
dm_dram_clock_change_uninitialized = 0,
|
||||
|
||||
/**
|
||||
* @dm_dram_clock_change_vactive: Support DRAM switch in VActive
|
||||
*/
|
||||
dm_dram_clock_change_vactive,
|
||||
|
||||
/**
|
||||
* @dm_dram_clock_change_vblank: Support DRAM switch in VBlank
|
||||
*/
|
||||
dm_dram_clock_change_vblank,
|
||||
|
||||
dm_dram_clock_change_vactive_w_mall_full_frame,
|
||||
dm_dram_clock_change_vactive_w_mall_sub_vp,
|
||||
dm_dram_clock_change_vblank_w_mall_full_frame,
|
||||
dm_dram_clock_change_vblank_w_mall_sub_vp,
|
||||
|
||||
/**
|
||||
* @dm_dram_clock_change_unsupported: Do not support DRAM switch
|
||||
*/
|
||||
dm_dram_clock_change_unsupported
|
||||
};
|
||||
|
||||
|
|
|
@ -419,6 +419,15 @@ struct vba_vars_st {
|
|||
double MinPixelChunkSizeBytes;
|
||||
unsigned int DCCMetaBufferSizeBytes;
|
||||
// Pipe/Plane Parameters
|
||||
|
||||
/** @VoltageLevel:
|
||||
* Every ASIC has a fixed number of DPM states, and some devices might
|
||||
* have some particular voltage configuration that does not map
|
||||
* directly to the DPM states. This field tells how many states the
|
||||
* target device supports; even though this field combines the DPM and
|
||||
* special SOC voltages, it mostly matches the total number of DPM
|
||||
* states.
|
||||
*/
|
||||
int VoltageLevel;
|
||||
double FabricClock;
|
||||
double DRAMSpeed;
|
||||
|
|
|
@ -115,6 +115,13 @@ struct resource_funcs {
|
|||
int vlevel);
|
||||
void (*update_soc_for_wm_a)(
|
||||
struct dc *dc, struct dc_state *context);
|
||||
|
||||
/**
|
||||
* @populate_dml_pipes - Populate pipe data struct
|
||||
*
|
||||
* Returns:
|
||||
* Total of pipes available in the specific ASIC.
|
||||
*/
|
||||
int (*populate_dml_pipes)(
|
||||
struct dc *dc,
|
||||
struct dc_state *context,
|
||||
|
|
|
@ -35,6 +35,13 @@
|
|||
******************************************************************************/
|
||||
|
||||
#define MAX_AUDIOS 7
|
||||
|
||||
/**
|
||||
* @MAX_PIPES:
|
||||
*
|
||||
* Every ASIC support a fixed number of pipes; MAX_PIPES defines a large number
|
||||
* to be used inside loops and for determining array sizes.
|
||||
*/
|
||||
#define MAX_PIPES 6
|
||||
#define MAX_DIG_LINK_ENCODERS 7
|
||||
#define MAX_DWB_PIPES 1
|
||||
|
|
|
@ -332,6 +332,8 @@ struct dmub_srv_hw_funcs {
|
|||
void (*setup_mailbox)(struct dmub_srv *dmub,
|
||||
const struct dmub_region *inbox1);
|
||||
|
||||
uint32_t (*get_inbox1_wptr)(struct dmub_srv *dmub);
|
||||
|
||||
uint32_t (*get_inbox1_rptr)(struct dmub_srv *dmub);
|
||||
|
||||
void (*set_inbox1_wptr)(struct dmub_srv *dmub, uint32_t wptr_offset);
|
||||
|
@ -590,6 +592,18 @@ enum dmub_status dmub_srv_hw_init(struct dmub_srv *dmub,
|
|||
*/
|
||||
enum dmub_status dmub_srv_hw_reset(struct dmub_srv *dmub);
|
||||
|
||||
/**
|
||||
* dmub_srv_sync_inbox1() - sync sw state with hw state
|
||||
* @dmub: the dmub service
|
||||
*
|
||||
* Sync sw state with hw state when resume from S0i3
|
||||
*
|
||||
* Return:
|
||||
* DMUB_STATUS_OK - success
|
||||
* DMUB_STATUS_INVALID - unspecified error
|
||||
*/
|
||||
enum dmub_status dmub_srv_sync_inbox1(struct dmub_srv *dmub);
|
||||
|
||||
/**
|
||||
* dmub_srv_cmd_queue() - queues a command to the DMUB
|
||||
* @dmub: the dmub service
|
||||
|
|
|
@ -282,6 +282,11 @@ void dmub_dcn20_setup_mailbox(struct dmub_srv *dmub,
|
|||
REG_WRITE(DMCUB_INBOX1_SIZE, inbox1->top - inbox1->base);
|
||||
}
|
||||
|
||||
uint32_t dmub_dcn20_get_inbox1_wptr(struct dmub_srv *dmub)
|
||||
{
|
||||
return REG_READ(DMCUB_INBOX1_WPTR);
|
||||
}
|
||||
|
||||
uint32_t dmub_dcn20_get_inbox1_rptr(struct dmub_srv *dmub)
|
||||
{
|
||||
return REG_READ(DMCUB_INBOX1_RPTR);
|
||||
|
|
|
@ -202,6 +202,8 @@ void dmub_dcn20_setup_windows(struct dmub_srv *dmub,
|
|||
void dmub_dcn20_setup_mailbox(struct dmub_srv *dmub,
|
||||
const struct dmub_region *inbox1);
|
||||
|
||||
uint32_t dmub_dcn20_get_inbox1_wptr(struct dmub_srv *dmub);
|
||||
|
||||
uint32_t dmub_dcn20_get_inbox1_rptr(struct dmub_srv *dmub);
|
||||
|
||||
void dmub_dcn20_set_inbox1_wptr(struct dmub_srv *dmub, uint32_t wptr_offset);
|
||||
|
|
|
@ -242,6 +242,11 @@ void dmub_dcn31_setup_mailbox(struct dmub_srv *dmub,
|
|||
REG_WRITE(DMCUB_INBOX1_SIZE, inbox1->top - inbox1->base);
|
||||
}
|
||||
|
||||
uint32_t dmub_dcn31_get_inbox1_wptr(struct dmub_srv *dmub)
|
||||
{
|
||||
return REG_READ(DMCUB_INBOX1_WPTR);
|
||||
}
|
||||
|
||||
uint32_t dmub_dcn31_get_inbox1_rptr(struct dmub_srv *dmub)
|
||||
{
|
||||
return REG_READ(DMCUB_INBOX1_RPTR);
|
||||
|
|
|
@ -204,6 +204,8 @@ void dmub_dcn31_setup_windows(struct dmub_srv *dmub,
|
|||
void dmub_dcn31_setup_mailbox(struct dmub_srv *dmub,
|
||||
const struct dmub_region *inbox1);
|
||||
|
||||
uint32_t dmub_dcn31_get_inbox1_wptr(struct dmub_srv *dmub);
|
||||
|
||||
uint32_t dmub_dcn31_get_inbox1_rptr(struct dmub_srv *dmub);
|
||||
|
||||
void dmub_dcn31_set_inbox1_wptr(struct dmub_srv *dmub, uint32_t wptr_offset);
|
||||
|
|
|
@ -266,6 +266,11 @@ void dmub_dcn32_setup_mailbox(struct dmub_srv *dmub,
|
|||
REG_WRITE(DMCUB_INBOX1_SIZE, inbox1->top - inbox1->base);
|
||||
}
|
||||
|
||||
uint32_t dmub_dcn32_get_inbox1_wptr(struct dmub_srv *dmub)
|
||||
{
|
||||
return REG_READ(DMCUB_INBOX1_WPTR);
|
||||
}
|
||||
|
||||
uint32_t dmub_dcn32_get_inbox1_rptr(struct dmub_srv *dmub)
|
||||
{
|
||||
return REG_READ(DMCUB_INBOX1_RPTR);
|
||||
|
|
|
@ -206,6 +206,8 @@ void dmub_dcn32_setup_windows(struct dmub_srv *dmub,
|
|||
void dmub_dcn32_setup_mailbox(struct dmub_srv *dmub,
|
||||
const struct dmub_region *inbox1);
|
||||
|
||||
uint32_t dmub_dcn32_get_inbox1_wptr(struct dmub_srv *dmub);
|
||||
|
||||
uint32_t dmub_dcn32_get_inbox1_rptr(struct dmub_srv *dmub);
|
||||
|
||||
void dmub_dcn32_set_inbox1_wptr(struct dmub_srv *dmub, uint32_t wptr_offset);
|
||||
|
|
|
@ -167,6 +167,7 @@ static bool dmub_srv_hw_setup(struct dmub_srv *dmub, enum dmub_asic asic)
|
|||
funcs->backdoor_load = dmub_dcn20_backdoor_load;
|
||||
funcs->setup_windows = dmub_dcn20_setup_windows;
|
||||
funcs->setup_mailbox = dmub_dcn20_setup_mailbox;
|
||||
funcs->get_inbox1_wptr = dmub_dcn20_get_inbox1_wptr;
|
||||
funcs->get_inbox1_rptr = dmub_dcn20_get_inbox1_rptr;
|
||||
funcs->set_inbox1_wptr = dmub_dcn20_set_inbox1_wptr;
|
||||
funcs->is_supported = dmub_dcn20_is_supported;
|
||||
|
@ -243,6 +244,7 @@ static bool dmub_srv_hw_setup(struct dmub_srv *dmub, enum dmub_asic asic)
|
|||
funcs->backdoor_load = dmub_dcn31_backdoor_load;
|
||||
funcs->setup_windows = dmub_dcn31_setup_windows;
|
||||
funcs->setup_mailbox = dmub_dcn31_setup_mailbox;
|
||||
funcs->get_inbox1_wptr = dmub_dcn31_get_inbox1_wptr;
|
||||
funcs->get_inbox1_rptr = dmub_dcn31_get_inbox1_rptr;
|
||||
funcs->set_inbox1_wptr = dmub_dcn31_set_inbox1_wptr;
|
||||
funcs->setup_out_mailbox = dmub_dcn31_setup_out_mailbox;
|
||||
|
@ -281,6 +283,7 @@ static bool dmub_srv_hw_setup(struct dmub_srv *dmub, enum dmub_asic asic)
|
|||
funcs->backdoor_load_zfb_mode = dmub_dcn32_backdoor_load_zfb_mode;
|
||||
funcs->setup_windows = dmub_dcn32_setup_windows;
|
||||
funcs->setup_mailbox = dmub_dcn32_setup_mailbox;
|
||||
funcs->get_inbox1_wptr = dmub_dcn32_get_inbox1_wptr;
|
||||
funcs->get_inbox1_rptr = dmub_dcn32_get_inbox1_rptr;
|
||||
funcs->set_inbox1_wptr = dmub_dcn32_set_inbox1_wptr;
|
||||
funcs->setup_out_mailbox = dmub_dcn32_setup_out_mailbox;
|
||||
|
@ -666,6 +669,27 @@ enum dmub_status dmub_srv_hw_init(struct dmub_srv *dmub,
|
|||
return DMUB_STATUS_OK;
|
||||
}
|
||||
|
||||
enum dmub_status dmub_srv_sync_inbox1(struct dmub_srv *dmub)
|
||||
{
|
||||
if (!dmub->sw_init)
|
||||
return DMUB_STATUS_INVALID;
|
||||
|
||||
if (dmub->hw_funcs.get_inbox1_rptr && dmub->hw_funcs.get_inbox1_wptr) {
|
||||
uint32_t rptr = dmub->hw_funcs.get_inbox1_rptr(dmub);
|
||||
uint32_t wptr = dmub->hw_funcs.get_inbox1_wptr(dmub);
|
||||
|
||||
if (rptr > dmub->inbox1_rb.capacity || wptr > dmub->inbox1_rb.capacity) {
|
||||
return DMUB_STATUS_HW_FAILURE;
|
||||
} else {
|
||||
dmub->inbox1_rb.rptr = rptr;
|
||||
dmub->inbox1_rb.wrpt = wptr;
|
||||
dmub->inbox1_last_wptr = dmub->inbox1_rb.wrpt;
|
||||
}
|
||||
}
|
||||
|
||||
return DMUB_STATUS_OK;
|
||||
}
|
||||
|
||||
enum dmub_status dmub_srv_hw_reset(struct dmub_srv *dmub)
|
||||
{
|
||||
if (!dmub->sw_init)
|
||||
|
@ -694,6 +718,11 @@ enum dmub_status dmub_srv_cmd_queue(struct dmub_srv *dmub,
|
|||
if (!dmub->hw_init)
|
||||
return DMUB_STATUS_INVALID;
|
||||
|
||||
if (dmub->inbox1_rb.rptr > dmub->inbox1_rb.capacity ||
|
||||
dmub->inbox1_rb.wrpt > dmub->inbox1_rb.capacity) {
|
||||
return DMUB_STATUS_HW_FAILURE;
|
||||
}
|
||||
|
||||
if (dmub_rb_push_front(&dmub->inbox1_rb, cmd))
|
||||
return DMUB_STATUS_OK;
|
||||
|
||||
|
@ -964,6 +993,7 @@ enum dmub_status dmub_srv_wait_for_inbox0_ack(struct dmub_srv *dmub, uint32_t ti
|
|||
ack = dmub->hw_funcs.read_inbox0_ack_register(dmub);
|
||||
if (ack)
|
||||
return DMUB_STATUS_OK;
|
||||
udelay(1);
|
||||
}
|
||||
return DMUB_STATUS_TIMEOUT;
|
||||
}
|
||||
|
|
|
@ -6369,6 +6369,8 @@
|
|||
#define regTCP_INVALIDATE_BASE_IDX 1
|
||||
#define regTCP_STATUS 0x19a1
|
||||
#define regTCP_STATUS_BASE_IDX 1
|
||||
#define regTCP_CNTL 0x19a2
|
||||
#define regTCP_CNTL_BASE_IDX 1
|
||||
#define regTCP_CNTL2 0x19a3
|
||||
#define regTCP_CNTL2_BASE_IDX 1
|
||||
#define regTCP_DEBUG_INDEX 0x19a5
|
||||
|
|
|
@ -258,8 +258,11 @@ static int aldebaran_tables_init(struct smu_context *smu)
|
|||
}
|
||||
|
||||
smu_table->ecc_table = kzalloc(tables[SMU_TABLE_ECCINFO].size, GFP_KERNEL);
|
||||
if (!smu_table->ecc_table)
|
||||
if (!smu_table->ecc_table) {
|
||||
kfree(smu_table->metrics_table);
|
||||
kfree(smu_table->gpu_metrics_table);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -301,7 +301,7 @@ void dma_resv_add_fence(struct dma_resv *obj, struct dma_fence *fence,
|
|||
|
||||
dma_resv_list_entry(fobj, i, obj, &old, &old_usage);
|
||||
if ((old->context == fence->context && old_usage >= usage &&
|
||||
dma_fence_is_later(fence, old)) ||
|
||||
dma_fence_is_later_or_same(fence, old)) ||
|
||||
dma_fence_is_signaled(old)) {
|
||||
dma_resv_list_set(fobj, i, fence, usage);
|
||||
dma_fence_put(old);
|
||||
|
|
|
@ -113,6 +113,14 @@ dma_fence_is_later(struct dma_fence *a, struct dma_fence *b)
|
|||
return __dma_fence_is_later(a->seqno, b->seqno, a->ops);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
dma_fence_is_later_or_same(struct dma_fence *a, struct dma_fence *b)
|
||||
{
|
||||
if (a == b)
|
||||
return true;
|
||||
return dma_fence_is_later(a, b);
|
||||
}
|
||||
|
||||
static inline void
|
||||
dma_fence_set_error(struct dma_fence *fence, int error)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue