diff options
Diffstat (limited to 'recipes-kernel/linux/linux-wandboard-3.0.35/0004-ENGR00264288-1-GPU-Integrate-4.6.9p12-release-kernel.patch')
-rw-r--r-- | recipes-kernel/linux/linux-wandboard-3.0.35/0004-ENGR00264288-1-GPU-Integrate-4.6.9p12-release-kernel.patch | 2006 |
1 files changed, 2006 insertions, 0 deletions
diff --git a/recipes-kernel/linux/linux-wandboard-3.0.35/0004-ENGR00264288-1-GPU-Integrate-4.6.9p12-release-kernel.patch b/recipes-kernel/linux/linux-wandboard-3.0.35/0004-ENGR00264288-1-GPU-Integrate-4.6.9p12-release-kernel.patch new file mode 100644 index 0000000..08ca88a --- /dev/null +++ b/recipes-kernel/linux/linux-wandboard-3.0.35/0004-ENGR00264288-1-GPU-Integrate-4.6.9p12-release-kernel.patch | |||
@@ -0,0 +1,2006 @@ | |||
1 | From c090a0238315094d245de2503b6f9a5bce0bda03 Mon Sep 17 00:00:00 2001 | ||
2 | From: Loren Huang <b02279@freescale.com> | ||
3 | Date: Mon, 27 May 2013 17:45:48 +0800 | ||
4 | Subject: [PATCH 4/6] ENGR00264288-1 [GPU]Integrate 4.6.9p12 release kernel | ||
5 | part code | ||
6 | |||
7 | Integrate 4.6.9p12 release kernel part code. | ||
8 | Cherry-pick from 3.0.35 branch. | ||
9 | |||
10 | Upstream-Status: Backport [3.5.7-1.0.0] | ||
11 | |||
12 | Signed-off-by: Loren Huang <b02279@freescale.com> | ||
13 | Acked-by: Lily Zhang | ||
14 | --- | ||
15 | .../GC350/hal/kernel/gc_hal_kernel_hardware_vg.c | 63 +++- | ||
16 | .../GC350/hal/kernel/gc_hal_kernel_hardware_vg.h | 2 + | ||
17 | .../arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c | 174 ++++++++--- | ||
18 | .../arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.h | 2 + | ||
19 | drivers/mxc/gpu-viv/config | 1 - | ||
20 | drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c | 329 +++++++-------------- | ||
21 | .../mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c | 6 +- | ||
22 | .../gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c | 14 +- | ||
23 | drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c | 6 +- | ||
24 | drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu.c | 119 +++++++- | ||
25 | .../hal/kernel/gc_hal_kernel_video_memory.c | 3 + | ||
26 | drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h | 6 + | ||
27 | drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h | 34 +-- | ||
28 | .../mxc/gpu-viv/hal/kernel/inc/gc_hal_compiler.h | 20 +- | ||
29 | drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h | 35 ++- | ||
30 | drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine.h | 62 +--- | ||
31 | drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h | 7 - | ||
32 | .../mxc/gpu-viv/hal/kernel/inc/gc_hal_options.h | 31 +- | ||
33 | .../mxc/gpu-viv/hal/kernel/inc/gc_hal_version.h | 2 +- | ||
34 | drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_vg.h | 6 + | ||
35 | .../hal/os/linux/kernel/gc_hal_kernel_device.c | 13 + | ||
36 | .../hal/os/linux/kernel/gc_hal_kernel_device.h | 1 + | ||
37 | .../hal/os/linux/kernel/gc_hal_kernel_driver.c | 10 +- | ||
38 | .../gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c | 74 +++-- | ||
39 | .../gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h | 3 + | ||
40 | 25 files changed, 574 insertions(+), 449 deletions(-) | ||
41 | |||
42 | diff --git a/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_vg.c b/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_vg.c | ||
43 | index 4a6010d..70c2cd6 100644 | ||
44 | --- a/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_vg.c | ||
45 | +++ b/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_vg.c | ||
46 | @@ -217,7 +217,6 @@ _IdentifyHardware( | ||
47 | return status; | ||
48 | } | ||
49 | |||
50 | -#if gcdPOWER_MANAGEMENT | ||
51 | static gctTHREADFUNCRESULT gctTHREADFUNCTYPE | ||
52 | _TimeIdleThread( | ||
53 | gctTHREADFUNCPARAMETER ThreadParameter | ||
54 | @@ -262,8 +261,6 @@ _TimeIdleThread( | ||
55 | } | ||
56 | return 0; | ||
57 | } | ||
58 | -#endif | ||
59 | - | ||
60 | |||
61 | /******************************************************************************\ | ||
62 | ****************************** gckVGHARDWARE API code ***************************** | ||
63 | @@ -309,6 +306,7 @@ gckVGHARDWARE_Construct( | ||
64 | do | ||
65 | { | ||
66 | gcmkERR_BREAK(gckOS_SetGPUPower(Os, gcvCORE_VG, gcvTRUE, gcvTRUE)); | ||
67 | + | ||
68 | status = _ResetGPU(Os); | ||
69 | |||
70 | if (status != gcvSTATUS_OK) | ||
71 | @@ -368,14 +366,17 @@ gckVGHARDWARE_Construct( | ||
72 | |||
73 | gcmkERR_BREAK(gckOS_CreateMutex(Os, &hardware->powerMutex)); | ||
74 | gcmkERR_BREAK(gckOS_CreateSignal(Os, gcvFALSE, &hardware->idleSignal)); | ||
75 | -#if gcdPOWER_MANAGEMENT | ||
76 | + | ||
77 | + /* Enable power management by default. */ | ||
78 | + hardware->powerManagement = gcvTRUE; | ||
79 | + | ||
80 | gcmkERR_BREAK(gckOS_StartThread( | ||
81 | hardware->os, | ||
82 | _TimeIdleThread, | ||
83 | hardware, | ||
84 | &hardware->timeIdleThread | ||
85 | )); | ||
86 | -#endif | ||
87 | + | ||
88 | /* Return pointer to the gckVGHARDWARE object. */ | ||
89 | *Hardware = hardware; | ||
90 | |||
91 | @@ -395,6 +396,8 @@ gckVGHARDWARE_Construct( | ||
92 | gcmkVERIFY_OK(gckOS_Free(Os, hardware)); | ||
93 | } | ||
94 | |||
95 | + gcmkVERIFY_OK(gckOS_SetGPUPower(Os, gcvCORE_VG, gcvFALSE, gcvFALSE)); | ||
96 | + | ||
97 | gcmkFOOTER(); | ||
98 | /* Return the status. */ | ||
99 | return status; | ||
100 | @@ -425,11 +428,10 @@ gckVGHARDWARE_Destroy( | ||
101 | /* Verify the arguments. */ | ||
102 | gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE); | ||
103 | |||
104 | -#if gcdPOWER_MANAGEMENT | ||
105 | Hardware->killThread = gcvTRUE; | ||
106 | gcmkVERIFY_OK(gckOS_Signal(Hardware->os, Hardware->idleSignal, gcvTRUE)); | ||
107 | gcmkVERIFY_OK(gckOS_StopThread(Hardware->os, Hardware->timeIdleThread)); | ||
108 | -#endif | ||
109 | + | ||
110 | /* Mark the object as unknown. */ | ||
111 | Hardware->object.type = gcvOBJ_UNKNOWN; | ||
112 | |||
113 | @@ -1432,7 +1434,6 @@ gckVGHARDWARE_ReadInterrupt( | ||
114 | return status; | ||
115 | } | ||
116 | |||
117 | -#if gcdPOWER_MANAGEMENT | ||
118 | static gceSTATUS _CommandStall( | ||
119 | gckVGHARDWARE Hardware) | ||
120 | { | ||
121 | @@ -1477,7 +1478,6 @@ static gceSTATUS _CommandStall( | ||
122 | /* Return the status. */ | ||
123 | return status; | ||
124 | } | ||
125 | -#endif | ||
126 | |||
127 | /******************************************************************************* | ||
128 | ** | ||
129 | @@ -1500,7 +1500,6 @@ gckVGHARDWARE_SetPowerManagementState( | ||
130 | IN gceCHIPPOWERSTATE State | ||
131 | ) | ||
132 | { | ||
133 | -#if gcdPOWER_MANAGEMENT | ||
134 | gceSTATUS status; | ||
135 | gckVGCOMMAND command = gcvNULL; | ||
136 | gckOS os; | ||
137 | @@ -1600,6 +1599,12 @@ gckVGHARDWARE_SetPowerManagementState( | ||
138 | command = Hardware->kernel->command; | ||
139 | gcmkVERIFY_OBJECT(command, gcvOBJ_COMMAND); | ||
140 | |||
141 | + if (Hardware->powerManagement == gcvFALSE) | ||
142 | + { | ||
143 | + gcmkFOOTER_NO(); | ||
144 | + return gcvSTATUS_OK; | ||
145 | + } | ||
146 | + | ||
147 | /* Start profiler. */ | ||
148 | gcmkPROFILE_INIT(freq, time); | ||
149 | |||
150 | @@ -1914,10 +1919,6 @@ OnError: | ||
151 | /* Return the status. */ | ||
152 | gcmkFOOTER(); | ||
153 | return status; | ||
154 | -#else /* gcdPOWER_MANAGEMENT */ | ||
155 | - /* Do nothing */ | ||
156 | - return gcvSTATUS_OK; | ||
157 | -#endif | ||
158 | } | ||
159 | |||
160 | /******************************************************************************* | ||
161 | @@ -1955,6 +1956,40 @@ gckVGHARDWARE_QueryPowerManagementState( | ||
162 | return gcvSTATUS_OK; | ||
163 | } | ||
164 | |||
165 | +/******************************************************************************* | ||
166 | +** | ||
167 | +** gckVGHARDWARE_SetPowerManagement | ||
168 | +** | ||
169 | +** Configure GPU power management function. | ||
170 | +** Only used in driver initialization stage. | ||
171 | +** | ||
172 | +** INPUT: | ||
173 | +** | ||
174 | +** gckVGHARDWARE Harwdare | ||
175 | +** Pointer to an gckHARDWARE object. | ||
176 | +** | ||
177 | +** gctBOOL PowerManagement | ||
178 | +** Power Mangement State. | ||
179 | +** | ||
180 | +*/ | ||
181 | +gceSTATUS | ||
182 | +gckVGHARDWARE_SetPowerManagement( | ||
183 | + IN gckVGHARDWARE Hardware, | ||
184 | + IN gctBOOL PowerManagement | ||
185 | + ) | ||
186 | +{ | ||
187 | + gcmkHEADER_ARG("Hardware=0x%x", Hardware); | ||
188 | + | ||
189 | + /* Verify the arguments. */ | ||
190 | + gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE); | ||
191 | + | ||
192 | + Hardware->powerManagement = PowerManagement; | ||
193 | + | ||
194 | + /* Success. */ | ||
195 | + gcmkFOOTER_NO(); | ||
196 | + return gcvSTATUS_OK; | ||
197 | +} | ||
198 | + | ||
199 | gceSTATUS | ||
200 | gckVGHARDWARE_SetPowerOffTimeout( | ||
201 | IN gckVGHARDWARE Hardware, | ||
202 | diff --git a/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_vg.h b/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_vg.h | ||
203 | index 83a603e..16b81ae 100644 | ||
204 | --- a/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_vg.h | ||
205 | +++ b/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_vg.h | ||
206 | @@ -66,6 +66,8 @@ struct _gckVGHARDWARE | ||
207 | gctTHREAD timeIdleThread; | ||
208 | gctBOOL killThread; | ||
209 | gctPOINTER pageTableDirty; | ||
210 | + | ||
211 | + gctBOOL powerManagement; | ||
212 | }; | ||
213 | |||
214 | #endif /* __gc_hal_kernel_hardware_h_ */ | ||
215 | diff --git a/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c b/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c | ||
216 | index ebd36fe..00f3839 100644 | ||
217 | --- a/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c | ||
218 | +++ b/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c | ||
219 | @@ -176,6 +176,7 @@ _IdentifyHardware( | ||
220 | Identity->chipMinorFeatures1 = 0; | ||
221 | Identity->chipMinorFeatures2 = 0; | ||
222 | Identity->chipMinorFeatures3 = 0; | ||
223 | + Identity->chipMinorFeatures4 = 0; | ||
224 | } | ||
225 | else | ||
226 | { | ||
227 | @@ -207,13 +208,20 @@ _IdentifyHardware( | ||
228 | gckOS_ReadRegisterEx(Os, Core, | ||
229 | 0x00088, | ||
230 | &Identity->chipMinorFeatures3)); | ||
231 | + | ||
232 | + /* Read chip minor featuress register #4. */ | ||
233 | + gcmkONERROR( | ||
234 | + gckOS_ReadRegisterEx(Os, Core, | ||
235 | + 0x00094, | ||
236 | + &Identity->chipMinorFeatures4)); | ||
237 | } | ||
238 | else | ||
239 | { | ||
240 | - /* Chip doesn't has minor features register #1 or 2 or 3. */ | ||
241 | + /* Chip doesn't has minor features register #1 or 2 or 3 or 4. */ | ||
242 | Identity->chipMinorFeatures1 = 0; | ||
243 | Identity->chipMinorFeatures2 = 0; | ||
244 | Identity->chipMinorFeatures3 = 0; | ||
245 | + Identity->chipMinorFeatures4 = 0; | ||
246 | } | ||
247 | } | ||
248 | |||
249 | @@ -234,14 +242,14 @@ _IdentifyHardware( | ||
250 | |||
251 | /* Exception for GC1000, revision 5035 & GC800, revision 4612 */ | ||
252 | if (((Identity->chipModel == gcv1000) && ((Identity->chipRevision == 0x5035) | ||
253 | - || (Identity->chipRevision == 0x5036))) | ||
254 | + || (Identity->chipRevision == 0x5036) | ||
255 | + || (Identity->chipRevision == 0x5037))) | ||
256 | || ((Identity->chipModel == gcv800) && (Identity->chipRevision == 0x4612))) | ||
257 | { | ||
258 | Identity->superTileMode = 1; | ||
259 | } | ||
260 | |||
261 | |||
262 | - | ||
263 | /* Disable HZ when EZ is present for older chips. */ | ||
264 | if (!((((gctUINT32) (Identity->chipFeatures)) >> (0 ? 16:16) & ((gctUINT32) ((((1 ? 16:16) - (0 ? 16:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 16:16) - (0 ? 16:16) + 1)))))) == (0x1 & ((gctUINT32) ((((1 ? 16:16) - (0 ? 16:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 16:16) - (0 ? 16:16) + 1)))))))) | ||
265 | { | ||
266 | @@ -285,6 +293,10 @@ _IdentifyHardware( | ||
267 | "Identity: chipMinorFeatures3=0x%08X", | ||
268 | Identity->chipMinorFeatures3); | ||
269 | |||
270 | + gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE, | ||
271 | + "Identity: chipMinorFeatures4=0x%08X", | ||
272 | + Identity->chipMinorFeatures4); | ||
273 | + | ||
274 | /*************************************************************************** | ||
275 | ** Get chip specs. | ||
276 | */ | ||
277 | @@ -576,7 +588,6 @@ OnError: | ||
278 | return status; | ||
279 | } | ||
280 | |||
281 | -#if gcdPOWER_MANAGEMENT | ||
282 | static gceSTATUS | ||
283 | _IsGPUPresent( | ||
284 | IN gckHARDWARE Hardware | ||
285 | @@ -631,7 +642,6 @@ OnError: | ||
286 | gcmkFOOTER(); | ||
287 | return status; | ||
288 | } | ||
289 | -#endif | ||
290 | |||
291 | /******************************************************************************\ | ||
292 | ****************************** gckHARDWARE API code ***************************** | ||
293 | @@ -708,6 +718,7 @@ gckHARDWARE_Construct( | ||
294 | |||
295 | case gcv300: | ||
296 | case gcv320: | ||
297 | + case gcv420: | ||
298 | hardware->type = gcvHARDWARE_2D; | ||
299 | /*set outstanding limit*/ | ||
300 | gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x00414, &axi_ot)); | ||
301 | @@ -795,6 +806,9 @@ gckHARDWARE_Construct( | ||
302 | hardware->linkQueue.count = 0; | ||
303 | #endif | ||
304 | |||
305 | + /* Enable power management by default. */ | ||
306 | + hardware->powerManagement = gcvTRUE; | ||
307 | + | ||
308 | /* Return pointer to the gckHARDWARE object. */ | ||
309 | *Hardware = hardware; | ||
310 | |||
311 | @@ -1404,6 +1418,7 @@ gckHARDWARE_QueryChipIdentity( | ||
312 | Identity->chipMinorFeatures1 = Hardware->identity.chipMinorFeatures1; | ||
313 | Identity->chipMinorFeatures2 = Hardware->identity.chipMinorFeatures2; | ||
314 | Identity->chipMinorFeatures3 = Hardware->identity.chipMinorFeatures3; | ||
315 | + Identity->chipMinorFeatures4 = Hardware->identity.chipMinorFeatures4; | ||
316 | |||
317 | /* Return chip specs. */ | ||
318 | Identity->streamCount = Hardware->identity.streamCount; | ||
319 | @@ -3129,7 +3144,7 @@ gckHARDWARE_FlushMMU( | ||
320 | | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))); | ||
321 | |||
322 | buffer[9] | ||
323 | - = (((((gctUINT32) (~0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 4:4) - (0 ? 4:4) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:4) - (0 ? 4:4) + 1))))))) << (0 ? 4:4))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ? 4:4) - (0 ? 4:4) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:4) - (0 ? 4:4) + 1))))))) << (0 ? 4:4))) & ((((gctUINT32) (~0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 7:7) - (0 ? 7:7) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:7) - (0 ? 7:7) + 1))))))) << (0 ? 7:7))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ? 7:7) - (0 ? 7:7) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:7) - (0 ? 7:7) + 1))))))) << (0 ? 7:7))) ); | ||
324 | + = (((((gctUINT32) (~0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 4:4) - (0 ? 4:4) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:4) - (0 ? 4:4) + 1))))))) << (0 ? 4:4))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ? 4:4) - (0 ? 4:4) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:4) - (0 ? 4:4) + 1))))))) << (0 ? 4:4))) & ((((gctUINT32) (~0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 7:7) - (0 ? 7:7) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:7) - (0 ? 7:7) + 1))))))) << (0 ? 7:7))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ? 7:7) - (0 ? 7:7) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:7) - (0 ? 7:7) + 1))))))) << (0 ? 7:7)))); | ||
325 | |||
326 | /* Arm the PE-FE Semaphore. */ | ||
327 | buffer[10] | ||
328 | @@ -3660,7 +3675,7 @@ typedef enum | ||
329 | } | ||
330 | gcePOWER_FLAGS; | ||
331 | |||
332 | -#if gcmIS_DEBUG(gcdDEBUG_TRACE) && gcdPOWER_MANAGEMENT | ||
333 | +#if gcmIS_DEBUG(gcdDEBUG_TRACE) | ||
334 | static gctCONST_STRING | ||
335 | _PowerEnum(gceCHIPPOWERSTATE State) | ||
336 | { | ||
337 | @@ -3709,7 +3724,6 @@ gckHARDWARE_SetPowerManagementState( | ||
338 | IN gceCHIPPOWERSTATE State | ||
339 | ) | ||
340 | { | ||
341 | -#if gcdPOWER_MANAGEMENT | ||
342 | gceSTATUS status; | ||
343 | gckCOMMAND command = gcvNULL; | ||
344 | gckOS os; | ||
345 | @@ -3841,6 +3855,12 @@ gckHARDWARE_SetPowerManagementState( | ||
346 | command = Hardware->kernel->command; | ||
347 | gcmkVERIFY_OBJECT(command, gcvOBJ_COMMAND); | ||
348 | |||
349 | + if (Hardware->powerManagement == gcvFALSE) | ||
350 | + { | ||
351 | + gcmkFOOTER_NO(); | ||
352 | + return gcvSTATUS_OK; | ||
353 | + } | ||
354 | + | ||
355 | /* Start profiler. */ | ||
356 | gcmkPROFILE_INIT(freq, time); | ||
357 | |||
358 | @@ -4491,10 +4511,6 @@ OnError: | ||
359 | /* Return the status. */ | ||
360 | gcmkFOOTER(); | ||
361 | return status; | ||
362 | -#else /* gcdPOWER_MANAGEMENT */ | ||
363 | - /* Do nothing */ | ||
364 | - return gcvSTATUS_OK; | ||
365 | -#endif | ||
366 | } | ||
367 | |||
368 | /******************************************************************************* | ||
369 | @@ -4532,6 +4548,40 @@ gckHARDWARE_QueryPowerManagementState( | ||
370 | return gcvSTATUS_OK; | ||
371 | } | ||
372 | |||
373 | +/******************************************************************************* | ||
374 | +** | ||
375 | +** gckHARDWARE_SetPowerManagement | ||
376 | +** | ||
377 | +** Configure GPU power management function. | ||
378 | +** Only used in driver initialization stage. | ||
379 | +** | ||
380 | +** INPUT: | ||
381 | +** | ||
382 | +** gckHARDWARE Harwdare | ||
383 | +** Pointer to an gckHARDWARE object. | ||
384 | +** | ||
385 | +** gctBOOL PowerManagement | ||
386 | +** Power Mangement State. | ||
387 | +** | ||
388 | +*/ | ||
389 | +gceSTATUS | ||
390 | +gckHARDWARE_SetPowerManagement( | ||
391 | + IN gckHARDWARE Hardware, | ||
392 | + IN gctBOOL PowerManagement | ||
393 | + ) | ||
394 | +{ | ||
395 | + gcmkHEADER_ARG("Hardware=0x%x", Hardware); | ||
396 | + | ||
397 | + /* Verify the arguments. */ | ||
398 | + gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE); | ||
399 | + | ||
400 | + Hardware->powerManagement = PowerManagement; | ||
401 | + | ||
402 | + /* Success. */ | ||
403 | + gcmkFOOTER_NO(); | ||
404 | + return gcvSTATUS_OK; | ||
405 | +} | ||
406 | + | ||
407 | #if gcdENABLE_FSCALE_VAL_ADJUST | ||
408 | gceSTATUS | ||
409 | gckHARDWARE_SetFscaleValue( | ||
410 | @@ -4767,6 +4817,21 @@ OnError: | ||
411 | GC_DEBUG_SIGNALS_##block##_Address, \ | ||
412 | &profiler->data)) | ||
413 | |||
414 | +#define gcmkREAD_DEBUG_REGISTER_N(control, block, index, data) \ | ||
415 | + gcmkONERROR(\ | ||
416 | + gckOS_WriteRegisterEx(Hardware->os, \ | ||
417 | + Hardware->core, \ | ||
418 | + GC_DEBUG_CONTROL##control##_Address, \ | ||
419 | + gcmSETFIELD(0, \ | ||
420 | + GC_DEBUG_CONTROL##control, \ | ||
421 | + block, \ | ||
422 | + index))); \ | ||
423 | + gcmkONERROR(\ | ||
424 | + gckOS_ReadRegisterEx(Hardware->os, \ | ||
425 | + Hardware->core, \ | ||
426 | + GC_DEBUG_SIGNALS_##block##_Address, \ | ||
427 | + &data)) | ||
428 | + | ||
429 | #define gcmkRESET_DEBUG_REGISTER(control, block) \ | ||
430 | gcmkONERROR(\ | ||
431 | gckOS_WriteRegisterEx(Hardware->os, \ | ||
432 | @@ -4857,6 +4922,9 @@ gckHARDWARE_QueryProfileRegisters( | ||
433 | { | ||
434 | gceSTATUS status; | ||
435 | gcsPROFILER_COUNTERS * profiler = Counters; | ||
436 | + gctUINT i, clock; | ||
437 | + gctUINT32 colorKilled, colorDrawn, depthKilled, depthDrawn; | ||
438 | + gctUINT32 totalRead, totalWrite; | ||
439 | |||
440 | gcmkHEADER_ARG("Hardware=0x%x Counters=0x%x", Hardware, Counters); | ||
441 | |||
442 | @@ -4867,16 +4935,6 @@ gckHARDWARE_QueryProfileRegisters( | ||
443 | gcmkONERROR( | ||
444 | gckOS_ReadRegisterEx(Hardware->os, | ||
445 | Hardware->core, | ||
446 | - 0x00040, | ||
447 | - &profiler->gpuTotalRead64BytesPerFrame)); | ||
448 | - gcmkONERROR( | ||
449 | - gckOS_ReadRegisterEx(Hardware->os, | ||
450 | - Hardware->core, | ||
451 | - 0x00044, | ||
452 | - &profiler->gpuTotalWrite64BytesPerFrame)); | ||
453 | - gcmkONERROR( | ||
454 | - gckOS_ReadRegisterEx(Hardware->os, | ||
455 | - Hardware->core, | ||
456 | 0x00438, | ||
457 | &profiler->gpuCyclesCounter)); | ||
458 | |||
459 | @@ -4892,8 +4950,63 @@ gckHARDWARE_QueryProfileRegisters( | ||
460 | 0x0007C, | ||
461 | &profiler->gpuIdleCyclesCounter)); | ||
462 | |||
463 | - if(Reset){ | ||
464 | |||
465 | + /* Read clock control register. */ | ||
466 | + gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, | ||
467 | + Hardware->core, | ||
468 | + 0x00000, | ||
469 | + &clock)); | ||
470 | + | ||
471 | + profiler->gpuTotalRead64BytesPerFrame = 0; | ||
472 | + profiler->gpuTotalWrite64BytesPerFrame = 0; | ||
473 | + profiler->pe_pixel_count_killed_by_color_pipe = 0; | ||
474 | + profiler->pe_pixel_count_killed_by_depth_pipe = 0; | ||
475 | + profiler->pe_pixel_count_drawn_by_color_pipe = 0; | ||
476 | + profiler->pe_pixel_count_drawn_by_depth_pipe = 0; | ||
477 | + | ||
478 | + /* Walk through all avaiable pixel pipes. */ | ||
479 | + for (i = 0; i < Hardware->identity.pixelPipes; ++i) | ||
480 | + { | ||
481 | + /* Select proper pipe. */ | ||
482 | + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, | ||
483 | + Hardware->core, | ||
484 | + 0x00000, | ||
485 | + ((((gctUINT32) (clock)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:20) - (0 ? 23:20) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:20) - (0 ? 23:20) + 1))))))) << (0 ? 23:20))) | (((gctUINT32) ((gctUINT32) (i) & ((gctUINT32) ((((1 ? 23:20) - (0 ? 23:20) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:20) - (0 ? 23:20) + 1))))))) << (0 ? 23:20))))); | ||
486 | + | ||
487 | + /* BW */ | ||
488 | + gcmkONERROR( | ||
489 | + gckOS_ReadRegisterEx(Hardware->os, | ||
490 | + Hardware->core, | ||
491 | + 0x00040, | ||
492 | + &totalRead)); | ||
493 | + gcmkONERROR( | ||
494 | + gckOS_ReadRegisterEx(Hardware->os, | ||
495 | + Hardware->core, | ||
496 | + 0x00044, | ||
497 | + &totalWrite)); | ||
498 | + | ||
499 | + profiler->gpuTotalRead64BytesPerFrame += totalRead; | ||
500 | + profiler->gpuTotalWrite64BytesPerFrame += totalWrite; | ||
501 | + | ||
502 | + /* PE */ | ||
503 | + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16)))));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00454, &colorKilled)); | ||
504 | + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16)))));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00454, &depthKilled)); | ||
505 | + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (2) & ((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16)))));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00454, &colorDrawn)); | ||
506 | + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (3) & ((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16)))));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00454, &depthDrawn)); | ||
507 | + | ||
508 | + profiler->pe_pixel_count_killed_by_color_pipe += colorKilled; | ||
509 | + profiler->pe_pixel_count_killed_by_depth_pipe += depthKilled; | ||
510 | + profiler->pe_pixel_count_drawn_by_color_pipe += colorDrawn; | ||
511 | + profiler->pe_pixel_count_drawn_by_depth_pipe += depthDrawn; | ||
512 | + } | ||
513 | + | ||
514 | + /* Reset clock control register. */ | ||
515 | + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, | ||
516 | + Hardware->core, | ||
517 | + 0x00000, | ||
518 | + clock)); | ||
519 | + | ||
520 | + if(Reset){ | ||
521 | /* Reset counters. */ | ||
522 | gcmkONERROR( | ||
523 | gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x0003C, 1)); | ||
524 | @@ -4903,19 +5016,10 @@ gckHARDWARE_QueryProfileRegisters( | ||
525 | gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00438, 0)); | ||
526 | gcmkONERROR( | ||
527 | gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00078, 0)); | ||
528 | - } | ||
529 | - /* PE */ | ||
530 | - gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) )); | ||
531 | -gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00454, &profiler->pe_pixel_count_killed_by_color_pipe)); | ||
532 | - gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) )); | ||
533 | -gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00454, &profiler->pe_pixel_count_killed_by_depth_pipe)); | ||
534 | - gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (2) & ((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) )); | ||
535 | -gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00454, &profiler->pe_pixel_count_drawn_by_color_pipe)); | ||
536 | - gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (3) & ((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) )); | ||
537 | -gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00454, &profiler->pe_pixel_count_drawn_by_depth_pipe)); | ||
538 | - if(Reset){ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (15) & ((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) )); | ||
539 | + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (15) & ((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) )); | ||
540 | gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | ||
541 | -)); } | ||
542 | +)); | ||
543 | + } | ||
544 | |||
545 | /* SH */ | ||
546 | gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (7) & ((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) )); | ||
547 | diff --git a/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.h b/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.h | ||
548 | index 517b35c..37226b7 100644 | ||
549 | --- a/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.h | ||
550 | +++ b/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.h | ||
551 | @@ -90,6 +90,8 @@ struct _gckHARDWARE | ||
552 | #if gcdLINK_QUEUE_SIZE | ||
553 | struct _gckLINKQUEUE linkQueue; | ||
554 | #endif | ||
555 | + | ||
556 | + gctBOOL powerManagement; | ||
557 | }; | ||
558 | |||
559 | gceSTATUS | ||
560 | diff --git a/drivers/mxc/gpu-viv/config b/drivers/mxc/gpu-viv/config | ||
561 | index 1196efa..cdd143e 100644 | ||
562 | --- a/drivers/mxc/gpu-viv/config | ||
563 | +++ b/drivers/mxc/gpu-viv/config | ||
564 | @@ -22,7 +22,6 @@ | ||
565 | ARCH_TYPE ?= arm | ||
566 | SDK_DIR ?= $(AQROOT)/build/sdk | ||
567 | USE_3D_VG ?= 1 | ||
568 | -USE_POWER_MANAGEMENT ?= 1 | ||
569 | FORCE_ALL_VIDEO_MEMORY_CACHED ?= 0 | ||
570 | NONPAGED_MEMORY_CACHEABLE ?= 0 | ||
571 | NONPAGED_MEMORY_BUFFERABLE ?= 1 | ||
572 | diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c | ||
573 | index 7964585..b7b0d28 100644 | ||
574 | --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c | ||
575 | +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c | ||
576 | @@ -904,9 +904,6 @@ gckKERNEL_Dispatch( | ||
577 | gctSIGNAL signal; | ||
578 | #endif | ||
579 | |||
580 | - gcsDATABASE_RECORD record; | ||
581 | - gctPOINTER data; | ||
582 | - | ||
583 | gcmkHEADER_ARG("Kernel=0x%x FromUser=%d Interface=0x%x", | ||
584 | Kernel, FromUser, Interface); | ||
585 | |||
586 | @@ -1940,249 +1937,133 @@ gckKERNEL_Dispatch( | ||
587 | #endif | ||
588 | |||
589 | case gcvHAL_GET_SHARED_INFO: | ||
590 | - bytes = (gctSIZE_T) Interface->u.GetSharedInfo.size; | ||
591 | - | ||
592 | - if (Interface->u.GetSharedInfo.dataId != 0) | ||
593 | + if (Interface->u.GetSharedInfo.data == gcvNULL) | ||
594 | { | ||
595 | - gcmkONERROR(gckKERNEL_FindProcessDB(Kernel, | ||
596 | - Interface->u.GetSharedInfo.pid, | ||
597 | - 0, | ||
598 | - gcvDB_SHARED_INFO, | ||
599 | - gcmINT2PTR(Interface->u.GetSharedInfo.dataId), | ||
600 | - &record)); | ||
601 | - | ||
602 | - /* find a record in db, check size */ | ||
603 | - if (record.bytes != bytes) | ||
604 | - { | ||
605 | - /* Size change is not allowed */ | ||
606 | - gcmkONERROR(gcvSTATUS_INVALID_DATA); | ||
607 | - } | ||
608 | - | ||
609 | - /* fetch data */ | ||
610 | - gcmkONERROR(gckOS_CopyToUserData( | ||
611 | - Kernel->os, | ||
612 | - record.physical, | ||
613 | - gcmUINT64_TO_PTR(Interface->u.GetSharedInfo.data), | ||
614 | - bytes | ||
615 | - )); | ||
616 | - | ||
617 | + gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT); | ||
618 | } | ||
619 | - | ||
620 | - if ((node = gcmUINT64_TO_PTR(Interface->u.GetSharedInfo.node)) != gcvNULL) | ||
621 | + else | ||
622 | { | ||
623 | - switch (Interface->u.GetSharedInfo.infoType) | ||
624 | - { | ||
625 | - case gcvVIDMEM_INFO_GENERIC: | ||
626 | - { /* Generic data stored */ | ||
627 | - if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM) | ||
628 | - { | ||
629 | - data = &node->VidMem.sharedInfo; | ||
630 | - | ||
631 | - } | ||
632 | - else | ||
633 | - { | ||
634 | - data = &node->Virtual.sharedInfo; | ||
635 | - } | ||
636 | + gctUINT32 pid = Interface->u.GetSharedInfo.pid; | ||
637 | + gctUINT32 dataId = Interface->u.GetSharedInfo.dataId; | ||
638 | + gctSIZE_T bytes = Interface->u.GetSharedInfo.bytes; | ||
639 | + gctPOINTER data = Interface->u.GetSharedInfo.data; | ||
640 | + gcsDATABASE_RECORD record; | ||
641 | |||
642 | - gcmkONERROR(gckOS_CopyToUserData( | ||
643 | - Kernel->os, | ||
644 | - data, | ||
645 | - gcmUINT64_TO_PTR(Interface->u.GetSharedInfo.nodeData), | ||
646 | - sizeof(gcsVIDMEM_NODE_SHARED_INFO) | ||
647 | - )); | ||
648 | - } | ||
649 | - break; | ||
650 | - | ||
651 | - case gcvVIDMEM_INFO_DIRTY_RECTANGLE: | ||
652 | - { /* Dirty rectangle stored */ | ||
653 | - gcsVIDMEM_NODE_SHARED_INFO *storedSharedInfo; | ||
654 | - gcsVIDMEM_NODE_SHARED_INFO alignedSharedInfo; | ||
655 | - | ||
656 | - if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM) | ||
657 | - { | ||
658 | - storedSharedInfo = &node->VidMem.sharedInfo; | ||
659 | - } | ||
660 | - else | ||
661 | - { | ||
662 | - storedSharedInfo = &node->Virtual.sharedInfo; | ||
663 | - } | ||
664 | - | ||
665 | - /* Stored shared info holds the unaligned dirty rectangle. | ||
666 | - Align it first. */ | ||
667 | - | ||
668 | - /* Hardware requires 64-byte aligned address, and 16x4 pixel aligned rectsize. | ||
669 | - We simply align to 32 pixels which covers both 16- and 32-bpp formats. */ | ||
670 | - | ||
671 | - /* Make sure we have a legit rectangle. */ | ||
672 | - gcmkASSERT((storedSharedInfo->RectSize.width != 0) && (storedSharedInfo->RectSize.height != 0)); | ||
673 | - | ||
674 | - alignedSharedInfo.SrcOrigin.x = gcmALIGN_BASE(storedSharedInfo->SrcOrigin.x, 32); | ||
675 | - alignedSharedInfo.RectSize.width = gcmALIGN((storedSharedInfo->RectSize.width + (storedSharedInfo->SrcOrigin.x - alignedSharedInfo.SrcOrigin.x)), 16); | ||
676 | - | ||
677 | - alignedSharedInfo.SrcOrigin.y = gcmALIGN_BASE(storedSharedInfo->SrcOrigin.y, 4); | ||
678 | - alignedSharedInfo.RectSize.height = gcmALIGN((storedSharedInfo->RectSize.height + (storedSharedInfo->SrcOrigin.y - alignedSharedInfo.SrcOrigin.y)), 4); | ||
679 | - | ||
680 | - gcmkONERROR(gckOS_CopyToUserData( | ||
681 | - Kernel->os, | ||
682 | - &alignedSharedInfo, | ||
683 | - gcmUINT64_TO_PTR(Interface->u.GetSharedInfo.nodeData), | ||
684 | - sizeof(gcsVIDMEM_NODE_SHARED_INFO) | ||
685 | - )); | ||
686 | - | ||
687 | - gcmkTRACE_ZONE(gcvLEVEL_VERBOSE, gcvZONE_KERNEL, | ||
688 | - "Node = %p, unaligned rectangle (l=%d, t=%d, w=%d, h=%d) aligned to (l=%d, t=%d, w=%d, h=%d)", node, | ||
689 | - storedSharedInfo->SrcOrigin.x, storedSharedInfo->SrcOrigin.y, | ||
690 | - storedSharedInfo->RectSize.width, storedSharedInfo->RectSize.height, | ||
691 | - alignedSharedInfo.SrcOrigin.x, alignedSharedInfo.SrcOrigin.y, | ||
692 | - alignedSharedInfo.RectSize.width, alignedSharedInfo.RectSize.height); | ||
693 | + /* Find record. */ | ||
694 | + gcmkONERROR( | ||
695 | + gckKERNEL_FindProcessDB(Kernel, | ||
696 | + pid, | ||
697 | + 0, | ||
698 | + gcvDB_SHARED_INFO, | ||
699 | + gcmINT2PTR(dataId), | ||
700 | + &record)); | ||
701 | + | ||
702 | + /* Check memory size. */ | ||
703 | + if (bytes < record.bytes) | ||
704 | + { | ||
705 | + /* Insufficient memory to hold shared data. */ | ||
706 | + gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT); | ||
707 | + } | ||
708 | |||
709 | - /* Rectangle */ | ||
710 | - storedSharedInfo->SrcOrigin.x = | ||
711 | - storedSharedInfo->SrcOrigin.y = | ||
712 | - storedSharedInfo->RectSize.width = | ||
713 | - storedSharedInfo->RectSize.height = 0; | ||
714 | - } | ||
715 | - break; | ||
716 | - } | ||
717 | + /* Copy to user. */ | ||
718 | + status = gckOS_CopyToUserData(Kernel->os, | ||
719 | + record.physical, | ||
720 | + data, | ||
721 | + record.bytes); | ||
722 | + | ||
723 | + /* | ||
724 | + * Remove from process db. | ||
725 | + * Every time when shared info is taken, the record is erased in | ||
726 | + * kernel side. | ||
727 | + */ | ||
728 | + gcmkVERIFY_OK( | ||
729 | + gckKERNEL_RemoveProcessDB(Kernel, | ||
730 | + pid, | ||
731 | + gcvDB_SHARED_INFO, | ||
732 | + gcmINT2PTR(dataId))); | ||
733 | + /* Free existed data. */ | ||
734 | + gcmkVERIFY_OK( | ||
735 | + gckOS_FreeMemory(Kernel->os, record.physical)); | ||
736 | } | ||
737 | break; | ||
738 | |||
739 | case gcvHAL_SET_SHARED_INFO: | ||
740 | - bytes = (gctSIZE_T) Interface->u.SetSharedInfo.size; | ||
741 | - | ||
742 | - if (Interface->u.SetSharedInfo.dataId != 0) | ||
743 | { | ||
744 | - status = gckKERNEL_FindProcessDB(Kernel, processID, 0, | ||
745 | - gcvDB_SHARED_INFO, | ||
746 | - gcmINT2PTR(Interface->u.SetSharedInfo.dataId), | ||
747 | - &record); | ||
748 | - | ||
749 | - if (status == gcvSTATUS_INVALID_DATA) | ||
750 | - { | ||
751 | - /* private data has not been created yet */ | ||
752 | - /* Note: we count on DestoryProcessDB to free it */ | ||
753 | - gcmkONERROR(gckOS_AllocateMemory( | ||
754 | - Kernel->os, | ||
755 | - bytes, | ||
756 | - &data | ||
757 | - )); | ||
758 | - | ||
759 | - gcmkONERROR( | ||
760 | - gckKERNEL_AddProcessDB(Kernel, processID, | ||
761 | - gcvDB_SHARED_INFO, | ||
762 | - gcmINT2PTR(Interface->u.SetSharedInfo.dataId), | ||
763 | - data, | ||
764 | - bytes | ||
765 | - )); | ||
766 | - } | ||
767 | - else | ||
768 | + gctUINT32 dataId = Interface->u.SetSharedInfo.dataId; | ||
769 | + gctPOINTER data = Interface->u.SetSharedInfo.data; | ||
770 | + gctUINT32 bytes = Interface->u.SetSharedInfo.bytes; | ||
771 | + gctPOINTER memory = gcvNULL; | ||
772 | + gcsDATABASE_RECORD record; | ||
773 | + | ||
774 | + if (gcmIS_SUCCESS(gckKERNEL_FindProcessDB(Kernel, | ||
775 | + processID, | ||
776 | + 0, | ||
777 | + gcvDB_SHARED_INFO, | ||
778 | + gcmINT2PTR(dataId), | ||
779 | + &record))) | ||
780 | { | ||
781 | - /* bail on other errors */ | ||
782 | - gcmkONERROR(status); | ||
783 | - | ||
784 | - /* find a record in db, check size */ | ||
785 | - if (record.bytes != bytes) | ||
786 | + /* Find a record with the same id. */ | ||
787 | + if (bytes != record.bytes) | ||
788 | { | ||
789 | - /* Size change is not allowed */ | ||
790 | - gcmkONERROR(gcvSTATUS_INVALID_DATA); | ||
791 | + /* Remove from process db. */ | ||
792 | + gcmkVERIFY_OK( | ||
793 | + gckKERNEL_RemoveProcessDB(Kernel, | ||
794 | + processID, | ||
795 | + gcvDB_SHARED_INFO, | ||
796 | + gcmINT2PTR(dataId))); | ||
797 | + | ||
798 | + /* Free existed data. */ | ||
799 | + gcmkVERIFY_OK( | ||
800 | + gckOS_FreeMemory(Kernel->os, record.physical)); | ||
801 | } | ||
802 | - | ||
803 | - /* get storage address */ | ||
804 | - data = record.physical; | ||
805 | - } | ||
806 | - | ||
807 | - gcmkONERROR(gckOS_CopyFromUserData( | ||
808 | - Kernel->os, | ||
809 | - data, | ||
810 | - gcmUINT64_TO_PTR(Interface->u.SetSharedInfo.data), | ||
811 | - bytes | ||
812 | - )); | ||
813 | - } | ||
814 | - | ||
815 | - if ((node = gcmUINT64_TO_PTR(Interface->u.SetSharedInfo.node)) != gcvNULL) | ||
816 | - { | ||
817 | - switch (Interface->u.SetSharedInfo.infoType) | ||
818 | + else | ||
819 | { | ||
820 | - case gcvVIDMEM_INFO_GENERIC: | ||
821 | - { /* Generic data stored */ | ||
822 | - if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM) | ||
823 | - { | ||
824 | - data = &node->VidMem.sharedInfo; | ||
825 | - } | ||
826 | - else | ||
827 | - { | ||
828 | - data = &node->Virtual.sharedInfo; | ||
829 | - } | ||
830 | - | ||
831 | - gcmkONERROR(gckOS_CopyFromUserData( | ||
832 | - Kernel->os, | ||
833 | - data, | ||
834 | - gcmUINT64_TO_PTR(Interface->u.SetSharedInfo.nodeData), | ||
835 | - sizeof(gcsVIDMEM_NODE_SHARED_INFO) | ||
836 | - )); | ||
837 | - } | ||
838 | - break; | ||
839 | + /* Re-use allocated memory. */ | ||
840 | + memory = record.physical; | ||
841 | + } | ||
842 | + } | ||
843 | |||
844 | - case gcvVIDMEM_INFO_DIRTY_RECTANGLE: | ||
845 | - { /* Dirty rectangle stored */ | ||
846 | - gcsVIDMEM_NODE_SHARED_INFO newSharedInfo; | ||
847 | - gcsVIDMEM_NODE_SHARED_INFO *currentSharedInfo; | ||
848 | - gctINT dirtyX, dirtyY, right, bottom; | ||
849 | - | ||
850 | - /* Expand the dirty rectangle stored in the node to include the rectangle passed in. */ | ||
851 | - gcmkONERROR(gckOS_CopyFromUserData( | ||
852 | - Kernel->os, | ||
853 | - &newSharedInfo, | ||
854 | - gcmUINT64_TO_PTR(Interface->u.SetSharedInfo.nodeData), | ||
855 | - gcmSIZEOF(gcsVIDMEM_NODE_SHARED_INFO) | ||
856 | - )); | ||
857 | - | ||
858 | - if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM) | ||
859 | - { | ||
860 | - currentSharedInfo = &node->VidMem.sharedInfo; | ||
861 | - } | ||
862 | - else | ||
863 | - { | ||
864 | - currentSharedInfo = &node->Virtual.sharedInfo; | ||
865 | - } | ||
866 | + if ((data == gcvNULL) || (bytes == 0)) | ||
867 | + { | ||
868 | + /* Nothing to record. */ | ||
869 | + break; | ||
870 | + } | ||
871 | |||
872 | - gcmkTRACE_ZONE(gcvLEVEL_VERBOSE, gcvZONE_KERNEL, "Node = %p Stored rectangle (l=%d, t=%d, w=%d, h=%d)", node, | ||
873 | - currentSharedInfo->SrcOrigin.x, currentSharedInfo->SrcOrigin.y, | ||
874 | - currentSharedInfo->RectSize.width, currentSharedInfo->RectSize.height); | ||
875 | + if (bytes > 1024) | ||
876 | + { | ||
877 | + /* Limite data size. */ | ||
878 | + gcmkONERROR(gcvSTATUS_TOO_COMPLEX); | ||
879 | + } | ||
880 | |||
881 | - gcmkTRACE_ZONE(gcvLEVEL_VERBOSE, gcvZONE_KERNEL, "To combine with (l=%d, t=%d, w=%d, h=%d)", | ||
882 | - newSharedInfo.SrcOrigin.x, newSharedInfo.SrcOrigin.y, | ||
883 | - newSharedInfo.RectSize.width, newSharedInfo.RectSize.height); | ||
884 | + if (memory == gcvNULL) | ||
885 | + { | ||
886 | + /* Allocate memory for holding shared data. */ | ||
887 | + gcmkONERROR( | ||
888 | + gckOS_AllocateMemory(Kernel->os, bytes, &memory)); | ||
889 | |||
890 | - if ((currentSharedInfo->RectSize.width == 0) || (currentSharedInfo->RectSize.height == 0)) | ||
891 | - { /* Setting it for the first time */ | ||
892 | - currentSharedInfo->SrcOrigin.x = newSharedInfo.SrcOrigin.x; | ||
893 | - currentSharedInfo->SrcOrigin.y = newSharedInfo.SrcOrigin.y; | ||
894 | - currentSharedInfo->RectSize.width = newSharedInfo.RectSize.width; | ||
895 | - currentSharedInfo->RectSize.height = newSharedInfo.RectSize.height; | ||
896 | - } | ||
897 | - else | ||
898 | - { | ||
899 | - /* Expand the stored rectangle to include newly locked rectangle */ | ||
900 | - dirtyX = (newSharedInfo.SrcOrigin.x < currentSharedInfo->SrcOrigin.x) ? newSharedInfo.SrcOrigin.x : currentSharedInfo->SrcOrigin.x; | ||
901 | - right = gcmMAX((currentSharedInfo->SrcOrigin.x + currentSharedInfo->RectSize.width), (newSharedInfo.SrcOrigin.x + newSharedInfo.RectSize.width)); | ||
902 | - currentSharedInfo->RectSize.width = right - dirtyX; | ||
903 | - currentSharedInfo->SrcOrigin.x = dirtyX; | ||
904 | - | ||
905 | - dirtyY = (newSharedInfo.SrcOrigin.y < currentSharedInfo->SrcOrigin.y) ? newSharedInfo.SrcOrigin.y : currentSharedInfo->SrcOrigin.y; | ||
906 | - bottom = gcmMAX((currentSharedInfo->SrcOrigin.y + currentSharedInfo->RectSize.height), (newSharedInfo.SrcOrigin.y + newSharedInfo.RectSize.height)); | ||
907 | - currentSharedInfo->RectSize.height = bottom - dirtyY; | ||
908 | - currentSharedInfo->SrcOrigin.y = dirtyY; | ||
909 | - } | ||
910 | + /* Add to process db. */ | ||
911 | + status = gckKERNEL_AddProcessDB(Kernel, | ||
912 | + processID, | ||
913 | + gcvDB_SHARED_INFO, | ||
914 | + gcmINT2PTR(dataId), | ||
915 | + memory, | ||
916 | + bytes); | ||
917 | |||
918 | - gcmkTRACE_ZONE(gcvLEVEL_VERBOSE, gcvZONE_KERNEL, "Combined rectangle (l=%d, t=%d, w=%d, h=%d)", | ||
919 | - currentSharedInfo->SrcOrigin.x, currentSharedInfo->SrcOrigin.y, | ||
920 | - currentSharedInfo->RectSize.width, currentSharedInfo->RectSize.height); | ||
921 | - } | ||
922 | + if (gcmIS_ERROR(status)) | ||
923 | + { | ||
924 | + /* Failed to add process db. Free allocated memory. */ | ||
925 | + gcmkVERIFY_OK(gckOS_FreeMemory(Kernel->os, memory)); | ||
926 | break; | ||
927 | } | ||
928 | - } | ||
929 | + } | ||
930 | |||
931 | + /* Copy shared data to kernel memory. */ | ||
932 | + gcmkONERROR( | ||
933 | + gckOS_CopyFromUserData(Kernel->os, | ||
934 | + memory, | ||
935 | + data, | ||
936 | + bytes)); | ||
937 | + } | ||
938 | break; | ||
939 | |||
940 | case gcvHAL_SET_FSCALE_VALUE: | ||
941 | diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c | ||
942 | index 66ce0d1..9ee9ea1 100644 | ||
943 | --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c | ||
944 | +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c | ||
945 | @@ -2047,14 +2047,14 @@ gckCOMMAND_Commit( | ||
946 | EventQueue = nextEventRecord; | ||
947 | } | ||
948 | |||
949 | -#if gcdPOWER_MANAGEMENT | ||
950 | - if (Command->kernel->eventObj->queueHead == gcvNULL) | ||
951 | + if (Command->kernel->eventObj->queueHead == gcvNULL | ||
952 | + && Command->kernel->hardware->powerManagement == gcvTRUE | ||
953 | + ) | ||
954 | { | ||
955 | /* Commit done event by which work thread knows all jobs done. */ | ||
956 | gcmkVERIFY_OK( | ||
957 | gckEVENT_CommitDone(Command->kernel->eventObj, gcvKERNEL_PIXEL)); | ||
958 | } | ||
959 | -#endif | ||
960 | |||
961 | /* Submit events. */ | ||
962 | status = gckEVENT_Submit(Command->kernel->eventObj, gcvTRUE, gcvFALSE); | ||
963 | diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c | ||
964 | index 9685a5d..76c1c10 100644 | ||
965 | --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c | ||
966 | +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c | ||
967 | @@ -1234,7 +1234,6 @@ _EventHandler_BusError( | ||
968 | return gcvSTATUS_OK; | ||
969 | } | ||
970 | |||
971 | -#if gcdPOWER_MANAGEMENT | ||
972 | /******************************************************************************\ | ||
973 | ****************************** Power Stall Handler ******************************* | ||
974 | \******************************************************************************/ | ||
975 | @@ -1250,7 +1249,6 @@ _EventHandler_PowerStall( | ||
976 | Kernel->command->powerStallSignal, | ||
977 | gcvTRUE); | ||
978 | } | ||
979 | -#endif | ||
980 | |||
981 | /******************************************************************************\ | ||
982 | ******************************** Task Routines ********************************* | ||
983 | @@ -1965,15 +1963,12 @@ gcmDECLARE_INTERRUPT_HANDLER(COMMAND, 0) | ||
984 | ); | ||
985 | } | ||
986 | } | ||
987 | -#if gcdPOWER_MANAGEMENT | ||
988 | else | ||
989 | { | ||
990 | - | ||
991 | status = gckVGHARDWARE_SetPowerManagementState( | ||
992 | Kernel->command->hardware, gcvPOWER_IDLE_BROADCAST | ||
993 | ); | ||
994 | } | ||
995 | -#endif | ||
996 | |||
997 | /* Break out of the loop. */ | ||
998 | break; | ||
999 | @@ -2848,7 +2843,7 @@ gckVGCOMMAND_Construct( | ||
1000 | _EventHandler_BusError | ||
1001 | )); | ||
1002 | |||
1003 | -#if gcdPOWER_MANAGEMENT | ||
1004 | + | ||
1005 | command->powerStallInt = 30; | ||
1006 | /* Enable the interrupt. */ | ||
1007 | gcmkERR_BREAK(gckVGINTERRUPT_Enable( | ||
1008 | @@ -2856,7 +2851,6 @@ gckVGCOMMAND_Construct( | ||
1009 | &command->powerStallInt, | ||
1010 | _EventHandler_PowerStall | ||
1011 | )); | ||
1012 | -#endif | ||
1013 | |||
1014 | /*********************************************************************** | ||
1015 | ** Task management initialization. | ||
1016 | @@ -3419,7 +3413,6 @@ gckVGCOMMAND_Commit( | ||
1017 | gcvINFINITE | ||
1018 | )); | ||
1019 | |||
1020 | -#if gcdPOWER_MANAGEMENT | ||
1021 | status = gckVGHARDWARE_SetPowerManagementState( | ||
1022 | Command->hardware, gcvPOWER_ON_AUTO); | ||
1023 | |||
1024 | @@ -3447,7 +3440,7 @@ gckVGCOMMAND_Commit( | ||
1025 | |||
1026 | break; | ||
1027 | } | ||
1028 | -#endif | ||
1029 | + | ||
1030 | gcmkERR_BREAK(_FlushMMU(Command)); | ||
1031 | |||
1032 | do | ||
1033 | @@ -3676,10 +3669,9 @@ gckVGCOMMAND_Commit( | ||
1034 | } | ||
1035 | while (gcvFALSE); | ||
1036 | |||
1037 | -#if gcdPOWER_MANAGEMENT | ||
1038 | gcmkVERIFY_OK(gckOS_ReleaseSemaphore( | ||
1039 | Command->os, Command->powerSemaphore)); | ||
1040 | -#endif | ||
1041 | + | ||
1042 | /* Release the mutex. */ | ||
1043 | gcmkCHECK_STATUS(gckOS_ReleaseMutex( | ||
1044 | Command->os, | ||
1045 | diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c | ||
1046 | index bc5f083..673d4f7 100644 | ||
1047 | --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c | ||
1048 | +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c | ||
1049 | @@ -1303,9 +1303,9 @@ gckKERNEL_DestroyProcessDB( | ||
1050 | gcmPTR2INT(record->data), status); | ||
1051 | break; | ||
1052 | |||
1053 | - case gcvDB_SHARED_INFO: | ||
1054 | - status = gckOS_FreeMemory(Kernel->os, record->physical); | ||
1055 | - break; | ||
1056 | + case gcvDB_SHARED_INFO: | ||
1057 | + status = gckOS_FreeMemory(Kernel->os, record->physical); | ||
1058 | + break; | ||
1059 | |||
1060 | default: | ||
1061 | gcmkTRACE_ZONE(gcvLEVEL_ERROR, gcvZONE_DATABASE, | ||
1062 | diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu.c | ||
1063 | index 43c9297..c7f67c7 100644 | ||
1064 | --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu.c | ||
1065 | +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu.c | ||
1066 | @@ -97,6 +97,14 @@ static gcsMirrorPageTable_PTR mirrorPageTable = gcvNULL; | ||
1067 | static gctPOINTER mirrorPageTableMutex = gcvNULL; | ||
1068 | #endif | ||
1069 | |||
1070 | +typedef struct _gcsDynamicSpaceNode * gcsDynamicSpaceNode_PTR; | ||
1071 | +typedef struct _gcsDynamicSpaceNode | ||
1072 | +{ | ||
1073 | + gctUINT32 start; | ||
1074 | + gctINT32 entries; | ||
1075 | +} | ||
1076 | +gcsDynamicSpaceNode; | ||
1077 | + | ||
1078 | static void | ||
1079 | _WritePageEntry( | ||
1080 | IN gctUINT32_PTR PageEntry, | ||
1081 | @@ -482,30 +490,117 @@ OnError: | ||
1082 | } | ||
1083 | |||
1084 | static gceSTATUS | ||
1085 | +_FindDynamicSpace( | ||
1086 | + IN gckMMU Mmu, | ||
1087 | + OUT gcsDynamicSpaceNode_PTR *Array, | ||
1088 | + OUT gctINT * Size | ||
1089 | + ) | ||
1090 | +{ | ||
1091 | + gceSTATUS status = gcvSTATUS_OK; | ||
1092 | + gctPOINTER pointer = gcvNULL; | ||
1093 | + gcsDynamicSpaceNode_PTR array = gcvNULL; | ||
1094 | + gctINT size = 0; | ||
1095 | + gctINT i = 0, nodeStart = -1, nodeEntries = 0; | ||
1096 | + | ||
1097 | + /* Allocate memory for the array. */ | ||
1098 | + gcmkONERROR(gckOS_Allocate(Mmu->os, | ||
1099 | + gcmSIZEOF(*array) * (gcdMMU_MTLB_ENTRY_NUM / 2), | ||
1100 | + &pointer)); | ||
1101 | + | ||
1102 | + array = (gcsDynamicSpaceNode_PTR)pointer; | ||
1103 | + | ||
1104 | + /* Loop all the entries. */ | ||
1105 | + while (i < gcdMMU_MTLB_ENTRY_NUM) | ||
1106 | + { | ||
1107 | + if (!Mmu->mtlbLogical[i]) | ||
1108 | + { | ||
1109 | + if (nodeStart < 0) | ||
1110 | + { | ||
1111 | + /* This is the first entry of the dynamic space. */ | ||
1112 | + nodeStart = i; | ||
1113 | + nodeEntries = 1; | ||
1114 | + } | ||
1115 | + else | ||
1116 | + { | ||
1117 | + /* Other entries of the dynamic space. */ | ||
1118 | + nodeEntries++; | ||
1119 | + } | ||
1120 | + } | ||
1121 | + else if (nodeStart >= 0) | ||
1122 | + { | ||
1123 | + /* Save the previous node. */ | ||
1124 | + array[size].start = nodeStart; | ||
1125 | + array[size].entries = nodeEntries; | ||
1126 | + size++; | ||
1127 | + | ||
1128 | + /* Reset the start. */ | ||
1129 | + nodeStart = -1; | ||
1130 | + nodeEntries = 0; | ||
1131 | + } | ||
1132 | + | ||
1133 | + i++; | ||
1134 | + } | ||
1135 | + | ||
1136 | + /* Save the previous node. */ | ||
1137 | + if (nodeStart >= 0) | ||
1138 | + { | ||
1139 | + array[size].start = nodeStart; | ||
1140 | + array[size].entries = nodeEntries; | ||
1141 | + size++; | ||
1142 | + } | ||
1143 | + | ||
1144 | +#if gcdMMU_TABLE_DUMP | ||
1145 | + for (i = 0; i < size; i++) | ||
1146 | + { | ||
1147 | + gckOS_Print("%s(%d): [%d]: start=%d, entries=%d.\n", | ||
1148 | + __FUNCTION__, __LINE__, | ||
1149 | + i, | ||
1150 | + array[i].start, | ||
1151 | + array[i].entries); | ||
1152 | + } | ||
1153 | +#endif | ||
1154 | + | ||
1155 | + *Array = array; | ||
1156 | + *Size = size; | ||
1157 | + | ||
1158 | + return gcvSTATUS_OK; | ||
1159 | + | ||
1160 | +OnError: | ||
1161 | + if (pointer != gcvNULL) | ||
1162 | + { | ||
1163 | + gckOS_Free(Mmu->os, pointer); | ||
1164 | + } | ||
1165 | + | ||
1166 | + return status; | ||
1167 | +} | ||
1168 | + | ||
1169 | +static gceSTATUS | ||
1170 | _SetupDynamicSpace( | ||
1171 | IN gckMMU Mmu | ||
1172 | ) | ||
1173 | { | ||
1174 | gceSTATUS status; | ||
1175 | - gctINT i; | ||
1176 | + gcsDynamicSpaceNode_PTR nodeArray = gcvNULL; | ||
1177 | + gctINT i, nodeArraySize = 0; | ||
1178 | gctUINT32 physical; | ||
1179 | - gctINT numEntries; | ||
1180 | + gctINT numEntries = 0; | ||
1181 | gctUINT32_PTR pageTable; | ||
1182 | gctBOOL acquired = gcvFALSE; | ||
1183 | |||
1184 | - /* find the start of dynamic address space. */ | ||
1185 | - for (i = 0; i < gcdMMU_MTLB_ENTRY_NUM; i++) | ||
1186 | + /* Find all the dynamic address space. */ | ||
1187 | + gcmkONERROR(_FindDynamicSpace(Mmu, &nodeArray, &nodeArraySize)); | ||
1188 | + | ||
1189 | + /* TODO: We only use the largest one for now. */ | ||
1190 | + for (i = 0; i < nodeArraySize; i++) | ||
1191 | { | ||
1192 | - if (!Mmu->mtlbLogical[i]) | ||
1193 | + if (nodeArray[i].entries > numEntries) | ||
1194 | { | ||
1195 | - break; | ||
1196 | + Mmu->dynamicMappingStart = nodeArray[i].start; | ||
1197 | + numEntries = nodeArray[i].entries; | ||
1198 | } | ||
1199 | } | ||
1200 | |||
1201 | - Mmu->dynamicMappingStart = i; | ||
1202 | - | ||
1203 | - /* Number of entries in Master TLB for dynamic mapping. */ | ||
1204 | - numEntries = gcdMMU_MTLB_ENTRY_NUM - i; | ||
1205 | + gckOS_Free(Mmu->os, (gctPOINTER)nodeArray); | ||
1206 | |||
1207 | Mmu->pageTableSize = numEntries * 4096; | ||
1208 | |||
1209 | @@ -545,7 +640,9 @@ _SetupDynamicSpace( | ||
1210 | acquired = gcvTRUE; | ||
1211 | |||
1212 | /* Map to Master TLB. */ | ||
1213 | - for (; i < gcdMMU_MTLB_ENTRY_NUM; i++) | ||
1214 | + for (i = (gctINT)Mmu->dynamicMappingStart; | ||
1215 | + i < (gctINT)Mmu->dynamicMappingStart + numEntries; | ||
1216 | + i++) | ||
1217 | { | ||
1218 | _WritePageEntry(Mmu->mtlbLogical + i, | ||
1219 | physical | ||
1220 | diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c | ||
1221 | index 8a442a2..8b8bbdc 100644 | ||
1222 | --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c | ||
1223 | +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c | ||
1224 | @@ -2144,6 +2144,9 @@ gckVIDMEM_Unlock( | ||
1225 | |||
1226 | if (!Node->Virtual.contiguous | ||
1227 | && (Node->Virtual.lockeds[Kernel->core] == 1) | ||
1228 | +#if gcdENABLE_VG | ||
1229 | + && (Kernel->vg == gcvNULL) | ||
1230 | +#endif | ||
1231 | ) | ||
1232 | { | ||
1233 | if (Type == gcvSURF_BITMAP) | ||
1234 | diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h | ||
1235 | index 7077412..4406d7e 100644 | ||
1236 | --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h | ||
1237 | +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h | ||
1238 | @@ -2072,6 +2072,12 @@ gckHARDWARE_QueryPowerManagementState( | ||
1239 | OUT gceCHIPPOWERSTATE* State | ||
1240 | ); | ||
1241 | |||
1242 | +gceSTATUS | ||
1243 | +gckHARDWARE_SetPowerManagement( | ||
1244 | + IN gckHARDWARE Hardware, | ||
1245 | + IN gctBOOL PowerManagement | ||
1246 | + ); | ||
1247 | + | ||
1248 | #if gcdENABLE_FSCALE_VAL_ADJUST | ||
1249 | gceSTATUS | ||
1250 | gckHARDWARE_SetFscaleValue( | ||
1251 | diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h | ||
1252 | index ac86399..44689b0 100644 | ||
1253 | --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h | ||
1254 | +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h | ||
1255 | @@ -74,7 +74,6 @@ typedef struct _gcsSYNC_CONTEXT * gcsSYNC_CONTEXT_PTR; | ||
1256 | /******************************************************************************\ | ||
1257 | ******************************* Process local storage ************************* | ||
1258 | \******************************************************************************/ | ||
1259 | - | ||
1260 | typedef struct _gcsPLS * gcsPLS_PTR; | ||
1261 | typedef struct _gcsPLS | ||
1262 | { | ||
1263 | @@ -107,6 +106,7 @@ typedef struct _gcsPLS | ||
1264 | |||
1265 | /* Reference count for destructor. */ | ||
1266 | gcsATOM_PTR reference; | ||
1267 | + gctBOOL bKFS; | ||
1268 | #if gcdUSE_NPOT_PATCH | ||
1269 | gctBOOL bNeedSupportNP2Texture; | ||
1270 | #endif | ||
1271 | @@ -123,7 +123,7 @@ extern gcsPLS gcPLS; | ||
1272 | typedef struct _gcsTLS * gcsTLS_PTR; | ||
1273 | |||
1274 | typedef void (* gctTLS_DESTRUCTOR) ( | ||
1275 | - gcsTLS_PTR TLS | ||
1276 | + gcsTLS_PTR | ||
1277 | ); | ||
1278 | |||
1279 | typedef struct _gcsTLS | ||
1280 | @@ -658,8 +658,6 @@ gcoHAL_QueryChipFeature( | ||
1281 | IN gceFEATURE Feature); | ||
1282 | |||
1283 | #endif | ||
1284 | - | ||
1285 | - | ||
1286 | /******************************************************************************\ | ||
1287 | ********************************** gcoOS Object ********************************* | ||
1288 | \******************************************************************************/ | ||
1289 | @@ -1775,20 +1773,6 @@ gcoSURF_QueryVidMemNode( | ||
1290 | OUT gctUINT_PTR Bytes | ||
1291 | ); | ||
1292 | |||
1293 | -/* Set usage attribute of a surface. */ | ||
1294 | -gceSTATUS | ||
1295 | -gcoSURF_SetUsage( | ||
1296 | - IN gcoSURF Surface, | ||
1297 | - IN gceSURF_USAGE Usage | ||
1298 | - ); | ||
1299 | - | ||
1300 | -/* Return usage attribute of a surface. */ | ||
1301 | -gceSTATUS | ||
1302 | -gcoSURF_QueryUsage( | ||
1303 | - IN gcoSURF Surface, | ||
1304 | - OUT gceSURF_USAGE *Usage | ||
1305 | - ); | ||
1306 | - | ||
1307 | /* Set the color type of the surface. */ | ||
1308 | gceSTATUS | ||
1309 | gcoSURF_SetColorType( | ||
1310 | @@ -1975,6 +1959,14 @@ gcoSURF_SetWindow( | ||
1311 | IN gctUINT Height | ||
1312 | ); | ||
1313 | |||
1314 | +/* Set width/height alignment of the surface directly and calculate stride/size. This is only for dri backend now. Please be careful before use. */ | ||
1315 | +gceSTATUS | ||
1316 | +gcoSURF_SetAlignment( | ||
1317 | + IN gcoSURF Surface, | ||
1318 | + IN gctUINT Width, | ||
1319 | + IN gctUINT Height | ||
1320 | + ); | ||
1321 | + | ||
1322 | /* Increase reference count of the surface. */ | ||
1323 | gceSTATUS | ||
1324 | gcoSURF_ReferenceSurface( | ||
1325 | @@ -2009,6 +2001,12 @@ gcoSURF_SetOffset( | ||
1326 | ); | ||
1327 | |||
1328 | gceSTATUS | ||
1329 | +gcoSURF_GetOffset( | ||
1330 | + IN gcoSURF Surface, | ||
1331 | + OUT gctUINT *Offset | ||
1332 | + ); | ||
1333 | + | ||
1334 | +gceSTATUS | ||
1335 | gcoSURF_NODE_Cache( | ||
1336 | IN gcsSURF_NODE_PTR Node, | ||
1337 | IN gctPOINTER Logical, | ||
1338 | diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_compiler.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_compiler.h | ||
1339 | index 4a0870f..8693c37 100644 | ||
1340 | --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_compiler.h | ||
1341 | +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_compiler.h | ||
1342 | @@ -36,12 +36,16 @@ extern "C" { | ||
1343 | #endif | ||
1344 | |||
1345 | #ifndef GC_ENABLE_LOADTIME_OPT | ||
1346 | -#define GC_ENABLE_LOADTIME_OPT 1 | ||
1347 | +#define GC_ENABLE_LOADTIME_OPT 1 | ||
1348 | #endif | ||
1349 | |||
1350 | #define TEMP_OPT_CONSTANT_TEXLD_COORD 1 | ||
1351 | |||
1352 | -#define TEMP_SHADER_PATCH 1 | ||
1353 | +#define TEMP_SHADER_PATCH 1 | ||
1354 | + | ||
1355 | +#define ADD_PRE_ROTATION_TO_VS 0 | ||
1356 | + | ||
1357 | +#define TEMP_INLINE_ALL_EXPANSION 1 | ||
1358 | /******************************* IR VERSION ******************/ | ||
1359 | #define gcdSL_IR_VERSION gcmCC('\0','\0','\0','\1') | ||
1360 | |||
1361 | @@ -683,6 +687,13 @@ typedef enum _gceSHADER_FLAGS | ||
1362 | gcvSHADER_USE_ALPHA_KILL = 0x100, | ||
1363 | #endif | ||
1364 | |||
1365 | +#if ADD_PRE_ROTATION_TO_VS | ||
1366 | + gcvSHADER_VS_PRE_ROTATION = 0x200, | ||
1367 | +#endif | ||
1368 | + | ||
1369 | +#if TEMP_INLINE_ALL_EXPANSION | ||
1370 | + gcvSHADER_INLINE_ALL_EXPANSION = 0x200, | ||
1371 | +#endif | ||
1372 | } | ||
1373 | gceSHADER_FLAGS; | ||
1374 | |||
1375 | @@ -771,10 +782,15 @@ typedef enum _gceSHADER_OPTIMIZATION | ||
1376 | /* optimize varying packing */ | ||
1377 | gcvOPTIMIZATION_VARYINGPACKING = 1 << 22, | ||
1378 | |||
1379 | +#if TEMP_INLINE_ALL_EXPANSION | ||
1380 | + gcvOPTIMIZATION_INLINE_ALL_EXPANSION = 1 << 23, | ||
1381 | +#endif | ||
1382 | + | ||
1383 | /* Full optimization. */ | ||
1384 | /* Note that gcvOPTIMIZATION_LOAD_SW_WORKAROUND is off. */ | ||
1385 | gcvOPTIMIZATION_FULL = 0x7FFFFFFF & | ||
1386 | ~gcvOPTIMIZATION_LOAD_SW_WORKAROUND & | ||
1387 | + ~gcvOPTIMIZATION_INLINE_ALL_EXPANSION & | ||
1388 | ~gcvOPTIMIZATION_POWER_OPTIMIZATION, | ||
1389 | |||
1390 | /* Optimization Unit Test flag. */ | ||
1391 | diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h | ||
1392 | index 028bbd1..b056c52 100644 | ||
1393 | --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h | ||
1394 | +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h | ||
1395 | @@ -210,6 +210,9 @@ typedef struct _gcsHAL_QUERY_CHIP_IDENTITY | ||
1396 | /* Supported minor feature 3 fields. */ | ||
1397 | gctUINT32 chipMinorFeatures3; | ||
1398 | |||
1399 | + /* Supported minor feature 4 fields. */ | ||
1400 | + gctUINT32 chipMinorFeatures4; | ||
1401 | + | ||
1402 | /* Number of streams supported. */ | ||
1403 | gctUINT32 streamCount; | ||
1404 | |||
1405 | @@ -929,30 +932,30 @@ typedef struct _gcsHAL_INTERFACE | ||
1406 | |||
1407 | struct _gcsHAL_GET_SHARED_INFO | ||
1408 | { | ||
1409 | + /* Process id. */ | ||
1410 | IN gctUINT32 pid; | ||
1411 | + | ||
1412 | + /* Data id. */ | ||
1413 | IN gctUINT32 dataId; | ||
1414 | - /* gcuVIDMEM_NODE_PTR */ | ||
1415 | - IN gctUINT64 node; | ||
1416 | - /* gctUINT8_PTR */ | ||
1417 | - OUT gctUINT64 data; | ||
1418 | - /* fix size. gctUINT8_PTR*/ | ||
1419 | - OUT gctUINT64 nodeData; | ||
1420 | - gctUINT64 size; | ||
1421 | - IN gceVIDMEM_NODE_SHARED_INFO_TYPE infoType; | ||
1422 | + | ||
1423 | + /* Data size. */ | ||
1424 | + IN gctSIZE_T bytes; | ||
1425 | + | ||
1426 | + /* Pointer to save the shared data. */ | ||
1427 | + OUT gctPOINTER data; | ||
1428 | } | ||
1429 | GetSharedInfo; | ||
1430 | |||
1431 | struct _gcsHAL_SET_SHARED_INFO | ||
1432 | { | ||
1433 | + /* Data id. */ | ||
1434 | IN gctUINT32 dataId; | ||
1435 | - /* gcuVIDMEM_NODE_PTR */ | ||
1436 | - IN gctUINT64 node; | ||
1437 | - /* gctUINT8_PTR */ | ||
1438 | - IN gctUINT64 data; | ||
1439 | - /* gctUINT8_PTR */ | ||
1440 | - IN gctUINT64 nodeData; | ||
1441 | - IN gctUINT64 size; | ||
1442 | - IN gceVIDMEM_NODE_SHARED_INFO_TYPE infoType; | ||
1443 | + | ||
1444 | + /* Data to be shared. */ | ||
1445 | + IN gctPOINTER data; | ||
1446 | + | ||
1447 | + /* Data size. */ | ||
1448 | + IN gctSIZE_T bytes; | ||
1449 | } | ||
1450 | SetSharedInfo; | ||
1451 | |||
1452 | diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine.h | ||
1453 | index 249b61b..8481375 100644 | ||
1454 | --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine.h | ||
1455 | +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine.h | ||
1456 | @@ -323,50 +323,6 @@ gcoSURF_Resolve( | ||
1457 | IN gcoSURF DestSurface | ||
1458 | ); | ||
1459 | |||
1460 | -/* Export the render target. */ | ||
1461 | -gceSTATUS | ||
1462 | -gcoSURF_ExportRenderTarget( | ||
1463 | - IN gcoSURF SrcSurface | ||
1464 | -); | ||
1465 | - | ||
1466 | -/* Import the render target. */ | ||
1467 | -gceSTATUS | ||
1468 | -gcoSURF_ImportRenderTarget( | ||
1469 | - IN gctUINT32 Pid, | ||
1470 | - IN gcoSURF SrcSurface | ||
1471 | -); | ||
1472 | - | ||
1473 | -/* Save the Resolve info to kernel. */ | ||
1474 | -gceSTATUS | ||
1475 | -gcoSURF_PrepareRemoteResolveRect( | ||
1476 | - IN gcoSURF SrcSurface, | ||
1477 | - IN gcsPOINT_PTR SrcOrigin, | ||
1478 | - IN gcsPOINT_PTR DestOrigin, | ||
1479 | - IN gcsPOINT_PTR RectSize | ||
1480 | - ); | ||
1481 | - | ||
1482 | -/* Resolve using the rectangle info previously saved in the vid mem node. */ | ||
1483 | -gceSTATUS | ||
1484 | -gcoSURF_ResolveFromStoredRect( | ||
1485 | - IN gcoSURF SrcSurface, | ||
1486 | - IN gcoSURF DestSurface | ||
1487 | - ); | ||
1488 | - | ||
1489 | -/* Using the info that Process Pid saved to do resolve. */ | ||
1490 | -gceSTATUS | ||
1491 | -gcoSURF_RemoteResolveRect( | ||
1492 | - IN gcoSURF SrcSurface, | ||
1493 | - IN gcoSURF DestSurface, | ||
1494 | - IN gctBOOL *resolveDiscarded | ||
1495 | - ); | ||
1496 | - | ||
1497 | -/* Return the "resolve submitted indicator" signal. */ | ||
1498 | -gceSTATUS | ||
1499 | -gcoSURF_GetRTSignal( | ||
1500 | - IN gcoSURF RTSurface, | ||
1501 | - OUT gctSIGNAL * resolveSubmittedSignal | ||
1502 | - ); | ||
1503 | - | ||
1504 | /* Resolve rectangular area of a surface. */ | ||
1505 | gceSTATUS | ||
1506 | gcoSURF_ResolveRect( | ||
1507 | @@ -1684,6 +1640,12 @@ gcoTEXTURE_IsRenderable( | ||
1508 | ); | ||
1509 | |||
1510 | gceSTATUS | ||
1511 | +gcoTEXTURE_IsRenderableEx( | ||
1512 | + IN gcoTEXTURE Texture, | ||
1513 | + IN gctUINT Level | ||
1514 | + ); | ||
1515 | + | ||
1516 | +gceSTATUS | ||
1517 | gcoTEXTURE_IsComplete( | ||
1518 | IN gcoTEXTURE Texture, | ||
1519 | IN gctINT MaxLevel | ||
1520 | @@ -2028,21 +1990,15 @@ gceSTATUS | ||
1521 | gcoHAL_GetSharedInfo( | ||
1522 | IN gctUINT32 Pid, | ||
1523 | IN gctUINT32 DataId, | ||
1524 | - OUT gctUINT8_PTR Data, | ||
1525 | IN gctSIZE_T Bytes, | ||
1526 | - IN gctUINT64 Node, | ||
1527 | - OUT gctUINT8_PTR NodeData, | ||
1528 | - IN gceVIDMEM_NODE_SHARED_INFO_TYPE SharedInfoType | ||
1529 | + OUT gctPOINTER Data | ||
1530 | ); | ||
1531 | |||
1532 | gceSTATUS | ||
1533 | gcoHAL_SetSharedInfo( | ||
1534 | IN gctUINT32 DataId, | ||
1535 | - IN gctUINT8_PTR Data, | ||
1536 | - IN gctSIZE_T Bytes, | ||
1537 | - IN gctUINT64 Node, | ||
1538 | - IN gctUINT8_PTR NodeData, | ||
1539 | - IN gceVIDMEM_NODE_SHARED_INFO_TYPE SharedInfoType | ||
1540 | + IN gctPOINTER Data, | ||
1541 | + IN gctSIZE_T Bytes | ||
1542 | ); | ||
1543 | |||
1544 | #ifdef __cplusplus | ||
1545 | diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h | ||
1546 | index cf6b425..a1d9ae5 100644 | ||
1547 | --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h | ||
1548 | +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h | ||
1549 | @@ -181,13 +181,6 @@ typedef enum _gceCACHEOPERATION | ||
1550 | } | ||
1551 | gceCACHEOPERATION; | ||
1552 | |||
1553 | -typedef enum _gceVIDMEM_NODE_SHARED_INFO_TYPE | ||
1554 | -{ | ||
1555 | - gcvVIDMEM_INFO_GENERIC, | ||
1556 | - gcvVIDMEM_INFO_DIRTY_RECTANGLE | ||
1557 | -} | ||
1558 | -gceVIDMEM_NODE_SHARED_INFO_TYPE; | ||
1559 | - | ||
1560 | /* Surface types. */ | ||
1561 | typedef enum _gceSURF_TYPE | ||
1562 | { | ||
1563 | diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_options.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_options.h | ||
1564 | index afe83d0..9e2a8db 100644 | ||
1565 | --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_options.h | ||
1566 | +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_options.h | ||
1567 | @@ -391,15 +391,6 @@ | ||
1568 | #endif | ||
1569 | |||
1570 | /* | ||
1571 | - gcdPOWER_MANAGEMENT | ||
1572 | - | ||
1573 | - This define enables the power management code. | ||
1574 | -*/ | ||
1575 | -#ifndef gcdPOWER_MANAGEMENT | ||
1576 | -# define gcdPOWER_MANAGEMENT 1 | ||
1577 | -#endif | ||
1578 | - | ||
1579 | -/* | ||
1580 | gcdPOWER_SUSNPEND_WHEN_IDLE | ||
1581 | |||
1582 | Set to 1 to make GPU enter gcvPOWER_SUSPEND when idle detected, | ||
1583 | @@ -428,7 +419,7 @@ | ||
1584 | If the value is 0, no timeout will be checked for. | ||
1585 | */ | ||
1586 | #ifndef gcdGPU_TIMEOUT | ||
1587 | -# if gcdFPGA_BUILD | ||
1588 | +#if gcdFPGA_BUILD | ||
1589 | # define gcdGPU_TIMEOUT 0 | ||
1590 | # else | ||
1591 | # define gcdGPU_TIMEOUT 20000 | ||
1592 | @@ -726,31 +717,13 @@ | ||
1593 | |||
1594 | Support swap with a specific rectangle. | ||
1595 | |||
1596 | - Set the rectangle with eglSetSwapRectangleANDROID api. | ||
1597 | + Set the rectangle with eglSetSwapRectangleVIV api. | ||
1598 | */ | ||
1599 | #ifndef gcdSUPPORT_SWAP_RECTANGLE | ||
1600 | # define gcdSUPPORT_SWAP_RECTANGLE 0 | ||
1601 | #endif | ||
1602 | |||
1603 | /* | ||
1604 | - gcdDEFER_RESOLVES | ||
1605 | - | ||
1606 | - Support deferred resolves for 3D apps. | ||
1607 | -*/ | ||
1608 | -#ifndef gcdDEFER_RESOLVES | ||
1609 | -# define gcdDEFER_RESOLVES 0 | ||
1610 | -#endif | ||
1611 | - | ||
1612 | -/* | ||
1613 | - gcdCOPYBLT_OPTIMIZATION | ||
1614 | - | ||
1615 | - Combine dirty areas resulting from Android's copyBlt. | ||
1616 | -*/ | ||
1617 | -#ifndef gcdCOPYBLT_OPTIMIZATION | ||
1618 | -# define gcdCOPYBLT_OPTIMIZATION 0 | ||
1619 | -#endif | ||
1620 | - | ||
1621 | -/* | ||
1622 | gcdGPU_LINEAR_BUFFER_ENABLED | ||
1623 | |||
1624 | Use linear buffer for GPU apps so HWC can do 2D composition. | ||
1625 | diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_version.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_version.h | ||
1626 | index 808fde0..03cb4d6 100644 | ||
1627 | --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_version.h | ||
1628 | +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_version.h | ||
1629 | @@ -28,7 +28,7 @@ | ||
1630 | |||
1631 | #define gcvVERSION_PATCH 9 | ||
1632 | |||
1633 | -#define gcvVERSION_BUILD 4651 | ||
1634 | +#define gcvVERSION_BUILD 6622 | ||
1635 | |||
1636 | #define gcvVERSION_DATE __DATE__ | ||
1637 | |||
1638 | diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_vg.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_vg.h | ||
1639 | index 5ff0281..2a910e8 100644 | ||
1640 | --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_vg.h | ||
1641 | +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_vg.h | ||
1642 | @@ -552,6 +552,12 @@ gckVGHARDWARE_QueryPowerManagementState( | ||
1643 | ); | ||
1644 | |||
1645 | gceSTATUS | ||
1646 | +gckVGHARDWARE_SetPowerManagement( | ||
1647 | + IN gckVGHARDWARE Hardware, | ||
1648 | + IN gctBOOL PowerManagement | ||
1649 | + ); | ||
1650 | + | ||
1651 | +gceSTATUS | ||
1652 | gckVGHARDWARE_SetPowerOffTimeout( | ||
1653 | IN gckVGHARDWARE Hardware, | ||
1654 | IN gctUINT32 Timeout | ||
1655 | diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c | ||
1656 | index 7168f0e..168987a 100644 | ||
1657 | --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c | ||
1658 | +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c | ||
1659 | @@ -304,6 +304,7 @@ gckGALDEVICE_Construct( | ||
1660 | IN gctINT Signal, | ||
1661 | IN gctUINT LogFileSize, | ||
1662 | IN struct device *pdev, | ||
1663 | + IN gctINT PowerManagement, | ||
1664 | OUT gckGALDEVICE *Device | ||
1665 | ) | ||
1666 | { | ||
1667 | @@ -538,6 +539,9 @@ gckGALDEVICE_Construct( | ||
1668 | device->kernels[gcvCORE_MAJOR]->hardware, FastClear, Compression | ||
1669 | )); | ||
1670 | |||
1671 | + gcmkONERROR(gckHARDWARE_SetPowerManagement( | ||
1672 | + device->kernels[gcvCORE_MAJOR]->hardware, PowerManagement | ||
1673 | + )); | ||
1674 | |||
1675 | #if COMMAND_PROCESSOR_VERSION == 1 | ||
1676 | /* Start the command queue. */ | ||
1677 | @@ -593,6 +597,10 @@ gckGALDEVICE_Construct( | ||
1678 | device | ||
1679 | )); | ||
1680 | |||
1681 | + gcmkONERROR(gckHARDWARE_SetPowerManagement( | ||
1682 | + device->kernels[gcvCORE_2D]->hardware, PowerManagement | ||
1683 | + )); | ||
1684 | + | ||
1685 | #if COMMAND_PROCESSOR_VERSION == 1 | ||
1686 | /* Start the command queue. */ | ||
1687 | gcmkONERROR(gckCOMMAND_Start(device->kernels[gcvCORE_2D]->command)); | ||
1688 | @@ -624,6 +632,11 @@ gckGALDEVICE_Construct( | ||
1689 | device->coreMapping[gcvHARDWARE_VG] = gcvCORE_VG; | ||
1690 | } | ||
1691 | |||
1692 | + | ||
1693 | + gcmkONERROR(gckVGHARDWARE_SetPowerManagement( | ||
1694 | + device->kernels[gcvCORE_VG]->vg->hardware, | ||
1695 | + PowerManagement | ||
1696 | + )); | ||
1697 | #endif | ||
1698 | } | ||
1699 | else | ||
1700 | diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.h b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.h | ||
1701 | index 460f022..d488fc8 100644 | ||
1702 | --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.h | ||
1703 | +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.h | ||
1704 | @@ -169,6 +169,7 @@ gceSTATUS gckGALDEVICE_Construct( | ||
1705 | IN gctINT Signal, | ||
1706 | IN gctUINT LogFileSize, | ||
1707 | IN struct device *pdev, | ||
1708 | + IN gctINT PowerManagement, | ||
1709 | OUT gckGALDEVICE *Device | ||
1710 | ); | ||
1711 | |||
1712 | diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_driver.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_driver.c | ||
1713 | index 64cace1..183000d 100644 | ||
1714 | --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_driver.c | ||
1715 | +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_driver.c | ||
1716 | @@ -131,6 +131,9 @@ module_param(fastClear, int, 0644); | ||
1717 | static int compression = -1; | ||
1718 | module_param(compression, int, 0644); | ||
1719 | |||
1720 | +static int powerManagement = 1; | ||
1721 | +module_param(powerManagement, int, 0644); | ||
1722 | + | ||
1723 | static int signal = 48; | ||
1724 | module_param(signal, int, 0644); | ||
1725 | |||
1726 | @@ -781,6 +784,9 @@ static int drv_init(struct device *pdev) | ||
1727 | } | ||
1728 | #endif | ||
1729 | |||
1730 | + printk(KERN_INFO "Galcore version %d.%d.%d.%d\n", | ||
1731 | + gcvVERSION_MAJOR, gcvVERSION_MINOR, gcvVERSION_PATCH, gcvVERSION_BUILD); | ||
1732 | + | ||
1733 | if (showArgs) | ||
1734 | { | ||
1735 | printk("galcore options:\n"); | ||
1736 | @@ -810,7 +816,8 @@ static int drv_init(struct device *pdev) | ||
1737 | printk(" signal = %d\n", signal); | ||
1738 | printk(" baseAddress = 0x%08lX\n", baseAddress); | ||
1739 | printk(" physSize = 0x%08lX\n", physSize); | ||
1740 | - printk(" logFileSize = %d KB \n", logFileSize); | ||
1741 | + printk(" logFileSize = %d KB \n", logFileSize); | ||
1742 | + printk(" powerManagement = %d\n", powerManagement); | ||
1743 | #if ENABLE_GPU_CLOCK_BY_DRIVER | ||
1744 | printk(" coreClock = %lu\n", coreClock); | ||
1745 | #endif | ||
1746 | @@ -833,6 +840,7 @@ static int drv_init(struct device *pdev) | ||
1747 | bankSize, fastClear, compression, baseAddress, physSize, signal, | ||
1748 | logFileSize, | ||
1749 | pdev, | ||
1750 | + powerManagement, | ||
1751 | &device | ||
1752 | )); | ||
1753 | |||
1754 | diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c | ||
1755 | index dfbc699..6a0295d 100644 | ||
1756 | --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c | ||
1757 | +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c | ||
1758 | @@ -55,6 +55,7 @@ const char * _PLATFORM = "\n\0$PLATFORM$Linux$\n"; | ||
1759 | #endif | ||
1760 | |||
1761 | #define USER_SIGNAL_TABLE_LEN_INIT 64 | ||
1762 | +#define gcdSUPPRESS_OOM_MESSAGE 1 | ||
1763 | |||
1764 | #define MEMORY_LOCK(os) \ | ||
1765 | gcmkVERIFY_OK(gckOS_AcquireMutex( \ | ||
1766 | @@ -85,6 +86,12 @@ const char * _PLATFORM = "\n\0$PLATFORM$Linux$\n"; | ||
1767 | #define gcmkNONPAGED_MEMROY_PROT(x) pgprot_noncached(x) | ||
1768 | #endif | ||
1769 | |||
1770 | +#if gcdSUPPRESS_OOM_MESSAGE | ||
1771 | +#define gcdNOWARN __GFP_NOWARN | ||
1772 | +#else | ||
1773 | +#define gcdNOWARN 0 | ||
1774 | +#endif | ||
1775 | + | ||
1776 | #define gcdINFINITE_TIMEOUT (60 * 1000) | ||
1777 | #define gcdDETECT_TIMEOUT 0 | ||
1778 | #define gcdDETECT_DMA_ADDRESS 1 | ||
1779 | @@ -261,7 +268,7 @@ _CreateMdl( | ||
1780 | |||
1781 | gcmkHEADER_ARG("ProcessID=%d", ProcessID); | ||
1782 | |||
1783 | - mdl = (PLINUX_MDL)kzalloc(sizeof(struct _LINUX_MDL), GFP_KERNEL | __GFP_NOWARN); | ||
1784 | + mdl = (PLINUX_MDL)kzalloc(sizeof(struct _LINUX_MDL), GFP_KERNEL | gcdNOWARN); | ||
1785 | if (mdl == gcvNULL) | ||
1786 | { | ||
1787 | gcmkFOOTER_NO(); | ||
1788 | @@ -322,7 +329,7 @@ _CreateMdlMap( | ||
1789 | |||
1790 | gcmkHEADER_ARG("Mdl=0x%X ProcessID=%d", Mdl, ProcessID); | ||
1791 | |||
1792 | - mdlMap = (PLINUX_MDL_MAP)kmalloc(sizeof(struct _LINUX_MDL_MAP), GFP_KERNEL | __GFP_NOWARN); | ||
1793 | + mdlMap = (PLINUX_MDL_MAP)kmalloc(sizeof(struct _LINUX_MDL_MAP), GFP_KERNEL | gcdNOWARN); | ||
1794 | if (mdlMap == gcvNULL) | ||
1795 | { | ||
1796 | gcmkFOOTER_NO(); | ||
1797 | @@ -481,7 +488,7 @@ _NonContiguousAlloc( | ||
1798 | |||
1799 | size = NumPages * sizeof(struct page *); | ||
1800 | |||
1801 | - pages = kmalloc(size, GFP_KERNEL | __GFP_NOWARN); | ||
1802 | + pages = kmalloc(size, GFP_KERNEL | gcdNOWARN); | ||
1803 | |||
1804 | if (!pages) | ||
1805 | { | ||
1806 | @@ -496,7 +503,7 @@ _NonContiguousAlloc( | ||
1807 | |||
1808 | for (i = 0; i < NumPages; i++) | ||
1809 | { | ||
1810 | - p = alloc_page(GFP_KERNEL | __GFP_HIGHMEM | __GFP_NOWARN); | ||
1811 | + p = alloc_page(GFP_KERNEL | __GFP_HIGHMEM | gcdNOWARN); | ||
1812 | |||
1813 | if (!p) | ||
1814 | { | ||
1815 | @@ -762,7 +769,7 @@ _AllocateIntegerId( | ||
1816 | int result; | ||
1817 | |||
1818 | again: | ||
1819 | - if (idr_pre_get(&Database->idr, GFP_KERNEL | __GFP_NOWARN) == 0) | ||
1820 | + if (idr_pre_get(&Database->idr, GFP_KERNEL | gcdNOWARN) == 0) | ||
1821 | { | ||
1822 | return gcvSTATUS_OUT_OF_MEMORY; | ||
1823 | } | ||
1824 | @@ -954,7 +961,7 @@ gckOS_Construct( | ||
1825 | gcmkVERIFY_ARGUMENT(Os != gcvNULL); | ||
1826 | |||
1827 | /* Allocate the gckOS object. */ | ||
1828 | - os = (gckOS) kmalloc(gcmSIZEOF(struct _gckOS), GFP_KERNEL | __GFP_NOWARN); | ||
1829 | + os = (gckOS) kmalloc(gcmSIZEOF(struct _gckOS), GFP_KERNEL | gcdNOWARN); | ||
1830 | |||
1831 | if (os == gcvNULL) | ||
1832 | { | ||
1833 | @@ -1171,7 +1178,7 @@ _CreateKernelVirtualMapping( | ||
1834 | |||
1835 | if (Mdl->contiguous) | ||
1836 | { | ||
1837 | - pages = kmalloc(sizeof(struct page *) * numPages, GFP_KERNEL | __GFP_NOWARN); | ||
1838 | + pages = kmalloc(sizeof(struct page *) * numPages, GFP_KERNEL | gcdNOWARN); | ||
1839 | |||
1840 | if (!pages) | ||
1841 | { | ||
1842 | @@ -1385,7 +1392,7 @@ gckOS_AllocateMemory( | ||
1843 | } | ||
1844 | else | ||
1845 | { | ||
1846 | - memory = (gctPOINTER) kmalloc(Bytes, GFP_KERNEL | __GFP_NOWARN); | ||
1847 | + memory = (gctPOINTER) kmalloc(Bytes, GFP_KERNEL | gcdNOWARN); | ||
1848 | } | ||
1849 | |||
1850 | if (memory == gcvNULL) | ||
1851 | @@ -1904,7 +1911,7 @@ gckOS_AllocateNonPagedMemory( | ||
1852 | addr = dma_alloc_coherent(gcvNULL, | ||
1853 | mdl->numPages * PAGE_SIZE, | ||
1854 | &mdl->dmaHandle, | ||
1855 | - GFP_KERNEL | __GFP_NOWARN); | ||
1856 | + GFP_KERNEL | gcdNOWARN); | ||
1857 | } | ||
1858 | #else | ||
1859 | size = mdl->numPages * PAGE_SIZE; | ||
1860 | @@ -1915,7 +1922,7 @@ gckOS_AllocateNonPagedMemory( | ||
1861 | if (page == gcvNULL) | ||
1862 | #endif | ||
1863 | { | ||
1864 | - page = alloc_pages(GFP_KERNEL | __GFP_NOWARN, order); | ||
1865 | + page = alloc_pages(GFP_KERNEL | gcdNOWARN, order); | ||
1866 | } | ||
1867 | |||
1868 | if (page == gcvNULL) | ||
1869 | @@ -3848,6 +3855,9 @@ gckOS_AllocatePagedMemoryEx( | ||
1870 | gctSIZE_T bytes; | ||
1871 | gctBOOL locked = gcvFALSE; | ||
1872 | gceSTATUS status; | ||
1873 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) | ||
1874 | + gctPOINTER addr = gcvNULL; | ||
1875 | +#endif | ||
1876 | |||
1877 | gcmkHEADER_ARG("Os=0x%X Contiguous=%d Bytes=%lu", Os, Contiguous, Bytes); | ||
1878 | |||
1879 | @@ -3873,13 +3883,27 @@ gckOS_AllocatePagedMemoryEx( | ||
1880 | { | ||
1881 | /* Get contiguous pages, and suppress warning (stack dump) from kernel when | ||
1882 | we run out of memory. */ | ||
1883 | - mdl->u.contiguousPages = | ||
1884 | - alloc_pages(GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY, GetOrder(numPages)); | ||
1885 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) | ||
1886 | + addr = | ||
1887 | + alloc_pages_exact(numPages * PAGE_SIZE, GFP_KERNEL | gcdNOWARN | __GFP_NORETRY); | ||
1888 | |||
1889 | + mdl->u.contiguousPages = addr | ||
1890 | + ? virt_to_page(addr) | ||
1891 | + : gcvNULL; | ||
1892 | + | ||
1893 | + mdl->exact = gcvTRUE; | ||
1894 | +#else | ||
1895 | + mdl->u.contiguousPages = | ||
1896 | + alloc_pages(GFP_KERNEL | gcdNOWARN | __GFP_NORETRY, GetOrder(numPages)); | ||
1897 | +#endif | ||
1898 | if (mdl->u.contiguousPages == gcvNULL) | ||
1899 | { | ||
1900 | mdl->u.contiguousPages = | ||
1901 | - alloc_pages(GFP_KERNEL | __GFP_HIGHMEM | __GFP_NOWARN, GetOrder(numPages)); | ||
1902 | + alloc_pages(GFP_KERNEL | __GFP_HIGHMEM | gcdNOWARN, GetOrder(numPages)); | ||
1903 | + | ||
1904 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) | ||
1905 | + mdl->exact = gcvFALSE; | ||
1906 | +#endif | ||
1907 | } | ||
1908 | } | ||
1909 | else | ||
1910 | @@ -4024,7 +4048,16 @@ gckOS_FreePagedMemory( | ||
1911 | |||
1912 | if (mdl->contiguous) | ||
1913 | { | ||
1914 | - __free_pages(mdl->u.contiguousPages, GetOrder(mdl->numPages)); | ||
1915 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) | ||
1916 | + if (mdl->exact == gcvTRUE) | ||
1917 | + { | ||
1918 | + free_pages_exact(page_address(mdl->u.contiguousPages), mdl->numPages * PAGE_SIZE); | ||
1919 | + } | ||
1920 | + else | ||
1921 | +#endif | ||
1922 | + { | ||
1923 | + __free_pages(mdl->u.contiguousPages, GetOrder(mdl->numPages)); | ||
1924 | + } | ||
1925 | } | ||
1926 | else | ||
1927 | { | ||
1928 | @@ -4859,7 +4892,7 @@ gckOS_MapUserPointer( | ||
1929 | gcmkVERIFY_ARGUMENT(Size > 0); | ||
1930 | gcmkVERIFY_ARGUMENT(KernelPointer != gcvNULL); | ||
1931 | |||
1932 | - buf = kmalloc(Size, GFP_KERNEL | __GFP_NOWARN); | ||
1933 | + buf = kmalloc(Size, GFP_KERNEL | gcdNOWARN); | ||
1934 | if (buf == gcvNULL) | ||
1935 | { | ||
1936 | gcmkTRACE( | ||
1937 | @@ -5274,7 +5307,7 @@ OnError: | ||
1938 | MEMORY_MAP_LOCK(Os); | ||
1939 | |||
1940 | /* Allocate the Info struct. */ | ||
1941 | - info = (gcsPageInfo_PTR)kmalloc(sizeof(gcsPageInfo), GFP_KERNEL | __GFP_NOWARN); | ||
1942 | + info = (gcsPageInfo_PTR)kmalloc(sizeof(gcsPageInfo), GFP_KERNEL | gcdNOWARN); | ||
1943 | |||
1944 | if (info == gcvNULL) | ||
1945 | { | ||
1946 | @@ -5283,7 +5316,7 @@ OnError: | ||
1947 | } | ||
1948 | |||
1949 | /* Allocate the array of page addresses. */ | ||
1950 | - pages = (struct page **)kmalloc(pageCount * sizeof(struct page *), GFP_KERNEL | __GFP_NOWARN); | ||
1951 | + pages = (struct page **)kmalloc(pageCount * sizeof(struct page *), GFP_KERNEL | gcdNOWARN); | ||
1952 | |||
1953 | if (pages == gcvNULL) | ||
1954 | { | ||
1955 | @@ -6502,7 +6535,7 @@ gckOS_CreateSemaphore( | ||
1956 | gcmkVERIFY_ARGUMENT(Semaphore != gcvNULL); | ||
1957 | |||
1958 | /* Allocate the semaphore structure. */ | ||
1959 | - sem = (struct semaphore *)kmalloc(gcmSIZEOF(struct semaphore), GFP_KERNEL | __GFP_NOWARN); | ||
1960 | + sem = (struct semaphore *)kmalloc(gcmSIZEOF(struct semaphore), GFP_KERNEL | gcdNOWARN); | ||
1961 | if (sem == gcvNULL) | ||
1962 | { | ||
1963 | gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY); | ||
1964 | @@ -6942,6 +6975,7 @@ gckOS_SetGPUPower( | ||
1965 | #else | ||
1966 | imx_gpc_power_up_pu(false); | ||
1967 | #endif | ||
1968 | + | ||
1969 | } | ||
1970 | /* TODO: Put your code here. */ | ||
1971 | gcmkFOOTER_NO(); | ||
1972 | @@ -7255,7 +7289,7 @@ gckOS_CreateSignal( | ||
1973 | gcmkVERIFY_ARGUMENT(Signal != gcvNULL); | ||
1974 | |||
1975 | /* Create an event structure. */ | ||
1976 | - signal = (gcsSIGNAL_PTR) kmalloc(sizeof(gcsSIGNAL), GFP_KERNEL | __GFP_NOWARN); | ||
1977 | + signal = (gcsSIGNAL_PTR) kmalloc(sizeof(gcsSIGNAL), GFP_KERNEL | gcdNOWARN); | ||
1978 | |||
1979 | if (signal == gcvNULL) | ||
1980 | { | ||
1981 | @@ -8000,7 +8034,7 @@ gckOS_CreateSemaphoreVG( | ||
1982 | do | ||
1983 | { | ||
1984 | /* Allocate the semaphore structure. */ | ||
1985 | - newSemaphore = (struct semaphore *)kmalloc(gcmSIZEOF(struct semaphore), GFP_KERNEL | __GFP_NOWARN); | ||
1986 | + newSemaphore = (struct semaphore *)kmalloc(gcmSIZEOF(struct semaphore), GFP_KERNEL | gcdNOWARN); | ||
1987 | if (newSemaphore == gcvNULL) | ||
1988 | { | ||
1989 | gcmkERR_BREAK(gcvSTATUS_OUT_OF_MEMORY); | ||
1990 | diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h | ||
1991 | index e970477..006632c 100644 | ||
1992 | --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h | ||
1993 | +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h | ||
1994 | @@ -54,6 +54,9 @@ typedef struct _LINUX_MDL | ||
1995 | gctINT numPages; | ||
1996 | gctINT pagedMem; | ||
1997 | gctBOOL contiguous; | ||
1998 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) | ||
1999 | + gctBOOL exact; | ||
2000 | +#endif | ||
2001 | dma_addr_t dmaHandle; | ||
2002 | PLINUX_MDL_MAP maps; | ||
2003 | struct _LINUX_MDL * prev; | ||
2004 | -- | ||
2005 | 1.8.3.2 | ||
2006 | |||