1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #ifndef OMAP_DMM_PRIV_H
17 #define OMAP_DMM_PRIV_H
18
19 #define DMM_REVISION 0x000
20 #define DMM_HWINFO 0x004
21 #define DMM_LISA_HWINFO 0x008
22 #define DMM_DMM_SYSCONFIG 0x010
23 #define DMM_LISA_LOCK 0x01C
24 #define DMM_LISA_MAP__0 0x040
25 #define DMM_LISA_MAP__1 0x044
26 #define DMM_TILER_HWINFO 0x208
27 #define DMM_TILER_OR__0 0x220
28 #define DMM_TILER_OR__1 0x224
29 #define DMM_PAT_HWINFO 0x408
30 #define DMM_PAT_GEOMETRY 0x40C
31 #define DMM_PAT_CONFIG 0x410
32 #define DMM_PAT_VIEW__0 0x420
33 #define DMM_PAT_VIEW__1 0x424
34 #define DMM_PAT_VIEW_MAP__0 0x440
35 #define DMM_PAT_VIEW_MAP_BASE 0x460
36 #define DMM_PAT_IRQ_EOI 0x478
37 #define DMM_PAT_IRQSTATUS_RAW 0x480
38 #define DMM_PAT_IRQSTATUS 0x490
39 #define DMM_PAT_IRQENABLE_SET 0x4A0
40 #define DMM_PAT_IRQENABLE_CLR 0x4B0
41 #define DMM_PAT_STATUS__0 0x4C0
42 #define DMM_PAT_STATUS__1 0x4C4
43 #define DMM_PAT_STATUS__2 0x4C8
44 #define DMM_PAT_STATUS__3 0x4CC
45 #define DMM_PAT_DESCR__0 0x500
46 #define DMM_PAT_DESCR__1 0x510
47 #define DMM_PAT_DESCR__2 0x520
48 #define DMM_PAT_DESCR__3 0x530
49 #define DMM_PEG_HWINFO 0x608
50 #define DMM_PEG_PRIO 0x620
51 #define DMM_PEG_PRIO_PAT 0x640
52
53 #define DMM_IRQSTAT_DST (1<<0)
54 #define DMM_IRQSTAT_LST (1<<1)
55 #define DMM_IRQSTAT_ERR_INV_DSC (1<<2)
56 #define DMM_IRQSTAT_ERR_INV_DATA (1<<3)
57 #define DMM_IRQSTAT_ERR_UPD_AREA (1<<4)
58 #define DMM_IRQSTAT_ERR_UPD_CTRL (1<<5)
59 #define DMM_IRQSTAT_ERR_UPD_DATA (1<<6)
60 #define DMM_IRQSTAT_ERR_LUT_MISS (1<<7)
61
62 #define DMM_IRQSTAT_ERR_MASK (DMM_IRQSTAT_ERR_INV_DSC | \
63 DMM_IRQSTAT_ERR_INV_DATA | \
64 DMM_IRQSTAT_ERR_UPD_AREA | \
65 DMM_IRQSTAT_ERR_UPD_CTRL | \
66 DMM_IRQSTAT_ERR_UPD_DATA | \
67 DMM_IRQSTAT_ERR_LUT_MISS)
68
69 #define DMM_PATSTATUS_READY (1<<0)
70 #define DMM_PATSTATUS_VALID (1<<1)
71 #define DMM_PATSTATUS_RUN (1<<2)
72 #define DMM_PATSTATUS_DONE (1<<3)
73 #define DMM_PATSTATUS_LINKED (1<<4)
74 #define DMM_PATSTATUS_BYPASSED (1<<7)
75 #define DMM_PATSTATUS_ERR_INV_DESCR (1<<10)
76 #define DMM_PATSTATUS_ERR_INV_DATA (1<<11)
77 #define DMM_PATSTATUS_ERR_UPD_AREA (1<<12)
78 #define DMM_PATSTATUS_ERR_UPD_CTRL (1<<13)
79 #define DMM_PATSTATUS_ERR_UPD_DATA (1<<14)
80 #define DMM_PATSTATUS_ERR_ACCESS (1<<15)
81
82
83 #define DMM_PATSTATUS_ERR (DMM_PATSTATUS_ERR_INV_DESCR | \
84 DMM_PATSTATUS_ERR_INV_DATA | \
85 DMM_PATSTATUS_ERR_UPD_AREA | \
86 DMM_PATSTATUS_ERR_UPD_CTRL | \
87 DMM_PATSTATUS_ERR_UPD_DATA)
88
89
90
91 enum {
92 PAT_STATUS,
93 PAT_DESCR
94 };
95
96 struct pat_ctrl {
97 u32 start:4;
98 u32 dir:4;
99 u32 lut_id:8;
100 u32 sync:12;
101 u32 ini:4;
102 };
103
104 struct pat {
105 u32 next_pa;
106 struct pat_area area;
107 struct pat_ctrl ctrl;
108 u32 data_pa;
109 };
110
111 #define DMM_FIXED_RETRY_COUNT 1000
112
113
114
115
116
117
118 #define DESCR_SIZE 128
119 #define REFILL_BUFFER_SIZE ((4 * 128 * 256) + (3 * DESCR_SIZE))
120
121
122
123
124 #define OMAP5_LUT_OFFSET 128
125
126 struct dmm;
127
128 struct dmm_txn {
129 void *engine_handle;
130 struct tcm *tcm;
131
132 u8 *current_va;
133 dma_addr_t current_pa;
134
135 struct pat *last_pat;
136 };
137
138 struct refill_engine {
139 int id;
140 struct dmm *dmm;
141 struct tcm *tcm;
142
143 u8 *refill_va;
144 dma_addr_t refill_pa;
145
146
147 struct dmm_txn txn;
148
149 bool async;
150
151 struct completion compl;
152
153 struct list_head idle_node;
154 };
155
156 struct dmm_platform_data {
157 u32 cpu_cache_flags;
158 };
159
160 struct dmm {
161 struct device *dev;
162 dma_addr_t phys_base;
163 void __iomem *base;
164 int irq;
165
166 struct page *dummy_page;
167 dma_addr_t dummy_pa;
168
169 void *refill_va;
170 dma_addr_t refill_pa;
171
172
173 wait_queue_head_t engine_queue;
174 struct list_head idle_head;
175 struct refill_engine *engines;
176 int num_engines;
177 atomic_t engine_counter;
178
179
180 int container_width;
181 int container_height;
182 int lut_width;
183 int lut_height;
184 int num_lut;
185
186
187 struct tcm **tcm;
188
189
190 struct list_head alloc_head;
191
192 const struct dmm_platform_data *plat_data;
193
194 bool dmm_workaround;
195 spinlock_t wa_lock;
196 u32 *wa_dma_data;
197 dma_addr_t wa_dma_handle;
198 struct dma_chan *wa_dma_chan;
199 };
200
201 #endif