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