Module Name: src
Committed By: riastradh
Date: Wed Jul 16 23:25:18 UTC 2014
Modified Files:
src/sys/external/bsd/drm2/dist/drm/i915: i915_dma.c i915_drv.c
i915_drv.h intel_uncore.c
src/sys/external/bsd/drm2/i915drm: i915_pci.c
Log Message:
Get suspend/resume sorta working for i915drm.
To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c
cvs rdiff -u -r1.4 -r1.5 src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c
cvs rdiff -u -r1.5 -r1.6 src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h
cvs rdiff -u -r1.3 -r1.4 \
src/sys/external/bsd/drm2/dist/drm/i915/intel_uncore.c
cvs rdiff -u -r1.11 -r1.12 src/sys/external/bsd/drm2/i915drm/i915_pci.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c:1.9 src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c:1.10
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c:1.9 Wed Jul 16 20:56:24 2014
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c Wed Jul 16 23:25:18 2014
@@ -1851,6 +1851,7 @@ out_gtt:
dev_priv->gtt.base.cleanup(&dev_priv->gtt.base);
out_regs:
intel_uncore_fini(dev);
+ intel_uncore_destroy(dev);
pci_iounmap(dev->pdev, dev_priv->regs);
put_bridge:
pci_dev_put(dev_priv->bridge_dev);
@@ -1966,6 +1967,7 @@ int i915_driver_unload(struct drm_device
dev_priv->gtt.base.cleanup(&dev_priv->gtt.base);
intel_uncore_fini(dev);
+ intel_uncore_destroy(dev);
if (dev_priv->regs != NULL)
pci_iounmap(dev->pdev, dev_priv->regs);
Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c:1.4 src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c:1.5
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c:1.4 Wed Jul 16 20:56:24 2014
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c Wed Jul 16 23:25:18 2014
@@ -427,7 +427,7 @@ bool i915_semaphore_is_enabled(struct dr
return true;
}
-static int i915_drm_freeze(struct drm_device *dev)
+int i915_drm_freeze(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;
struct drm_crtc *crtc;
@@ -563,7 +563,7 @@ static void intel_resume_hotplug(struct
drm_helper_hpd_irq_event(dev);
}
-static int i915_drm_thaw_early(struct drm_device *dev)
+int i915_drm_thaw_early(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;
@@ -644,15 +644,13 @@ static int __i915_drm_thaw(struct drm_de
return error;
}
-#ifndef __NetBSD__ /* XXX freeze/thaw */
-static int i915_drm_thaw(struct drm_device *dev)
+int i915_drm_thaw(struct drm_device *dev)
{
if (drm_core_check_feature(dev, DRIVER_MODESET))
i915_check_and_clear_faults(dev);
return __i915_drm_thaw(dev, true);
}
-#endif
static int i915_resume_early(struct drm_device *dev)
{
Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h:1.5 src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h:1.6
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h:1.5 Wed Jul 16 20:56:24 2014
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h Wed Jul 16 23:25:18 2014
@@ -2158,6 +2158,10 @@ extern int i915_resume(struct drm_device
extern int i915_master_create(struct drm_device *dev, struct drm_master *master);
extern void i915_master_destroy(struct drm_device *dev, struct drm_master *master);
+extern int i915_drm_freeze(struct drm_device *dev);
+extern int i915_drm_thaw_early(struct drm_device *dev);
+extern int i915_drm_thaw(struct drm_device *dev);
+
/* i915_params.c */
struct i915_params {
int modeset;
@@ -2230,6 +2234,7 @@ extern void intel_uncore_early_sanitize(
extern void intel_uncore_init(struct drm_device *dev);
extern void intel_uncore_check_errors(struct drm_device *dev);
extern void intel_uncore_fini(struct drm_device *dev);
+extern void intel_uncore_destroy(struct drm_device *dev);
void
i915_enable_pipestat(struct drm_i915_private *dev_priv, enum pipe pipe,
Index: src/sys/external/bsd/drm2/dist/drm/i915/intel_uncore.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/intel_uncore.c:1.3 src/sys/external/bsd/drm2/dist/drm/i915/intel_uncore.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/i915/intel_uncore.c:1.3 Wed Jul 16 20:56:25 2014
+++ src/sys/external/bsd/drm2/dist/drm/i915/intel_uncore.c Wed Jul 16 23:25:18 2014
@@ -868,14 +868,16 @@ void intel_uncore_init(struct drm_device
void intel_uncore_fini(struct drm_device *dev)
{
-#ifdef __NetBSD__
- struct drm_i915_private *const dev_priv = dev->dev_private;
-#endif
-
/* Paranoia: make sure we have disabled everything before we exit. */
intel_uncore_sanitize(dev);
intel_uncore_forcewake_reset(dev, false);
+}
+
+void intel_uncore_destroy(struct drm_device *dev)
+{
#ifdef __NetBSD__
+ struct drm_i915_private *const dev_priv = dev->dev_private;
+
teardown_timer(&dev_priv->uncore.force_wake_timer);
#endif
}
Index: src/sys/external/bsd/drm2/i915drm/i915_pci.c
diff -u src/sys/external/bsd/drm2/i915drm/i915_pci.c:1.11 src/sys/external/bsd/drm2/i915drm/i915_pci.c:1.12
--- src/sys/external/bsd/drm2/i915drm/i915_pci.c:1.11 Wed Jul 16 20:56:25 2014
+++ src/sys/external/bsd/drm2/i915drm/i915_pci.c Wed Jul 16 23:25:18 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: i915_pci.c,v 1.11 2014/07/16 20:56:25 riastradh Exp $ */
+/* $NetBSD: i915_pci.c,v 1.12 2014/07/16 23:25:18 riastradh Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_pci.c,v 1.11 2014/07/16 20:56:25 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_pci.c,v 1.12 2014/07/16 23:25:18 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "vga.h"
@@ -94,6 +94,9 @@ static int i915drmkms_match(device_t, cf
static void i915drmkms_attach(device_t, device_t, void *);
static int i915drmkms_detach(device_t, int);
+static bool i915drmkms_suspend(device_t, const pmf_qual_t *);
+static bool i915drmkms_resume(device_t, const pmf_qual_t *);
+
static void intel_genfb_defer_set_config(struct drm_fb_helper *);
static void intel_genfb_set_config_work(struct work *, void *);
static void intel_genfb_set_config(struct intel_genfb_work *);
@@ -190,6 +193,10 @@ i915drmkms_attach(device_t parent, devic
pci_aprint_devinfo(pa, NULL);
+ if (!pmf_device_register(self, &i915drmkms_suspend,
+ &i915drmkms_resume))
+ aprint_error_dev(self, "unable to establish power handler\n");
+
SIMPLEQ_INIT(&sc->sc_genfb_work);
/* XXX errno Linux->NetBSD */
@@ -229,19 +236,58 @@ i915drmkms_detach(device_t self, int fla
return error;
if (sc->sc_genfb_wq == NULL)
- return 0;
+ goto out;
workqueue_destroy(sc->sc_genfb_wq);
if (sc->sc_drm_dev == NULL)
- return 0;
+ goto out;
/* XXX errno Linux->NetBSD */
error = -drm_pci_detach(sc->sc_drm_dev, flags);
if (error)
return error;
+ sc->sc_drm_dev = NULL;
+out: pmf_device_deregister(self);
return 0;
}
+static bool
+i915drmkms_suspend(device_t self, const pmf_qual_t *qual)
+{
+ struct i915drmkms_softc *const sc = device_private(self);
+ struct drm_device *const dev = sc->sc_drm_dev;
+ int ret;
+
+ if (dev == NULL)
+ return true;
+
+ ret = i915_drm_freeze(dev);
+ if (ret)
+ return false;
+
+ return true;
+}
+
+static bool
+i915drmkms_resume(device_t self, const pmf_qual_t *qual)
+{
+ struct i915drmkms_softc *const sc = device_private(self);
+ struct drm_device *const dev = sc->sc_drm_dev;
+ int ret;
+
+ if (dev == NULL)
+ return true;
+
+ ret = i915_drm_thaw_early(dev);
+ if (ret)
+ return false;
+ ret = i915_drm_thaw(dev);
+ if (ret)
+ return false;
+
+ return true;
+}
+
int
intel_genfb_attach(struct drm_device *dev, struct drm_fb_helper *helper,
const struct drm_fb_helper_surface_size *sizes)