From patchwork Thu Jun 23 14:35:33 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Wilson X-Patchwork-Id: 9195343 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id A5ECE6075C for ; Thu, 23 Jun 2016 14:35:59 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 970522833B for ; Thu, 23 Jun 2016 14:35:59 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8C1A72845C; Thu, 23 Jun 2016 14:35:59 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.1 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 330AD2833B for ; Thu, 23 Jun 2016 14:35:59 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id ABC036E3BB; Thu, 23 Jun 2016 14:35:52 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mail-wm0-x244.google.com (mail-wm0-x244.google.com [IPv6:2a00:1450:400c:c09::244]) by gabe.freedesktop.org (Postfix) with ESMTPS id 6512F6E2FA; Thu, 23 Jun 2016 14:35:50 +0000 (UTC) Received: by mail-wm0-x244.google.com with SMTP id 187so11515042wmz.1; Thu, 23 Jun 2016 07:35:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=oWrgQZyipPfvka7NyXlzcHgGujNkyhr7Y3+4Gz6uwnc=; b=bgqujDh3mOXZcDi9V0zKH0ztuNRnA6ST0EBez0ivKjtCTj6/DOhNjPHEXg51RJvUhf KLQjHYAmXYbe1kEDfuclVPW8rZ3ukWB9oMqe2i8ONeNrDRQYjvow1+nB1NfiaHwuWvZc hiT+NQhBkoAbz1InBwL9q83MQpXjj8G5NlM7Grc3kVbJKsSyB//ldHHVUGLvC5aNthbI +mb6Ljq3K78n5nDfPHMDMAwB+4WG+KU8/+POdfu3f59WHLjNJIuUh0VHYOlZoz1hRDOg 4/wyYHIOsGlGApff6YcFc5YuAXM6azVmXsHi5ME0/oQzPBzAujUkrrxQWX8wwUdDcVyY u9rw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=oWrgQZyipPfvka7NyXlzcHgGujNkyhr7Y3+4Gz6uwnc=; b=FdDDv6BWUWtu3WCwjF3sf0ORiECgZmAPQxI5bfCnYSUIyZY4QmE/FZi3O0ZdTStUPt GHDljgXPp7oH3gOZIy4f+Ahtat8u14xs4jUhGR2f8LFnQwCdWzKgRiwjpNFoEDWeOE9F hFRUBeW9hBW3DxFdgTYXwfUd1/blekLszw55IubRrBdRvAB4vK77IBUq54BBW1XIdw2v 2PlQrgpmcugF9x/rGBxogRBS4OutGD/qJuWKDDlL1s5A+umcFrikF9ewxvQPDjNP0rtf PxTJXB+xg8MspQt9SR1Jynw6tzs0eSu+pVl4K6WSUSXwhdm68D/F0r7gQ5DNVFFz9+Q/ a1hg== X-Gm-Message-State: ALyK8tJMcvvKpwwDjatgLVIxTPHnmS9pTJjb+vzFt5SKB95H0stXoDA2y+zWSJFBCS5SWQ== X-Received: by 10.28.191.90 with SMTP id p87mr1030611wmf.69.1466692548615; Thu, 23 Jun 2016 07:35:48 -0700 (PDT) Received: from haswell.alporthouse.com ([78.156.65.138]) by smtp.gmail.com with ESMTPSA id m5sm4213155wmm.10.2016.06.23.07.35.47 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 23 Jun 2016 07:35:47 -0700 (PDT) From: Chris Wilson To: dri-devel@lists.freedesktop.org Date: Thu, 23 Jun 2016 15:35:33 +0100 Message-Id: <1466692534-28303-2-git-send-email-chris@chris-wilson.co.uk> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1466692534-28303-1-git-send-email-chris@chris-wilson.co.uk> References: <1466692534-28303-1-git-send-email-chris@chris-wilson.co.uk> Cc: Zach Reizner , intel-gfx@lists.freedesktop.org, matthew.auld@intel.com Subject: [Intel-gfx] [PATCH 2/3] drm/vgem: Enable dmabuf interface for export X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Virus-Scanned: ClamAV using ClamSMTP Enable the standard GEM dma-buf interface provided by the DRM core, but only for exporting the VGEM object. This allows passing around the VGEM objects created from the dumb interface and using them as sources elsewhere. Creating a VGEM object for a foriegn handle is not supported. v2: With additional completeness. v3: Need to clear the CPU cache upon exporting the dma-addresses. v4: Use drm_gem_put_pages() as well. Testcase: igt/vgem_basic/dmabuf-* Testcase: igt/prime_vgem Signed-off-by: Chris Wilson Cc: Sean Paul Cc: Zach Reizner Reviewed-by: Matthew Auld --- drivers/gpu/drm/vgem/vgem_drv.c | 104 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 103 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/vgem/vgem_drv.c b/drivers/gpu/drm/vgem/vgem_drv.c index c161b6d7e427..69468b5f3d82 100644 --- a/drivers/gpu/drm/vgem/vgem_drv.c +++ b/drivers/gpu/drm/vgem/vgem_drv.c @@ -192,14 +192,116 @@ static const struct file_operations vgem_driver_fops = { .release = drm_release, }; +static int vgem_prime_pin(struct drm_gem_object *obj) +{ + long n_pages = obj->size >> PAGE_SHIFT; + struct page **pages; + + /* Flush the object from the CPU cache so that importers can rely + * on coherent indirect access via the exported dma-address. + */ + pages = drm_gem_get_pages(obj); + if (IS_ERR(pages)) + return PTR_ERR(pages); + + drm_clflush_pages(pages, n_pages); + drm_gem_put_pages(obj, pages, true, false); + + return 0; +} + +static struct sg_table *vgem_prime_get_sg_table(struct drm_gem_object *obj) +{ + long n_pages = obj->size >> PAGE_SHIFT; + struct sg_table *st; + struct page **pages; + int ret; + + st = kmalloc(sizeof(struct sg_table), GFP_KERNEL); + if (st == NULL) + return ERR_PTR(-ENOMEM); + + pages = drm_gem_get_pages(obj); + if (IS_ERR(pages)) { + ret = PTR_ERR(pages); + goto err; + } + + ret = sg_alloc_table_from_pages(st, pages, n_pages, + 0, obj->size, GFP_KERNEL); + drm_gem_put_pages(obj, pages, false, false); + if (ret) + goto err; + + return st; + +err: + kfree(st); + return ERR_PTR(ret); +} + +static void *vgem_prime_vmap(struct drm_gem_object *obj) +{ + long n_pages = obj->size >> PAGE_SHIFT; + struct page **pages; + void *addr; + + pages = drm_gem_get_pages(obj); + if (IS_ERR(pages)) + return NULL; + + addr = vmap(pages, n_pages, 0, pgprot_writecombine(PAGE_KERNEL_IO)); + drm_gem_put_pages(obj, pages, false, false); + + return addr; +} + +static void vgem_prime_vunmap(struct drm_gem_object *obj, void *vaddr) +{ + vunmap(vaddr); +} + +static int vgem_prime_mmap(struct drm_gem_object *obj, + struct vm_area_struct *vma) +{ + int ret; + + if (obj->size < vma->vm_end - vma->vm_start) + return -EINVAL; + + if (!obj->filp) + return -ENODEV; + + ret = obj->filp->f_op->mmap(obj->filp, vma); + if (ret) + return ret; + + fput(vma->vm_file); + vma->vm_file = get_file(obj->filp); + vma->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP; + vma->vm_page_prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags)); + + return 0; +} + static struct drm_driver vgem_driver = { - .driver_features = DRIVER_GEM, + .driver_features = DRIVER_GEM | DRIVER_PRIME, .gem_free_object_unlocked = vgem_gem_free_object, .gem_vm_ops = &vgem_gem_vm_ops, .ioctls = vgem_ioctls, .fops = &vgem_driver_fops, + .dumb_create = vgem_gem_dumb_create, .dumb_map_offset = vgem_gem_dumb_map, + + .prime_handle_to_fd = drm_gem_prime_handle_to_fd, + .gem_prime_pin = vgem_prime_pin, + .gem_prime_export = drm_gem_prime_export, + .gem_prime_get_sg_table = vgem_prime_get_sg_table, + .gem_prime_vmap = vgem_prime_vmap, + .gem_prime_vunmap = vgem_prime_vunmap, + .gem_prime_mmap = vgem_prime_mmap, + .name = DRIVER_NAME, .desc = DRIVER_DESC, .date = DRIVER_DATE,