diff options
author | Dave Airlie <airlied@redhat.com> | 2012-09-12 22:02:30 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2013-11-01 12:43:14 -0400 |
commit | 7473e830c400b2ebf54937a4f075279f7713a2b7 (patch) | |
tree | d01d08dd598c3710df68d806a8e2003fb19457c1 | |
parent | 6214bb748783e65466d864c992770c07293ee820 (diff) |
drm/radeon: convert to pmops
This is a pre-requisite for runtime pm on powerxpress systems.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_device.c | 27 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_drv.c | 48 |
3 files changed, 49 insertions, 30 deletions
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index a400ac1c4147..986100a6e5ca 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
@@ -2673,8 +2673,8 @@ extern void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain); | |||
2673 | extern bool radeon_ttm_bo_is_radeon_bo(struct ttm_buffer_object *bo); | 2673 | extern bool radeon_ttm_bo_is_radeon_bo(struct ttm_buffer_object *bo); |
2674 | extern void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *mc, u64 base); | 2674 | extern void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *mc, u64 base); |
2675 | extern void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc); | 2675 | extern void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc); |
2676 | extern int radeon_resume_kms(struct drm_device *dev); | 2676 | extern int radeon_resume_kms(struct drm_device *dev, bool resume); |
2677 | extern int radeon_suspend_kms(struct drm_device *dev, pm_message_t state); | 2677 | extern int radeon_suspend_kms(struct drm_device *dev, bool suspend); |
2678 | extern void radeon_ttm_set_active_vram_size(struct radeon_device *rdev, u64 size); | 2678 | extern void radeon_ttm_set_active_vram_size(struct radeon_device *rdev, u64 size); |
2679 | extern void radeon_program_register_sequence(struct radeon_device *rdev, | 2679 | extern void radeon_program_register_sequence(struct radeon_device *rdev, |
2680 | const u32 *registers, | 2680 | const u32 *registers, |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index 841d0e09be3e..d08ae5be1598 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
@@ -1076,7 +1076,6 @@ static bool radeon_switcheroo_quirk_long_wakeup(struct pci_dev *pdev) | |||
1076 | static void radeon_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_state state) | 1076 | static void radeon_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_state state) |
1077 | { | 1077 | { |
1078 | struct drm_device *dev = pci_get_drvdata(pdev); | 1078 | struct drm_device *dev = pci_get_drvdata(pdev); |
1079 | pm_message_t pmm = { .event = PM_EVENT_SUSPEND }; | ||
1080 | if (state == VGA_SWITCHEROO_ON) { | 1079 | if (state == VGA_SWITCHEROO_ON) { |
1081 | unsigned d3_delay = dev->pdev->d3_delay; | 1080 | unsigned d3_delay = dev->pdev->d3_delay; |
1082 | 1081 | ||
@@ -1087,7 +1086,7 @@ static void radeon_switcheroo_set_state(struct pci_dev *pdev, enum vga_switchero | |||
1087 | if (d3_delay < 20 && radeon_switcheroo_quirk_long_wakeup(pdev)) | 1086 | if (d3_delay < 20 && radeon_switcheroo_quirk_long_wakeup(pdev)) |
1088 | dev->pdev->d3_delay = 20; | 1087 | dev->pdev->d3_delay = 20; |
1089 | 1088 | ||
1090 | radeon_resume_kms(dev); | 1089 | radeon_resume_kms(dev, 1); |
1091 | 1090 | ||
1092 | dev->pdev->d3_delay = d3_delay; | 1091 | dev->pdev->d3_delay = d3_delay; |
1093 | 1092 | ||
@@ -1097,7 +1096,7 @@ static void radeon_switcheroo_set_state(struct pci_dev *pdev, enum vga_switchero | |||
1097 | printk(KERN_INFO "radeon: switched off\n"); | 1096 | printk(KERN_INFO "radeon: switched off\n"); |
1098 | drm_kms_helper_poll_disable(dev); | 1097 | drm_kms_helper_poll_disable(dev); |
1099 | dev->switch_power_state = DRM_SWITCH_POWER_CHANGING; | 1098 | dev->switch_power_state = DRM_SWITCH_POWER_CHANGING; |
1100 | radeon_suspend_kms(dev, pmm); | 1099 | radeon_suspend_kms(dev, 1); |
1101 | dev->switch_power_state = DRM_SWITCH_POWER_OFF; | 1100 | dev->switch_power_state = DRM_SWITCH_POWER_OFF; |
1102 | } | 1101 | } |
1103 | } | 1102 | } |
@@ -1383,7 +1382,7 @@ void radeon_device_fini(struct radeon_device *rdev) | |||
1383 | * Returns 0 for success or an error on failure. | 1382 | * Returns 0 for success or an error on failure. |
1384 | * Called at driver suspend. | 1383 | * Called at driver suspend. |
1385 | */ | 1384 | */ |
1386 | int radeon_suspend_kms(struct drm_device *dev, pm_message_t state) | 1385 | int radeon_suspend_kms(struct drm_device *dev, bool suspend) |
1387 | { | 1386 | { |
1388 | struct radeon_device *rdev; | 1387 | struct radeon_device *rdev; |
1389 | struct drm_crtc *crtc; | 1388 | struct drm_crtc *crtc; |
@@ -1394,9 +1393,7 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state) | |||
1394 | if (dev == NULL || dev->dev_private == NULL) { | 1393 | if (dev == NULL || dev->dev_private == NULL) { |
1395 | return -ENODEV; | 1394 | return -ENODEV; |
1396 | } | 1395 | } |
1397 | if (state.event == PM_EVENT_PRETHAW) { | 1396 | |
1398 | return 0; | ||
1399 | } | ||
1400 | rdev = dev->dev_private; | 1397 | rdev = dev->dev_private; |
1401 | 1398 | ||
1402 | if (dev->switch_power_state == DRM_SWITCH_POWER_OFF) | 1399 | if (dev->switch_power_state == DRM_SWITCH_POWER_OFF) |
@@ -1455,7 +1452,7 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state) | |||
1455 | radeon_agp_suspend(rdev); | 1452 | radeon_agp_suspend(rdev); |
1456 | 1453 | ||
1457 | pci_save_state(dev->pdev); | 1454 | pci_save_state(dev->pdev); |
1458 | if (state.event == PM_EVENT_SUSPEND) { | 1455 | if (suspend) { |
1459 | /* Shut down the device */ | 1456 | /* Shut down the device */ |
1460 | pci_disable_device(dev->pdev); | 1457 | pci_disable_device(dev->pdev); |
1461 | pci_set_power_state(dev->pdev, PCI_D3hot); | 1458 | pci_set_power_state(dev->pdev, PCI_D3hot); |
@@ -1475,7 +1472,7 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state) | |||
1475 | * Returns 0 for success or an error on failure. | 1472 | * Returns 0 for success or an error on failure. |
1476 | * Called at driver resume. | 1473 | * Called at driver resume. |
1477 | */ | 1474 | */ |
1478 | int radeon_resume_kms(struct drm_device *dev) | 1475 | int radeon_resume_kms(struct drm_device *dev, bool resume) |
1479 | { | 1476 | { |
1480 | struct drm_connector *connector; | 1477 | struct drm_connector *connector; |
1481 | struct radeon_device *rdev = dev->dev_private; | 1478 | struct radeon_device *rdev = dev->dev_private; |
@@ -1485,11 +1482,13 @@ int radeon_resume_kms(struct drm_device *dev) | |||
1485 | return 0; | 1482 | return 0; |
1486 | 1483 | ||
1487 | console_lock(); | 1484 | console_lock(); |
1488 | pci_set_power_state(dev->pdev, PCI_D0); | 1485 | if (resume) { |
1489 | pci_restore_state(dev->pdev); | 1486 | pci_set_power_state(dev->pdev, PCI_D0); |
1490 | if (pci_enable_device(dev->pdev)) { | 1487 | pci_restore_state(dev->pdev); |
1491 | console_unlock(); | 1488 | if (pci_enable_device(dev->pdev)) { |
1492 | return -1; | 1489 | console_unlock(); |
1490 | return -1; | ||
1491 | } | ||
1493 | } | 1492 | } |
1494 | /* resume AGP if in use */ | 1493 | /* resume AGP if in use */ |
1495 | radeon_agp_resume(rdev); | 1494 | radeon_agp_resume(rdev); |
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c index 22f685827b7e..59f067e857db 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.c +++ b/drivers/gpu/drm/radeon/radeon_drv.c | |||
@@ -87,8 +87,8 @@ void radeon_driver_postclose_kms(struct drm_device *dev, | |||
87 | struct drm_file *file_priv); | 87 | struct drm_file *file_priv); |
88 | void radeon_driver_preclose_kms(struct drm_device *dev, | 88 | void radeon_driver_preclose_kms(struct drm_device *dev, |
89 | struct drm_file *file_priv); | 89 | struct drm_file *file_priv); |
90 | int radeon_suspend_kms(struct drm_device *dev, pm_message_t state); | 90 | int radeon_suspend_kms(struct drm_device *dev, bool suspend); |
91 | int radeon_resume_kms(struct drm_device *dev); | 91 | int radeon_resume_kms(struct drm_device *dev, bool resume); |
92 | u32 radeon_get_vblank_counter_kms(struct drm_device *dev, int crtc); | 92 | u32 radeon_get_vblank_counter_kms(struct drm_device *dev, int crtc); |
93 | int radeon_enable_vblank_kms(struct drm_device *dev, int crtc); | 93 | int radeon_enable_vblank_kms(struct drm_device *dev, int crtc); |
94 | void radeon_disable_vblank_kms(struct drm_device *dev, int crtc); | 94 | void radeon_disable_vblank_kms(struct drm_device *dev, int crtc); |
@@ -352,20 +352,43 @@ radeon_pci_remove(struct pci_dev *pdev) | |||
352 | drm_put_dev(dev); | 352 | drm_put_dev(dev); |
353 | } | 353 | } |
354 | 354 | ||
355 | static int | 355 | static int radeon_pmops_suspend(struct device *dev) |
356 | radeon_pci_suspend(struct pci_dev *pdev, pm_message_t state) | ||
357 | { | 356 | { |
358 | struct drm_device *dev = pci_get_drvdata(pdev); | 357 | struct pci_dev *pdev = to_pci_dev(dev); |
359 | return radeon_suspend_kms(dev, state); | 358 | struct drm_device *drm_dev = pci_get_drvdata(pdev); |
359 | return radeon_suspend_kms(drm_dev, 1); | ||
360 | } | 360 | } |
361 | 361 | ||
362 | static int | 362 | static int radeon_pmops_resume(struct device *dev) |
363 | radeon_pci_resume(struct pci_dev *pdev) | ||
364 | { | 363 | { |
365 | struct drm_device *dev = pci_get_drvdata(pdev); | 364 | struct pci_dev *pdev = to_pci_dev(dev); |
366 | return radeon_resume_kms(dev); | 365 | struct drm_device *drm_dev = pci_get_drvdata(pdev); |
366 | return radeon_resume_kms(drm_dev, 1); | ||
367 | } | ||
368 | |||
369 | static int radeon_pmops_freeze(struct device *dev) | ||
370 | { | ||
371 | struct pci_dev *pdev = to_pci_dev(dev); | ||
372 | struct drm_device *drm_dev = pci_get_drvdata(pdev); | ||
373 | return radeon_suspend_kms(drm_dev, 0); | ||
367 | } | 374 | } |
368 | 375 | ||
376 | static int radeon_pmops_thaw(struct device *dev) | ||
377 | { | ||
378 | struct pci_dev *pdev = to_pci_dev(dev); | ||
379 | struct drm_device *drm_dev = pci_get_drvdata(pdev); | ||
380 | return radeon_resume_kms(drm_dev, 0); | ||
381 | } | ||
382 | |||
383 | static const struct dev_pm_ops radeon_pm_ops = { | ||
384 | .suspend = radeon_pmops_suspend, | ||
385 | .resume = radeon_pmops_resume, | ||
386 | .freeze = radeon_pmops_freeze, | ||
387 | .thaw = radeon_pmops_thaw, | ||
388 | .poweroff = radeon_pmops_freeze, | ||
389 | .restore = radeon_pmops_resume, | ||
390 | }; | ||
391 | |||
369 | static const struct file_operations radeon_driver_kms_fops = { | 392 | static const struct file_operations radeon_driver_kms_fops = { |
370 | .owner = THIS_MODULE, | 393 | .owner = THIS_MODULE, |
371 | .open = drm_open, | 394 | .open = drm_open, |
@@ -391,8 +414,6 @@ static struct drm_driver kms_driver = { | |||
391 | .postclose = radeon_driver_postclose_kms, | 414 | .postclose = radeon_driver_postclose_kms, |
392 | .lastclose = radeon_driver_lastclose_kms, | 415 | .lastclose = radeon_driver_lastclose_kms, |
393 | .unload = radeon_driver_unload_kms, | 416 | .unload = radeon_driver_unload_kms, |
394 | .suspend = radeon_suspend_kms, | ||
395 | .resume = radeon_resume_kms, | ||
396 | .get_vblank_counter = radeon_get_vblank_counter_kms, | 417 | .get_vblank_counter = radeon_get_vblank_counter_kms, |
397 | .enable_vblank = radeon_enable_vblank_kms, | 418 | .enable_vblank = radeon_enable_vblank_kms, |
398 | .disable_vblank = radeon_disable_vblank_kms, | 419 | .disable_vblank = radeon_disable_vblank_kms, |
@@ -449,8 +470,7 @@ static struct pci_driver radeon_kms_pci_driver = { | |||
449 | .id_table = pciidlist, | 470 | .id_table = pciidlist, |
450 | .probe = radeon_pci_probe, | 471 | .probe = radeon_pci_probe, |
451 | .remove = radeon_pci_remove, | 472 | .remove = radeon_pci_remove, |
452 | .suspend = radeon_pci_suspend, | 473 | .driver.pm = &radeon_pm_ops, |
453 | .resume = radeon_pci_resume, | ||
454 | }; | 474 | }; |
455 | 475 | ||
456 | static int __init radeon_init(void) | 476 | static int __init radeon_init(void) |