aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2012-09-12 22:02:30 -0400
committerAlex Deucher <alexander.deucher@amd.com>2013-11-01 12:43:14 -0400
commit7473e830c400b2ebf54937a4f075279f7713a2b7 (patch)
treed01d08dd598c3710df68d806a8e2003fb19457c1
parent6214bb748783e65466d864c992770c07293ee820 (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.h4
-rw-r--r--drivers/gpu/drm/radeon/radeon_device.c27
-rw-r--r--drivers/gpu/drm/radeon/radeon_drv.c48
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);
2673extern bool radeon_ttm_bo_is_radeon_bo(struct ttm_buffer_object *bo); 2673extern bool radeon_ttm_bo_is_radeon_bo(struct ttm_buffer_object *bo);
2674extern void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *mc, u64 base); 2674extern void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *mc, u64 base);
2675extern void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc); 2675extern void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc);
2676extern int radeon_resume_kms(struct drm_device *dev); 2676extern int radeon_resume_kms(struct drm_device *dev, bool resume);
2677extern int radeon_suspend_kms(struct drm_device *dev, pm_message_t state); 2677extern int radeon_suspend_kms(struct drm_device *dev, bool suspend);
2678extern void radeon_ttm_set_active_vram_size(struct radeon_device *rdev, u64 size); 2678extern void radeon_ttm_set_active_vram_size(struct radeon_device *rdev, u64 size);
2679extern void radeon_program_register_sequence(struct radeon_device *rdev, 2679extern 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)
1076static void radeon_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_state state) 1076static 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 */
1386int radeon_suspend_kms(struct drm_device *dev, pm_message_t state) 1385int 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 */
1478int radeon_resume_kms(struct drm_device *dev) 1475int 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);
88void radeon_driver_preclose_kms(struct drm_device *dev, 88void radeon_driver_preclose_kms(struct drm_device *dev,
89 struct drm_file *file_priv); 89 struct drm_file *file_priv);
90int radeon_suspend_kms(struct drm_device *dev, pm_message_t state); 90int radeon_suspend_kms(struct drm_device *dev, bool suspend);
91int radeon_resume_kms(struct drm_device *dev); 91int radeon_resume_kms(struct drm_device *dev, bool resume);
92u32 radeon_get_vblank_counter_kms(struct drm_device *dev, int crtc); 92u32 radeon_get_vblank_counter_kms(struct drm_device *dev, int crtc);
93int radeon_enable_vblank_kms(struct drm_device *dev, int crtc); 93int radeon_enable_vblank_kms(struct drm_device *dev, int crtc);
94void radeon_disable_vblank_kms(struct drm_device *dev, int crtc); 94void 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
355static int 355static int radeon_pmops_suspend(struct device *dev)
356radeon_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
362static int 362static int radeon_pmops_resume(struct device *dev)
363radeon_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
369static 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
376static 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
383static 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
369static const struct file_operations radeon_driver_kms_fops = { 392static 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
456static int __init radeon_init(void) 476static int __init radeon_init(void)