18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Tegra host1x GEM implementation 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (c) 2012-2013, NVIDIA Corporation. 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#ifndef __HOST1X_GEM_H 98c2ecf20Sopenharmony_ci#define __HOST1X_GEM_H 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <linux/host1x.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#include <drm/drm.h> 148c2ecf20Sopenharmony_ci#include <drm/drm_gem.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#define TEGRA_BO_BOTTOM_UP (1 << 0) 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_cienum tegra_bo_tiling_mode { 198c2ecf20Sopenharmony_ci TEGRA_BO_TILING_MODE_PITCH, 208c2ecf20Sopenharmony_ci TEGRA_BO_TILING_MODE_TILED, 218c2ecf20Sopenharmony_ci TEGRA_BO_TILING_MODE_BLOCK, 228c2ecf20Sopenharmony_ci}; 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_cistruct tegra_bo_tiling { 258c2ecf20Sopenharmony_ci enum tegra_bo_tiling_mode mode; 268c2ecf20Sopenharmony_ci unsigned long value; 278c2ecf20Sopenharmony_ci}; 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_cistruct tegra_bo { 308c2ecf20Sopenharmony_ci struct drm_gem_object gem; 318c2ecf20Sopenharmony_ci struct host1x_bo base; 328c2ecf20Sopenharmony_ci unsigned long flags; 338c2ecf20Sopenharmony_ci struct sg_table *sgt; 348c2ecf20Sopenharmony_ci dma_addr_t iova; 358c2ecf20Sopenharmony_ci void *vaddr; 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci struct drm_mm_node *mm; 388c2ecf20Sopenharmony_ci unsigned long num_pages; 398c2ecf20Sopenharmony_ci struct page **pages; 408c2ecf20Sopenharmony_ci /* size of IOMMU mapping */ 418c2ecf20Sopenharmony_ci size_t size; 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci struct tegra_bo_tiling tiling; 448c2ecf20Sopenharmony_ci}; 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_cistatic inline struct tegra_bo *to_tegra_bo(struct drm_gem_object *gem) 478c2ecf20Sopenharmony_ci{ 488c2ecf20Sopenharmony_ci return container_of(gem, struct tegra_bo, gem); 498c2ecf20Sopenharmony_ci} 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_cistatic inline struct tegra_bo *host1x_to_tegra_bo(struct host1x_bo *bo) 528c2ecf20Sopenharmony_ci{ 538c2ecf20Sopenharmony_ci return container_of(bo, struct tegra_bo, base); 548c2ecf20Sopenharmony_ci} 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_cistruct tegra_bo *tegra_bo_create(struct drm_device *drm, size_t size, 578c2ecf20Sopenharmony_ci unsigned long flags); 588c2ecf20Sopenharmony_cistruct tegra_bo *tegra_bo_create_with_handle(struct drm_file *file, 598c2ecf20Sopenharmony_ci struct drm_device *drm, 608c2ecf20Sopenharmony_ci size_t size, 618c2ecf20Sopenharmony_ci unsigned long flags, 628c2ecf20Sopenharmony_ci u32 *handle); 638c2ecf20Sopenharmony_civoid tegra_bo_free_object(struct drm_gem_object *gem); 648c2ecf20Sopenharmony_ciint tegra_bo_dumb_create(struct drm_file *file, struct drm_device *drm, 658c2ecf20Sopenharmony_ci struct drm_mode_create_dumb *args); 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ciextern const struct vm_operations_struct tegra_bo_vm_ops; 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ciint __tegra_gem_mmap(struct drm_gem_object *gem, struct vm_area_struct *vma); 708c2ecf20Sopenharmony_ciint tegra_drm_mmap(struct file *file, struct vm_area_struct *vma); 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_cistruct dma_buf *tegra_gem_prime_export(struct drm_gem_object *gem, 738c2ecf20Sopenharmony_ci int flags); 748c2ecf20Sopenharmony_cistruct drm_gem_object *tegra_gem_prime_import(struct drm_device *drm, 758c2ecf20Sopenharmony_ci struct dma_buf *buf); 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci#endif 78