aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/exynos_tmp/exynos_drm_iommu.h
blob: aa267ba931e9a65bbb53ad89621fe0972d869388 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/* exynos_drm_iommu.h
 *
 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
 * Authoer: Inki Dae <inki.dae@samsung.com>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 */

#ifndef _EXYNOS_DRM_IOMMU_H_
#define _EXYNOS_DRM_IOMMU_H_

enum iommu_types {
	IOMMU_FIMD	= 0,
	IOMMU_HDMI,
	IOMMU_G2D,
	IOMMU_FIMC,
	IOMMU_G3D,
	IOMMU_ROTATOR,
	IOMMU_MASK	= 0x3f
};

struct iommu_gem_map_params {
	struct device		*dev;
	struct drm_device	*drm_dev;
	struct drm_file		*file;
	void			*gem_obj;
};

#define is_iommu_type_valid(t)	(((1 << (t)) & ~(IOMMU_MASK)) ? false : true)

void exynos_drm_remove_iommu_list(struct list_head *iommu_list,
					void *gem_obj);

/* get all pages to gem object and map them to iommu table. */
dma_addr_t exynos_drm_iommu_map_gem(struct iommu_gem_map_params *params,
					struct list_head *iommu_list,
					unsigned int gem_handle,
					enum iommu_types type);

/* unmap device address space to gem object from iommu table. */
void exynos_drm_iommu_unmap_gem(struct iommu_gem_map_params *params,
				dma_addr_t dma_addr,
				enum iommu_types type);

/* map physical memory region pointed by paddr to iommu table. */
dma_addr_t exynos_drm_iommu_map(struct device *dev, dma_addr_t paddr,
					size_t size);

/* unmap device address space pointed by dma_addr from iommu table. */
void exynos_drm_iommu_unmap(struct device *dev, dma_addr_t dma_addr);

/* setup device address space for device iommu. */
int exynos_drm_iommu_setup(struct device *dev);

int exynos_drm_iommu_activate(struct device *dev);

void exynos_drm_iommu_deactivate(struct device *dev);

/* clean up allocated device address space for device iommu. */
void exynos_drm_iommu_cleanup(struct device *dev);

#endif