Skip to content

Commit ce7d881

Browse files
ij-intelbjorn-helgaas
authored andcommitted
drm/amdgpu: 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: a2e73f5 ("drm/amdgpu: Add support for CIK parts") Fixes: 62a3755 ("drm/amdgpu: add si implementation v10") Link: https://lore.kernel.org/r/20230717120503.15276-6-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 e09060b commit ce7d881

2 files changed

Lines changed: 20 additions & 52 deletions

File tree

drivers/gpu/drm/amd/amdgpu/cik.c

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1574,17 +1574,8 @@ static void cik_pcie_gen3_enable(struct amdgpu_device *adev)
15741574
u16 bridge_cfg2, gpu_cfg2;
15751575
u32 max_lw, current_lw, tmp;
15761576

1577-
pcie_capability_read_word(root, PCI_EXP_LNKCTL,
1578-
&bridge_cfg);
1579-
pcie_capability_read_word(adev->pdev, PCI_EXP_LNKCTL,
1580-
&gpu_cfg);
1581-
1582-
tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
1583-
pcie_capability_write_word(root, PCI_EXP_LNKCTL, tmp16);
1584-
1585-
tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
1586-
pcie_capability_write_word(adev->pdev, PCI_EXP_LNKCTL,
1587-
tmp16);
1577+
pcie_capability_set_word(root, PCI_EXP_LNKCTL, PCI_EXP_LNKCTL_HAWD);
1578+
pcie_capability_set_word(adev->pdev, PCI_EXP_LNKCTL, PCI_EXP_LNKCTL_HAWD);
15881579

15891580
tmp = RREG32_PCIE(ixPCIE_LC_STATUS1);
15901581
max_lw = (tmp & PCIE_LC_STATUS1__LC_DETECTED_LINK_WIDTH_MASK) >>
@@ -1637,21 +1628,14 @@ static void cik_pcie_gen3_enable(struct amdgpu_device *adev)
16371628
msleep(100);
16381629

16391630
/* linkctl */
1640-
pcie_capability_read_word(root, PCI_EXP_LNKCTL,
1641-
&tmp16);
1642-
tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
1643-
tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
1644-
pcie_capability_write_word(root, PCI_EXP_LNKCTL,
1645-
tmp16);
1646-
1647-
pcie_capability_read_word(adev->pdev,
1648-
PCI_EXP_LNKCTL,
1649-
&tmp16);
1650-
tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
1651-
tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
1652-
pcie_capability_write_word(adev->pdev,
1653-
PCI_EXP_LNKCTL,
1654-
tmp16);
1631+
pcie_capability_clear_and_set_word(root, PCI_EXP_LNKCTL,
1632+
PCI_EXP_LNKCTL_HAWD,
1633+
bridge_cfg &
1634+
PCI_EXP_LNKCTL_HAWD);
1635+
pcie_capability_clear_and_set_word(adev->pdev, PCI_EXP_LNKCTL,
1636+
PCI_EXP_LNKCTL_HAWD,
1637+
gpu_cfg &
1638+
PCI_EXP_LNKCTL_HAWD);
16551639

16561640
/* linkctl2 */
16571641
pcie_capability_read_word(root, PCI_EXP_LNKCTL2,

drivers/gpu/drm/amd/amdgpu/si.c

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2276,17 +2276,8 @@ static void si_pcie_gen3_enable(struct amdgpu_device *adev)
22762276
u16 bridge_cfg2, gpu_cfg2;
22772277
u32 max_lw, current_lw, tmp;
22782278

2279-
pcie_capability_read_word(root, PCI_EXP_LNKCTL,
2280-
&bridge_cfg);
2281-
pcie_capability_read_word(adev->pdev, PCI_EXP_LNKCTL,
2282-
&gpu_cfg);
2283-
2284-
tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
2285-
pcie_capability_write_word(root, PCI_EXP_LNKCTL, tmp16);
2286-
2287-
tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
2288-
pcie_capability_write_word(adev->pdev, PCI_EXP_LNKCTL,
2289-
tmp16);
2279+
pcie_capability_set_word(root, PCI_EXP_LNKCTL, PCI_EXP_LNKCTL_HAWD);
2280+
pcie_capability_set_word(adev->pdev, PCI_EXP_LNKCTL, PCI_EXP_LNKCTL_HAWD);
22902281

22912282
tmp = RREG32_PCIE(PCIE_LC_STATUS1);
22922283
max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
@@ -2331,21 +2322,14 @@ static void si_pcie_gen3_enable(struct amdgpu_device *adev)
23312322

23322323
mdelay(100);
23332324

2334-
pcie_capability_read_word(root, PCI_EXP_LNKCTL,
2335-
&tmp16);
2336-
tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
2337-
tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
2338-
pcie_capability_write_word(root, PCI_EXP_LNKCTL,
2339-
tmp16);
2340-
2341-
pcie_capability_read_word(adev->pdev,
2342-
PCI_EXP_LNKCTL,
2343-
&tmp16);
2344-
tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
2345-
tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
2346-
pcie_capability_write_word(adev->pdev,
2347-
PCI_EXP_LNKCTL,
2348-
tmp16);
2325+
pcie_capability_clear_and_set_word(root, PCI_EXP_LNKCTL,
2326+
PCI_EXP_LNKCTL_HAWD,
2327+
bridge_cfg &
2328+
PCI_EXP_LNKCTL_HAWD);
2329+
pcie_capability_clear_and_set_word(adev->pdev, PCI_EXP_LNKCTL,
2330+
PCI_EXP_LNKCTL_HAWD,
2331+
gpu_cfg &
2332+
PCI_EXP_LNKCTL_HAWD);
23492333

23502334
pcie_capability_read_word(root, PCI_EXP_LNKCTL2,
23512335
&tmp16);

0 commit comments

Comments
 (0)