Commit 321f5c5f authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau: replace multiple open-coded runpm support checks with function

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 86276921
...@@ -80,7 +80,7 @@ int nouveau_modeset = -1; ...@@ -80,7 +80,7 @@ int nouveau_modeset = -1;
module_param_named(modeset, nouveau_modeset, int, 0400); module_param_named(modeset, nouveau_modeset, int, 0400);
MODULE_PARM_DESC(runpm, "disable (0), force enable (1), optimus only default (-1)"); MODULE_PARM_DESC(runpm, "disable (0), force enable (1), optimus only default (-1)");
int nouveau_runtime_pm = -1; static int nouveau_runtime_pm = -1;
module_param_named(runpm, nouveau_runtime_pm, int, 0400); module_param_named(runpm, nouveau_runtime_pm, int, 0400);
static struct drm_driver driver_stub; static struct drm_driver driver_stub;
...@@ -726,6 +726,14 @@ nouveau_pmops_thaw(struct device *dev) ...@@ -726,6 +726,14 @@ nouveau_pmops_thaw(struct device *dev)
return nouveau_do_resume(drm_dev, false); return nouveau_do_resume(drm_dev, false);
} }
bool
nouveau_pmops_runtime()
{
if (nouveau_runtime_pm == -1)
return nouveau_is_optimus() || nouveau_is_v1_dsm();
return nouveau_runtime_pm == 1;
}
static int static int
nouveau_pmops_runtime_suspend(struct device *dev) nouveau_pmops_runtime_suspend(struct device *dev)
{ {
...@@ -733,14 +741,7 @@ nouveau_pmops_runtime_suspend(struct device *dev) ...@@ -733,14 +741,7 @@ nouveau_pmops_runtime_suspend(struct device *dev)
struct drm_device *drm_dev = pci_get_drvdata(pdev); struct drm_device *drm_dev = pci_get_drvdata(pdev);
int ret; int ret;
if (nouveau_runtime_pm == 0) { if (!nouveau_pmops_runtime()) {
pm_runtime_forbid(dev);
return -EBUSY;
}
/* are we optimus enabled? */
if (nouveau_runtime_pm == -1 && !nouveau_is_optimus() && !nouveau_is_v1_dsm()) {
DRM_DEBUG_DRIVER("failing to power off - not optimus\n");
pm_runtime_forbid(dev); pm_runtime_forbid(dev);
return -EBUSY; return -EBUSY;
} }
...@@ -765,8 +766,10 @@ nouveau_pmops_runtime_resume(struct device *dev) ...@@ -765,8 +766,10 @@ nouveau_pmops_runtime_resume(struct device *dev)
struct nvif_device *device = &nouveau_drm(drm_dev)->client.device; struct nvif_device *device = &nouveau_drm(drm_dev)->client.device;
int ret; int ret;
if (nouveau_runtime_pm == 0) if (!nouveau_pmops_runtime()) {
return -EINVAL; pm_runtime_forbid(dev);
return -EBUSY;
}
pci_set_power_state(pdev, PCI_D0); pci_set_power_state(pdev, PCI_D0);
pci_restore_state(pdev); pci_restore_state(pdev);
...@@ -796,14 +799,7 @@ nouveau_pmops_runtime_idle(struct device *dev) ...@@ -796,14 +799,7 @@ nouveau_pmops_runtime_idle(struct device *dev)
struct nouveau_drm *drm = nouveau_drm(drm_dev); struct nouveau_drm *drm = nouveau_drm(drm_dev);
struct drm_crtc *crtc; struct drm_crtc *crtc;
if (nouveau_runtime_pm == 0) { if (!nouveau_pmops_runtime()) {
pm_runtime_forbid(dev);
return -EBUSY;
}
/* are we optimus enabled? */
if (nouveau_runtime_pm == -1 && !nouveau_is_optimus() && !nouveau_is_v1_dsm()) {
DRM_DEBUG_DRIVER("failing to power off - not optimus\n");
pm_runtime_forbid(dev); pm_runtime_forbid(dev);
return -EBUSY; return -EBUSY;
} }
......
...@@ -108,8 +108,6 @@ nouveau_cli(struct drm_file *fpriv) ...@@ -108,8 +108,6 @@ nouveau_cli(struct drm_file *fpriv)
#include <nvif/object.h> #include <nvif/object.h>
#include <nvif/device.h> #include <nvif/device.h>
extern int nouveau_runtime_pm;
struct nouveau_drm { struct nouveau_drm {
struct nouveau_cli client; struct nouveau_cli client;
struct drm_device *dev; struct drm_device *dev;
...@@ -195,6 +193,7 @@ nouveau_drm(struct drm_device *dev) ...@@ -195,6 +193,7 @@ nouveau_drm(struct drm_device *dev)
int nouveau_pmops_suspend(struct device *); int nouveau_pmops_suspend(struct device *);
int nouveau_pmops_resume(struct device *); int nouveau_pmops_resume(struct device *);
bool nouveau_pmops_runtime(void);
#include <nvkm/core/tegra.h> #include <nvkm/core/tegra.h>
......
...@@ -87,7 +87,7 @@ void ...@@ -87,7 +87,7 @@ void
nouveau_vga_init(struct nouveau_drm *drm) nouveau_vga_init(struct nouveau_drm *drm)
{ {
struct drm_device *dev = drm->dev; struct drm_device *dev = drm->dev;
bool runtime = false; bool runtime = nouveau_pmops_runtime();
/* only relevant for PCI devices */ /* only relevant for PCI devices */
if (!dev->pdev) if (!dev->pdev)
...@@ -99,10 +99,6 @@ nouveau_vga_init(struct nouveau_drm *drm) ...@@ -99,10 +99,6 @@ nouveau_vga_init(struct nouveau_drm *drm)
if (pci_is_thunderbolt_attached(dev->pdev)) if (pci_is_thunderbolt_attached(dev->pdev))
return; return;
if (nouveau_runtime_pm == 1)
runtime = true;
if ((nouveau_runtime_pm == -1) && (nouveau_is_optimus() || nouveau_is_v1_dsm()))
runtime = true;
vga_switcheroo_register_client(dev->pdev, &nouveau_switcheroo_ops, runtime); vga_switcheroo_register_client(dev->pdev, &nouveau_switcheroo_ops, runtime);
if (runtime && nouveau_is_v1_dsm() && !nouveau_is_optimus()) if (runtime && nouveau_is_v1_dsm() && !nouveau_is_optimus())
...@@ -113,18 +109,13 @@ void ...@@ -113,18 +109,13 @@ void
nouveau_vga_fini(struct nouveau_drm *drm) nouveau_vga_fini(struct nouveau_drm *drm)
{ {
struct drm_device *dev = drm->dev; struct drm_device *dev = drm->dev;
bool runtime = false; bool runtime = nouveau_pmops_runtime();
vga_client_register(dev->pdev, NULL, NULL, NULL); vga_client_register(dev->pdev, NULL, NULL, NULL);
if (pci_is_thunderbolt_attached(dev->pdev)) if (pci_is_thunderbolt_attached(dev->pdev))
return; return;
if (nouveau_runtime_pm == 1)
runtime = true;
if ((nouveau_runtime_pm == -1) && (nouveau_is_optimus() || nouveau_is_v1_dsm()))
runtime = true;
vga_switcheroo_unregister_client(dev->pdev); vga_switcheroo_unregister_client(dev->pdev);
if (runtime && nouveau_is_v1_dsm() && !nouveau_is_optimus()) if (runtime && nouveau_is_v1_dsm() && !nouveau_is_optimus())
vga_switcheroo_fini_domain_pm_ops(drm->dev->dev); vga_switcheroo_fini_domain_pm_ops(drm->dev->dev);
......
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