105b84911SRob Clark /* 205b84911SRob Clark * Copyright (C) 2013 Red Hat 305b84911SRob Clark * Author: Rob Clark <robdclark@gmail.com> 405b84911SRob Clark * 505b84911SRob Clark * This program is free software; you can redistribute it and/or modify it 605b84911SRob Clark * under the terms of the GNU General Public License version 2 as published by 705b84911SRob Clark * the Free Software Foundation. 805b84911SRob Clark * 905b84911SRob Clark * This program is distributed in the hope that it will be useful, but WITHOUT 1005b84911SRob Clark * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1105b84911SRob Clark * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 1205b84911SRob Clark * more details. 1305b84911SRob Clark * 1405b84911SRob Clark * You should have received a copy of the GNU General Public License along with 1505b84911SRob Clark * this program. If not, see <http://www.gnu.org/licenses/>. 1605b84911SRob Clark */ 1705b84911SRob Clark 1805b84911SRob Clark #include "msm_drv.h" 1905b84911SRob Clark #include "msm_gem.h" 2005b84911SRob Clark 21b5e9c1a2SMaarten Lankhorst #include <linux/dma-buf.h> 2205b84911SRob Clark 2305b84911SRob Clark struct sg_table *msm_gem_prime_get_sg_table(struct drm_gem_object *obj) 2405b84911SRob Clark { 2505b84911SRob Clark struct msm_gem_object *msm_obj = to_msm_bo(obj); 26ac451467SRob Clark int npages = obj->size >> PAGE_SHIFT; 27ac451467SRob Clark 28ac451467SRob Clark if (WARN_ON(!msm_obj->pages)) /* should have already pinned! */ 29ac451467SRob Clark return NULL; 30ac451467SRob Clark 31ac451467SRob Clark return drm_prime_pages_to_sg(msm_obj->pages, npages); 3205b84911SRob Clark } 3305b84911SRob Clark 3405b84911SRob Clark void *msm_gem_prime_vmap(struct drm_gem_object *obj) 3505b84911SRob Clark { 3605b84911SRob Clark return msm_gem_vaddr(obj); 3705b84911SRob Clark } 3805b84911SRob Clark 3905b84911SRob Clark void msm_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr) 4005b84911SRob Clark { 4105b84911SRob Clark /* TODO msm_gem_vunmap() */ 4205b84911SRob Clark } 4305b84911SRob Clark 4477a147e7SDaniel Thompson int msm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma) 4577a147e7SDaniel Thompson { 4677a147e7SDaniel Thompson int ret; 4777a147e7SDaniel Thompson 4877a147e7SDaniel Thompson ret = drm_gem_mmap_obj(obj, obj->size, vma); 4977a147e7SDaniel Thompson if (ret < 0) 5077a147e7SDaniel Thompson return ret; 5177a147e7SDaniel Thompson 5277a147e7SDaniel Thompson return msm_gem_mmap_obj(vma->vm_private_data, vma); 5377a147e7SDaniel Thompson } 5477a147e7SDaniel Thompson 5505b84911SRob Clark struct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev, 56b5e9c1a2SMaarten Lankhorst struct dma_buf_attachment *attach, struct sg_table *sg) 5705b84911SRob Clark { 5879f0e202SRob Clark return msm_gem_import(dev, attach->dmabuf, sg); 5905b84911SRob Clark } 6005b84911SRob Clark 6105b84911SRob Clark int msm_gem_prime_pin(struct drm_gem_object *obj) 6205b84911SRob Clark { 6305b84911SRob Clark if (!obj->import_attach) 6405b84911SRob Clark msm_gem_get_pages(obj); 6505b84911SRob Clark return 0; 6605b84911SRob Clark } 6705b84911SRob Clark 6805b84911SRob Clark void msm_gem_prime_unpin(struct drm_gem_object *obj) 6905b84911SRob Clark { 7005b84911SRob Clark if (!obj->import_attach) 7105b84911SRob Clark msm_gem_put_pages(obj); 7205b84911SRob Clark } 73