summaryrefslogtreecommitdiffstats
path: root/recipes-kernel/linux/linux-wandboard-3.0.35/0004-ENGR00264288-1-GPU-Integrate-4.6.9p12-release-kernel.patch
diff options
context:
space:
mode:
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.patch2006
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 @@
1From c090a0238315094d245de2503b6f9a5bce0bda03 Mon Sep 17 00:00:00 2001
2From: Loren Huang <b02279@freescale.com>
3Date: Mon, 27 May 2013 17:45:48 +0800
4Subject: [PATCH 4/6] ENGR00264288-1 [GPU]Integrate 4.6.9p12 release kernel
5 part code
6
7Integrate 4.6.9p12 release kernel part code.
8Cherry-pick from 3.0.35 branch.
9
10Upstream-Status: Backport [3.5.7-1.0.0]
11
12Signed-off-by: Loren Huang <b02279@freescale.com>
13Acked-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
42diff --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
43index 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,
202diff --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
203index 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_ */
215diff --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
216index 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))) ));
547diff --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
548index 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
560diff --git a/drivers/mxc/gpu-viv/config b/drivers/mxc/gpu-viv/config
561index 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
572diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
573index 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:
941diff --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
942index 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);
963diff --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
964index 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,
1045diff --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
1046index 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,
1062diff --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
1063index 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
1220diff --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
1221index 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)
1234diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h
1235index 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(
1251diff --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
1252index 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,
1338diff --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
1339index 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. */
1391diff --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
1392index 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
1452diff --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
1453index 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
1545diff --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
1546index 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 {
1563diff --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
1564index 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.
1625diff --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
1626index 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
1638diff --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
1639index 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
1655diff --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
1656index 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
1700diff --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
1701index 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
1712diff --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
1713index 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
1754diff --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
1755index 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);
1990diff --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
1991index 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--
20051.8.3.2
2006