diff options
Diffstat (limited to 'sys/dev/drm2/i915')
-rw-r--r-- | sys/dev/drm2/i915/i915_drv.c | 25 | ||||
-rw-r--r-- | sys/dev/drm2/i915/intel_fb.c | 19 |
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); |