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;
|
||||
}
|
||||
|
||||
/* 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,
|
||||
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,
|
||||
struct drm_gem_object *obj)
|
||||
{
|
||||
struct amdgpu_device *adev = drm_to_adev(dev);
|
||||
int ret, i;
|
||||
|
||||
/*
|
||||
@ -1122,6 +1145,14 @@ int amdgpu_display_framebuffer_init(struct drm_device *dev,
|
||||
if (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 &&
|
||||
!(rfb->base.flags & DRM_MODE_FB_MODIFIERS)) {
|
||||
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 */
|
||||
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,
|
||||
* 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;
|
||||
|
||||
gmc_v10_0_gart_disable(adev);
|
||||
|
||||
if (amdgpu_sriov_vf(adev)) {
|
||||
/* full access mode, so don't touch any GMC register */
|
||||
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.vm_fault, 0);
|
||||
gmc_v10_0_gart_disable(adev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1794,6 +1794,8 @@ static int gmc_v9_0_hw_fini(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
gmc_v9_0_gart_disable(adev);
|
||||
|
||||
if (amdgpu_sriov_vf(adev)) {
|
||||
/* full access mode, so don't touch any GMC register */
|
||||
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.vm_fault, 0);
|
||||
gmc_v9_0_gart_disable(adev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -868,6 +868,12 @@ static int sdma_v5_2_start(struct amdgpu_device *adev)
|
||||
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);
|
||||
/* unhalt the MEs */
|
||||
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 */
|
||||
r = sdma_v5_2_gfx_resume(adev);
|
||||
if (adev->in_s0ix)
|
||||
amdgpu_gfx_off_ctrl(adev, true);
|
||||
if (r)
|
||||
return r;
|
||||
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.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;
|
||||
/* 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;
|
||||
|
||||
params.set = 0;
|
||||
params.backlight_ramping_override = false;
|
||||
params.backlight_ramping_start = 0xCCCC;
|
||||
params.backlight_ramping_reduction = 0xCCCCCCCC;
|
||||
params.backlight_lut_array_size = 16;
|
||||
|
@ -1826,14 +1826,13 @@ bool perform_link_training_with_retries(
|
||||
if (panel_mode == DP_PANEL_MODE_EDP) {
|
||||
struct cp_psp *cp_psp = &stream->ctx->cp_psp;
|
||||
|
||||
if (cp_psp && cp_psp->funcs.enable_assr) {
|
||||
if (!cp_psp->funcs.enable_assr(cp_psp->handle, link)) {
|
||||
/* since eDP implies ASSR on, change panel
|
||||
* mode to disable ASSR
|
||||
if (cp_psp && cp_psp->funcs.enable_assr)
|
||||
/* ASSR is bound to fail with unsigned PSP
|
||||
* verstage used during devlopment phase.
|
||||
* 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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user