Merge tag 'amd-drm-fixes-5.15-2021-09-29' of https://gitlab.freedesktop.org/agd5f/linux into drm-fixes
amd-drm-fixes-5.15-2021-09-29: amdgpu: - gart pin count fix - eDP flicker fix - GFX9 MQD fix - Display fixes - Tiling flags fix for pre-GFX9 - SDMA resume fix for S0ix Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> From: Alex Deucher <alexander.deucher@amd.com> Link: https://patchwork.freedesktop.org/patch/msgid/20210930023013.5207-1-alexander.deucher@amd.com
This commit is contained in:
commit
3ff43f9df8
@ -837,6 +837,28 @@ static int convert_tiling_flags_to_modifier(struct amdgpu_framebuffer *afb)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Mirrors the is_displayable check in radeonsi's gfx6_compute_surface */
|
||||||
|
static int check_tiling_flags_gfx6(struct amdgpu_framebuffer *afb)
|
||||||
|
{
|
||||||
|
u64 micro_tile_mode;
|
||||||
|
|
||||||
|
/* Zero swizzle mode means linear */
|
||||||
|
if (AMDGPU_TILING_GET(afb->tiling_flags, SWIZZLE_MODE) == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
micro_tile_mode = AMDGPU_TILING_GET(afb->tiling_flags, MICRO_TILE_MODE);
|
||||||
|
switch (micro_tile_mode) {
|
||||||
|
case 0: /* DISPLAY */
|
||||||
|
case 3: /* RENDER */
|
||||||
|
return 0;
|
||||||
|
default:
|
||||||
|
drm_dbg_kms(afb->base.dev,
|
||||||
|
"Micro tile mode %llu not supported for scanout\n",
|
||||||
|
micro_tile_mode);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void get_block_dimensions(unsigned int block_log2, unsigned int cpp,
|
static void get_block_dimensions(unsigned int block_log2, unsigned int cpp,
|
||||||
unsigned int *width, unsigned int *height)
|
unsigned int *width, unsigned int *height)
|
||||||
{
|
{
|
||||||
@ -1103,6 +1125,7 @@ int amdgpu_display_framebuffer_init(struct drm_device *dev,
|
|||||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||||
struct drm_gem_object *obj)
|
struct drm_gem_object *obj)
|
||||||
{
|
{
|
||||||
|
struct amdgpu_device *adev = drm_to_adev(dev);
|
||||||
int ret, i;
|
int ret, i;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1122,6 +1145,14 @@ int amdgpu_display_framebuffer_init(struct drm_device *dev,
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
if (!dev->mode_config.allow_fb_modifiers) {
|
||||||
|
drm_WARN_ONCE(dev, adev->family >= AMDGPU_FAMILY_AI,
|
||||||
|
"GFX9+ requires FB check based on format modifier\n");
|
||||||
|
ret = check_tiling_flags_gfx6(rfb);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
if (dev->mode_config.allow_fb_modifiers &&
|
if (dev->mode_config.allow_fb_modifiers &&
|
||||||
!(rfb->base.flags & DRM_MODE_FB_MODIFIERS)) {
|
!(rfb->base.flags & DRM_MODE_FB_MODIFIERS)) {
|
||||||
ret = convert_tiling_flags_to_modifier(rfb);
|
ret = convert_tiling_flags_to_modifier(rfb);
|
||||||
|
@ -3599,7 +3599,7 @@ static int gfx_v9_0_mqd_init(struct amdgpu_ring *ring)
|
|||||||
|
|
||||||
/* set static priority for a queue/ring */
|
/* set static priority for a queue/ring */
|
||||||
gfx_v9_0_mqd_set_priority(ring, mqd);
|
gfx_v9_0_mqd_set_priority(ring, mqd);
|
||||||
mqd->cp_hqd_quantum = RREG32(mmCP_HQD_QUANTUM);
|
mqd->cp_hqd_quantum = RREG32_SOC15(GC, 0, mmCP_HQD_QUANTUM);
|
||||||
|
|
||||||
/* map_queues packet doesn't need activate the queue,
|
/* map_queues packet doesn't need activate the queue,
|
||||||
* so only kiq need set this field.
|
* so only kiq need set this field.
|
||||||
|
@ -1098,6 +1098,8 @@ static int gmc_v10_0_hw_fini(void *handle)
|
|||||||
{
|
{
|
||||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||||
|
|
||||||
|
gmc_v10_0_gart_disable(adev);
|
||||||
|
|
||||||
if (amdgpu_sriov_vf(adev)) {
|
if (amdgpu_sriov_vf(adev)) {
|
||||||
/* full access mode, so don't touch any GMC register */
|
/* full access mode, so don't touch any GMC register */
|
||||||
DRM_DEBUG("For SRIOV client, shouldn't do anything.\n");
|
DRM_DEBUG("For SRIOV client, shouldn't do anything.\n");
|
||||||
@ -1106,7 +1108,6 @@ static int gmc_v10_0_hw_fini(void *handle)
|
|||||||
|
|
||||||
amdgpu_irq_put(adev, &adev->gmc.ecc_irq, 0);
|
amdgpu_irq_put(adev, &adev->gmc.ecc_irq, 0);
|
||||||
amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0);
|
amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0);
|
||||||
gmc_v10_0_gart_disable(adev);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1794,6 +1794,8 @@ static int gmc_v9_0_hw_fini(void *handle)
|
|||||||
{
|
{
|
||||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||||
|
|
||||||
|
gmc_v9_0_gart_disable(adev);
|
||||||
|
|
||||||
if (amdgpu_sriov_vf(adev)) {
|
if (amdgpu_sriov_vf(adev)) {
|
||||||
/* full access mode, so don't touch any GMC register */
|
/* full access mode, so don't touch any GMC register */
|
||||||
DRM_DEBUG("For SRIOV client, shouldn't do anything.\n");
|
DRM_DEBUG("For SRIOV client, shouldn't do anything.\n");
|
||||||
@ -1802,7 +1804,6 @@ static int gmc_v9_0_hw_fini(void *handle)
|
|||||||
|
|
||||||
amdgpu_irq_put(adev, &adev->gmc.ecc_irq, 0);
|
amdgpu_irq_put(adev, &adev->gmc.ecc_irq, 0);
|
||||||
amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0);
|
amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0);
|
||||||
gmc_v9_0_gart_disable(adev);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -868,6 +868,12 @@ static int sdma_v5_2_start(struct amdgpu_device *adev)
|
|||||||
msleep(1000);
|
msleep(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* TODO: check whether can submit a doorbell request to raise
|
||||||
|
* a doorbell fence to exit gfxoff.
|
||||||
|
*/
|
||||||
|
if (adev->in_s0ix)
|
||||||
|
amdgpu_gfx_off_ctrl(adev, false);
|
||||||
|
|
||||||
sdma_v5_2_soft_reset(adev);
|
sdma_v5_2_soft_reset(adev);
|
||||||
/* unhalt the MEs */
|
/* unhalt the MEs */
|
||||||
sdma_v5_2_enable(adev, true);
|
sdma_v5_2_enable(adev, true);
|
||||||
@ -876,6 +882,8 @@ static int sdma_v5_2_start(struct amdgpu_device *adev)
|
|||||||
|
|
||||||
/* start the gfx rings and rlc compute queues */
|
/* start the gfx rings and rlc compute queues */
|
||||||
r = sdma_v5_2_gfx_resume(adev);
|
r = sdma_v5_2_gfx_resume(adev);
|
||||||
|
if (adev->in_s0ix)
|
||||||
|
amdgpu_gfx_off_ctrl(adev, true);
|
||||||
if (r)
|
if (r)
|
||||||
return r;
|
return r;
|
||||||
r = sdma_v5_2_rlc_resume(adev);
|
r = sdma_v5_2_rlc_resume(adev);
|
||||||
|
@ -1115,6 +1115,7 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
|
|||||||
|
|
||||||
init_data.asic_id.pci_revision_id = adev->pdev->revision;
|
init_data.asic_id.pci_revision_id = adev->pdev->revision;
|
||||||
init_data.asic_id.hw_internal_rev = adev->external_rev_id;
|
init_data.asic_id.hw_internal_rev = adev->external_rev_id;
|
||||||
|
init_data.asic_id.chip_id = adev->pdev->device;
|
||||||
|
|
||||||
init_data.asic_id.vram_width = adev->gmc.vram_width;
|
init_data.asic_id.vram_width = adev->gmc.vram_width;
|
||||||
/* TODO: initialize init_data.asic_id.vram_type here!!!! */
|
/* TODO: initialize init_data.asic_id.vram_type here!!!! */
|
||||||
@ -1719,6 +1720,7 @@ static int dm_late_init(void *handle)
|
|||||||
linear_lut[i] = 0xFFFF * i / 15;
|
linear_lut[i] = 0xFFFF * i / 15;
|
||||||
|
|
||||||
params.set = 0;
|
params.set = 0;
|
||||||
|
params.backlight_ramping_override = false;
|
||||||
params.backlight_ramping_start = 0xCCCC;
|
params.backlight_ramping_start = 0xCCCC;
|
||||||
params.backlight_ramping_reduction = 0xCCCCCCCC;
|
params.backlight_ramping_reduction = 0xCCCCCCCC;
|
||||||
params.backlight_lut_array_size = 16;
|
params.backlight_lut_array_size = 16;
|
||||||
|
@ -1826,14 +1826,13 @@ bool perform_link_training_with_retries(
|
|||||||
if (panel_mode == DP_PANEL_MODE_EDP) {
|
if (panel_mode == DP_PANEL_MODE_EDP) {
|
||||||
struct cp_psp *cp_psp = &stream->ctx->cp_psp;
|
struct cp_psp *cp_psp = &stream->ctx->cp_psp;
|
||||||
|
|
||||||
if (cp_psp && cp_psp->funcs.enable_assr) {
|
if (cp_psp && cp_psp->funcs.enable_assr)
|
||||||
if (!cp_psp->funcs.enable_assr(cp_psp->handle, link)) {
|
/* ASSR is bound to fail with unsigned PSP
|
||||||
/* since eDP implies ASSR on, change panel
|
* verstage used during devlopment phase.
|
||||||
* mode to disable ASSR
|
* Report and continue with eDP panel mode to
|
||||||
*/
|
* perform eDP link training with right settings
|
||||||
panel_mode = DP_PANEL_MODE_DEFAULT;
|
*/
|
||||||
}
|
cp_psp->funcs.enable_assr(cp_psp->handle, link);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user