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