drm/nouveau/kms/nv04-nv4x: move suspend code to dispnv04 fini hook

It has no relevance to the atomic path used by newer GPUs.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
Ben Skeggs 2019-02-12 22:28:13 +10:00
parent fcd6f04838
commit f04a4186af
4 changed files with 29 additions and 28 deletions

View File

@ -30,13 +30,15 @@
#include "hw.h" #include "hw.h"
#include "nouveau_encoder.h" #include "nouveau_encoder.h"
#include "nouveau_connector.h" #include "nouveau_connector.h"
#include "nouveau_bo.h"
#include <nvif/if0004.h> #include <nvif/if0004.h>
static void static void
nv04_display_fini(struct drm_device *dev) nv04_display_fini(struct drm_device *dev, bool suspend)
{ {
struct nv04_display *disp = nv04_display(dev); struct nv04_display *disp = nv04_display(dev);
struct drm_crtc *crtc;
/* Disable flip completion events. */ /* Disable flip completion events. */
nvif_notify_put(&disp->flip); nvif_notify_put(&disp->flip);
@ -45,6 +47,29 @@ nv04_display_fini(struct drm_device *dev)
NVWriteCRTC(dev, 0, NV_PCRTC_INTR_EN_0, 0); NVWriteCRTC(dev, 0, NV_PCRTC_INTR_EN_0, 0);
if (nv_two_heads(dev)) if (nv_two_heads(dev))
NVWriteCRTC(dev, 1, NV_PCRTC_INTR_EN_0, 0); NVWriteCRTC(dev, 1, NV_PCRTC_INTR_EN_0, 0);
if (!suspend)
return;
/* Un-pin FB and cursors so they'll be evicted to system memory. */
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
struct nouveau_framebuffer *nouveau_fb;
nouveau_fb = nouveau_framebuffer(crtc->primary->fb);
if (!nouveau_fb || !nouveau_fb->nvbo)
continue;
nouveau_bo_unpin(nouveau_fb->nvbo);
}
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
if (nv_crtc->cursor.nvbo) {
if (nv_crtc->cursor.set_offset)
nouveau_bo_unmap(nv_crtc->cursor.nvbo);
nouveau_bo_unpin(nv_crtc->cursor.nvbo);
}
}
} }
static int static int

View File

@ -2222,7 +2222,7 @@ nv50_disp_func = {
*****************************************************************************/ *****************************************************************************/
static void static void
nv50_display_fini(struct drm_device *dev) nv50_display_fini(struct drm_device *dev, bool suspend)
{ {
struct nouveau_encoder *nv_encoder; struct nouveau_encoder *nv_encoder;
struct drm_encoder *encoder; struct drm_encoder *encoder;

View File

@ -461,7 +461,7 @@ nouveau_display_fini(struct drm_device *dev, bool suspend, bool runtime)
cancel_work_sync(&drm->hpd_work); cancel_work_sync(&drm->hpd_work);
drm_kms_helper_poll_disable(dev); drm_kms_helper_poll_disable(dev);
disp->fini(dev); disp->fini(dev, suspend);
} }
static void static void
@ -614,7 +614,6 @@ int
nouveau_display_suspend(struct drm_device *dev, bool runtime) nouveau_display_suspend(struct drm_device *dev, bool runtime)
{ {
struct nouveau_display *disp = nouveau_display(dev); struct nouveau_display *disp = nouveau_display(dev);
struct drm_crtc *crtc;
if (drm_drv_uses_atomic_modeset(dev)) { if (drm_drv_uses_atomic_modeset(dev)) {
if (!runtime) { if (!runtime) {
@ -625,32 +624,9 @@ nouveau_display_suspend(struct drm_device *dev, bool runtime)
return ret; return ret;
} }
} }
nouveau_display_fini(dev, true, runtime);
return 0;
} }
nouveau_display_fini(dev, true, runtime); nouveau_display_fini(dev, true, runtime);
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
struct nouveau_framebuffer *nouveau_fb;
nouveau_fb = nouveau_framebuffer(crtc->primary->fb);
if (!nouveau_fb || !nouveau_fb->nvbo)
continue;
nouveau_bo_unpin(nouveau_fb->nvbo);
}
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
if (nv_crtc->cursor.nvbo) {
if (nv_crtc->cursor.set_offset)
nouveau_bo_unmap(nv_crtc->cursor.nvbo);
nouveau_bo_unpin(nv_crtc->cursor.nvbo);
}
}
return 0; return 0;
} }

View File

@ -29,7 +29,7 @@ struct nouveau_display {
void *priv; void *priv;
void (*dtor)(struct drm_device *); void (*dtor)(struct drm_device *);
int (*init)(struct drm_device *); int (*init)(struct drm_device *);
void (*fini)(struct drm_device *); void (*fini)(struct drm_device *, bool suspend);
struct nvif_disp disp; struct nvif_disp disp;