26
26
#include <linux/shmem_fs.h>
27
27
28
28
#include "xen_drm_drv.h"
29
+ #include "xen_drm_front.h"
29
30
#include "xen_drm_gem.h"
30
31
31
32
struct xen_gem_object {
@@ -156,13 +157,17 @@ void xendrm_gem_free_object(struct drm_gem_object *gem_obj)
156
157
{
157
158
struct xen_gem_object * xen_obj = to_xen_gem_obj (gem_obj );
158
159
159
- if (xen_obj -> pages ) {
160
- if (!xen_obj -> be_alloc )
161
- drm_gem_put_pages (& xen_obj -> base , xen_obj -> pages ,
162
- true, false);
163
- }
164
- if (xen_obj -> base .import_attach )
160
+ if (xen_obj -> base .import_attach ) {
165
161
drm_prime_gem_destroy (& xen_obj -> base , xen_obj -> sgt_imported );
162
+ if (xen_obj -> pages )
163
+ drm_free_large (xen_obj -> pages );
164
+ } else {
165
+ if (xen_obj -> pages ) {
166
+ if (!xen_obj -> be_alloc )
167
+ drm_gem_put_pages (& xen_obj -> base ,
168
+ xen_obj -> pages , true, false);
169
+ }
170
+ }
166
171
drm_gem_object_release (gem_obj );
167
172
kfree (xen_obj );
168
173
}
@@ -186,17 +191,39 @@ struct sg_table *xendrm_gem_get_sg_table(struct drm_gem_object *gem_obj)
186
191
struct drm_gem_object * xendrm_gem_import_sg_table (struct drm_device * dev ,
187
192
struct dma_buf_attachment * attach , struct sg_table * sgt )
188
193
{
194
+ struct xendrm_device * xendrm_dev = dev -> dev_private ;
189
195
struct xen_gem_object * xen_obj ;
196
+ struct page * * pages ;
197
+ int ret ;
190
198
191
199
xen_obj = xendrm_gem_create_obj (dev , attach -> dmabuf -> size );
192
200
if (IS_ERR (xen_obj ))
193
201
return ERR_CAST (xen_obj );
202
+
203
+ xen_obj -> num_pages = DIV_ROUND_UP (attach -> dmabuf -> size , PAGE_SIZE );
204
+ xen_obj -> pages = drm_malloc_ab (xen_obj -> num_pages ,
205
+ sizeof (struct page * ));
206
+ if (xen_obj -> pages == NULL )
207
+ return ERR_PTR (- ENOMEM );
208
+
194
209
xen_obj -> sgt_imported = sgt ;
195
- /***********************************************************************
196
- * TODO: talk to backend and create dumb,
197
- * convert sgt to pages, so we can return those on xendrm_gem_get_pages
198
- **********************************************************************/
199
- BUG ();
210
+
211
+ ret = drm_prime_sg_to_page_addr_arrays (sgt , xen_obj -> pages ,
212
+ NULL , xen_obj -> num_pages );
213
+ if (ret < 0 )
214
+ return ERR_PTR (ret );
215
+
216
+ pages = xendrm_dev -> front_ops -> dbuf_create (
217
+ xendrm_dev -> xdrv_info ,
218
+ xendrm_dbuf_to_cookie (& xen_obj -> base ),
219
+ 0 , 0 , 0 , attach -> dmabuf -> size , xen_obj -> pages , sgt );
220
+
221
+ if (IS_ERR_OR_NULL (pages ))
222
+ return ERR_CAST (pages );
223
+
224
+ DRM_DEBUG ("Imported buffer of size %zu with nents %u\n" ,
225
+ attach -> dmabuf -> size , sgt -> nents );
226
+
200
227
return & xen_obj -> base ;
201
228
}
202
229
0 commit comments