@@ -77,6 +77,7 @@ static int drm_fbdev_fb_probe(struct drm_fb_helper *fb_helper,
77
77
struct drm_client_buffer * buffer ;
78
78
struct fb_info * info ;
79
79
size_t screen_size ;
80
+ void * screen_buffer ;
80
81
u32 format ;
81
82
int ret ;
82
83
@@ -92,36 +93,51 @@ static int drm_fbdev_fb_probe(struct drm_fb_helper *fb_helper,
92
93
93
94
fb_helper -> buffer = buffer ;
94
95
fb_helper -> fb = buffer -> fb ;
96
+
95
97
screen_size = buffer -> gem -> size ;
98
+ screen_buffer = vzalloc (screen_size );
99
+ if (!screen_buffer ) {
100
+ ret = - ENOMEM ;
101
+ goto err_drm_client_framebuffer_delete ;
102
+ }
96
103
97
104
info = drm_fb_helper_alloc_info (fb_helper );
98
- if (IS_ERR (info ))
99
- return PTR_ERR (info );
105
+ if (IS_ERR (info )) {
106
+ ret = PTR_ERR (info );
107
+ goto err_vfree ;
108
+ }
109
+
110
+ drm_fb_helper_fill_info (info , fb_helper , sizes );
100
111
101
112
info -> fbops = & drm_fbdev_fb_ops ;
102
- info -> screen_size = screen_size ;
103
- info -> fix .smem_len = screen_size ;
104
113
info -> flags = FBINFO_DEFAULT ;
105
114
106
- drm_fb_helper_fill_info (info , fb_helper , sizes );
107
-
108
- info -> screen_buffer = vzalloc (screen_size );
109
- if (!info -> screen_buffer )
110
- return - ENOMEM ;
115
+ /* screen */
111
116
info -> flags |= FBINFO_VIRTFB | FBINFO_READS_FAST ;
112
-
117
+ info -> screen_buffer = screen_buffer ;
113
118
info -> fix .smem_start = page_to_phys (vmalloc_to_page (info -> screen_buffer ));
119
+ info -> fix .smem_len = screen_size ;
114
120
115
- /* Set a default deferred I/O handler */
121
+ /* deferred I/O */
116
122
fb_helper -> fbdefio .delay = HZ / 20 ;
117
123
fb_helper -> fbdefio .deferred_io = drm_fb_helper_deferred_io ;
118
124
119
125
info -> fbdefio = & fb_helper -> fbdefio ;
120
126
ret = fb_deferred_io_init (info );
121
127
if (ret )
122
- return ret ;
128
+ goto err_drm_fb_helper_release_info ;
123
129
124
130
return 0 ;
131
+
132
+ err_drm_fb_helper_release_info :
133
+ drm_fb_helper_release_info (fb_helper );
134
+ err_vfree :
135
+ vfree (screen_buffer );
136
+ err_drm_client_framebuffer_delete :
137
+ fb_helper -> fb = NULL ;
138
+ fb_helper -> buffer = NULL ;
139
+ drm_client_framebuffer_delete (buffer );
140
+ return ret ;
125
141
}
126
142
127
143
static void drm_fbdev_damage_blit_real (struct drm_fb_helper * fb_helper ,
0 commit comments