Commit f04a4186 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

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: default avatarBen Skeggs <bskeggs@redhat.com>
parent fcd6f048
Loading
Loading
Loading
Loading
+26 −1
Original line number Diff line number Diff line
@@ -30,13 +30,15 @@
#include "hw.h"
#include "nouveau_encoder.h"
#include "nouveau_connector.h"
#include "nouveau_bo.h"

#include <nvif/if0004.h>

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 drm_crtc *crtc;

	/* Disable flip completion events. */
	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);
	if (nv_two_heads(dev))
		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
+1 −1
Original line number Diff line number Diff line
@@ -2222,7 +2222,7 @@ nv50_disp_func = {
 *****************************************************************************/

static void
nv50_display_fini(struct drm_device *dev)
nv50_display_fini(struct drm_device *dev, bool suspend)
{
	struct nouveau_encoder *nv_encoder;
	struct drm_encoder *encoder;
+1 −25
Original line number Diff line number Diff line
@@ -461,7 +461,7 @@ nouveau_display_fini(struct drm_device *dev, bool suspend, bool runtime)
		cancel_work_sync(&drm->hpd_work);

	drm_kms_helper_poll_disable(dev);
	disp->fini(dev);
	disp->fini(dev, suspend);
}

static void
@@ -614,7 +614,6 @@ int
nouveau_display_suspend(struct drm_device *dev, bool runtime)
{
	struct nouveau_display *disp = nouveau_display(dev);
	struct drm_crtc *crtc;

	if (drm_drv_uses_atomic_modeset(dev)) {
		if (!runtime) {
@@ -625,32 +624,9 @@ nouveau_display_suspend(struct drm_device *dev, bool runtime)
				return ret;
			}
		}

		nouveau_display_fini(dev, true, runtime);
		return 0;
	}

	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;
}

+1 −1
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ struct nouveau_display {
	void *priv;
	void (*dtor)(struct drm_device *);
	int  (*init)(struct drm_device *);
	void (*fini)(struct drm_device *);
	void (*fini)(struct drm_device *, bool suspend);

	struct nvif_disp disp;