1
2
3
4
5
6
7
8#ifndef TEGRA_VDE_H
9#define TEGRA_VDE_H
10
11#include <linux/completion.h>
12#include <linux/dma-direction.h>
13#include <linux/iova.h>
14#include <linux/list.h>
15#include <linux/miscdevice.h>
16#include <linux/mutex.h>
17#include <linux/types.h>
18
19struct clk;
20struct dma_buf;
21struct gen_pool;
22struct iommu_group;
23struct iommu_domain;
24struct reset_control;
25struct dma_buf_attachment;
26
27struct tegra_vde {
28 void __iomem *sxe;
29 void __iomem *bsev;
30 void __iomem *mbe;
31 void __iomem *ppe;
32 void __iomem *mce;
33 void __iomem *tfe;
34 void __iomem *ppb;
35 void __iomem *vdma;
36 void __iomem *frameid;
37 struct mutex lock;
38 struct mutex map_lock;
39 struct list_head map_list;
40 struct miscdevice miscdev;
41 struct reset_control *rst;
42 struct reset_control *rst_mc;
43 struct gen_pool *iram_pool;
44 struct completion decode_completion;
45 struct clk *clk;
46 struct iommu_domain *domain;
47 struct iommu_group *group;
48 struct iova_domain iova;
49 struct iova *iova_resv_static_addresses;
50 struct iova *iova_resv_last_page;
51 dma_addr_t iram_lists_addr;
52 u32 *iram;
53};
54
55int tegra_vde_iommu_init(struct tegra_vde *vde);
56void tegra_vde_iommu_deinit(struct tegra_vde *vde);
57int tegra_vde_iommu_map(struct tegra_vde *vde,
58 struct sg_table *sgt,
59 struct iova **iovap,
60 size_t size);
61void tegra_vde_iommu_unmap(struct tegra_vde *vde, struct iova *iova);
62
63int tegra_vde_dmabuf_cache_map(struct tegra_vde *vde,
64 struct dma_buf *dmabuf,
65 enum dma_data_direction dma_dir,
66 struct dma_buf_attachment **ap,
67 dma_addr_t *addrp);
68void tegra_vde_dmabuf_cache_unmap(struct tegra_vde *vde,
69 struct dma_buf_attachment *a,
70 bool release);
71void tegra_vde_dmabuf_cache_unmap_sync(struct tegra_vde *vde);
72void tegra_vde_dmabuf_cache_unmap_all(struct tegra_vde *vde);
73
74static __maybe_unused char const *
75tegra_vde_reg_base_name(struct tegra_vde *vde, void __iomem *base)
76{
77 if (vde->sxe == base)
78 return "SXE";
79
80 if (vde->bsev == base)
81 return "BSEV";
82
83 if (vde->mbe == base)
84 return "MBE";
85
86 if (vde->ppe == base)
87 return "PPE";
88
89 if (vde->mce == base)
90 return "MCE";
91
92 if (vde->tfe == base)
93 return "TFE";
94
95 if (vde->ppb == base)
96 return "PPB";
97
98 if (vde->vdma == base)
99 return "VDMA";
100
101 if (vde->frameid == base)
102 return "FRAMEID";
103
104 return "???";
105}
106
107#endif
108