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