43
43
#include <drm/drm_fourcc.h>
44
44
#include <drm/drm_gem.h>
45
45
#include <drm/drm_gem_framebuffer_helper.h>
46
+ #include <drm/drm_managed.h>
46
47
#include <drm/drm_print.h>
47
48
48
49
#include "i915_drv.h"
56
57
#include "intel_frontbuffer.h"
57
58
58
59
struct intel_fbdev {
59
- struct drm_fb_helper helper ;
60
60
struct intel_framebuffer * fb ;
61
61
struct i915_vma * vma ;
62
62
unsigned long vma_flags ;
63
63
};
64
64
65
65
static struct intel_fbdev * to_intel_fbdev (struct drm_fb_helper * fb_helper )
66
66
{
67
- return container_of (fb_helper , struct intel_fbdev , helper );
67
+ struct drm_i915_private * i915 = to_i915 (fb_helper -> client .dev );
68
+
69
+ return i915 -> display .fbdev .fbdev ;
68
70
}
69
71
70
72
static struct intel_frontbuffer * to_frontbuffer (struct intel_fbdev * ifbdev )
@@ -120,30 +122,30 @@ static int intel_fbdev_pan_display(struct fb_var_screeninfo *var,
120
122
121
123
static int intel_fbdev_mmap (struct fb_info * info , struct vm_area_struct * vma )
122
124
{
123
- struct intel_fbdev * fbdev = to_intel_fbdev ( info -> par ) ;
124
- struct drm_gem_object * obj = drm_gem_fb_get_obj (& fbdev -> fb -> base , 0 );
125
+ struct drm_fb_helper * fb_helper = info -> par ;
126
+ struct drm_gem_object * obj = drm_gem_fb_get_obj (fb_helper -> fb , 0 );
125
127
126
128
return intel_bo_fb_mmap (obj , vma );
127
129
}
128
130
129
131
static void intel_fbdev_fb_destroy (struct fb_info * info )
130
132
{
131
133
struct drm_fb_helper * fb_helper = info -> par ;
132
- struct intel_fbdev * ifbdev = container_of (fb_helper , struct intel_fbdev , helper );
134
+ struct intel_fbdev * ifbdev = to_intel_fbdev (fb_helper );
133
135
134
- drm_fb_helper_fini (& ifbdev -> helper );
136
+ drm_fb_helper_fini (fb_helper );
135
137
136
138
/*
137
139
* We rely on the object-free to release the VMA pinning for
138
140
* the info->screen_base mmaping. Leaking the VMA is simpler than
139
141
* trying to rectify all the possible error paths leading here.
140
142
*/
141
143
intel_fb_unpin_vma (ifbdev -> vma , ifbdev -> vma_flags );
142
- drm_framebuffer_remove (& ifbdev -> fb -> base );
144
+ drm_framebuffer_remove (fb_helper -> fb );
143
145
144
146
drm_client_release (& fb_helper -> client );
145
- drm_fb_helper_unprepare (& ifbdev -> helper );
146
- kfree (ifbdev );
147
+ drm_fb_helper_unprepare (fb_helper );
148
+ kfree (fb_helper );
147
149
}
148
150
149
151
__diag_push ();
@@ -227,7 +229,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
227
229
goto out_unpin ;
228
230
}
229
231
230
- ifbdev -> helper . fb = & fb -> base ;
232
+ helper -> fb = & fb -> base ;
231
233
232
234
info -> fbops = & intelfb_ops ;
233
235
@@ -237,7 +239,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
237
239
if (ret )
238
240
goto out_unpin ;
239
241
240
- drm_fb_helper_fill_info (info , & ifbdev -> helper , sizes );
242
+ drm_fb_helper_fill_info (info , dev -> fb_helper , sizes );
241
243
242
244
/* If the object is shmemfs backed, it will have given us zeroed pages.
243
245
* If the object is stolen however, it will be full of whatever
@@ -528,13 +530,14 @@ void intel_fbdev_set_suspend(struct drm_device *dev, int state, bool synchronous
528
530
}
529
531
}
530
532
531
- drm_fb_helper_set_suspend (& ifbdev -> helper , state );
533
+ drm_fb_helper_set_suspend (dev -> fb_helper , state );
532
534
console_unlock ();
533
535
}
534
536
535
537
static int intel_fbdev_restore_mode (struct drm_i915_private * dev_priv )
536
538
{
537
539
struct intel_fbdev * ifbdev = dev_priv -> display .fbdev .fbdev ;
540
+ struct drm_device * dev = & dev_priv -> drm ;
538
541
int ret ;
539
542
540
543
if (!ifbdev )
@@ -543,7 +546,7 @@ static int intel_fbdev_restore_mode(struct drm_i915_private *dev_priv)
543
546
if (!ifbdev -> vma )
544
547
return - ENOMEM ;
545
548
546
- ret = drm_fb_helper_restore_fbdev_mode_unlocked (& ifbdev -> helper );
549
+ ret = drm_fb_helper_restore_fbdev_mode_unlocked (dev -> fb_helper );
547
550
if (ret )
548
551
return ret ;
549
552
@@ -640,13 +643,14 @@ void intel_fbdev_setup(struct drm_i915_private *i915)
640
643
{
641
644
struct drm_device * dev = & i915 -> drm ;
642
645
struct intel_fbdev * ifbdev ;
646
+ struct drm_fb_helper * fb_helper ;
643
647
unsigned int preferred_bpp = 0 ;
644
648
int ret ;
645
649
646
650
if (!HAS_DISPLAY (i915 ))
647
651
return ;
648
652
649
- ifbdev = kzalloc ( sizeof (* ifbdev ), GFP_KERNEL );
653
+ ifbdev = drmm_kzalloc ( dev , sizeof (* ifbdev ), GFP_KERNEL );
650
654
if (!ifbdev )
651
655
return ;
652
656
@@ -657,30 +661,33 @@ void intel_fbdev_setup(struct drm_i915_private *i915)
657
661
if (!preferred_bpp )
658
662
preferred_bpp = 32 ;
659
663
660
- drm_fb_helper_prepare (dev , & ifbdev -> helper , preferred_bpp , & intel_fb_helper_funcs );
664
+ fb_helper = kzalloc (sizeof (* fb_helper ), GFP_KERNEL );
665
+ if (!fb_helper )
666
+ return ;
667
+ drm_fb_helper_prepare (dev , fb_helper , preferred_bpp , & intel_fb_helper_funcs );
661
668
662
- ret = drm_client_init (dev , & ifbdev -> helper . client , "intel-fbdev" ,
669
+ ret = drm_client_init (dev , & fb_helper -> client , "intel-fbdev" ,
663
670
& intel_fbdev_client_funcs );
664
671
if (ret ) {
665
672
drm_err (dev , "Failed to register client: %d\n" , ret );
666
673
goto err_drm_fb_helper_unprepare ;
667
674
}
668
675
669
- drm_client_register (& ifbdev -> helper . client );
676
+ drm_client_register (& fb_helper -> client );
670
677
671
678
return ;
672
679
673
680
err_drm_fb_helper_unprepare :
674
- drm_fb_helper_unprepare (& ifbdev -> helper );
675
- kfree (ifbdev );
681
+ drm_fb_helper_unprepare (dev -> fb_helper );
682
+ kfree (fb_helper );
676
683
}
677
684
678
685
struct intel_framebuffer * intel_fbdev_framebuffer (struct intel_fbdev * fbdev )
679
686
{
680
- if (!fbdev || ! fbdev -> helper . fb )
687
+ if (!fbdev )
681
688
return NULL ;
682
689
683
- return to_intel_framebuffer ( fbdev -> helper . fb ) ;
690
+ return fbdev -> fb ;
684
691
}
685
692
686
693
struct i915_vma * intel_fbdev_vma_pointer (struct intel_fbdev * fbdev )
0 commit comments