Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys Rework Intel framebuffer attachment.



details:   https://anonhg.NetBSD.org/src/rev/6df5c5033847
branches:  trunk
changeset: 330875:6df5c5033847
user:      riastradh <riastradh%NetBSD.org@localhost>
date:      Thu Jul 24 21:18:40 2014 +0000

description:
Rework Intel framebuffer attachment.

Turns out genfb_softc must be at the start of its own device_private,
so we can't have it in the middle of a structure, and certainly can't
have potentially multiple genfbs per graphics device.  Failing to do
this is why entering ddb didn't work with an i915drmkms console.

Instead of putting a genfb_softc into each drm_fb_helper, put a
device_t into each drm_fb_helper and create a new intelfb(4) device
for each Intel framebuffer.  This will be more flexible, too, in case
we want accelerated framebuffers later on.  (XXX Need to adapt the
radeon code, which I'm disabling until that happens to avoid breaking
the build.)

While here, defer disabling VGA, vga_cndetach, and genfb_attach until
we're actually ready to do them all together along with the mode
switch.  This should reduce the amount of time during which the
screen is blanked, in case it hangs.

diffstat:

 sys/arch/amd64/conf/DRMKMS                             |    4 +-
 sys/external/bsd/drm2/dist/drm/i915/i915_drv.h         |    1 +
 sys/external/bsd/drm2/dist/drm/i915/intel_display.c    |    6 +-
 sys/external/bsd/drm2/dist/drm/i915/intel_fbdev.c      |   59 +-
 sys/external/bsd/drm2/dist/include/drm/drm_fb_helper.h |   11 +-
 sys/external/bsd/drm2/i915drm/files.i915drmkms         |   11 +-
 sys/external/bsd/drm2/i915drm/i915_pci.c               |  427 +--------------
 sys/external/bsd/drm2/i915drm/i915_pci.h               |   56 ++
 sys/external/bsd/drm2/i915drm/intelfb.c                |  434 +++++++++++++++++
 sys/external/bsd/drm2/i915drm/intelfb.h                |   50 +
 sys/modules/i915drmkms/Makefile                        |    4 +-
 sys/modules/i915drmkms/i915drmkms.ioconf               |    4 +-
 12 files changed, 646 insertions(+), 421 deletions(-)

diffs (truncated from 1295 to 300 lines):

diff -r c7f3d0eb4351 -r 6df5c5033847 sys/arch/amd64/conf/DRMKMS
--- a/sys/arch/amd64/conf/DRMKMS        Thu Jul 24 21:10:26 2014 +0000
+++ b/sys/arch/amd64/conf/DRMKMS        Thu Jul 24 21:18:40 2014 +0000
@@ -1,7 +1,9 @@
 include "arch/amd64/conf/NO_DRM"
 
 i915drmkms*    at pci? dev ? function ?
-radeondrmkms*  at pci? dev ? function ?
+intelfb*       at intelfbbus?
+#nouveau*      at pci? dev ? function ?
+#radeondrmkms* at pci? dev ? function ?
 
 no options     DIAGNOSTIC
 options        DIAGNOSTIC      # expensive kernel consistency check
diff -r c7f3d0eb4351 -r 6df5c5033847 sys/external/bsd/drm2/dist/drm/i915/i915_drv.h
--- a/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h    Thu Jul 24 21:10:26 2014 +0000
+++ b/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h    Thu Jul 24 21:18:40 2014 +0000
@@ -2756,6 +2756,7 @@
 #endif /* CONFIG_ACPI */
 
 /* modesetting */
+extern void i915_disable_vga(struct drm_device *dev);
 extern void intel_modeset_init_hw(struct drm_device *dev);
 extern void intel_modeset_suspend_hw(struct drm_device *dev);
 extern void intel_modeset_init(struct drm_device *dev);
diff -r c7f3d0eb4351 -r 6df5c5033847 sys/external/bsd/drm2/dist/drm/i915/intel_display.c
--- a/sys/external/bsd/drm2/dist/drm/i915/intel_display.c       Thu Jul 24 21:10:26 2014 +0000
+++ b/sys/external/bsd/drm2/dist/drm/i915/intel_display.c       Thu Jul 24 21:18:40 2014 +0000
@@ -11318,7 +11318,7 @@
 }
 
 /* Disable the VGA plane that we never use */
-static void i915_disable_vga(struct drm_device *dev)
+void i915_disable_vga(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        u8 sr1;
@@ -11326,7 +11326,7 @@
 
 #ifdef __NetBSD__
     {
-       const bus_size_t vgabase = 0x3c0;
+       const bus_addr_t vgabase = 0x3c0;
        const bus_space_tag_t iot = dev->pdev->pd_pa.pa_iot;
        bus_space_handle_t ioh;
        int error;
@@ -11435,8 +11435,10 @@
        intel_cpu_pll_init(dev);
        intel_shared_dpll_init(dev);
 
+#ifndef __NetBSD__             /* XXX We wait until intelfb is ready.  */
        /* Just disable it once at startup */
        i915_disable_vga(dev);
+#endif
        intel_setup_outputs(dev);
 
        /* Just in case the BIOS is doing something questionable. */
diff -r c7f3d0eb4351 -r 6df5c5033847 sys/external/bsd/drm2/dist/drm/i915/intel_fbdev.c
--- a/sys/external/bsd/drm2/dist/drm/i915/intel_fbdev.c Thu Jul 24 21:10:26 2014 +0000
+++ b/sys/external/bsd/drm2/dist/drm/i915/intel_fbdev.c Thu Jul 24 21:18:40 2014 +0000
@@ -44,6 +44,8 @@
 #include <drm/i915_drm.h>
 #include "i915_drv.h"
 
+#include "intelfb.h"
+
 #ifndef __NetBSD__
 static struct fb_ops intelfb_ops = {
        .owner = THIS_MODULE,
@@ -174,30 +176,31 @@
        size = obj->base.size;
 
 #ifdef __NetBSD__
-       /* XXX errno NetBSD->Linux */
-       helper->fb_bst = dev->pdev->pd_pa.pa_memt;
-       ret = -bus_space_map(helper->fb_bst,
-           (dev_priv->gtt.mappable_base + i915_gem_obj_ggtt_offset(obj)),
-           size, (BUS_SPACE_MAP_LINEAR | BUS_SPACE_MAP_PREFETCHABLE),
-           &helper->fb_bsh);
-       if (ret) {
-               DRM_ERROR("unable to map framebuffer: %d\n", ret);
+    {
+       static const struct intelfb_attach_args zero_ifa;
+       struct intelfb_attach_args ifa = zero_ifa;
+
+       ifa.ifa_drm_dev = dev;
+       ifa.ifa_fb_helper = helper;
+       ifa.ifa_fb_sizes = *sizes;
+       ifa.ifa_fb_bst = dev->pdev->pd_pa.pa_memt;
+       ifa.ifa_fb_addr = (dev_priv->gtt.mappable_base +
+           i915_gem_obj_ggtt_offset(obj));
+       ifa.ifa_fb_size = size;
+       ifa.ifa_fb_zero = (ifbdev->fb->obj->stolen && !prealloc);
+
+       /*
+        * XXX Should do this asynchronously, since we hold
+        * dev->struct_mutex.
+        */
+       helper->fbdev = config_found_ia(dev->dev, "intelfbbus", &ifa, NULL);
+       if (helper->fbdev == NULL) {
+               DRM_ERROR("unable to attach intelfb\n");
                goto out_unpin;
        }
-
-       ret = intel_genfb_attach(dev, helper, sizes);
-       if (ret) {
-               DRM_ERROR("unable to attach genfb: %d\n", ret);
-               bus_space_unmap(helper->fb_bst, helper->fb_bsh, size);
-               goto out_unpin;
-       }
-       helper->genfb_attached = true;
        fb = &ifbdev->fb->base;
        ifbdev->helper.fb = fb;
-
-       if (ifbdev->fb->obj->stolen && !prealloc)
-               bus_space_set_region_1(helper->fb_bst, helper->fb_bsh, 0, 0,
-                   size);
+    }
 #else
        info = framebuffer_alloc(0, &dev->pdev->dev);
        if (!info) {
@@ -503,13 +506,15 @@
                                struct intel_fbdev *ifbdev)
 {
 #ifdef __NetBSD__
-       if (ifbdev->helper.genfb_attached) {
-               /* XXX genfb doesn't give us a child device_t!  */
-               (void)config_detach_children(dev->dev, DETACH_FORCE);
-               bus_space_unmap(ifbdev->helper.fb_bst, ifbdev->helper.fb_bsh,
-                   ifbdev->fb->obj->base.size);
-               ifbdev->helper.genfb_attached = false;
-       }
+       int ret;
+#endif
+
+#ifdef __NetBSD__
+       /* XXX errno NetBSD->Linux */
+       ret = -config_detach(ifbdev->helper.fbdev, DETACH_FORCE);
+       if (ret)
+               DRM_ERROR("failed to detach intelfb: %d\n", ret);
+       ifbdev->helper.fbdev = NULL;
 #else
        if (ifbdev->helper.fbdev) {
                struct fb_info *info = ifbdev->helper.fbdev;
diff -r c7f3d0eb4351 -r 6df5c5033847 sys/external/bsd/drm2/dist/include/drm/drm_fb_helper.h
--- a/sys/external/bsd/drm2/dist/include/drm/drm_fb_helper.h    Thu Jul 24 21:10:26 2014 +0000
+++ b/sys/external/bsd/drm2/dist/include/drm/drm_fb_helper.h    Thu Jul 24 21:18:40 2014 +0000
@@ -35,7 +35,7 @@
 #include <linux/kgdb.h>
 
 #ifdef __NetBSD__
-#include <dev/wsfb/genfbvar.h>
+#include <sys/device_if.h>
 #endif
 
 struct drm_fb_helper_crtc {
@@ -93,14 +93,7 @@
        struct drm_fb_helper_connector **connector_info;
        struct drm_fb_helper_funcs *funcs;
 #ifdef __NetBSD__              /* XXX fb info */
-       bus_space_tag_t fb_bst;
-       bus_space_handle_t fb_bsh;
-       /*
-        * XXX Should be a child, not genfb, but genfb doesn't have its
-        * own independent device_t concept.
-        */
-       struct genfb_softc genfb;
-       bool genfb_attached:1;
+       device_t fbdev;
 #else
        struct fb_info *fbdev;
 #endif
diff -r c7f3d0eb4351 -r 6df5c5033847 sys/external/bsd/drm2/i915drm/files.i915drmkms
--- a/sys/external/bsd/drm2/i915drm/files.i915drmkms    Thu Jul 24 21:10:26 2014 +0000
+++ b/sys/external/bsd/drm2/i915drm/files.i915drmkms    Thu Jul 24 21:18:40 2014 +0000
@@ -1,9 +1,14 @@
-#      $NetBSD: files.i915drmkms,v 1.3 2014/07/16 20:56:25 riastradh Exp $
+#      $NetBSD: files.i915drmkms,v 1.4 2014/07/24 21:18:40 riastradh Exp $
 
-device i915drmkms: drmkms, drmkms_pci, genfb, wsemuldisplaydev
+define intelfbbus      { }
+device i915drmkms: drmkms, drmkms_pci, intelfbbus
 attach i915drmkms at pci
 
+device intelfb: intelfbbus, genfb, wsemuldisplaydev
+attach intelfb at intelfbbus
+
 makeoptions    i915drmkms      CPPFLAGS+="-I$S/external/bsd/drm2/dist/drm/i915"
+makeoptions    i915drmkms      CPPFLAGS+="-I$S/external/bsd/drm2/i915drm"
 
 makeoptions    i915drmkms      "CWARNFLAGS.i915_drv.c"+="-Wno-override-init"
 makeoptions    i915drmkms      "CWARNFLAGS.intel_display.c"+="-Wno-shadow"
@@ -71,3 +76,5 @@
 file   external/bsd/drm2/i915drm/i915_module.c         i915drmkms
 file   external/bsd/drm2/i915drm/i915_pci.c            i915drmkms
 file   external/bsd/drm2/i915drm/intel_gtt.c           i915drmkms
+
+file   external/bsd/drm2/i915drm/intelfb.c             intelfb
diff -r c7f3d0eb4351 -r 6df5c5033847 sys/external/bsd/drm2/i915drm/i915_pci.c
--- a/sys/external/bsd/drm2/i915drm/i915_pci.c  Thu Jul 24 21:10:26 2014 +0000
+++ b/sys/external/bsd/drm2/i915drm/i915_pci.c  Thu Jul 24 21:18:40 2014 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: i915_pci.c,v 1.13 2014/07/23 18:05:44 riastradh Exp $  */
+/*     $NetBSD: i915_pci.c,v 1.14 2014/07/24 21:18:40 riastradh Exp $  */
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,61 +30,33 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_pci.c,v 1.13 2014/07/23 18:05:44 riastradh Exp $");
-
-#ifdef _KERNEL_OPT
-#include "vga.h"
-#endif
+__KERNEL_RCSID(0, "$NetBSD: i915_pci.c,v 1.14 2014/07/24 21:18:40 riastradh Exp $");
 
 #include <sys/types.h>
 #include <sys/queue.h>
 #include <sys/systm.h>
+#include <sys/queue.h>
 #include <sys/workqueue.h>
 
-#include <dev/pci/pciio.h>
-#include <dev/pci/pcireg.h>
-#include <dev/pci/pcivar.h>
-
-#include <dev/pci/wsdisplay_pci.h>
-#include <dev/wsfb/genfbvar.h>
-
-#if NVGA > 0
-/*
- * XXX All we really need is vga_is_console from vgavar.h, but the
- * header files are missing their own dependencies, so we need to
- * explicitly drag in the other crap.
- */
-#include <dev/ic/mc6845reg.h>
-#include <dev/ic/pcdisplayvar.h>
-#include <dev/ic/vgareg.h>
-#include <dev/ic/vgavar.h>
-#endif
-
 #include <drm/drmP.h>
 
 #include "i915_drv.h"
+#include "i915_pci.h"
 
-struct intel_genfb_work;
-SIMPLEQ_HEAD(intel_genfb_work_head, intel_genfb_work);
+SIMPLEQ_HEAD(i915drmkms_task_head, i915drmkms_task);
 
 struct i915drmkms_softc {
        device_t                        sc_dev;
-       struct workqueue                *sc_genfb_wq;
-       struct intel_genfb_work_head    sc_genfb_work;
+       enum {
+               I915DRMKMS_TASK_ATTACH,
+               I915DRMKMS_TASK_WORKQUEUE,
+       }                               sc_task_state;
+       union {
+               struct workqueue                *workqueue;
+               struct i915drmkms_task_head     attach;
+       }                               sc_task_u;
        struct drm_device               *sc_drm_dev;
        struct pci_dev                  sc_pci_dev;
-#if 0                          /* XXX backlight/brightness */
-       struct genfb_parameter_callback sc_genfb_backlight_callback;
-       struct genfb_parameter_callback sc_genfb_brightness_callback;
-#endif
-};
-
-struct intel_genfb_work {
-       struct drm_fb_helper    *igw_fb_helper;
-       union {
-               SIMPLEQ_ENTRY(intel_genfb_work) queue;
-               struct work                     work;
-       }                       igw_u;
 };
 
 static const struct intel_device_info *
@@ -97,22 +69,7 @@
 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 *);
-static int     intel_genfb_dpms(struct drm_device *, int);
-static int     intel_genfb_ioctl(void *, void *, unsigned long, void *,
-                   int, struct lwp *);
-static paddr_t intel_genfb_mmap(void *, void *, off_t, int);
-
-#if 0                          /* XXX backlight/brightness */
-static int     intel_genfb_get_backlight(void *, int *);
-static int     intel_genfb_set_backlight(void *, int);
-static int     intel_genfb_upd_backlight(void *, int);
-static int     intel_genfb_get_brightness(void *, int *);
-static int     intel_genfb_set_brightness(void *, int);
-static int     intel_genfb_upd_brightness(void *, int);



Home | Main Index | Thread Index | Old Index