Skip to content

Commit d054ac1

Browse files
alexdeucherairlied
authored andcommitted
drm/radeon/kms: make sure pci max read request size is valid on evergreen+ (v2)
If the bios or OS sets the pci max read request size to 0 or an invalid value (6,7), it can result in a hang or slowdown. Check and set it to something sane if it's invalid. Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=42162 v2: use pci reg defines from include/linux/pci_regs.h Signed-off-by: Alex Deucher <[email protected]> Cc: [email protected] Reviewed-by: Michel Dänzer <[email protected]> Signed-off-by: Dave Airlie <[email protected]>
1 parent 9adceaa commit d054ac1

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

drivers/gpu/drm/radeon/evergreen.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,31 @@ static void evergreen_gpu_init(struct radeon_device *rdev);
4141
void evergreen_fini(struct radeon_device *rdev);
4242
static void evergreen_pcie_gen2_enable(struct radeon_device *rdev);
4343

44+
void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev)
45+
{
46+
u16 ctl, v;
47+
int cap, err;
48+
49+
cap = pci_pcie_cap(rdev->pdev);
50+
if (!cap)
51+
return;
52+
53+
err = pci_read_config_word(rdev->pdev, cap + PCI_EXP_DEVCTL, &ctl);
54+
if (err)
55+
return;
56+
57+
v = (ctl & PCI_EXP_DEVCTL_READRQ) >> 12;
58+
59+
/* if bios or OS sets MAX_READ_REQUEST_SIZE to an invalid value, fix it
60+
* to avoid hangs or perfomance issues
61+
*/
62+
if ((v == 0) || (v == 6) || (v == 7)) {
63+
ctl &= ~PCI_EXP_DEVCTL_READRQ;
64+
ctl |= (2 << 12);
65+
pci_write_config_word(rdev->pdev, cap + PCI_EXP_DEVCTL, ctl);
66+
}
67+
}
68+
4469
void evergreen_pre_page_flip(struct radeon_device *rdev, int crtc)
4570
{
4671
/* enable the pflip int */
@@ -1863,6 +1888,8 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
18631888

18641889
WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
18651890

1891+
evergreen_fix_pci_max_read_req_size(rdev);
1892+
18661893
cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & ~2;
18671894

18681895
cc_gc_shader_pipe_config |=

drivers/gpu/drm/radeon/ni.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ extern int evergreen_mc_wait_for_idle(struct radeon_device *rdev);
3939
extern void evergreen_mc_program(struct radeon_device *rdev);
4040
extern void evergreen_irq_suspend(struct radeon_device *rdev);
4141
extern int evergreen_mc_init(struct radeon_device *rdev);
42+
extern void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev);
4243

4344
#define EVERGREEN_PFP_UCODE_SIZE 1120
4445
#define EVERGREEN_PM4_UCODE_SIZE 1376
@@ -669,6 +670,8 @@ static void cayman_gpu_init(struct radeon_device *rdev)
669670

670671
WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
671672

673+
evergreen_fix_pci_max_read_req_size(rdev);
674+
672675
mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
673676
mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
674677

0 commit comments

Comments
 (0)