Skip to content

Commit 7189576

Browse files
ij-intelbjorn-helgaas
authored andcommitted
drm/radeon: Use RMW accessors for changing LNKCTL
Don't assume that only the driver would be accessing LNKCTL. ASPM policy changes can trigger write to LNKCTL outside of driver's control. And in the case of upstream bridge, the driver does not even own the device it's changing the registers for. Use RMW capability accessors which do proper locking to avoid losing concurrent updates to the register value. Suggested-by: Lukas Wunner <lukas@wunner.de> Fixes: 8a7cd27 ("drm/radeon/cik: add support for pcie gen1/2/3 switching") Fixes: b9d305d ("drm/radeon: implement pcie gen2/3 support for SI") Link: https://lore.kernel.org/r/20230717120503.15276-7-ilpo.jarvinen@linux.intel.com Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Acked-by: Alex Deucher <alexander.deucher@amd.com>
1 parent ce7d881 commit 7189576

2 files changed

Lines changed: 20 additions & 53 deletions

File tree

drivers/gpu/drm/radeon/cik.c

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9534,17 +9534,8 @@ static void cik_pcie_gen3_enable(struct radeon_device *rdev)
95349534
u16 bridge_cfg2, gpu_cfg2;
95359535
u32 max_lw, current_lw, tmp;
95369536

9537-
pcie_capability_read_word(root, PCI_EXP_LNKCTL,
9538-
&bridge_cfg);
9539-
pcie_capability_read_word(rdev->pdev, PCI_EXP_LNKCTL,
9540-
&gpu_cfg);
9541-
9542-
tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
9543-
pcie_capability_write_word(root, PCI_EXP_LNKCTL, tmp16);
9544-
9545-
tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
9546-
pcie_capability_write_word(rdev->pdev, PCI_EXP_LNKCTL,
9547-
tmp16);
9537+
pcie_capability_set_word(root, PCI_EXP_LNKCTL, PCI_EXP_LNKCTL_HAWD);
9538+
pcie_capability_set_word(rdev->pdev, PCI_EXP_LNKCTL, PCI_EXP_LNKCTL_HAWD);
95489539

95499540
tmp = RREG32_PCIE_PORT(PCIE_LC_STATUS1);
95509541
max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
@@ -9591,21 +9582,14 @@ static void cik_pcie_gen3_enable(struct radeon_device *rdev)
95919582
msleep(100);
95929583

95939584
/* linkctl */
9594-
pcie_capability_read_word(root, PCI_EXP_LNKCTL,
9595-
&tmp16);
9596-
tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
9597-
tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
9598-
pcie_capability_write_word(root, PCI_EXP_LNKCTL,
9599-
tmp16);
9600-
9601-
pcie_capability_read_word(rdev->pdev,
9602-
PCI_EXP_LNKCTL,
9603-
&tmp16);
9604-
tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
9605-
tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
9606-
pcie_capability_write_word(rdev->pdev,
9607-
PCI_EXP_LNKCTL,
9608-
tmp16);
9585+
pcie_capability_clear_and_set_word(root, PCI_EXP_LNKCTL,
9586+
PCI_EXP_LNKCTL_HAWD,
9587+
bridge_cfg &
9588+
PCI_EXP_LNKCTL_HAWD);
9589+
pcie_capability_clear_and_set_word(rdev->pdev, PCI_EXP_LNKCTL,
9590+
PCI_EXP_LNKCTL_HAWD,
9591+
gpu_cfg &
9592+
PCI_EXP_LNKCTL_HAWD);
96099593

96109594
/* linkctl2 */
96119595
pcie_capability_read_word(root, PCI_EXP_LNKCTL2,

drivers/gpu/drm/radeon/si.c

Lines changed: 10 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7131,17 +7131,8 @@ static void si_pcie_gen3_enable(struct radeon_device *rdev)
71317131
u16 bridge_cfg2, gpu_cfg2;
71327132
u32 max_lw, current_lw, tmp;
71337133

7134-
pcie_capability_read_word(root, PCI_EXP_LNKCTL,
7135-
&bridge_cfg);
7136-
pcie_capability_read_word(rdev->pdev, PCI_EXP_LNKCTL,
7137-
&gpu_cfg);
7138-
7139-
tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
7140-
pcie_capability_write_word(root, PCI_EXP_LNKCTL, tmp16);
7141-
7142-
tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
7143-
pcie_capability_write_word(rdev->pdev, PCI_EXP_LNKCTL,
7144-
tmp16);
7134+
pcie_capability_set_word(root, PCI_EXP_LNKCTL, PCI_EXP_LNKCTL_HAWD);
7135+
pcie_capability_set_word(rdev->pdev, PCI_EXP_LNKCTL, PCI_EXP_LNKCTL_HAWD);
71457136

71467137
tmp = RREG32_PCIE(PCIE_LC_STATUS1);
71477138
max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
@@ -7188,22 +7179,14 @@ static void si_pcie_gen3_enable(struct radeon_device *rdev)
71887179
msleep(100);
71897180

71907181
/* linkctl */
7191-
pcie_capability_read_word(root, PCI_EXP_LNKCTL,
7192-
&tmp16);
7193-
tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
7194-
tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
7195-
pcie_capability_write_word(root,
7196-
PCI_EXP_LNKCTL,
7197-
tmp16);
7198-
7199-
pcie_capability_read_word(rdev->pdev,
7200-
PCI_EXP_LNKCTL,
7201-
&tmp16);
7202-
tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
7203-
tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
7204-
pcie_capability_write_word(rdev->pdev,
7205-
PCI_EXP_LNKCTL,
7206-
tmp16);
7182+
pcie_capability_clear_and_set_word(root, PCI_EXP_LNKCTL,
7183+
PCI_EXP_LNKCTL_HAWD,
7184+
bridge_cfg &
7185+
PCI_EXP_LNKCTL_HAWD);
7186+
pcie_capability_clear_and_set_word(rdev->pdev, PCI_EXP_LNKCTL,
7187+
PCI_EXP_LNKCTL_HAWD,
7188+
gpu_cfg &
7189+
PCI_EXP_LNKCTL_HAWD);
72077190

72087191
/* linkctl2 */
72097192
pcie_capability_read_word(root, PCI_EXP_LNKCTL2,

0 commit comments

Comments
 (0)