Commit b98c6299 authored by Alex Deucher's avatar Alex Deucher

drm/amdgpu: disentangle HG systems from vgaswitcheroo

There's no need to keep vgaswitcheroo around for HG
systems.  They don't use muxes and their power control
is handled via ACPI.
Reviewed-by: default avatarEvan Quan <evan.quan@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent b2aba43a
...@@ -1275,8 +1275,9 @@ void amdgpu_device_program_register_sequence(struct amdgpu_device *adev, ...@@ -1275,8 +1275,9 @@ void amdgpu_device_program_register_sequence(struct amdgpu_device *adev,
const u32 *registers, const u32 *registers,
const u32 array_size); const u32 array_size);
bool amdgpu_device_supports_atpx(struct drm_device *dev);
int amdgpu_device_mode1_reset(struct amdgpu_device *adev); int amdgpu_device_mode1_reset(struct amdgpu_device *adev);
bool amdgpu_device_supports_atpx(struct drm_device *dev);
bool amdgpu_device_supports_px(struct drm_device *dev);
bool amdgpu_device_supports_boco(struct drm_device *dev); bool amdgpu_device_supports_boco(struct drm_device *dev);
bool amdgpu_device_supports_baco(struct drm_device *dev); bool amdgpu_device_supports_baco(struct drm_device *dev);
bool amdgpu_device_is_peer_accessible(struct amdgpu_device *adev, bool amdgpu_device_is_peer_accessible(struct amdgpu_device *adev,
......
...@@ -212,18 +212,18 @@ static DEVICE_ATTR(serial_number, S_IRUGO, ...@@ -212,18 +212,18 @@ static DEVICE_ATTR(serial_number, S_IRUGO,
amdgpu_device_get_serial_number, NULL); amdgpu_device_get_serial_number, NULL);
/** /**
* amdgpu_device_supports_atpx - Is the device a dGPU with HG/PX power control * amdgpu_device_supports_px - Is the device a dGPU with ATPX power control
* *
* @dev: drm_device pointer * @dev: drm_device pointer
* *
* Returns true if the device is a dGPU with HG/PX power control, * Returns true if the device is a dGPU with ATPX power control,
* otherwise return false. * otherwise return false.
*/ */
bool amdgpu_device_supports_atpx(struct drm_device *dev) bool amdgpu_device_supports_px(struct drm_device *dev)
{ {
struct amdgpu_device *adev = drm_to_adev(dev); struct amdgpu_device *adev = drm_to_adev(dev);
if (adev->flags & AMD_IS_PX) if ((adev->flags & AMD_IS_PX) && !amdgpu_is_atpx_hybrid())
return true; return true;
return false; return false;
} }
...@@ -233,14 +233,15 @@ bool amdgpu_device_supports_atpx(struct drm_device *dev) ...@@ -233,14 +233,15 @@ bool amdgpu_device_supports_atpx(struct drm_device *dev)
* *
* @dev: drm_device pointer * @dev: drm_device pointer
* *
* Returns true if the device is a dGPU with HG/PX power control, * Returns true if the device is a dGPU with ACPI power control,
* otherwise return false. * otherwise return false.
*/ */
bool amdgpu_device_supports_boco(struct drm_device *dev) bool amdgpu_device_supports_boco(struct drm_device *dev)
{ {
struct amdgpu_device *adev = drm_to_adev(dev); struct amdgpu_device *adev = drm_to_adev(dev);
if (adev->has_pr3) if (adev->has_pr3 ||
((adev->flags & AMD_IS_PX) && amdgpu_is_atpx_hybrid()))
return true; return true;
return false; return false;
} }
...@@ -1420,7 +1421,7 @@ static void amdgpu_switcheroo_set_state(struct pci_dev *pdev, ...@@ -1420,7 +1421,7 @@ static void amdgpu_switcheroo_set_state(struct pci_dev *pdev,
struct drm_device *dev = pci_get_drvdata(pdev); struct drm_device *dev = pci_get_drvdata(pdev);
int r; int r;
if (amdgpu_device_supports_atpx(dev) && state == VGA_SWITCHEROO_OFF) if (amdgpu_device_supports_px(dev) && state == VGA_SWITCHEROO_OFF)
return; return;
if (state == VGA_SWITCHEROO_ON) { if (state == VGA_SWITCHEROO_ON) {
...@@ -3226,7 +3227,7 @@ int amdgpu_device_init(struct amdgpu_device *adev, ...@@ -3226,7 +3227,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
struct drm_device *ddev = adev_to_drm(adev); struct drm_device *ddev = adev_to_drm(adev);
struct pci_dev *pdev = adev->pdev; struct pci_dev *pdev = adev->pdev;
int r, i; int r, i;
bool atpx = false; bool px = false;
u32 max_MBps; u32 max_MBps;
adev->shutdown = false; adev->shutdown = false;
...@@ -3388,16 +3389,12 @@ int amdgpu_device_init(struct amdgpu_device *adev, ...@@ -3388,16 +3389,12 @@ int amdgpu_device_init(struct amdgpu_device *adev,
if ((adev->pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA) if ((adev->pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA)
vga_client_register(adev->pdev, adev, NULL, amdgpu_device_vga_set_decode); vga_client_register(adev->pdev, adev, NULL, amdgpu_device_vga_set_decode);
if (amdgpu_device_supports_atpx(ddev)) if (amdgpu_device_supports_px(ddev)) {
atpx = true; px = true;
if (amdgpu_has_atpx() &&
(amdgpu_is_atpx_hybrid() ||
amdgpu_has_atpx_dgpu_power_cntl()) &&
!pci_is_thunderbolt_attached(adev->pdev))
vga_switcheroo_register_client(adev->pdev, vga_switcheroo_register_client(adev->pdev,
&amdgpu_switcheroo_ops, atpx); &amdgpu_switcheroo_ops, px);
if (atpx)
vga_switcheroo_init_domain_pm_ops(adev->dev, &adev->vga_pm_domain); vga_switcheroo_init_domain_pm_ops(adev->dev, &adev->vga_pm_domain);
}
if (amdgpu_emu_mode == 1) { if (amdgpu_emu_mode == 1) {
/* post the asic on emulation mode */ /* post the asic on emulation mode */
...@@ -3604,7 +3601,7 @@ int amdgpu_device_init(struct amdgpu_device *adev, ...@@ -3604,7 +3601,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
failed: failed:
amdgpu_vf_error_trans_all(adev); amdgpu_vf_error_trans_all(adev);
if (atpx) if (px)
vga_switcheroo_fini_domain_pm_ops(adev->dev); vga_switcheroo_fini_domain_pm_ops(adev->dev);
failed_unmap: failed_unmap:
...@@ -3664,13 +3661,10 @@ void amdgpu_device_fini(struct amdgpu_device *adev) ...@@ -3664,13 +3661,10 @@ void amdgpu_device_fini(struct amdgpu_device *adev)
kfree(adev->bios); kfree(adev->bios);
adev->bios = NULL; adev->bios = NULL;
if (amdgpu_has_atpx() && if (amdgpu_device_supports_px(adev_to_drm(adev))) {
(amdgpu_is_atpx_hybrid() ||
amdgpu_has_atpx_dgpu_power_cntl()) &&
!pci_is_thunderbolt_attached(adev->pdev))
vga_switcheroo_unregister_client(adev->pdev); vga_switcheroo_unregister_client(adev->pdev);
if (amdgpu_device_supports_atpx(adev_to_drm(adev)))
vga_switcheroo_fini_domain_pm_ops(adev->dev); vga_switcheroo_fini_domain_pm_ops(adev->dev);
}
if ((adev->pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA) if ((adev->pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA)
vga_client_register(adev->pdev, NULL, NULL, NULL); vga_client_register(adev->pdev, NULL, NULL, NULL);
iounmap(adev->rmmio); iounmap(adev->rmmio);
......
...@@ -1411,9 +1411,7 @@ static int amdgpu_pmops_prepare(struct device *dev) ...@@ -1411,9 +1411,7 @@ static int amdgpu_pmops_prepare(struct device *dev)
/* Return a positive number here so /* Return a positive number here so
* DPM_FLAG_SMART_SUSPEND works properly * DPM_FLAG_SMART_SUSPEND works properly
*/ */
if ((amdgpu_device_supports_atpx(drm_dev) && if (amdgpu_device_supports_boco(drm_dev))
amdgpu_is_atpx_hybrid()) ||
amdgpu_device_supports_boco(drm_dev))
return pm_runtime_suspended(dev) && return pm_runtime_suspended(dev) &&
pm_suspend_via_firmware(); pm_suspend_via_firmware();
...@@ -1502,7 +1500,7 @@ static int amdgpu_pmops_runtime_suspend(struct device *dev) ...@@ -1502,7 +1500,7 @@ static int amdgpu_pmops_runtime_suspend(struct device *dev)
} }
adev->in_runpm = true; adev->in_runpm = true;
if (amdgpu_device_supports_atpx(drm_dev)) if (amdgpu_device_supports_px(drm_dev))
drm_dev->switch_power_state = DRM_SWITCH_POWER_CHANGING; drm_dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
ret = amdgpu_device_suspend(drm_dev, false); ret = amdgpu_device_suspend(drm_dev, false);
...@@ -1511,16 +1509,14 @@ static int amdgpu_pmops_runtime_suspend(struct device *dev) ...@@ -1511,16 +1509,14 @@ static int amdgpu_pmops_runtime_suspend(struct device *dev)
return ret; return ret;
} }
if (amdgpu_device_supports_atpx(drm_dev)) { if (amdgpu_device_supports_px(drm_dev)) {
/* Only need to handle PCI state in the driver for ATPX /* Only need to handle PCI state in the driver for ATPX
* PCI core handles it for _PR3. * PCI core handles it for _PR3.
*/ */
if (!amdgpu_is_atpx_hybrid()) {
amdgpu_device_cache_pci_state(pdev); amdgpu_device_cache_pci_state(pdev);
pci_disable_device(pdev); pci_disable_device(pdev);
pci_ignore_hotplug(pdev); pci_ignore_hotplug(pdev);
pci_set_power_state(pdev, PCI_D3cold); pci_set_power_state(pdev, PCI_D3cold);
}
drm_dev->switch_power_state = DRM_SWITCH_POWER_DYNAMIC_OFF; drm_dev->switch_power_state = DRM_SWITCH_POWER_DYNAMIC_OFF;
} else if (amdgpu_device_supports_baco(drm_dev)) { } else if (amdgpu_device_supports_baco(drm_dev)) {
amdgpu_device_baco_enter(drm_dev); amdgpu_device_baco_enter(drm_dev);
...@@ -1539,19 +1535,17 @@ static int amdgpu_pmops_runtime_resume(struct device *dev) ...@@ -1539,19 +1535,17 @@ static int amdgpu_pmops_runtime_resume(struct device *dev)
if (!adev->runpm) if (!adev->runpm)
return -EINVAL; return -EINVAL;
if (amdgpu_device_supports_atpx(drm_dev)) { if (amdgpu_device_supports_px(drm_dev)) {
drm_dev->switch_power_state = DRM_SWITCH_POWER_CHANGING; drm_dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
/* Only need to handle PCI state in the driver for ATPX /* Only need to handle PCI state in the driver for ATPX
* PCI core handles it for _PR3. * PCI core handles it for _PR3.
*/ */
if (!amdgpu_is_atpx_hybrid()) {
pci_set_power_state(pdev, PCI_D0); pci_set_power_state(pdev, PCI_D0);
amdgpu_device_load_pci_state(pdev); amdgpu_device_load_pci_state(pdev);
ret = pci_enable_device(pdev); ret = pci_enable_device(pdev);
if (ret) if (ret)
return ret; return ret;
}
pci_set_master(pdev); pci_set_master(pdev);
} else if (amdgpu_device_supports_boco(drm_dev)) { } else if (amdgpu_device_supports_boco(drm_dev)) {
/* Only need to handle PCI state in the driver for ATPX /* Only need to handle PCI state in the driver for ATPX
...@@ -1562,7 +1556,7 @@ static int amdgpu_pmops_runtime_resume(struct device *dev) ...@@ -1562,7 +1556,7 @@ static int amdgpu_pmops_runtime_resume(struct device *dev)
amdgpu_device_baco_exit(drm_dev); amdgpu_device_baco_exit(drm_dev);
} }
ret = amdgpu_device_resume(drm_dev, false); ret = amdgpu_device_resume(drm_dev, false);
if (amdgpu_device_supports_atpx(drm_dev)) if (amdgpu_device_supports_px(drm_dev))
drm_dev->switch_power_state = DRM_SWITCH_POWER_ON; drm_dev->switch_power_state = DRM_SWITCH_POWER_ON;
adev->in_runpm = false; adev->in_runpm = false;
return 0; return 0;
......
...@@ -159,7 +159,7 @@ int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags) ...@@ -159,7 +159,7 @@ int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags)
goto out; goto out;
} }
if (amdgpu_device_supports_atpx(dev) && if (amdgpu_device_supports_px(dev) &&
(amdgpu_runtime_pm != 0)) { /* enable runpm by default for atpx */ (amdgpu_runtime_pm != 0)) { /* enable runpm by default for atpx */
adev->runpm = true; adev->runpm = true;
dev_info(adev->dev, "Using ATPX for runtime pm\n"); dev_info(adev->dev, "Using ATPX for runtime pm\n");
...@@ -200,13 +200,10 @@ int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags) ...@@ -200,13 +200,10 @@ int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags)
if (adev->runpm) { if (adev->runpm) {
/* only need to skip on ATPX */ /* only need to skip on ATPX */
if (amdgpu_device_supports_atpx(dev) && if (amdgpu_device_supports_px(dev))
!amdgpu_is_atpx_hybrid())
dev_pm_set_driver_flags(dev->dev, DPM_FLAG_NO_DIRECT_COMPLETE); dev_pm_set_driver_flags(dev->dev, DPM_FLAG_NO_DIRECT_COMPLETE);
/* we want direct complete for BOCO */ /* we want direct complete for BOCO */
if ((amdgpu_device_supports_atpx(dev) && if (amdgpu_device_supports_boco(dev))
amdgpu_is_atpx_hybrid()) ||
amdgpu_device_supports_boco(dev))
dev_pm_set_driver_flags(dev->dev, DPM_FLAG_SMART_PREPARE | dev_pm_set_driver_flags(dev->dev, DPM_FLAG_SMART_PREPARE |
DPM_FLAG_SMART_SUSPEND | DPM_FLAG_SMART_SUSPEND |
DPM_FLAG_MAY_SKIP_RESUME); DPM_FLAG_MAY_SKIP_RESUME);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment