drm/radeon: wire up a pci shutdown callback
Normally on shutdown or reboot we don't care about necessarily making sure the hw is in a good state because the system is about to be powered down or reset. However, after a shutdown or reboot in a VM, it's best to tear down the hw properly otherwise there can be problems with the next VM use. Reviewed-by: Christian König <christian.koenig@amd.com> Reviewed-by: Edward O'Callaghan <funfunctor@folklore1984.net> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
61e113067b
commit
a801abe477
@ -639,7 +639,7 @@ void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
|
|||||||
* Used at driver startup.
|
* Used at driver startup.
|
||||||
* Returns true if virtual or false if not.
|
* Returns true if virtual or false if not.
|
||||||
*/
|
*/
|
||||||
static bool radeon_device_is_virtual(void)
|
bool radeon_device_is_virtual(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_X86
|
#ifdef CONFIG_X86
|
||||||
return boot_cpu_has(X86_FEATURE_HYPERVISOR);
|
return boot_cpu_has(X86_FEATURE_HYPERVISOR);
|
||||||
|
@ -310,6 +310,8 @@ MODULE_DEVICE_TABLE(pci, pciidlist);
|
|||||||
|
|
||||||
static struct drm_driver kms_driver;
|
static struct drm_driver kms_driver;
|
||||||
|
|
||||||
|
bool radeon_device_is_virtual(void);
|
||||||
|
|
||||||
static int radeon_kick_out_firmware_fb(struct pci_dev *pdev)
|
static int radeon_kick_out_firmware_fb(struct pci_dev *pdev)
|
||||||
{
|
{
|
||||||
struct apertures_struct *ap;
|
struct apertures_struct *ap;
|
||||||
@ -363,6 +365,16 @@ radeon_pci_remove(struct pci_dev *pdev)
|
|||||||
drm_put_dev(dev);
|
drm_put_dev(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
radeon_pci_shutdown(struct pci_dev *pdev)
|
||||||
|
{
|
||||||
|
/* if we are running in a VM, make sure the device
|
||||||
|
* torn down properly on reboot/shutdown
|
||||||
|
*/
|
||||||
|
if (radeon_device_is_virtual())
|
||||||
|
radeon_pci_remove(pdev);
|
||||||
|
}
|
||||||
|
|
||||||
static int radeon_pmops_suspend(struct device *dev)
|
static int radeon_pmops_suspend(struct device *dev)
|
||||||
{
|
{
|
||||||
struct pci_dev *pdev = to_pci_dev(dev);
|
struct pci_dev *pdev = to_pci_dev(dev);
|
||||||
@ -583,6 +595,7 @@ static struct pci_driver radeon_kms_pci_driver = {
|
|||||||
.id_table = pciidlist,
|
.id_table = pciidlist,
|
||||||
.probe = radeon_pci_probe,
|
.probe = radeon_pci_probe,
|
||||||
.remove = radeon_pci_remove,
|
.remove = radeon_pci_remove,
|
||||||
|
.shutdown = radeon_pci_shutdown,
|
||||||
.driver.pm = &radeon_pm_ops,
|
.driver.pm = &radeon_pm_ops,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user