Module Name:    src
Committed By:   riastradh
Date:           Fri Apr  4 16:02:34 UTC 2014

Modified Files:
        src/sys/external/bsd/drm2/i915drm: i915_pci.c

Log Message:
Tweak i915 framebuffer attachment in preparation for detach/reconfig.

Can't do this yet because genfb can't detach or reconfigure...


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 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/i915drm/i915_pci.c
diff -u src/sys/external/bsd/drm2/i915drm/i915_pci.c:1.4 src/sys/external/bsd/drm2/i915drm/i915_pci.c:1.5
--- src/sys/external/bsd/drm2/i915drm/i915_pci.c:1.4	Thu Apr  3 19:18:29 2014
+++ src/sys/external/bsd/drm2/i915drm/i915_pci.c	Fri Apr  4 16:02:34 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_pci.c,v 1.4 2014/04/03 19:18:29 riastradh Exp $	*/
+/*	$NetBSD: i915_pci.c,v 1.5 2014/04/04 16:02:34 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.4 2014/04/03 19:18:29 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_pci.c,v 1.5 2014/04/04 16:02:34 riastradh Exp $");
 
 #include <sys/types.h>
 #ifndef _MODULE
@@ -248,6 +248,7 @@ i915drm_attach_framebuffer(device_t self
 
 	INIT_LIST_HEAD(&sc->sc_fb_list);
 
+	KASSERT(dev_priv->fbdev == NULL);
 	dev_priv->fbdev = kmem_zalloc(sizeof(*dev_priv->fbdev), KM_SLEEP);
 
 	struct drm_fb_helper *const fb_helper = &dev_priv->fbdev->helper;
@@ -267,6 +268,8 @@ i915drm_attach_framebuffer(device_t self
 	/* Success!  */
 	return;
 
+fail1: __unused
+	drm_fb_helper_fini(fb_helper);
 fail0:	kmem_free(dev_priv->fbdev, sizeof(*dev_priv->fbdev));
 	dev_priv->fbdev = NULL;
 }
@@ -282,21 +285,9 @@ i915drm_detach_framebuffer(device_t self
 	if (fbdev != NULL) {
 		struct drm_fb_helper *const fb_helper = &fbdev->helper;
 
-		if (fb_helper->fb != NULL) {
-			struct drm_i915_gem_object *const obj = sc->sc_fb_obj;
-
-			/*
-			 * genfb children have already been detached,
-			 * so all we need do is unmap the space and
-			 * clean up the drm structures.
-			 */
-			bus_space_unmap(dev->bst, sc->sc_fb_bsh,
-			    obj->base.size);
-			drm_framebuffer_unreference(fb_helper->fb);
-			fb_helper->fb = NULL;
-			drm_gem_object_unreference_unlocked(&obj->base);
-			sc->sc_fb_obj = NULL;
-		}
+		if (fb_helper->fb != NULL)
+			i915drm_fb_detach(fb_helper);
+		KASSERT(fb_helper->fb == NULL);
 
 		KASSERT(sc->sc_fb_obj == NULL);
 		drm_fb_helper_fini(fb_helper);
@@ -336,9 +327,13 @@ i915drm_fb_probe(struct drm_fb_helper *f
 	    sizes->surface_depth);
 
 	if (fb_helper->fb != NULL) {
+#if notyet			/* XXX genfb detach */
+		i915drm_fb_detach(fb_helper);
+#else
 		aprint_debug_dev(sc->sc_dev, "already have a framebuffer"
 		    ": %p\n", fb_helper->fb);
 		return 0;
+#endif
 	}
 
 	/*
@@ -453,6 +448,22 @@ fail0:	KASSERT(ret < 0);
 }
 
 static void
+i915drm_fb_detach(struct drm_fb_helper *fb_helper)
+{
+	struct drm_device *const dev = fb_helper->dev;
+	struct i915drm_softc *const sc = container_of(dev,
+	    struct i915drm_softc, sc_drm_dev);
+	struct drm_i915_gem_object *const obj = sc->sc_fb_obj;
+
+	/* XXX How to detach genfb?  */
+	bus_space_unmap(dev->bst, sc->sc_fb_bsh, obj->base.size);
+	drm_framebuffer_unreference(fb_helper->fb);
+	fb_helper->fb = NULL;
+	drm_gem_object_unreference_unlocked(&obj->base);
+	sc->sc_fb_obj = NULL;
+}
+
+static void
 i915drm_fb_destroy(struct drm_framebuffer *fb)
 {
 

Reply via email to