summaryrefslogtreecommitdiffstats
path: root/sys/dev/drm2/i915
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/drm2/i915')
-rw-r--r--sys/dev/drm2/i915/i915_drv.c25
-rw-r--r--sys/dev/drm2/i915/intel_fb.c19
2 files changed, 39 insertions, 5 deletions
diff --git a/sys/dev/drm2/i915/i915_drv.c b/sys/dev/drm2/i915/i915_drv.c
index a6bbb7d..85ac10e 100644
--- a/sys/dev/drm2/i915/i915_drv.c
+++ b/sys/dev/drm2/i915/i915_drv.c
@@ -40,6 +40,8 @@ __FBSDID("$FreeBSD$");
#include <dev/drm2/drm_pciids.h>
#include <dev/drm2/i915/intel_drv.h>
+#include "fb_if.h"
+
/* drv_PCI_IDs comes from drm_pciids.h, generated from drm_pciids.txt. */
static drm_pci_id_list_t i915_pciidlist[] = {
i915_PCI_IDS
@@ -380,6 +382,25 @@ i915_attach(device_t kdev)
return (drm_attach(kdev, i915_pciidlist));
}
+static struct fb_info *
+i915_fb_helper_getinfo(device_t kdev)
+{
+ struct intel_fbdev *ifbdev;
+ drm_i915_private_t *dev_priv;
+ struct drm_device *dev;
+ struct fb_info *info;
+
+ dev = device_get_softc(kdev);
+ dev_priv = dev->dev_private;
+ ifbdev = dev_priv->fbdev;
+ if (ifbdev == NULL)
+ return (NULL);
+
+ info = ifbdev->helper.fbdev;
+
+ return (info);
+}
+
const struct intel_device_info *
i915_get_device_id(int device)
{
@@ -400,6 +421,10 @@ static device_method_t i915_methods[] = {
DEVMETHOD(device_suspend, i915_suspend),
DEVMETHOD(device_resume, i915_resume),
DEVMETHOD(device_detach, drm_detach),
+
+ /* Framebuffer service methods */
+ DEVMETHOD(fb_getinfo, i915_fb_helper_getinfo),
+
DEVMETHOD_END
};
diff --git a/sys/dev/drm2/i915/intel_fb.c b/sys/dev/drm2/i915/intel_fb.c
index e41a49f..2957920 100644
--- a/sys/dev/drm2/i915/intel_fb.c
+++ b/sys/dev/drm2/i915/intel_fb.c
@@ -41,8 +41,8 @@ static int intelfb_create(struct intel_fbdev *ifbdev,
struct drm_device *dev = ifbdev->helper.dev;
#if 0
struct drm_i915_private *dev_priv = dev->dev_private;
- struct fb_info *info;
#endif
+ struct fb_info *info;
struct drm_framebuffer *fb;
struct drm_mode_fb_cmd2 mode_cmd;
struct drm_i915_gem_object *obj;
@@ -86,6 +86,16 @@ static int intelfb_create(struct intel_fbdev *ifbdev,
}
info->par = ifbdev;
+#else
+ info = malloc(sizeof(struct fb_info), DRM_MEM_KMS, M_WAITOK | M_ZERO);
+ info->fb_size = size;
+ info->fb_bpp = sizes->surface_bpp;
+ info->fb_width = sizes->fb_width;
+ info->fb_height = sizes->fb_height;
+ info->fb_pbase = dev->agp->base + obj->gtt_offset;
+ info->fb_vbase = (vm_offset_t)pmap_mapdev_attr(info->fb_pbase, size,
+ PAT_WRITE_COMBINING);
+
#endif
ret = intel_framebuffer_init(dev, &ifbdev->ifb, &mode_cmd, obj);
@@ -95,8 +105,8 @@ static int intelfb_create(struct intel_fbdev *ifbdev,
fb = &ifbdev->ifb.base;
ifbdev->helper.fb = fb;
-#if 0
ifbdev->helper.fbdev = info;
+#if 0
strcpy(info->fix.id, "inteldrmfb");
@@ -135,9 +145,8 @@ static int intelfb_create(struct intel_fbdev *ifbdev,
/* Use default scratch pixmap (info->pixmap.flags = FB_PIXMAP_SYSTEM) */
#endif
-
- DRM_DEBUG_KMS("allocated %dx%d fb: 0x%08x, bo %p\n",
- fb->width, fb->height,
+ DRM_DEBUG_KMS("allocated %dx%d (s %dbits) fb: 0x%08x, bo %p\n",
+ fb->width, fb->height, fb->depth,
obj->gtt_offset, obj);
DRM_UNLOCK(dev);
OpenPOWER on IntegriCloud