Skip to content

Commit afeff4c

Browse files
committed
drm/radeon: check if device is root before getting pci speed caps
Check if the device is root rather before attempting to see what speeds the pcie port supports. Fixes a crash with pci passthrough in a VM. Bug: https://bugs.freedesktop.org/show_bug.cgi?id=109366 Reviewed-by: Evan Quan <evan.quan@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent dc14eb1 commit afeff4c

File tree

2 files changed

+6
-4
lines changed

2 files changed

+6
-4
lines changed

drivers/gpu/drm/radeon/ci_dpm.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5676,7 +5676,7 @@ int ci_dpm_init(struct radeon_device *rdev)
56765676
u16 data_offset, size;
56775677
u8 frev, crev;
56785678
struct ci_power_info *pi;
5679-
enum pci_bus_speed speed_cap;
5679+
enum pci_bus_speed speed_cap = PCI_SPEED_UNKNOWN;
56805680
struct pci_dev *root = rdev->pdev->bus->self;
56815681
int ret;
56825682

@@ -5685,7 +5685,8 @@ int ci_dpm_init(struct radeon_device *rdev)
56855685
return -ENOMEM;
56865686
rdev->pm.dpm.priv = pi;
56875687

5688-
speed_cap = pcie_get_speed_cap(root);
5688+
if (!pci_is_root_bus(rdev->pdev->bus))
5689+
speed_cap = pcie_get_speed_cap(root);
56895690
if (speed_cap == PCI_SPEED_UNKNOWN) {
56905691
pi->sys_pcie_mask = 0;
56915692
} else {

drivers/gpu/drm/radeon/si_dpm.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6899,7 +6899,7 @@ int si_dpm_init(struct radeon_device *rdev)
68996899
struct ni_power_info *ni_pi;
69006900
struct si_power_info *si_pi;
69016901
struct atom_clock_dividers dividers;
6902-
enum pci_bus_speed speed_cap;
6902+
enum pci_bus_speed speed_cap = PCI_SPEED_UNKNOWN;
69036903
struct pci_dev *root = rdev->pdev->bus->self;
69046904
int ret;
69056905

@@ -6911,7 +6911,8 @@ int si_dpm_init(struct radeon_device *rdev)
69116911
eg_pi = &ni_pi->eg;
69126912
pi = &eg_pi->rv7xx;
69136913

6914-
speed_cap = pcie_get_speed_cap(root);
6914+
if (!pci_is_root_bus(rdev->pdev->bus))
6915+
speed_cap = pcie_get_speed_cap(root);
69156916
if (speed_cap == PCI_SPEED_UNKNOWN) {
69166917
si_pi->sys_pcie_mask = 0;
69176918
} else {

0 commit comments

Comments
 (0)