4040#include <drm/drm_crtc.h>
4141#include <drm/drm_fb_helper.h>
4242#include <drm/drm_fourcc.h>
43+ #include <drm/drm_gem_framebuffer_helper.h>
4344
4445#include "gem/i915_gem_lmem.h"
46+ #include "gem/i915_gem_mman.h"
4547
4648#include "i915_drv.h"
4749#include "intel_display_types.h"
@@ -67,6 +69,11 @@ struct intel_fbdev {
6769 struct mutex hpd_lock ;
6870};
6971
72+ static struct intel_fbdev * to_intel_fbdev (struct drm_fb_helper * fb_helper )
73+ {
74+ return container_of (fb_helper , struct intel_fbdev , helper );
75+ }
76+
7077static struct intel_frontbuffer * to_frontbuffer (struct intel_fbdev * ifbdev )
7178{
7279 return ifbdev -> fb -> frontbuffer ;
@@ -79,9 +86,7 @@ static void intel_fbdev_invalidate(struct intel_fbdev *ifbdev)
7986
8087static int intel_fbdev_set_par (struct fb_info * info )
8188{
82- struct drm_fb_helper * fb_helper = info -> par ;
83- struct intel_fbdev * ifbdev =
84- container_of (fb_helper , struct intel_fbdev , helper );
89+ struct intel_fbdev * ifbdev = to_intel_fbdev (info -> par );
8590 int ret ;
8691
8792 ret = drm_fb_helper_set_par (info );
@@ -93,9 +98,7 @@ static int intel_fbdev_set_par(struct fb_info *info)
9398
9499static int intel_fbdev_blank (int blank , struct fb_info * info )
95100{
96- struct drm_fb_helper * fb_helper = info -> par ;
97- struct intel_fbdev * ifbdev =
98- container_of (fb_helper , struct intel_fbdev , helper );
101+ struct intel_fbdev * ifbdev = to_intel_fbdev (info -> par );
99102 int ret ;
100103
101104 ret = drm_fb_helper_blank (blank , info );
@@ -108,9 +111,7 @@ static int intel_fbdev_blank(int blank, struct fb_info *info)
108111static int intel_fbdev_pan_display (struct fb_var_screeninfo * var ,
109112 struct fb_info * info )
110113{
111- struct drm_fb_helper * fb_helper = info -> par ;
112- struct intel_fbdev * ifbdev =
113- container_of (fb_helper , struct intel_fbdev , helper );
114+ struct intel_fbdev * ifbdev = to_intel_fbdev (info -> par );
114115 int ret ;
115116
116117 ret = drm_fb_helper_pan_display (var , info );
@@ -120,6 +121,15 @@ static int intel_fbdev_pan_display(struct fb_var_screeninfo *var,
120121 return ret ;
121122}
122123
124+ static int intel_fbdev_mmap (struct fb_info * info , struct vm_area_struct * vma )
125+ {
126+ struct intel_fbdev * fbdev = to_intel_fbdev (info -> par );
127+ struct drm_gem_object * bo = drm_gem_fb_get_obj (& fbdev -> fb -> base , 0 );
128+ struct drm_i915_gem_object * obj = to_intel_bo (bo );
129+
130+ return i915_gem_fb_mmap (obj , vma );
131+ }
132+
123133static const struct fb_ops intelfb_ops = {
124134 .owner = THIS_MODULE ,
125135 DRM_FB_HELPER_DEFAULT_OPS ,
@@ -131,13 +141,13 @@ static const struct fb_ops intelfb_ops = {
131141 .fb_imageblit = drm_fb_helper_cfb_imageblit ,
132142 .fb_pan_display = intel_fbdev_pan_display ,
133143 .fb_blank = intel_fbdev_blank ,
144+ .fb_mmap = intel_fbdev_mmap ,
134145};
135146
136147static int intelfb_alloc (struct drm_fb_helper * helper ,
137148 struct drm_fb_helper_surface_size * sizes )
138149{
139- struct intel_fbdev * ifbdev =
140- container_of (helper , struct intel_fbdev , helper );
150+ struct intel_fbdev * ifbdev = to_intel_fbdev (helper );
141151 struct drm_framebuffer * fb ;
142152 struct drm_device * dev = helper -> dev ;
143153 struct drm_i915_private * dev_priv = to_i915 (dev );
@@ -163,7 +173,8 @@ static int intelfb_alloc(struct drm_fb_helper *helper,
163173 obj = ERR_PTR (- ENODEV );
164174 if (HAS_LMEM (dev_priv )) {
165175 obj = i915_gem_object_create_lmem (dev_priv , size ,
166- I915_BO_ALLOC_CONTIGUOUS );
176+ I915_BO_ALLOC_CONTIGUOUS |
177+ I915_BO_ALLOC_USER );
167178 } else {
168179 /*
169180 * If the FB is too big, just don't use it since fbdev is not very
@@ -193,8 +204,7 @@ static int intelfb_alloc(struct drm_fb_helper *helper,
193204static int intelfb_create (struct drm_fb_helper * helper ,
194205 struct drm_fb_helper_surface_size * sizes )
195206{
196- struct intel_fbdev * ifbdev =
197- container_of (helper , struct intel_fbdev , helper );
207+ struct intel_fbdev * ifbdev = to_intel_fbdev (helper );
198208 struct intel_framebuffer * intel_fb = ifbdev -> fb ;
199209 struct drm_device * dev = helper -> dev ;
200210 struct drm_i915_private * dev_priv = to_i915 (dev );
0 commit comments