mirror of https://gitee.com/openkylin/linux.git
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:
parent
fcd6f04838
commit
f04a4186af
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue