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
7 Integrate 4.6.9p12 release kernel part code.
8 Cherry-pick from 3.0.35 branch.
10 Upstream-Status: Backport [3.5.7-1.0.0]
12 Signed-off-by: Loren Huang <b02279@freescale.com>
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(-)
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(
50 -#if gcdPOWER_MANAGEMENT
51 static gctTHREADFUNCRESULT gctTHREADFUNCTYPE
53 gctTHREADFUNCPARAMETER ThreadParameter
54 @@ -262,8 +261,6 @@ _TimeIdleThread(
61 /******************************************************************************\
62 ****************************** gckVGHARDWARE API code *****************************
63 @@ -309,6 +306,7 @@ gckVGHARDWARE_Construct(
66 gcmkERR_BREAK(gckOS_SetGPUPower(Os, gcvCORE_VG, gcvTRUE, gcvTRUE));
68 status = _ResetGPU(Os);
70 if (status != gcvSTATUS_OK)
71 @@ -368,14 +366,17 @@ gckVGHARDWARE_Construct(
73 gcmkERR_BREAK(gckOS_CreateMutex(Os, &hardware->powerMutex));
74 gcmkERR_BREAK(gckOS_CreateSignal(Os, gcvFALSE, &hardware->idleSignal));
75 -#if gcdPOWER_MANAGEMENT
77 + /* Enable power management by default. */
78 + hardware->powerManagement = gcvTRUE;
80 gcmkERR_BREAK(gckOS_StartThread(
84 &hardware->timeIdleThread
88 /* Return pointer to the gckVGHARDWARE object. */
91 @@ -395,6 +396,8 @@ gckVGHARDWARE_Construct(
92 gcmkVERIFY_OK(gckOS_Free(Os, hardware));
95 + gcmkVERIFY_OK(gckOS_SetGPUPower(Os, gcvCORE_VG, gcvFALSE, gcvFALSE));
98 /* Return the status. */
100 @@ -425,11 +428,10 @@ gckVGHARDWARE_Destroy(
101 /* Verify the arguments. */
102 gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
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));
110 /* Mark the object as unknown. */
111 Hardware->object.type = gcvOBJ_UNKNOWN;
113 @@ -1432,7 +1434,6 @@ gckVGHARDWARE_ReadInterrupt(
117 -#if gcdPOWER_MANAGEMENT
118 static gceSTATUS _CommandStall(
119 gckVGHARDWARE Hardware)
121 @@ -1477,7 +1478,6 @@ static gceSTATUS _CommandStall(
122 /* Return the status. */
127 /*******************************************************************************
129 @@ -1500,7 +1500,6 @@ gckVGHARDWARE_SetPowerManagementState(
130 IN gceCHIPPOWERSTATE State
133 -#if gcdPOWER_MANAGEMENT
135 gckVGCOMMAND command = gcvNULL;
137 @@ -1600,6 +1599,12 @@ gckVGHARDWARE_SetPowerManagementState(
138 command = Hardware->kernel->command;
139 gcmkVERIFY_OBJECT(command, gcvOBJ_COMMAND);
141 + if (Hardware->powerManagement == gcvFALSE)
144 + return gcvSTATUS_OK;
147 /* Start profiler. */
148 gcmkPROFILE_INIT(freq, time);
150 @@ -1914,10 +1919,6 @@ OnError:
151 /* Return the status. */
154 -#else /* gcdPOWER_MANAGEMENT */
156 - return gcvSTATUS_OK;
160 /*******************************************************************************
161 @@ -1955,6 +1956,40 @@ gckVGHARDWARE_QueryPowerManagementState(
165 +/*******************************************************************************
167 +** gckVGHARDWARE_SetPowerManagement
169 +** Configure GPU power management function.
170 +** Only used in driver initialization stage.
174 +** gckVGHARDWARE Harwdare
175 +** Pointer to an gckHARDWARE object.
177 +** gctBOOL PowerManagement
178 +** Power Mangement State.
182 +gckVGHARDWARE_SetPowerManagement(
183 + IN gckVGHARDWARE Hardware,
184 + IN gctBOOL PowerManagement
187 + gcmkHEADER_ARG("Hardware=0x%x", Hardware);
189 + /* Verify the arguments. */
190 + gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
192 + Hardware->powerManagement = PowerManagement;
196 + return gcvSTATUS_OK;
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;
209 gctPOINTER pageTableDirty;
211 + gctBOOL powerManagement;
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;
227 @@ -207,13 +208,20 @@ _IdentifyHardware(
228 gckOS_ReadRegisterEx(Os, Core,
230 &Identity->chipMinorFeatures3));
232 + /* Read chip minor featuress register #4. */
234 + gckOS_ReadRegisterEx(Os, Core,
236 + &Identity->chipMinorFeatures4));
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;
249 @@ -234,14 +242,14 @@ _IdentifyHardware(
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)))
258 Identity->superTileMode = 1;
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))))))))
266 @@ -285,6 +293,10 @@ _IdentifyHardware(
267 "Identity: chipMinorFeatures3=0x%08X",
268 Identity->chipMinorFeatures3);
270 + gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
271 + "Identity: chipMinorFeatures4=0x%08X",
272 + Identity->chipMinorFeatures4);
274 /***************************************************************************
277 @@ -576,7 +588,6 @@ OnError:
281 -#if gcdPOWER_MANAGEMENT
284 IN gckHARDWARE Hardware
285 @@ -631,7 +642,6 @@ OnError:
291 /******************************************************************************\
292 ****************************** gckHARDWARE API code *****************************
293 @@ -708,6 +718,7 @@ gckHARDWARE_Construct(
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;
305 + /* Enable power management by default. */
306 + hardware->powerManagement = gcvTRUE;
308 /* Return pointer to the gckHARDWARE object. */
309 *Hardware = hardware;
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;
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)));
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))));
326 /* Arm the PE-FE Semaphore. */
328 @@ -3660,7 +3675,7 @@ typedef enum
332 -#if gcmIS_DEBUG(gcdDEBUG_TRACE) && gcdPOWER_MANAGEMENT
333 +#if gcmIS_DEBUG(gcdDEBUG_TRACE)
334 static gctCONST_STRING
335 _PowerEnum(gceCHIPPOWERSTATE State)
337 @@ -3709,7 +3724,6 @@ gckHARDWARE_SetPowerManagementState(
338 IN gceCHIPPOWERSTATE State
341 -#if gcdPOWER_MANAGEMENT
343 gckCOMMAND command = gcvNULL;
345 @@ -3841,6 +3855,12 @@ gckHARDWARE_SetPowerManagementState(
346 command = Hardware->kernel->command;
347 gcmkVERIFY_OBJECT(command, gcvOBJ_COMMAND);
349 + if (Hardware->powerManagement == gcvFALSE)
352 + return gcvSTATUS_OK;
355 /* Start profiler. */
356 gcmkPROFILE_INIT(freq, time);
358 @@ -4491,10 +4511,6 @@ OnError:
359 /* Return the status. */
362 -#else /* gcdPOWER_MANAGEMENT */
364 - return gcvSTATUS_OK;
368 /*******************************************************************************
369 @@ -4532,6 +4548,40 @@ gckHARDWARE_QueryPowerManagementState(
373 +/*******************************************************************************
375 +** gckHARDWARE_SetPowerManagement
377 +** Configure GPU power management function.
378 +** Only used in driver initialization stage.
382 +** gckHARDWARE Harwdare
383 +** Pointer to an gckHARDWARE object.
385 +** gctBOOL PowerManagement
386 +** Power Mangement State.
390 +gckHARDWARE_SetPowerManagement(
391 + IN gckHARDWARE Hardware,
392 + IN gctBOOL PowerManagement
395 + gcmkHEADER_ARG("Hardware=0x%x", Hardware);
397 + /* Verify the arguments. */
398 + gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
400 + Hardware->powerManagement = PowerManagement;
404 + return gcvSTATUS_OK;
407 #if gcdENABLE_FSCALE_VAL_ADJUST
409 gckHARDWARE_SetFscaleValue(
410 @@ -4767,6 +4817,21 @@ OnError:
411 GC_DEBUG_SIGNALS_##block##_Address, \
414 +#define gcmkREAD_DEBUG_REGISTER_N(control, block, index, data) \
416 + gckOS_WriteRegisterEx(Hardware->os, \
418 + GC_DEBUG_CONTROL##control##_Address, \
420 + GC_DEBUG_CONTROL##control, \
424 + gckOS_ReadRegisterEx(Hardware->os, \
426 + GC_DEBUG_SIGNALS_##block##_Address, \
429 #define gcmkRESET_DEBUG_REGISTER(control, block) \
431 gckOS_WriteRegisterEx(Hardware->os, \
432 @@ -4857,6 +4922,9 @@ gckHARDWARE_QueryProfileRegisters(
435 gcsPROFILER_COUNTERS * profiler = Counters;
437 + gctUINT32 colorKilled, colorDrawn, depthKilled, depthDrawn;
438 + gctUINT32 totalRead, totalWrite;
440 gcmkHEADER_ARG("Hardware=0x%x Counters=0x%x", Hardware, Counters);
442 @@ -4867,16 +4935,6 @@ gckHARDWARE_QueryProfileRegisters(
444 gckOS_ReadRegisterEx(Hardware->os,
447 - &profiler->gpuTotalRead64BytesPerFrame));
449 - gckOS_ReadRegisterEx(Hardware->os,
452 - &profiler->gpuTotalWrite64BytesPerFrame));
454 - gckOS_ReadRegisterEx(Hardware->os,
457 &profiler->gpuCyclesCounter));
459 @@ -4892,8 +4950,63 @@ gckHARDWARE_QueryProfileRegisters(
461 &profiler->gpuIdleCyclesCounter));
465 + /* Read clock control register. */
466 + gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
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;
478 + /* Walk through all avaiable pixel pipes. */
479 + for (i = 0; i < Hardware->identity.pixelPipes; ++i)
481 + /* Select proper pipe. */
482 + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
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)))));
489 + gckOS_ReadRegisterEx(Hardware->os,
494 + gckOS_ReadRegisterEx(Hardware->os,
499 + profiler->gpuTotalRead64BytesPerFrame += totalRead;
500 + profiler->gpuTotalWrite64BytesPerFrame += totalWrite;
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));
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;
514 + /* Reset clock control register. */
515 + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
521 /* Reset counters. */
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));
527 gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00078, 0));
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)))
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;
556 + gctBOOL powerManagement;
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
566 SDK_DIR ?= $(AQROOT)/build/sdk
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(
580 - gcsDATABASE_RECORD record;
583 gcmkHEADER_ARG("Kernel=0x%x FromUser=%d Interface=0x%x",
584 Kernel, FromUser, Interface);
586 @@ -1940,249 +1937,133 @@ gckKERNEL_Dispatch(
589 case gcvHAL_GET_SHARED_INFO:
590 - bytes = (gctSIZE_T) Interface->u.GetSharedInfo.size;
592 - if (Interface->u.GetSharedInfo.dataId != 0)
593 + if (Interface->u.GetSharedInfo.data == gcvNULL)
595 - gcmkONERROR(gckKERNEL_FindProcessDB(Kernel,
596 - Interface->u.GetSharedInfo.pid,
599 - gcmINT2PTR(Interface->u.GetSharedInfo.dataId),
602 - /* find a record in db, check size */
603 - if (record.bytes != bytes)
605 - /* Size change is not allowed */
606 - gcmkONERROR(gcvSTATUS_INVALID_DATA);
610 - gcmkONERROR(gckOS_CopyToUserData(
613 - gcmUINT64_TO_PTR(Interface->u.GetSharedInfo.data),
617 + gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
620 - if ((node = gcmUINT64_TO_PTR(Interface->u.GetSharedInfo.node)) != gcvNULL)
623 - switch (Interface->u.GetSharedInfo.infoType)
625 - case gcvVIDMEM_INFO_GENERIC:
626 - { /* Generic data stored */
627 - if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
629 - data = &node->VidMem.sharedInfo;
634 - data = &node->Virtual.sharedInfo;
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;
642 - gcmkONERROR(gckOS_CopyToUserData(
645 - gcmUINT64_TO_PTR(Interface->u.GetSharedInfo.nodeData),
646 - sizeof(gcsVIDMEM_NODE_SHARED_INFO)
651 - case gcvVIDMEM_INFO_DIRTY_RECTANGLE:
652 - { /* Dirty rectangle stored */
653 - gcsVIDMEM_NODE_SHARED_INFO *storedSharedInfo;
654 - gcsVIDMEM_NODE_SHARED_INFO alignedSharedInfo;
656 - if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
658 - storedSharedInfo = &node->VidMem.sharedInfo;
662 - storedSharedInfo = &node->Virtual.sharedInfo;
665 - /* Stored shared info holds the unaligned dirty rectangle.
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. */
671 - /* Make sure we have a legit rectangle. */
672 - gcmkASSERT((storedSharedInfo->RectSize.width != 0) && (storedSharedInfo->RectSize.height != 0));
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);
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);
680 - gcmkONERROR(gckOS_CopyToUserData(
682 - &alignedSharedInfo,
683 - gcmUINT64_TO_PTR(Interface->u.GetSharedInfo.nodeData),
684 - sizeof(gcsVIDMEM_NODE_SHARED_INFO)
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);
695 + gckKERNEL_FindProcessDB(Kernel,
699 + gcmINT2PTR(dataId),
702 + /* Check memory size. */
703 + if (bytes < record.bytes)
705 + /* Insufficient memory to hold shared data. */
706 + gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
710 - storedSharedInfo->SrcOrigin.x =
711 - storedSharedInfo->SrcOrigin.y =
712 - storedSharedInfo->RectSize.width =
713 - storedSharedInfo->RectSize.height = 0;
717 + /* Copy to user. */
718 + status = gckOS_CopyToUserData(Kernel->os,
724 + * Remove from process db.
725 + * Every time when shared info is taken, the record is erased in
729 + gckKERNEL_RemoveProcessDB(Kernel,
732 + gcmINT2PTR(dataId)));
733 + /* Free existed data. */
735 + gckOS_FreeMemory(Kernel->os, record.physical));
739 case gcvHAL_SET_SHARED_INFO:
740 - bytes = (gctSIZE_T) Interface->u.SetSharedInfo.size;
742 - if (Interface->u.SetSharedInfo.dataId != 0)
744 - status = gckKERNEL_FindProcessDB(Kernel, processID, 0,
746 - gcmINT2PTR(Interface->u.SetSharedInfo.dataId),
749 - if (status == gcvSTATUS_INVALID_DATA)
751 - /* private data has not been created yet */
752 - /* Note: we count on DestoryProcessDB to free it */
753 - gcmkONERROR(gckOS_AllocateMemory(
760 - gckKERNEL_AddProcessDB(Kernel, processID,
762 - gcmINT2PTR(Interface->u.SetSharedInfo.dataId),
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;
774 + if (gcmIS_SUCCESS(gckKERNEL_FindProcessDB(Kernel,
778 + gcmINT2PTR(dataId),
781 - /* bail on other errors */
782 - gcmkONERROR(status);
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)
789 - /* Size change is not allowed */
790 - gcmkONERROR(gcvSTATUS_INVALID_DATA);
791 + /* Remove from process db. */
793 + gckKERNEL_RemoveProcessDB(Kernel,
796 + gcmINT2PTR(dataId)));
798 + /* Free existed data. */
800 + gckOS_FreeMemory(Kernel->os, record.physical));
803 - /* get storage address */
804 - data = record.physical;
807 - gcmkONERROR(gckOS_CopyFromUserData(
810 - gcmUINT64_TO_PTR(Interface->u.SetSharedInfo.data),
815 - if ((node = gcmUINT64_TO_PTR(Interface->u.SetSharedInfo.node)) != gcvNULL)
817 - switch (Interface->u.SetSharedInfo.infoType)
820 - case gcvVIDMEM_INFO_GENERIC:
821 - { /* Generic data stored */
822 - if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
824 - data = &node->VidMem.sharedInfo;
828 - data = &node->Virtual.sharedInfo;
831 - gcmkONERROR(gckOS_CopyFromUserData(
834 - gcmUINT64_TO_PTR(Interface->u.SetSharedInfo.nodeData),
835 - sizeof(gcsVIDMEM_NODE_SHARED_INFO)
839 + /* Re-use allocated memory. */
840 + memory = record.physical;
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;
850 - /* Expand the dirty rectangle stored in the node to include the rectangle passed in. */
851 - gcmkONERROR(gckOS_CopyFromUserData(
854 - gcmUINT64_TO_PTR(Interface->u.SetSharedInfo.nodeData),
855 - gcmSIZEOF(gcsVIDMEM_NODE_SHARED_INFO)
858 - if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
860 - currentSharedInfo = &node->VidMem.sharedInfo;
864 - currentSharedInfo = &node->Virtual.sharedInfo;
866 + if ((data == gcvNULL) || (bytes == 0))
868 + /* Nothing to record. */
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);
877 + /* Limite data size. */
878 + gcmkONERROR(gcvSTATUS_TOO_COMPLEX);
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)
886 + /* Allocate memory for holding shared data. */
888 + gckOS_AllocateMemory(Kernel->os, bytes, &memory));
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;
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;
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;
910 + /* Add to process db. */
911 + status = gckKERNEL_AddProcessDB(Kernel,
914 + gcmINT2PTR(dataId),
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);
922 + if (gcmIS_ERROR(status))
924 + /* Failed to add process db. Free allocated memory. */
925 + gcmkVERIFY_OK(gckOS_FreeMemory(Kernel->os, memory));
931 + /* Copy shared data to kernel memory. */
933 + gckOS_CopyFromUserData(Kernel->os,
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;
949 -#if gcdPOWER_MANAGEMENT
950 - if (Command->kernel->eventObj->queueHead == gcvNULL)
951 + if (Command->kernel->eventObj->queueHead == gcvNULL
952 + && Command->kernel->hardware->powerManagement == gcvTRUE
955 /* Commit done event by which work thread knows all jobs done. */
957 gckEVENT_CommitDone(Command->kernel->eventObj, gcvKERNEL_PIXEL));
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(
971 -#if gcdPOWER_MANAGEMENT
972 /******************************************************************************\
973 ****************************** Power Stall Handler *******************************
974 \******************************************************************************/
975 @@ -1250,7 +1249,6 @@ _EventHandler_PowerStall(
976 Kernel->command->powerStallSignal,
981 /******************************************************************************\
982 ******************************** Task Routines *********************************
983 @@ -1965,15 +1963,12 @@ gcmDECLARE_INTERRUPT_HANDLER(COMMAND, 0)
987 -#if gcdPOWER_MANAGEMENT
991 status = gckVGHARDWARE_SetPowerManagementState(
992 Kernel->command->hardware, gcvPOWER_IDLE_BROADCAST
997 /* Break out of the loop. */
999 @@ -2848,7 +2843,7 @@ gckVGCOMMAND_Construct(
1000 _EventHandler_BusError
1003 -#if gcdPOWER_MANAGEMENT
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
1014 /***********************************************************************
1015 ** Task management initialization.
1016 @@ -3419,7 +3413,6 @@ gckVGCOMMAND_Commit(
1020 -#if gcdPOWER_MANAGEMENT
1021 status = gckVGHARDWARE_SetPowerManagementState(
1022 Command->hardware, gcvPOWER_ON_AUTO);
1024 @@ -3447,7 +3440,7 @@ gckVGCOMMAND_Commit(
1030 gcmkERR_BREAK(_FlushMMU(Command));
1033 @@ -3676,10 +3669,9 @@ gckVGCOMMAND_Commit(
1037 -#if gcdPOWER_MANAGEMENT
1038 gcmkVERIFY_OK(gckOS_ReleaseSemaphore(
1039 Command->os, Command->powerSemaphore));
1042 /* Release the mutex. */
1043 gcmkCHECK_STATUS(gckOS_ReleaseMutex(
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);
1053 - case gcvDB_SHARED_INFO:
1054 - status = gckOS_FreeMemory(Kernel->os, record->physical);
1056 + case gcvDB_SHARED_INFO:
1057 + status = gckOS_FreeMemory(Kernel->os, record->physical);
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;
1070 +typedef struct _gcsDynamicSpaceNode * gcsDynamicSpaceNode_PTR;
1071 +typedef struct _gcsDynamicSpaceNode
1076 +gcsDynamicSpaceNode;
1080 IN gctUINT32_PTR PageEntry,
1081 @@ -482,30 +490,117 @@ OnError:
1087 + OUT gcsDynamicSpaceNode_PTR *Array,
1091 + gceSTATUS status = gcvSTATUS_OK;
1092 + gctPOINTER pointer = gcvNULL;
1093 + gcsDynamicSpaceNode_PTR array = gcvNULL;
1095 + gctINT i = 0, nodeStart = -1, nodeEntries = 0;
1097 + /* Allocate memory for the array. */
1098 + gcmkONERROR(gckOS_Allocate(Mmu->os,
1099 + gcmSIZEOF(*array) * (gcdMMU_MTLB_ENTRY_NUM / 2),
1102 + array = (gcsDynamicSpaceNode_PTR)pointer;
1104 + /* Loop all the entries. */
1105 + while (i < gcdMMU_MTLB_ENTRY_NUM)
1107 + if (!Mmu->mtlbLogical[i])
1109 + if (nodeStart < 0)
1111 + /* This is the first entry of the dynamic space. */
1117 + /* Other entries of the dynamic space. */
1121 + else if (nodeStart >= 0)
1123 + /* Save the previous node. */
1124 + array[size].start = nodeStart;
1125 + array[size].entries = nodeEntries;
1128 + /* Reset the start. */
1136 + /* Save the previous node. */
1137 + if (nodeStart >= 0)
1139 + array[size].start = nodeStart;
1140 + array[size].entries = nodeEntries;
1144 +#if gcdMMU_TABLE_DUMP
1145 + for (i = 0; i < size; i++)
1147 + gckOS_Print("%s(%d): [%d]: start=%d, entries=%d.\n",
1148 + __FUNCTION__, __LINE__,
1151 + array[i].entries);
1158 + return gcvSTATUS_OK;
1161 + if (pointer != gcvNULL)
1163 + gckOS_Free(Mmu->os, pointer);
1176 + gcsDynamicSpaceNode_PTR nodeArray = gcvNULL;
1177 + gctINT i, nodeArraySize = 0;
1179 - gctINT numEntries;
1180 + gctINT numEntries = 0;
1181 gctUINT32_PTR pageTable;
1182 gctBOOL acquired = gcvFALSE;
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));
1189 + /* TODO: We only use the largest one for now. */
1190 + for (i = 0; i < nodeArraySize; i++)
1192 - if (!Mmu->mtlbLogical[i])
1193 + if (nodeArray[i].entries > numEntries)
1196 + Mmu->dynamicMappingStart = nodeArray[i].start;
1197 + numEntries = nodeArray[i].entries;
1201 - Mmu->dynamicMappingStart = i;
1203 - /* Number of entries in Master TLB for dynamic mapping. */
1204 - numEntries = gcdMMU_MTLB_ENTRY_NUM - i;
1205 + gckOS_Free(Mmu->os, (gctPOINTER)nodeArray);
1207 Mmu->pageTableSize = numEntries * 4096;
1209 @@ -545,7 +640,9 @@ _SetupDynamicSpace(
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;
1218 _WritePageEntry(Mmu->mtlbLogical + i,
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(
1226 if (!Node->Virtual.contiguous
1227 && (Node->Virtual.lockeds[Kernel->core] == 1)
1229 + && (Kernel->vg == gcvNULL)
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
1243 +gckHARDWARE_SetPowerManagement(
1244 + IN gckHARDWARE Hardware,
1245 + IN gctBOOL PowerManagement
1248 #if gcdENABLE_FSCALE_VAL_ADJUST
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 \******************************************************************************/
1260 typedef struct _gcsPLS * gcsPLS_PTR;
1261 typedef struct _gcsPLS
1263 @@ -107,6 +106,7 @@ typedef struct _gcsPLS
1265 /* Reference count for destructor. */
1266 gcsATOM_PTR reference;
1268 #if gcdUSE_NPOT_PATCH
1269 gctBOOL bNeedSupportNP2Texture;
1271 @@ -123,7 +123,7 @@ extern gcsPLS gcPLS;
1272 typedef struct _gcsTLS * gcsTLS_PTR;
1274 typedef void (* gctTLS_DESTRUCTOR) (
1279 typedef struct _gcsTLS
1280 @@ -658,8 +658,6 @@ gcoHAL_QueryChipFeature(
1281 IN gceFEATURE Feature);
1286 /******************************************************************************\
1287 ********************************** gcoOS Object *********************************
1288 \******************************************************************************/
1289 @@ -1775,20 +1773,6 @@ gcoSURF_QueryVidMemNode(
1290 OUT gctUINT_PTR Bytes
1293 -/* Set usage attribute of a surface. */
1296 - IN gcoSURF Surface,
1297 - IN gceSURF_USAGE Usage
1300 -/* Return usage attribute of a surface. */
1302 -gcoSURF_QueryUsage(
1303 - IN gcoSURF Surface,
1304 - OUT gceSURF_USAGE *Usage
1307 /* Set the color type of the surface. */
1309 gcoSURF_SetColorType(
1310 @@ -1975,6 +1959,14 @@ gcoSURF_SetWindow(
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. */
1316 +gcoSURF_SetAlignment(
1317 + IN gcoSURF Surface,
1322 /* Increase reference count of the surface. */
1324 gcoSURF_ReferenceSurface(
1325 @@ -2009,6 +2001,12 @@ gcoSURF_SetOffset(
1330 + IN gcoSURF Surface,
1331 + OUT gctUINT *Offset
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" {
1345 #ifndef GC_ENABLE_LOADTIME_OPT
1346 -#define GC_ENABLE_LOADTIME_OPT 1
1347 +#define GC_ENABLE_LOADTIME_OPT 1
1350 #define TEMP_OPT_CONSTANT_TEXLD_COORD 1
1352 -#define TEMP_SHADER_PATCH 1
1353 +#define TEMP_SHADER_PATCH 1
1355 +#define ADD_PRE_ROTATION_TO_VS 0
1357 +#define TEMP_INLINE_ALL_EXPANSION 1
1358 /******************************* IR VERSION ******************/
1359 #define gcdSL_IR_VERSION gcmCC('\0','\0','\0','\1')
1361 @@ -683,6 +687,13 @@ typedef enum _gceSHADER_FLAGS
1362 gcvSHADER_USE_ALPHA_KILL = 0x100,
1365 +#if ADD_PRE_ROTATION_TO_VS
1366 + gcvSHADER_VS_PRE_ROTATION = 0x200,
1369 +#if TEMP_INLINE_ALL_EXPANSION
1370 + gcvSHADER_INLINE_ALL_EXPANSION = 0x200,
1375 @@ -771,10 +782,15 @@ typedef enum _gceSHADER_OPTIMIZATION
1376 /* optimize varying packing */
1377 gcvOPTIMIZATION_VARYINGPACKING = 1 << 22,
1379 +#if TEMP_INLINE_ALL_EXPANSION
1380 + gcvOPTIMIZATION_INLINE_ALL_EXPANSION = 1 << 23,
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,
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;
1399 + /* Supported minor feature 4 fields. */
1400 + gctUINT32 chipMinorFeatures4;
1402 /* Number of streams supported. */
1403 gctUINT32 streamCount;
1405 @@ -929,30 +932,30 @@ typedef struct _gcsHAL_INTERFACE
1407 struct _gcsHAL_GET_SHARED_INFO
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;
1421 - IN gceVIDMEM_NODE_SHARED_INFO_TYPE infoType;
1424 + IN gctSIZE_T bytes;
1426 + /* Pointer to save the shared data. */
1427 + OUT gctPOINTER data;
1431 struct _gcsHAL_SET_SHARED_INFO
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;
1444 + /* Data to be shared. */
1445 + IN gctPOINTER data;
1448 + IN gctSIZE_T bytes;
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
1460 -/* Export the render target. */
1462 -gcoSURF_ExportRenderTarget(
1463 - IN gcoSURF SrcSurface
1466 -/* Import the render target. */
1468 -gcoSURF_ImportRenderTarget(
1470 - IN gcoSURF SrcSurface
1473 -/* Save the Resolve info to kernel. */
1475 -gcoSURF_PrepareRemoteResolveRect(
1476 - IN gcoSURF SrcSurface,
1477 - IN gcsPOINT_PTR SrcOrigin,
1478 - IN gcsPOINT_PTR DestOrigin,
1479 - IN gcsPOINT_PTR RectSize
1482 -/* Resolve using the rectangle info previously saved in the vid mem node. */
1484 -gcoSURF_ResolveFromStoredRect(
1485 - IN gcoSURF SrcSurface,
1486 - IN gcoSURF DestSurface
1489 -/* Using the info that Process Pid saved to do resolve. */
1491 -gcoSURF_RemoteResolveRect(
1492 - IN gcoSURF SrcSurface,
1493 - IN gcoSURF DestSurface,
1494 - IN gctBOOL *resolveDiscarded
1497 -/* Return the "resolve submitted indicator" signal. */
1499 -gcoSURF_GetRTSignal(
1500 - IN gcoSURF RTSurface,
1501 - OUT gctSIGNAL * resolveSubmittedSignal
1504 /* Resolve rectangular area of a surface. */
1506 gcoSURF_ResolveRect(
1507 @@ -1684,6 +1640,12 @@ gcoTEXTURE_IsRenderable(
1511 +gcoTEXTURE_IsRenderableEx(
1512 + IN gcoTEXTURE Texture,
1517 gcoTEXTURE_IsComplete(
1518 IN gcoTEXTURE Texture,
1520 @@ -2028,21 +1990,15 @@ gceSTATUS
1521 gcoHAL_GetSharedInfo(
1523 IN gctUINT32 DataId,
1524 - OUT gctUINT8_PTR Data,
1526 - IN gctUINT64 Node,
1527 - OUT gctUINT8_PTR NodeData,
1528 - IN gceVIDMEM_NODE_SHARED_INFO_TYPE SharedInfoType
1529 + OUT gctPOINTER Data
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
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
1553 -typedef enum _gceVIDMEM_NODE_SHARED_INFO_TYPE
1555 - gcvVIDMEM_INFO_GENERIC,
1556 - gcvVIDMEM_INFO_DIRTY_RECTANGLE
1558 -gceVIDMEM_NODE_SHARED_INFO_TYPE;
1560 /* Surface types. */
1561 typedef enum _gceSURF_TYPE
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 @@
1571 - gcdPOWER_MANAGEMENT
1573 - This define enables the power management code.
1575 -#ifndef gcdPOWER_MANAGEMENT
1576 -# define gcdPOWER_MANAGEMENT 1
1580 gcdPOWER_SUSNPEND_WHEN_IDLE
1582 Set to 1 to make GPU enter gcvPOWER_SUSPEND when idle detected,
1584 If the value is 0, no timeout will be checked for.
1586 #ifndef gcdGPU_TIMEOUT
1589 # define gcdGPU_TIMEOUT 0
1591 # define gcdGPU_TIMEOUT 20000
1592 @@ -726,31 +717,13 @@
1594 Support swap with a specific rectangle.
1596 - Set the rectangle with eglSetSwapRectangleANDROID api.
1597 + Set the rectangle with eglSetSwapRectangleVIV api.
1599 #ifndef gcdSUPPORT_SWAP_RECTANGLE
1600 # define gcdSUPPORT_SWAP_RECTANGLE 0
1606 - Support deferred resolves for 3D apps.
1608 -#ifndef gcdDEFER_RESOLVES
1609 -# define gcdDEFER_RESOLVES 0
1613 - gcdCOPYBLT_OPTIMIZATION
1615 - Combine dirty areas resulting from Android's copyBlt.
1617 -#ifndef gcdCOPYBLT_OPTIMIZATION
1618 -# define gcdCOPYBLT_OPTIMIZATION 0
1622 gcdGPU_LINEAR_BUFFER_ENABLED
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
1631 #define gcvVERSION_PATCH 9
1633 -#define gcvVERSION_BUILD 4651
1634 +#define gcvVERSION_BUILD 6622
1636 #define gcvVERSION_DATE __DATE__
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(
1646 +gckVGHARDWARE_SetPowerManagement(
1647 + IN gckVGHARDWARE Hardware,
1648 + IN gctBOOL PowerManagement
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(
1661 IN gctUINT LogFileSize,
1662 IN struct device *pdev,
1663 + IN gctINT PowerManagement,
1664 OUT gckGALDEVICE *Device
1667 @@ -538,6 +539,9 @@ gckGALDEVICE_Construct(
1668 device->kernels[gcvCORE_MAJOR]->hardware, FastClear, Compression
1671 + gcmkONERROR(gckHARDWARE_SetPowerManagement(
1672 + device->kernels[gcvCORE_MAJOR]->hardware, PowerManagement
1675 #if COMMAND_PROCESSOR_VERSION == 1
1676 /* Start the command queue. */
1677 @@ -593,6 +597,10 @@ gckGALDEVICE_Construct(
1681 + gcmkONERROR(gckHARDWARE_SetPowerManagement(
1682 + device->kernels[gcvCORE_2D]->hardware, PowerManagement
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;
1693 + gcmkONERROR(gckVGHARDWARE_SetPowerManagement(
1694 + device->kernels[gcvCORE_VG]->vg->hardware,
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(
1706 IN gctUINT LogFileSize,
1707 IN struct device *pdev,
1708 + IN gctINT PowerManagement,
1709 OUT gckGALDEVICE *Device
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);
1720 +static int powerManagement = 1;
1721 +module_param(powerManagement, int, 0644);
1723 static int signal = 48;
1724 module_param(signal, int, 0644);
1726 @@ -781,6 +784,9 @@ static int drv_init(struct device *pdev)
1730 + printk(KERN_INFO "Galcore version %d.%d.%d.%d\n",
1731 + gcvVERSION_MAJOR, gcvVERSION_MINOR, gcvVERSION_PATCH, gcvVERSION_BUILD);
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);
1746 @@ -833,6 +840,7 @@ static int drv_init(struct device *pdev)
1747 bankSize, fastClear, compression, baseAddress, physSize, signal,
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";
1761 #define USER_SIGNAL_TABLE_LEN_INIT 64
1762 +#define gcdSUPPRESS_OOM_MESSAGE 1
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)
1770 +#if gcdSUPPRESS_OOM_MESSAGE
1771 +#define gcdNOWARN __GFP_NOWARN
1773 +#define gcdNOWARN 0
1776 #define gcdINFINITE_TIMEOUT (60 * 1000)
1777 #define gcdDETECT_TIMEOUT 0
1778 #define gcdDETECT_DMA_ADDRESS 1
1779 @@ -261,7 +268,7 @@ _CreateMdl(
1781 gcmkHEADER_ARG("ProcessID=%d", ProcessID);
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);
1788 @@ -322,7 +329,7 @@ _CreateMdlMap(
1790 gcmkHEADER_ARG("Mdl=0x%X ProcessID=%d", Mdl, ProcessID);
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)
1797 @@ -481,7 +488,7 @@ _NonContiguousAlloc(
1799 size = NumPages * sizeof(struct page *);
1801 - pages = kmalloc(size, GFP_KERNEL | __GFP_NOWARN);
1802 + pages = kmalloc(size, GFP_KERNEL | gcdNOWARN);
1806 @@ -496,7 +503,7 @@ _NonContiguousAlloc(
1808 for (i = 0; i < NumPages; i++)
1810 - p = alloc_page(GFP_KERNEL | __GFP_HIGHMEM | __GFP_NOWARN);
1811 + p = alloc_page(GFP_KERNEL | __GFP_HIGHMEM | gcdNOWARN);
1815 @@ -762,7 +769,7 @@ _AllocateIntegerId(
1819 - if (idr_pre_get(&Database->idr, GFP_KERNEL | __GFP_NOWARN) == 0)
1820 + if (idr_pre_get(&Database->idr, GFP_KERNEL | gcdNOWARN) == 0)
1822 return gcvSTATUS_OUT_OF_MEMORY;
1824 @@ -954,7 +961,7 @@ gckOS_Construct(
1825 gcmkVERIFY_ARGUMENT(Os != gcvNULL);
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);
1833 @@ -1171,7 +1178,7 @@ _CreateKernelVirtualMapping(
1835 if (Mdl->contiguous)
1837 - pages = kmalloc(sizeof(struct page *) * numPages, GFP_KERNEL | __GFP_NOWARN);
1838 + pages = kmalloc(sizeof(struct page *) * numPages, GFP_KERNEL | gcdNOWARN);
1842 @@ -1385,7 +1392,7 @@ gckOS_AllocateMemory(
1846 - memory = (gctPOINTER) kmalloc(Bytes, GFP_KERNEL | __GFP_NOWARN);
1847 + memory = (gctPOINTER) kmalloc(Bytes, GFP_KERNEL | gcdNOWARN);
1850 if (memory == gcvNULL)
1851 @@ -1904,7 +1911,7 @@ gckOS_AllocateNonPagedMemory(
1852 addr = dma_alloc_coherent(gcvNULL,
1853 mdl->numPages * PAGE_SIZE,
1855 - GFP_KERNEL | __GFP_NOWARN);
1856 + GFP_KERNEL | gcdNOWARN);
1859 size = mdl->numPages * PAGE_SIZE;
1860 @@ -1915,7 +1922,7 @@ gckOS_AllocateNonPagedMemory(
1861 if (page == gcvNULL)
1864 - page = alloc_pages(GFP_KERNEL | __GFP_NOWARN, order);
1865 + page = alloc_pages(GFP_KERNEL | gcdNOWARN, order);
1868 if (page == gcvNULL)
1869 @@ -3848,6 +3855,9 @@ gckOS_AllocatePagedMemoryEx(
1871 gctBOOL locked = gcvFALSE;
1873 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
1874 + gctPOINTER addr = gcvNULL;
1877 gcmkHEADER_ARG("Os=0x%X Contiguous=%d Bytes=%lu", Os, Contiguous, Bytes);
1879 @@ -3873,13 +3883,27 @@ gckOS_AllocatePagedMemoryEx(
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)
1887 + alloc_pages_exact(numPages * PAGE_SIZE, GFP_KERNEL | gcdNOWARN | __GFP_NORETRY);
1889 + mdl->u.contiguousPages = addr
1890 + ? virt_to_page(addr)
1893 + mdl->exact = gcvTRUE;
1895 + mdl->u.contiguousPages =
1896 + alloc_pages(GFP_KERNEL | gcdNOWARN | __GFP_NORETRY, GetOrder(numPages));
1898 if (mdl->u.contiguousPages == gcvNULL)
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));
1904 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
1905 + mdl->exact = gcvFALSE;
1910 @@ -4024,7 +4048,16 @@ gckOS_FreePagedMemory(
1912 if (mdl->contiguous)
1914 - __free_pages(mdl->u.contiguousPages, GetOrder(mdl->numPages));
1915 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
1916 + if (mdl->exact == gcvTRUE)
1918 + free_pages_exact(page_address(mdl->u.contiguousPages), mdl->numPages * PAGE_SIZE);
1923 + __free_pages(mdl->u.contiguousPages, GetOrder(mdl->numPages));
1928 @@ -4859,7 +4892,7 @@ gckOS_MapUserPointer(
1929 gcmkVERIFY_ARGUMENT(Size > 0);
1930 gcmkVERIFY_ARGUMENT(KernelPointer != gcvNULL);
1932 - buf = kmalloc(Size, GFP_KERNEL | __GFP_NOWARN);
1933 + buf = kmalloc(Size, GFP_KERNEL | gcdNOWARN);
1937 @@ -5274,7 +5307,7 @@ OnError:
1938 MEMORY_MAP_LOCK(Os);
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);
1944 if (info == gcvNULL)
1946 @@ -5283,7 +5316,7 @@ OnError:
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);
1953 if (pages == gcvNULL)
1955 @@ -6502,7 +6535,7 @@ gckOS_CreateSemaphore(
1956 gcmkVERIFY_ARGUMENT(Semaphore != gcvNULL);
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);
1963 gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
1964 @@ -6942,6 +6975,7 @@ gckOS_SetGPUPower(
1966 imx_gpc_power_up_pu(false);
1970 /* TODO: Put your code here. */
1972 @@ -7255,7 +7289,7 @@ gckOS_CreateSignal(
1973 gcmkVERIFY_ARGUMENT(Signal != gcvNULL);
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);
1979 if (signal == gcvNULL)
1981 @@ -8000,7 +8034,7 @@ gckOS_CreateSemaphoreVG(
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)
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
1998 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
2001 dma_addr_t dmaHandle;
2002 PLINUX_MDL_MAP maps;
2003 struct _LINUX_MDL * prev;