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