Skip to content

Commit dad52fd

Browse files
Oleksandr Andrushchenkoiartemenko
authored andcommitted
drm/xen-front: Handle PRIME import
Signed-off-by: Oleksandr Andrushchenko <[email protected]>
1 parent fd14c8c commit dad52fd

File tree

1 file changed

+38
-11
lines changed

1 file changed

+38
-11
lines changed

drivers/gpu/drm/xen/xen_drm_gem.c

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <linux/shmem_fs.h>
2727

2828
#include "xen_drm_drv.h"
29+
#include "xen_drm_front.h"
2930
#include "xen_drm_gem.h"
3031

3132
struct xen_gem_object {
@@ -156,13 +157,17 @@ void xendrm_gem_free_object(struct drm_gem_object *gem_obj)
156157
{
157158
struct xen_gem_object *xen_obj = to_xen_gem_obj(gem_obj);
158159

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) {
165161
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+
}
166171
drm_gem_object_release(gem_obj);
167172
kfree(xen_obj);
168173
}
@@ -186,17 +191,39 @@ struct sg_table *xendrm_gem_get_sg_table(struct drm_gem_object *gem_obj)
186191
struct drm_gem_object *xendrm_gem_import_sg_table(struct drm_device *dev,
187192
struct dma_buf_attachment *attach, struct sg_table *sgt)
188193
{
194+
struct xendrm_device *xendrm_dev = dev->dev_private;
189195
struct xen_gem_object *xen_obj;
196+
struct page **pages;
197+
int ret;
190198

191199
xen_obj = xendrm_gem_create_obj(dev, attach->dmabuf->size);
192200
if (IS_ERR(xen_obj))
193201
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+
194209
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+
200227
return &xen_obj->base;
201228
}
202229

0 commit comments

Comments
 (0)