162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2013 Red Hat 462306a36Sopenharmony_ci * Author: Rob Clark <robdclark@gmail.com> 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/dma-buf.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <drm/drm_prime.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include "msm_drv.h" 1262306a36Sopenharmony_ci#include "msm_gem.h" 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_cistruct sg_table *msm_gem_prime_get_sg_table(struct drm_gem_object *obj) 1562306a36Sopenharmony_ci{ 1662306a36Sopenharmony_ci struct msm_gem_object *msm_obj = to_msm_bo(obj); 1762306a36Sopenharmony_ci int npages = obj->size >> PAGE_SHIFT; 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci if (WARN_ON(!msm_obj->pages)) /* should have already pinned! */ 2062306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci return drm_prime_pages_to_sg(obj->dev, msm_obj->pages, npages); 2362306a36Sopenharmony_ci} 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ciint msm_gem_prime_vmap(struct drm_gem_object *obj, struct iosys_map *map) 2662306a36Sopenharmony_ci{ 2762306a36Sopenharmony_ci void *vaddr; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci vaddr = msm_gem_get_vaddr_locked(obj); 3062306a36Sopenharmony_ci if (IS_ERR(vaddr)) 3162306a36Sopenharmony_ci return PTR_ERR(vaddr); 3262306a36Sopenharmony_ci iosys_map_set_vaddr(map, vaddr); 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci return 0; 3562306a36Sopenharmony_ci} 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_civoid msm_gem_prime_vunmap(struct drm_gem_object *obj, struct iosys_map *map) 3862306a36Sopenharmony_ci{ 3962306a36Sopenharmony_ci msm_gem_put_vaddr_locked(obj); 4062306a36Sopenharmony_ci} 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cistruct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev, 4362306a36Sopenharmony_ci struct dma_buf_attachment *attach, struct sg_table *sg) 4462306a36Sopenharmony_ci{ 4562306a36Sopenharmony_ci return msm_gem_import(dev, attach->dmabuf, sg); 4662306a36Sopenharmony_ci} 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ciint msm_gem_prime_pin(struct drm_gem_object *obj) 4962306a36Sopenharmony_ci{ 5062306a36Sopenharmony_ci if (!obj->import_attach) 5162306a36Sopenharmony_ci msm_gem_pin_pages(obj); 5262306a36Sopenharmony_ci return 0; 5362306a36Sopenharmony_ci} 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_civoid msm_gem_prime_unpin(struct drm_gem_object *obj) 5662306a36Sopenharmony_ci{ 5762306a36Sopenharmony_ci if (!obj->import_attach) 5862306a36Sopenharmony_ci msm_gem_unpin_pages(obj); 5962306a36Sopenharmony_ci} 60