diff options
author | Dave Airlie <airlied@redhat.com> | 2019-02-10 23:04:05 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2019-02-10 23:04:20 -0500 |
commit | f4bc54b532a62d8bee421ca06adb6d1b3e7ffaa9 (patch) | |
tree | 3b835f9bed6bd236fa1a6d5d0add836f25ca8262 /drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |
parent | 5ea3998d56346975c2701df18fb5b6e3ab5c8d9e (diff) | |
parent | 0461221316ec21e0a535a35fba3feb6ba75706e6 (diff) |
Merge branch 'drm-next-5.1' of git://people.freedesktop.org/~agd5f/linux into drm-next
Updates for 5.1:
- GDS fixes
- Add AMDGPU_CHUNK_ID_SCHEDULED_DEPENDENCIES interface
- GPUVM fixes
- PCIE DPM switching fixes for vega20
- Vega10 uclk DPM regression fix
- DC Freesync fixes
- DC ABM fixes
- Various DC cleanups
Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Alex Deucher <alexdeucher@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190208210214.27666-1-alexander.deucher@amd.com
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_device.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 58 |
1 files changed, 46 insertions, 12 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 384272603b21..4f8fb4ecde34 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |||
@@ -3618,6 +3618,38 @@ retry: /* Rest of adevs pre asic reset from XGMI hive. */ | |||
3618 | return r; | 3618 | return r; |
3619 | } | 3619 | } |
3620 | 3620 | ||
3621 | static void amdgpu_device_get_min_pci_speed_width(struct amdgpu_device *adev, | ||
3622 | enum pci_bus_speed *speed, | ||
3623 | enum pcie_link_width *width) | ||
3624 | { | ||
3625 | struct pci_dev *pdev = adev->pdev; | ||
3626 | enum pci_bus_speed cur_speed; | ||
3627 | enum pcie_link_width cur_width; | ||
3628 | |||
3629 | *speed = PCI_SPEED_UNKNOWN; | ||
3630 | *width = PCIE_LNK_WIDTH_UNKNOWN; | ||
3631 | |||
3632 | while (pdev) { | ||
3633 | cur_speed = pcie_get_speed_cap(pdev); | ||
3634 | cur_width = pcie_get_width_cap(pdev); | ||
3635 | |||
3636 | if (cur_speed != PCI_SPEED_UNKNOWN) { | ||
3637 | if (*speed == PCI_SPEED_UNKNOWN) | ||
3638 | *speed = cur_speed; | ||
3639 | else if (cur_speed < *speed) | ||
3640 | *speed = cur_speed; | ||
3641 | } | ||
3642 | |||
3643 | if (cur_width != PCIE_LNK_WIDTH_UNKNOWN) { | ||
3644 | if (*width == PCIE_LNK_WIDTH_UNKNOWN) | ||
3645 | *width = cur_width; | ||
3646 | else if (cur_width < *width) | ||
3647 | *width = cur_width; | ||
3648 | } | ||
3649 | pdev = pci_upstream_bridge(pdev); | ||
3650 | } | ||
3651 | } | ||
3652 | |||
3621 | /** | 3653 | /** |
3622 | * amdgpu_device_get_pcie_info - fence pcie info about the PCIE slot | 3654 | * amdgpu_device_get_pcie_info - fence pcie info about the PCIE slot |
3623 | * | 3655 | * |
@@ -3630,8 +3662,8 @@ retry: /* Rest of adevs pre asic reset from XGMI hive. */ | |||
3630 | static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev) | 3662 | static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev) |
3631 | { | 3663 | { |
3632 | struct pci_dev *pdev; | 3664 | struct pci_dev *pdev; |
3633 | enum pci_bus_speed speed_cap; | 3665 | enum pci_bus_speed speed_cap, platform_speed_cap; |
3634 | enum pcie_link_width link_width; | 3666 | enum pcie_link_width platform_link_width; |
3635 | 3667 | ||
3636 | if (amdgpu_pcie_gen_cap) | 3668 | if (amdgpu_pcie_gen_cap) |
3637 | adev->pm.pcie_gen_mask = amdgpu_pcie_gen_cap; | 3669 | adev->pm.pcie_gen_mask = amdgpu_pcie_gen_cap; |
@@ -3648,6 +3680,12 @@ static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev) | |||
3648 | return; | 3680 | return; |
3649 | } | 3681 | } |
3650 | 3682 | ||
3683 | if (adev->pm.pcie_gen_mask && adev->pm.pcie_mlw_mask) | ||
3684 | return; | ||
3685 | |||
3686 | amdgpu_device_get_min_pci_speed_width(adev, &platform_speed_cap, | ||
3687 | &platform_link_width); | ||
3688 | |||
3651 | if (adev->pm.pcie_gen_mask == 0) { | 3689 | if (adev->pm.pcie_gen_mask == 0) { |
3652 | /* asic caps */ | 3690 | /* asic caps */ |
3653 | pdev = adev->pdev; | 3691 | pdev = adev->pdev; |
@@ -3673,22 +3711,20 @@ static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev) | |||
3673 | adev->pm.pcie_gen_mask |= CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1; | 3711 | adev->pm.pcie_gen_mask |= CAIL_ASIC_PCIE_LINK_SPEED_SUPPORT_GEN1; |
3674 | } | 3712 | } |
3675 | /* platform caps */ | 3713 | /* platform caps */ |
3676 | pdev = adev->ddev->pdev->bus->self; | 3714 | if (platform_speed_cap == PCI_SPEED_UNKNOWN) { |
3677 | speed_cap = pcie_get_speed_cap(pdev); | ||
3678 | if (speed_cap == PCI_SPEED_UNKNOWN) { | ||
3679 | adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 | | 3715 | adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 | |
3680 | CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2); | 3716 | CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2); |
3681 | } else { | 3717 | } else { |
3682 | if (speed_cap == PCIE_SPEED_16_0GT) | 3718 | if (platform_speed_cap == PCIE_SPEED_16_0GT) |
3683 | adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 | | 3719 | adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 | |
3684 | CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 | | 3720 | CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 | |
3685 | CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3 | | 3721 | CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3 | |
3686 | CAIL_PCIE_LINK_SPEED_SUPPORT_GEN4); | 3722 | CAIL_PCIE_LINK_SPEED_SUPPORT_GEN4); |
3687 | else if (speed_cap == PCIE_SPEED_8_0GT) | 3723 | else if (platform_speed_cap == PCIE_SPEED_8_0GT) |
3688 | adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 | | 3724 | adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 | |
3689 | CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 | | 3725 | CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 | |
3690 | CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3); | 3726 | CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3); |
3691 | else if (speed_cap == PCIE_SPEED_5_0GT) | 3727 | else if (platform_speed_cap == PCIE_SPEED_5_0GT) |
3692 | adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 | | 3728 | adev->pm.pcie_gen_mask |= (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN1 | |
3693 | CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2); | 3729 | CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2); |
3694 | else | 3730 | else |
@@ -3697,12 +3733,10 @@ static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev) | |||
3697 | } | 3733 | } |
3698 | } | 3734 | } |
3699 | if (adev->pm.pcie_mlw_mask == 0) { | 3735 | if (adev->pm.pcie_mlw_mask == 0) { |
3700 | pdev = adev->ddev->pdev->bus->self; | 3736 | if (platform_link_width == PCIE_LNK_WIDTH_UNKNOWN) { |
3701 | link_width = pcie_get_width_cap(pdev); | ||
3702 | if (link_width == PCIE_LNK_WIDTH_UNKNOWN) { | ||
3703 | adev->pm.pcie_mlw_mask |= AMDGPU_DEFAULT_PCIE_MLW_MASK; | 3737 | adev->pm.pcie_mlw_mask |= AMDGPU_DEFAULT_PCIE_MLW_MASK; |
3704 | } else { | 3738 | } else { |
3705 | switch (link_width) { | 3739 | switch (platform_link_width) { |
3706 | case PCIE_LNK_X32: | 3740 | case PCIE_LNK_X32: |
3707 | adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 | | 3741 | adev->pm.pcie_mlw_mask = (CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 | |
3708 | CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 | | 3742 | CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 | |