Merge tag 'amd-drm-fixes-5.9-2020-08-12' of git://people.freedesktop.org/~agd5f/linux into drm-fixes
amd-drm-fixes-5.9-2020-08-12: amdgpu: - Fix allocation size - SR-IOV fixes - Vega20 SMU feature state caching fix - Fix custom pptable handling - Arcturus golden settings update - Several display fixes Signed-off-by: Dave Airlie <airlied@redhat.com> From: Alex Deucher <alexdeucher@gmail.com> Link: https://patchwork.freedesktop.org/patch/msgid/20200813033610.4008-1-alexander.deucher@amd.com
This commit is contained in:
Коммит
485d41b092
|
@ -462,7 +462,7 @@ int amdgpu_vram_mgr_alloc_sgt(struct amdgpu_device *adev,
|
||||||
unsigned int pages;
|
unsigned int pages;
|
||||||
int i, r;
|
int i, r;
|
||||||
|
|
||||||
*sgt = kmalloc(sizeof(*sg), GFP_KERNEL);
|
*sgt = kmalloc(sizeof(**sgt), GFP_KERNEL);
|
||||||
if (!*sgt)
|
if (!*sgt)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
|
|
@ -691,6 +691,7 @@ static const struct soc15_reg_golden golden_settings_gc_9_4_1_arct[] =
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_5_ARCT, 0x3ff, 0x135),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_5_ARCT, 0x3ff, 0x135),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_CONFIG, 0xffffffff, 0x011A0000),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_CONFIG, 0xffffffff, 0x011A0000),
|
||||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_FIFO_SIZES, 0xffffffff, 0x00000f00),
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_FIFO_SIZES, 0xffffffff, 0x00000f00),
|
||||||
|
SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_UTCL1_CNTL1, 0x30000000, 0x30000000)
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct soc15_reg_rlcg rlcg_access_gc_9_0[] = {
|
static const struct soc15_reg_rlcg rlcg_access_gc_9_0[] = {
|
||||||
|
|
|
@ -135,6 +135,12 @@ static void gfxhub_v2_1_init_cache_regs(struct amdgpu_device *adev)
|
||||||
{
|
{
|
||||||
uint32_t tmp;
|
uint32_t tmp;
|
||||||
|
|
||||||
|
/* These registers are not accessible to VF-SRIOV.
|
||||||
|
* The PF will program them instead.
|
||||||
|
*/
|
||||||
|
if (amdgpu_sriov_vf(adev))
|
||||||
|
return;
|
||||||
|
|
||||||
/* Setup L2 cache */
|
/* Setup L2 cache */
|
||||||
tmp = RREG32_SOC15(GC, 0, mmGCVM_L2_CNTL);
|
tmp = RREG32_SOC15(GC, 0, mmGCVM_L2_CNTL);
|
||||||
tmp = REG_SET_FIELD(tmp, GCVM_L2_CNTL, ENABLE_L2_CACHE, 1);
|
tmp = REG_SET_FIELD(tmp, GCVM_L2_CNTL, ENABLE_L2_CACHE, 1);
|
||||||
|
@ -190,6 +196,12 @@ static void gfxhub_v2_1_enable_system_domain(struct amdgpu_device *adev)
|
||||||
|
|
||||||
static void gfxhub_v2_1_disable_identity_aperture(struct amdgpu_device *adev)
|
static void gfxhub_v2_1_disable_identity_aperture(struct amdgpu_device *adev)
|
||||||
{
|
{
|
||||||
|
/* These registers are not accessible to VF-SRIOV.
|
||||||
|
* The PF will program them instead.
|
||||||
|
*/
|
||||||
|
if (amdgpu_sriov_vf(adev))
|
||||||
|
return;
|
||||||
|
|
||||||
WREG32_SOC15(GC, 0, mmGCVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_LO32,
|
WREG32_SOC15(GC, 0, mmGCVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_LO32,
|
||||||
0xFFFFFFFF);
|
0xFFFFFFFF);
|
||||||
WREG32_SOC15(GC, 0, mmGCVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_HI32,
|
WREG32_SOC15(GC, 0, mmGCVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_HI32,
|
||||||
|
@ -326,6 +338,13 @@ void gfxhub_v2_1_set_fault_enable_default(struct amdgpu_device *adev,
|
||||||
bool value)
|
bool value)
|
||||||
{
|
{
|
||||||
u32 tmp;
|
u32 tmp;
|
||||||
|
|
||||||
|
/* These registers are not accessible to VF-SRIOV.
|
||||||
|
* The PF will program them instead.
|
||||||
|
*/
|
||||||
|
if (amdgpu_sriov_vf(adev))
|
||||||
|
return;
|
||||||
|
|
||||||
tmp = RREG32_SOC15(GC, 0, mmGCVM_L2_PROTECTION_FAULT_CNTL);
|
tmp = RREG32_SOC15(GC, 0, mmGCVM_L2_PROTECTION_FAULT_CNTL);
|
||||||
tmp = REG_SET_FIELD(tmp, GCVM_L2_PROTECTION_FAULT_CNTL,
|
tmp = REG_SET_FIELD(tmp, GCVM_L2_PROTECTION_FAULT_CNTL,
|
||||||
RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, value);
|
RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, value);
|
||||||
|
|
|
@ -134,6 +134,12 @@ static void mmhub_v2_0_init_cache_regs(struct amdgpu_device *adev)
|
||||||
{
|
{
|
||||||
uint32_t tmp;
|
uint32_t tmp;
|
||||||
|
|
||||||
|
/* These registers are not accessible to VF-SRIOV.
|
||||||
|
* The PF will program them instead.
|
||||||
|
*/
|
||||||
|
if (amdgpu_sriov_vf(adev))
|
||||||
|
return;
|
||||||
|
|
||||||
/* Setup L2 cache */
|
/* Setup L2 cache */
|
||||||
tmp = RREG32_SOC15(MMHUB, 0, mmMMVM_L2_CNTL);
|
tmp = RREG32_SOC15(MMHUB, 0, mmMMVM_L2_CNTL);
|
||||||
tmp = REG_SET_FIELD(tmp, MMVM_L2_CNTL, ENABLE_L2_CACHE, 1);
|
tmp = REG_SET_FIELD(tmp, MMVM_L2_CNTL, ENABLE_L2_CACHE, 1);
|
||||||
|
@ -189,6 +195,12 @@ static void mmhub_v2_0_enable_system_domain(struct amdgpu_device *adev)
|
||||||
|
|
||||||
static void mmhub_v2_0_disable_identity_aperture(struct amdgpu_device *adev)
|
static void mmhub_v2_0_disable_identity_aperture(struct amdgpu_device *adev)
|
||||||
{
|
{
|
||||||
|
/* These registers are not accessible to VF-SRIOV.
|
||||||
|
* The PF will program them instead.
|
||||||
|
*/
|
||||||
|
if (amdgpu_sriov_vf(adev))
|
||||||
|
return;
|
||||||
|
|
||||||
WREG32_SOC15(MMHUB, 0,
|
WREG32_SOC15(MMHUB, 0,
|
||||||
mmMMVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_LO32,
|
mmMMVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_LO32,
|
||||||
0xFFFFFFFF);
|
0xFFFFFFFF);
|
||||||
|
@ -318,6 +330,13 @@ void mmhub_v2_0_gart_disable(struct amdgpu_device *adev)
|
||||||
void mmhub_v2_0_set_fault_enable_default(struct amdgpu_device *adev, bool value)
|
void mmhub_v2_0_set_fault_enable_default(struct amdgpu_device *adev, bool value)
|
||||||
{
|
{
|
||||||
u32 tmp;
|
u32 tmp;
|
||||||
|
|
||||||
|
/* These registers are not accessible to VF-SRIOV.
|
||||||
|
* The PF will program them instead.
|
||||||
|
*/
|
||||||
|
if (amdgpu_sriov_vf(adev))
|
||||||
|
return;
|
||||||
|
|
||||||
tmp = RREG32_SOC15(MMHUB, 0, mmMMVM_L2_PROTECTION_FAULT_CNTL);
|
tmp = RREG32_SOC15(MMHUB, 0, mmMMVM_L2_PROTECTION_FAULT_CNTL);
|
||||||
tmp = REG_SET_FIELD(tmp, MMVM_L2_PROTECTION_FAULT_CNTL,
|
tmp = REG_SET_FIELD(tmp, MMVM_L2_PROTECTION_FAULT_CNTL,
|
||||||
RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, value);
|
RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, value);
|
||||||
|
|
|
@ -2196,6 +2196,7 @@ void amdgpu_dm_update_connector_after_detect(
|
||||||
|
|
||||||
drm_connector_update_edid_property(connector,
|
drm_connector_update_edid_property(connector,
|
||||||
aconnector->edid);
|
aconnector->edid);
|
||||||
|
drm_add_edid_modes(connector, aconnector->edid);
|
||||||
|
|
||||||
if (aconnector->dc_link->aux_mode)
|
if (aconnector->dc_link->aux_mode)
|
||||||
drm_dp_cec_set_edid(&aconnector->dm_dp_aux.aux,
|
drm_dp_cec_set_edid(&aconnector->dm_dp_aux.aux,
|
||||||
|
|
|
@ -3286,12 +3286,11 @@ void core_link_disable_stream(struct pipe_ctx *pipe_ctx)
|
||||||
core_link_set_avmute(pipe_ctx, true);
|
core_link_set_avmute(pipe_ctx, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dc->hwss.blank_stream(pipe_ctx);
|
||||||
#if defined(CONFIG_DRM_AMD_DC_HDCP)
|
#if defined(CONFIG_DRM_AMD_DC_HDCP)
|
||||||
update_psp_stream_config(pipe_ctx, true);
|
update_psp_stream_config(pipe_ctx, true);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
dc->hwss.blank_stream(pipe_ctx);
|
|
||||||
|
|
||||||
if (pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST)
|
if (pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST)
|
||||||
deallocate_mst_payload(pipe_ctx);
|
deallocate_mst_payload(pipe_ctx);
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,7 @@
|
||||||
#define DCN_PANEL_CNTL_REG_LIST()\
|
#define DCN_PANEL_CNTL_REG_LIST()\
|
||||||
DCN_PANEL_CNTL_SR(PWRSEQ_CNTL, LVTMA), \
|
DCN_PANEL_CNTL_SR(PWRSEQ_CNTL, LVTMA), \
|
||||||
DCN_PANEL_CNTL_SR(PWRSEQ_STATE, LVTMA), \
|
DCN_PANEL_CNTL_SR(PWRSEQ_STATE, LVTMA), \
|
||||||
DCE_PANEL_CNTL_SR(PWRSEQ_REF_DIV, LVTMA), \
|
DCN_PANEL_CNTL_SR(PWRSEQ_REF_DIV, LVTMA), \
|
||||||
SR(BL_PWM_CNTL), \
|
SR(BL_PWM_CNTL), \
|
||||||
SR(BL_PWM_CNTL2), \
|
SR(BL_PWM_CNTL2), \
|
||||||
SR(BL_PWM_PERIOD_CNTL), \
|
SR(BL_PWM_PERIOD_CNTL), \
|
||||||
|
|
|
@ -121,35 +121,35 @@ void enc1_update_generic_info_packet(
|
||||||
switch (packet_index) {
|
switch (packet_index) {
|
||||||
case 0:
|
case 0:
|
||||||
REG_UPDATE(AFMT_VBI_PACKET_CONTROL1,
|
REG_UPDATE(AFMT_VBI_PACKET_CONTROL1,
|
||||||
AFMT_GENERIC0_FRAME_UPDATE, 1);
|
AFMT_GENERIC0_IMMEDIATE_UPDATE, 1);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
REG_UPDATE(AFMT_VBI_PACKET_CONTROL1,
|
REG_UPDATE(AFMT_VBI_PACKET_CONTROL1,
|
||||||
AFMT_GENERIC1_FRAME_UPDATE, 1);
|
AFMT_GENERIC1_IMMEDIATE_UPDATE, 1);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
REG_UPDATE(AFMT_VBI_PACKET_CONTROL1,
|
REG_UPDATE(AFMT_VBI_PACKET_CONTROL1,
|
||||||
AFMT_GENERIC2_FRAME_UPDATE, 1);
|
AFMT_GENERIC2_IMMEDIATE_UPDATE, 1);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
REG_UPDATE(AFMT_VBI_PACKET_CONTROL1,
|
REG_UPDATE(AFMT_VBI_PACKET_CONTROL1,
|
||||||
AFMT_GENERIC3_FRAME_UPDATE, 1);
|
AFMT_GENERIC3_IMMEDIATE_UPDATE, 1);
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
REG_UPDATE(AFMT_VBI_PACKET_CONTROL1,
|
REG_UPDATE(AFMT_VBI_PACKET_CONTROL1,
|
||||||
AFMT_GENERIC4_FRAME_UPDATE, 1);
|
AFMT_GENERIC4_IMMEDIATE_UPDATE, 1);
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
REG_UPDATE(AFMT_VBI_PACKET_CONTROL1,
|
REG_UPDATE(AFMT_VBI_PACKET_CONTROL1,
|
||||||
AFMT_GENERIC5_FRAME_UPDATE, 1);
|
AFMT_GENERIC5_IMMEDIATE_UPDATE, 1);
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
REG_UPDATE(AFMT_VBI_PACKET_CONTROL1,
|
REG_UPDATE(AFMT_VBI_PACKET_CONTROL1,
|
||||||
AFMT_GENERIC6_FRAME_UPDATE, 1);
|
AFMT_GENERIC6_IMMEDIATE_UPDATE, 1);
|
||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
REG_UPDATE(AFMT_VBI_PACKET_CONTROL1,
|
REG_UPDATE(AFMT_VBI_PACKET_CONTROL1,
|
||||||
AFMT_GENERIC7_FRAME_UPDATE, 1);
|
AFMT_GENERIC7_IMMEDIATE_UPDATE, 1);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -281,7 +281,14 @@ struct dcn10_stream_enc_registers {
|
||||||
SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC2_FRAME_UPDATE, mask_sh),\
|
SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC2_FRAME_UPDATE, mask_sh),\
|
||||||
SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC3_FRAME_UPDATE, mask_sh),\
|
SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC3_FRAME_UPDATE, mask_sh),\
|
||||||
SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC4_FRAME_UPDATE, mask_sh),\
|
SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC4_FRAME_UPDATE, mask_sh),\
|
||||||
|
SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC0_IMMEDIATE_UPDATE, mask_sh),\
|
||||||
|
SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC1_IMMEDIATE_UPDATE, mask_sh),\
|
||||||
|
SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC2_IMMEDIATE_UPDATE, mask_sh),\
|
||||||
|
SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC3_IMMEDIATE_UPDATE, mask_sh),\
|
||||||
SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC4_IMMEDIATE_UPDATE, mask_sh),\
|
SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC4_IMMEDIATE_UPDATE, mask_sh),\
|
||||||
|
SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC5_IMMEDIATE_UPDATE, mask_sh),\
|
||||||
|
SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC6_IMMEDIATE_UPDATE, mask_sh),\
|
||||||
|
SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC7_IMMEDIATE_UPDATE, mask_sh),\
|
||||||
SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC5_FRAME_UPDATE, mask_sh),\
|
SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC5_FRAME_UPDATE, mask_sh),\
|
||||||
SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC6_FRAME_UPDATE, mask_sh),\
|
SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC6_FRAME_UPDATE, mask_sh),\
|
||||||
SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC7_FRAME_UPDATE, mask_sh),\
|
SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC7_FRAME_UPDATE, mask_sh),\
|
||||||
|
@ -345,7 +352,14 @@ struct dcn10_stream_enc_registers {
|
||||||
type AFMT_GENERIC2_FRAME_UPDATE;\
|
type AFMT_GENERIC2_FRAME_UPDATE;\
|
||||||
type AFMT_GENERIC3_FRAME_UPDATE;\
|
type AFMT_GENERIC3_FRAME_UPDATE;\
|
||||||
type AFMT_GENERIC4_FRAME_UPDATE;\
|
type AFMT_GENERIC4_FRAME_UPDATE;\
|
||||||
|
type AFMT_GENERIC0_IMMEDIATE_UPDATE;\
|
||||||
|
type AFMT_GENERIC1_IMMEDIATE_UPDATE;\
|
||||||
|
type AFMT_GENERIC2_IMMEDIATE_UPDATE;\
|
||||||
|
type AFMT_GENERIC3_IMMEDIATE_UPDATE;\
|
||||||
type AFMT_GENERIC4_IMMEDIATE_UPDATE;\
|
type AFMT_GENERIC4_IMMEDIATE_UPDATE;\
|
||||||
|
type AFMT_GENERIC5_IMMEDIATE_UPDATE;\
|
||||||
|
type AFMT_GENERIC6_IMMEDIATE_UPDATE;\
|
||||||
|
type AFMT_GENERIC7_IMMEDIATE_UPDATE;\
|
||||||
type AFMT_GENERIC5_FRAME_UPDATE;\
|
type AFMT_GENERIC5_FRAME_UPDATE;\
|
||||||
type AFMT_GENERIC6_FRAME_UPDATE;\
|
type AFMT_GENERIC6_FRAME_UPDATE;\
|
||||||
type AFMT_GENERIC7_FRAME_UPDATE;\
|
type AFMT_GENERIC7_FRAME_UPDATE;\
|
||||||
|
|
|
@ -3141,7 +3141,7 @@ static bool dcn20_validate_bandwidth_internal(struct dc *dc, struct dc_state *co
|
||||||
int vlevel = 0;
|
int vlevel = 0;
|
||||||
int pipe_split_from[MAX_PIPES];
|
int pipe_split_from[MAX_PIPES];
|
||||||
int pipe_cnt = 0;
|
int pipe_cnt = 0;
|
||||||
display_e2e_pipe_params_st *pipes = kzalloc(dc->res_pool->pipe_count * sizeof(display_e2e_pipe_params_st), GFP_KERNEL);
|
display_e2e_pipe_params_st *pipes = kzalloc(dc->res_pool->pipe_count * sizeof(display_e2e_pipe_params_st), GFP_ATOMIC);
|
||||||
DC_LOGGER_INIT(dc->ctx->logger);
|
DC_LOGGER_INIT(dc->ctx->logger);
|
||||||
|
|
||||||
BW_VAL_TRACE_COUNT();
|
BW_VAL_TRACE_COUNT();
|
||||||
|
|
|
@ -324,22 +324,44 @@ static void apply_below_the_range(struct core_freesync *core_freesync,
|
||||||
|
|
||||||
/* Choose number of frames to insert based on how close it
|
/* Choose number of frames to insert based on how close it
|
||||||
* can get to the mid point of the variable range.
|
* can get to the mid point of the variable range.
|
||||||
|
* - Delta for CEIL: delta_from_mid_point_in_us_1
|
||||||
|
* - Delta for FLOOR: delta_from_mid_point_in_us_2
|
||||||
*/
|
*/
|
||||||
if ((frame_time_in_us / mid_point_frames_ceil) > in_out_vrr->min_duration_in_us &&
|
if ((last_render_time_in_us / mid_point_frames_ceil) < in_out_vrr->min_duration_in_us) {
|
||||||
(delta_from_mid_point_in_us_1 < delta_from_mid_point_in_us_2 ||
|
/* Check for out of range.
|
||||||
mid_point_frames_floor < 2)) {
|
* If using CEIL produces a value that is out of range,
|
||||||
frames_to_insert = mid_point_frames_ceil;
|
* then we are forced to use FLOOR.
|
||||||
delta_from_mid_point_delta_in_us = delta_from_mid_point_in_us_2 -
|
*/
|
||||||
delta_from_mid_point_in_us_1;
|
frames_to_insert = mid_point_frames_floor;
|
||||||
} else {
|
} else if (mid_point_frames_floor < 2) {
|
||||||
|
/* Check if FLOOR would result in non-LFC. In this case
|
||||||
|
* choose to use CEIL
|
||||||
|
*/
|
||||||
|
frames_to_insert = mid_point_frames_ceil;
|
||||||
|
} else if (delta_from_mid_point_in_us_1 < delta_from_mid_point_in_us_2) {
|
||||||
|
/* If choosing CEIL results in a frame duration that is
|
||||||
|
* closer to the mid point of the range.
|
||||||
|
* Choose CEIL
|
||||||
|
*/
|
||||||
|
frames_to_insert = mid_point_frames_ceil;
|
||||||
|
} else {
|
||||||
|
/* If choosing FLOOR results in a frame duration that is
|
||||||
|
* closer to the mid point of the range.
|
||||||
|
* Choose FLOOR
|
||||||
|
*/
|
||||||
frames_to_insert = mid_point_frames_floor;
|
frames_to_insert = mid_point_frames_floor;
|
||||||
delta_from_mid_point_delta_in_us = delta_from_mid_point_in_us_1 -
|
|
||||||
delta_from_mid_point_in_us_2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Prefer current frame multiplier when BTR is enabled unless it drifts
|
/* Prefer current frame multiplier when BTR is enabled unless it drifts
|
||||||
* too far from the midpoint
|
* too far from the midpoint
|
||||||
*/
|
*/
|
||||||
|
if (delta_from_mid_point_in_us_1 < delta_from_mid_point_in_us_2) {
|
||||||
|
delta_from_mid_point_delta_in_us = delta_from_mid_point_in_us_2 -
|
||||||
|
delta_from_mid_point_in_us_1;
|
||||||
|
} else {
|
||||||
|
delta_from_mid_point_delta_in_us = delta_from_mid_point_in_us_1 -
|
||||||
|
delta_from_mid_point_in_us_2;
|
||||||
|
}
|
||||||
if (in_out_vrr->btr.frames_to_insert != 0 &&
|
if (in_out_vrr->btr.frames_to_insert != 0 &&
|
||||||
delta_from_mid_point_delta_in_us < BTR_DRIFT_MARGIN) {
|
delta_from_mid_point_delta_in_us < BTR_DRIFT_MARGIN) {
|
||||||
if (((last_render_time_in_us / in_out_vrr->btr.frames_to_insert) <
|
if (((last_render_time_in_us / in_out_vrr->btr.frames_to_insert) <
|
||||||
|
|
|
@ -979,10 +979,7 @@ static int vega20_disable_all_smu_features(struct pp_hwmgr *hwmgr)
|
||||||
{
|
{
|
||||||
struct vega20_hwmgr *data =
|
struct vega20_hwmgr *data =
|
||||||
(struct vega20_hwmgr *)(hwmgr->backend);
|
(struct vega20_hwmgr *)(hwmgr->backend);
|
||||||
uint64_t features_enabled;
|
int i, ret = 0;
|
||||||
int i;
|
|
||||||
bool enabled;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
PP_ASSERT_WITH_CODE((ret = smum_send_msg_to_smc(hwmgr,
|
PP_ASSERT_WITH_CODE((ret = smum_send_msg_to_smc(hwmgr,
|
||||||
PPSMC_MSG_DisableAllSmuFeatures,
|
PPSMC_MSG_DisableAllSmuFeatures,
|
||||||
|
@ -990,17 +987,8 @@ static int vega20_disable_all_smu_features(struct pp_hwmgr *hwmgr)
|
||||||
"[DisableAllSMUFeatures] Failed to disable all smu features!",
|
"[DisableAllSMUFeatures] Failed to disable all smu features!",
|
||||||
return ret);
|
return ret);
|
||||||
|
|
||||||
ret = vega20_get_enabled_smc_features(hwmgr, &features_enabled);
|
for (i = 0; i < GNLD_FEATURES_MAX; i++)
|
||||||
PP_ASSERT_WITH_CODE(!ret,
|
data->smu_features[i].enabled = 0;
|
||||||
"[DisableAllSMUFeatures] Failed to get enabled smc features!",
|
|
||||||
return ret);
|
|
||||||
|
|
||||||
for (i = 0; i < GNLD_FEATURES_MAX; i++) {
|
|
||||||
enabled = (features_enabled & data->smu_features[i].smu_feature_bitmap) ?
|
|
||||||
true : false;
|
|
||||||
data->smu_features[i].enabled = enabled;
|
|
||||||
data->smu_features[i].supported = enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1652,12 +1640,6 @@ static void vega20_init_powergate_state(struct pp_hwmgr *hwmgr)
|
||||||
|
|
||||||
data->uvd_power_gated = true;
|
data->uvd_power_gated = true;
|
||||||
data->vce_power_gated = true;
|
data->vce_power_gated = true;
|
||||||
|
|
||||||
if (data->smu_features[GNLD_DPM_UVD].enabled)
|
|
||||||
data->uvd_power_gated = false;
|
|
||||||
|
|
||||||
if (data->smu_features[GNLD_DPM_VCE].enabled)
|
|
||||||
data->vce_power_gated = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vega20_enable_dpm_tasks(struct pp_hwmgr *hwmgr)
|
static int vega20_enable_dpm_tasks(struct pp_hwmgr *hwmgr)
|
||||||
|
@ -3230,10 +3212,11 @@ static int vega20_get_ppfeature_status(struct pp_hwmgr *hwmgr, char *buf)
|
||||||
|
|
||||||
static int vega20_set_ppfeature_status(struct pp_hwmgr *hwmgr, uint64_t new_ppfeature_masks)
|
static int vega20_set_ppfeature_status(struct pp_hwmgr *hwmgr, uint64_t new_ppfeature_masks)
|
||||||
{
|
{
|
||||||
uint64_t features_enabled;
|
struct vega20_hwmgr *data =
|
||||||
uint64_t features_to_enable;
|
(struct vega20_hwmgr *)(hwmgr->backend);
|
||||||
uint64_t features_to_disable;
|
uint64_t features_enabled, features_to_enable, features_to_disable;
|
||||||
int ret = 0;
|
int i, ret = 0;
|
||||||
|
bool enabled;
|
||||||
|
|
||||||
if (new_ppfeature_masks >= (1ULL << GNLD_FEATURES_MAX))
|
if (new_ppfeature_masks >= (1ULL << GNLD_FEATURES_MAX))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -3262,6 +3245,17 @@ static int vega20_set_ppfeature_status(struct pp_hwmgr *hwmgr, uint64_t new_ppfe
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Update the cached feature enablement state */
|
||||||
|
ret = vega20_get_enabled_smc_features(hwmgr, &features_enabled);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
for (i = 0; i < GNLD_FEATURES_MAX; i++) {
|
||||||
|
enabled = (features_enabled & data->smu_features[i].smu_feature_bitmap) ?
|
||||||
|
true : false;
|
||||||
|
data->smu_features[i].enabled = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче