Merge tag 'amd-drm-fixes-5.17-2022-02-23' of https://gitlab.freedesktop.org/agd5f/linux into drm-fixes
amd-drm-fixes-5.17-2022-02-23: amdgpu: - Display FP fix - PCO powergating fix - RDNA2 OEM SKU stability fixes - Display PSR fix - PCI ASPM fix - Display link encoder fix for TEST_COMMIT - Raven2 suspend/resume fix - Fix a regression in virtual display support - GPUVM eviction fix Signed-off-by: Dave Airlie <airlied@redhat.com> From: Alex Deucher <alexander.deucher@amd.com> Link: https://patchwork.freedesktop.org/patch/msgid/20220223214623.28823-1-alexander.deucher@amd.com
This commit is contained in:
Коммит
7c17b3d37f
|
@ -1141,7 +1141,7 @@ int amdgpu_display_framebuffer_init(struct drm_device *dev,
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (!dev->mode_config.allow_fb_modifiers) {
|
if (!dev->mode_config.allow_fb_modifiers && !adev->enable_virtual_display) {
|
||||||
drm_WARN_ONCE(dev, adev->family >= AMDGPU_FAMILY_AI,
|
drm_WARN_ONCE(dev, adev->family >= AMDGPU_FAMILY_AI,
|
||||||
"GFX9+ requires FB check based on format modifier\n");
|
"GFX9+ requires FB check based on format modifier\n");
|
||||||
ret = check_tiling_flags_gfx6(rfb);
|
ret = check_tiling_flags_gfx6(rfb);
|
||||||
|
|
|
@ -2011,6 +2011,9 @@ static int amdgpu_pci_probe(struct pci_dev *pdev,
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (amdgpu_aspm == -1 && !pcie_aspm_enabled(pdev))
|
||||||
|
amdgpu_aspm = 0;
|
||||||
|
|
||||||
if (amdgpu_virtual_display ||
|
if (amdgpu_virtual_display ||
|
||||||
amdgpu_device_asic_has_dc_support(flags & AMD_ASIC_MASK))
|
amdgpu_device_asic_has_dc_support(flags & AMD_ASIC_MASK))
|
||||||
supports_atomic = true;
|
supports_atomic = true;
|
||||||
|
|
|
@ -391,7 +391,6 @@ static struct drm_plane *amdgpu_vkms_plane_init(struct drm_device *dev,
|
||||||
int index)
|
int index)
|
||||||
{
|
{
|
||||||
struct drm_plane *plane;
|
struct drm_plane *plane;
|
||||||
uint64_t modifiers[] = {DRM_FORMAT_MOD_LINEAR, DRM_FORMAT_MOD_INVALID};
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
plane = kzalloc(sizeof(*plane), GFP_KERNEL);
|
plane = kzalloc(sizeof(*plane), GFP_KERNEL);
|
||||||
|
@ -402,7 +401,7 @@ static struct drm_plane *amdgpu_vkms_plane_init(struct drm_device *dev,
|
||||||
&amdgpu_vkms_plane_funcs,
|
&amdgpu_vkms_plane_funcs,
|
||||||
amdgpu_vkms_formats,
|
amdgpu_vkms_formats,
|
||||||
ARRAY_SIZE(amdgpu_vkms_formats),
|
ARRAY_SIZE(amdgpu_vkms_formats),
|
||||||
modifiers, type, NULL);
|
NULL, type, NULL);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
kfree(plane);
|
kfree(plane);
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
|
|
|
@ -768,11 +768,16 @@ int amdgpu_vm_validate_pt_bos(struct amdgpu_device *adev, struct amdgpu_vm *vm,
|
||||||
* Check if all VM PDs/PTs are ready for updates
|
* Check if all VM PDs/PTs are ready for updates
|
||||||
*
|
*
|
||||||
* Returns:
|
* Returns:
|
||||||
* True if eviction list is empty.
|
* True if VM is not evicting.
|
||||||
*/
|
*/
|
||||||
bool amdgpu_vm_ready(struct amdgpu_vm *vm)
|
bool amdgpu_vm_ready(struct amdgpu_vm *vm)
|
||||||
{
|
{
|
||||||
return list_empty(&vm->evicted);
|
bool ret;
|
||||||
|
|
||||||
|
amdgpu_vm_eviction_lock(vm);
|
||||||
|
ret = !vm->evicting;
|
||||||
|
amdgpu_vm_eviction_unlock(vm);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -619,8 +619,8 @@ soc15_asic_reset_method(struct amdgpu_device *adev)
|
||||||
static int soc15_asic_reset(struct amdgpu_device *adev)
|
static int soc15_asic_reset(struct amdgpu_device *adev)
|
||||||
{
|
{
|
||||||
/* original raven doesn't have full asic reset */
|
/* original raven doesn't have full asic reset */
|
||||||
if ((adev->apu_flags & AMD_APU_IS_RAVEN) &&
|
if ((adev->apu_flags & AMD_APU_IS_RAVEN) ||
|
||||||
!(adev->apu_flags & AMD_APU_IS_RAVEN2))
|
(adev->apu_flags & AMD_APU_IS_RAVEN2))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
switch (soc15_asic_reset_method(adev)) {
|
switch (soc15_asic_reset_method(adev)) {
|
||||||
|
@ -1114,8 +1114,11 @@ static int soc15_common_early_init(void *handle)
|
||||||
AMD_CG_SUPPORT_SDMA_LS |
|
AMD_CG_SUPPORT_SDMA_LS |
|
||||||
AMD_CG_SUPPORT_VCN_MGCG;
|
AMD_CG_SUPPORT_VCN_MGCG;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MMHUB PG needs to be disabled for Picasso for
|
||||||
|
* stability reasons.
|
||||||
|
*/
|
||||||
adev->pg_flags = AMD_PG_SUPPORT_SDMA |
|
adev->pg_flags = AMD_PG_SUPPORT_SDMA |
|
||||||
AMD_PG_SUPPORT_MMHUB |
|
|
||||||
AMD_PG_SUPPORT_VCN;
|
AMD_PG_SUPPORT_VCN;
|
||||||
} else {
|
} else {
|
||||||
adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
|
adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
|
||||||
|
|
|
@ -4256,6 +4256,9 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Disable vblank IRQs aggressively for power-saving. */
|
||||||
|
adev_to_drm(adev)->vblank_disable_immediate = true;
|
||||||
|
|
||||||
/* loops over all connectors on the board */
|
/* loops over all connectors on the board */
|
||||||
for (i = 0; i < link_cnt; i++) {
|
for (i = 0; i < link_cnt; i++) {
|
||||||
struct dc_link *link = NULL;
|
struct dc_link *link = NULL;
|
||||||
|
@ -4301,19 +4304,17 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
|
||||||
update_connector_ext_caps(aconnector);
|
update_connector_ext_caps(aconnector);
|
||||||
if (psr_feature_enabled)
|
if (psr_feature_enabled)
|
||||||
amdgpu_dm_set_psr_caps(link);
|
amdgpu_dm_set_psr_caps(link);
|
||||||
|
|
||||||
|
/* TODO: Fix vblank control helpers to delay PSR entry to allow this when
|
||||||
|
* PSR is also supported.
|
||||||
|
*/
|
||||||
|
if (link->psr_settings.psr_feature_enabled)
|
||||||
|
adev_to_drm(adev)->vblank_disable_immediate = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Disable vblank IRQs aggressively for power-saving.
|
|
||||||
*
|
|
||||||
* TODO: Fix vblank control helpers to delay PSR entry to allow this when PSR
|
|
||||||
* is also supported.
|
|
||||||
*/
|
|
||||||
adev_to_drm(adev)->vblank_disable_immediate = !psr_feature_enabled;
|
|
||||||
|
|
||||||
/* Software is initialized. Now we can register interrupt handlers. */
|
/* Software is initialized. Now we can register interrupt handlers. */
|
||||||
switch (adev->asic_type) {
|
switch (adev->asic_type) {
|
||||||
#if defined(CONFIG_DRM_AMD_DC_SI)
|
#if defined(CONFIG_DRM_AMD_DC_SI)
|
||||||
|
|
|
@ -473,8 +473,10 @@ static void dcn3_get_memclk_states_from_smu(struct clk_mgr *clk_mgr_base)
|
||||||
clk_mgr_base->bw_params->dc_mode_softmax_memclk = dcn30_smu_get_dc_mode_max_dpm_freq(clk_mgr, PPCLK_UCLK);
|
clk_mgr_base->bw_params->dc_mode_softmax_memclk = dcn30_smu_get_dc_mode_max_dpm_freq(clk_mgr, PPCLK_UCLK);
|
||||||
|
|
||||||
/* Refresh bounding box */
|
/* Refresh bounding box */
|
||||||
|
DC_FP_START();
|
||||||
clk_mgr_base->ctx->dc->res_pool->funcs->update_bw_bounding_box(
|
clk_mgr_base->ctx->dc->res_pool->funcs->update_bw_bounding_box(
|
||||||
clk_mgr->base.ctx->dc, clk_mgr_base->bw_params);
|
clk_mgr->base.ctx->dc, clk_mgr_base->bw_params);
|
||||||
|
DC_FP_END();
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool dcn3_is_smu_present(struct clk_mgr *clk_mgr_base)
|
static bool dcn3_is_smu_present(struct clk_mgr *clk_mgr_base)
|
||||||
|
|
|
@ -985,10 +985,13 @@ static bool dc_construct(struct dc *dc,
|
||||||
goto fail;
|
goto fail;
|
||||||
#ifdef CONFIG_DRM_AMD_DC_DCN
|
#ifdef CONFIG_DRM_AMD_DC_DCN
|
||||||
dc->clk_mgr->force_smu_not_present = init_params->force_smu_not_present;
|
dc->clk_mgr->force_smu_not_present = init_params->force_smu_not_present;
|
||||||
#endif
|
|
||||||
|
|
||||||
if (dc->res_pool->funcs->update_bw_bounding_box)
|
if (dc->res_pool->funcs->update_bw_bounding_box) {
|
||||||
|
DC_FP_START();
|
||||||
dc->res_pool->funcs->update_bw_bounding_box(dc, dc->clk_mgr->bw_params);
|
dc->res_pool->funcs->update_bw_bounding_box(dc, dc->clk_mgr->bw_params);
|
||||||
|
DC_FP_END();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Creation of current_state must occur after dc->dml
|
/* Creation of current_state must occur after dc->dml
|
||||||
* is initialized in dc_create_resource_pool because
|
* is initialized in dc_create_resource_pool because
|
||||||
|
|
|
@ -1964,10 +1964,6 @@ enum dc_status dc_remove_stream_from_ctx(
|
||||||
dc->res_pool,
|
dc->res_pool,
|
||||||
del_pipe->stream_res.stream_enc,
|
del_pipe->stream_res.stream_enc,
|
||||||
false);
|
false);
|
||||||
/* Release link encoder from stream in new dc_state. */
|
|
||||||
if (dc->res_pool->funcs->link_enc_unassign)
|
|
||||||
dc->res_pool->funcs->link_enc_unassign(new_ctx, del_pipe->stream);
|
|
||||||
|
|
||||||
#if defined(CONFIG_DRM_AMD_DC_DCN)
|
#if defined(CONFIG_DRM_AMD_DC_DCN)
|
||||||
if (is_dp_128b_132b_signal(del_pipe)) {
|
if (is_dp_128b_132b_signal(del_pipe)) {
|
||||||
update_hpo_dp_stream_engine_usage(
|
update_hpo_dp_stream_engine_usage(
|
||||||
|
|
|
@ -421,6 +421,36 @@ static int sienna_cichlid_store_powerplay_table(struct smu_context *smu)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int sienna_cichlid_patch_pptable_quirk(struct smu_context *smu)
|
||||||
|
{
|
||||||
|
struct amdgpu_device *adev = smu->adev;
|
||||||
|
uint32_t *board_reserved;
|
||||||
|
uint16_t *freq_table_gfx;
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
/* Fix some OEM SKU specific stability issues */
|
||||||
|
GET_PPTABLE_MEMBER(BoardReserved, &board_reserved);
|
||||||
|
if ((adev->pdev->device == 0x73DF) &&
|
||||||
|
(adev->pdev->revision == 0XC3) &&
|
||||||
|
(adev->pdev->subsystem_device == 0x16C2) &&
|
||||||
|
(adev->pdev->subsystem_vendor == 0x1043))
|
||||||
|
board_reserved[0] = 1387;
|
||||||
|
|
||||||
|
GET_PPTABLE_MEMBER(FreqTableGfx, &freq_table_gfx);
|
||||||
|
if ((adev->pdev->device == 0x73DF) &&
|
||||||
|
(adev->pdev->revision == 0XC3) &&
|
||||||
|
((adev->pdev->subsystem_device == 0x16C2) ||
|
||||||
|
(adev->pdev->subsystem_device == 0x133C)) &&
|
||||||
|
(adev->pdev->subsystem_vendor == 0x1043)) {
|
||||||
|
for (i = 0; i < NUM_GFXCLK_DPM_LEVELS; i++) {
|
||||||
|
if (freq_table_gfx[i] > 2500)
|
||||||
|
freq_table_gfx[i] = 2500;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int sienna_cichlid_setup_pptable(struct smu_context *smu)
|
static int sienna_cichlid_setup_pptable(struct smu_context *smu)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
@ -441,7 +471,7 @@ static int sienna_cichlid_setup_pptable(struct smu_context *smu)
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
return ret;
|
return sienna_cichlid_patch_pptable_quirk(smu);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sienna_cichlid_tables_init(struct smu_context *smu)
|
static int sienna_cichlid_tables_init(struct smu_context *smu)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче