Commit 9430738d authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau: resurrect headless mode since rework

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 5cad16ac
...@@ -360,23 +360,26 @@ nouveau_display_create(struct drm_device *dev) ...@@ -360,23 +360,26 @@ nouveau_display_create(struct drm_device *dev)
drm_kms_helper_poll_init(dev); drm_kms_helper_poll_init(dev);
drm_kms_helper_poll_disable(dev); drm_kms_helper_poll_disable(dev);
if (nv_device(drm->device)->card_type < NV_50) if (nouveau_modeset == 1) {
ret = nv04_display_create(dev); if (nv_device(drm->device)->card_type < NV_50)
else ret = nv04_display_create(dev);
if (nv_device(drm->device)->card_type < NV_D0) else
ret = nv50_display_create(dev); if (nv_device(drm->device)->card_type < NV_D0)
else ret = nv50_display_create(dev);
ret = nvd0_display_create(dev); else
if (ret) ret = nvd0_display_create(dev);
goto disp_create_err;
if (dev->mode_config.num_crtc) {
ret = drm_vblank_init(dev, dev->mode_config.num_crtc);
if (ret) if (ret)
goto vblank_err; goto disp_create_err;
if (dev->mode_config.num_crtc) {
ret = drm_vblank_init(dev, dev->mode_config.num_crtc);
if (ret)
goto vblank_err;
}
nouveau_backlight_init(dev);
} }
nouveau_backlight_init(dev);
return 0; return 0;
vblank_err: vblank_err:
...@@ -395,7 +398,8 @@ nouveau_display_destroy(struct drm_device *dev) ...@@ -395,7 +398,8 @@ nouveau_display_destroy(struct drm_device *dev)
nouveau_backlight_exit(dev); nouveau_backlight_exit(dev);
drm_vblank_cleanup(dev); drm_vblank_cleanup(dev);
disp->dtor(dev); if (disp->dtor)
disp->dtor(dev);
drm_kms_helper_poll_fini(dev); drm_kms_helper_poll_fini(dev);
drm_mode_config_cleanup(dev); drm_mode_config_cleanup(dev);
......
...@@ -63,8 +63,9 @@ MODULE_PARM_DESC(noaccel, "disable kernel/abi16 acceleration"); ...@@ -63,8 +63,9 @@ MODULE_PARM_DESC(noaccel, "disable kernel/abi16 acceleration");
static int nouveau_noaccel = 0; static int nouveau_noaccel = 0;
module_param_named(noaccel, nouveau_noaccel, int, 0400); module_param_named(noaccel, nouveau_noaccel, int, 0400);
MODULE_PARM_DESC(modeset, "enable driver"); MODULE_PARM_DESC(modeset, "enable driver (default: auto, "
static int nouveau_modeset = -1; "0 = disabled, 1 = enabled, 2 = headless)");
int nouveau_modeset = -1;
module_param_named(modeset, nouveau_modeset, int, 0400); module_param_named(modeset, nouveau_modeset, int, 0400);
static struct drm_driver driver; static struct drm_driver driver;
...@@ -363,7 +364,8 @@ nouveau_drm_unload(struct drm_device *dev) ...@@ -363,7 +364,8 @@ nouveau_drm_unload(struct drm_device *dev)
nouveau_pm_fini(dev); nouveau_pm_fini(dev);
nouveau_display_fini(dev); if (dev->mode_config.num_crtc)
nouveau_display_fini(dev);
nouveau_display_destroy(dev); nouveau_display_destroy(dev);
nouveau_irq_fini(dev); nouveau_irq_fini(dev);
...@@ -403,13 +405,15 @@ nouveau_drm_suspend(struct pci_dev *pdev, pm_message_t pm_state) ...@@ -403,13 +405,15 @@ nouveau_drm_suspend(struct pci_dev *pdev, pm_message_t pm_state)
pm_state.event == PM_EVENT_PRETHAW) pm_state.event == PM_EVENT_PRETHAW)
return 0; return 0;
NV_INFO(drm, "suspending fbcon...\n"); if (dev->mode_config.num_crtc) {
nouveau_fbcon_set_suspend(dev, 1); NV_INFO(drm, "suspending fbcon...\n");
nouveau_fbcon_set_suspend(dev, 1);
NV_INFO(drm, "suspending display...\n"); NV_INFO(drm, "suspending display...\n");
ret = nouveau_display_suspend(dev); ret = nouveau_display_suspend(dev);
if (ret) if (ret)
return ret; return ret;
}
NV_INFO(drm, "evicting buffers...\n"); NV_INFO(drm, "evicting buffers...\n");
ttm_bo_evict_mm(&drm->ttm.bdev, TTM_PL_VRAM); ttm_bo_evict_mm(&drm->ttm.bdev, TTM_PL_VRAM);
...@@ -445,8 +449,10 @@ nouveau_drm_suspend(struct pci_dev *pdev, pm_message_t pm_state) ...@@ -445,8 +449,10 @@ nouveau_drm_suspend(struct pci_dev *pdev, pm_message_t pm_state)
nouveau_client_init(&cli->base); nouveau_client_init(&cli->base);
} }
NV_INFO(drm, "resuming display...\n"); if (dev->mode_config.num_crtc) {
nouveau_display_resume(dev); NV_INFO(drm, "resuming display...\n");
nouveau_display_resume(dev);
}
return ret; return ret;
} }
...@@ -486,8 +492,10 @@ nouveau_drm_resume(struct pci_dev *pdev) ...@@ -486,8 +492,10 @@ nouveau_drm_resume(struct pci_dev *pdev)
nouveau_irq_postinstall(dev); nouveau_irq_postinstall(dev);
nouveau_pm_resume(dev); nouveau_pm_resume(dev);
NV_INFO(drm, "resuming display...\n"); if (dev->mode_config.num_crtc) {
nouveau_display_resume(dev); NV_INFO(drm, "resuming display...\n");
nouveau_display_resume(dev);
}
return 0; return 0;
} }
......
...@@ -141,4 +141,6 @@ int nouveau_drm_resume(struct pci_dev *); ...@@ -141,4 +141,6 @@ int nouveau_drm_resume(struct pci_dev *);
nv_info((cli), fmt, ##args); \ nv_info((cli), fmt, ##args); \
} while (0) } while (0)
extern int nouveau_modeset;
#endif #endif
...@@ -61,13 +61,15 @@ nouveau_irq_handler(DRM_IRQ_ARGS) ...@@ -61,13 +61,15 @@ nouveau_irq_handler(DRM_IRQ_ARGS)
nv_subdev(pmc)->intr(nv_subdev(pmc)); nv_subdev(pmc)->intr(nv_subdev(pmc));
if (device->card_type >= NV_D0) { if (dev->mode_config.num_crtc) {
if (nv_rd32(device, 0x000100) & 0x04000000) if (device->card_type >= NV_D0) {
nvd0_display_intr(dev); if (nv_rd32(device, 0x000100) & 0x04000000)
} else nvd0_display_intr(dev);
if (device->card_type >= NV_50) { } else
if (nv_rd32(device, 0x000100) & 0x04000000) if (device->card_type >= NV_50) {
nv50_display_intr(dev); if (nv_rd32(device, 0x000100) & 0x04000000)
nv50_display_intr(dev);
}
} }
return IRQ_HANDLED; return IRQ_HANDLED;
......
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