Patchwork [meta-fsl-arm-extra,2/3] linux-wandboard: Update to 3.0.35-4.0.0 based kernel

login
register
mail settings
Submitter Otavio Salvador
Date July 2, 2013, 7:35 p.m.
Message ID <1372793748-4062-2-git-send-email-otavio@ossystems.com.br>
Download mbox | patch
Permalink /patch/52843/
State Accepted
Delegated to: Otavio Salvador
Headers show

Comments

Otavio Salvador - July 2, 2013, 7:35 p.m.
The 3.0.35-4.0.0 based branch, provided by Wandboard, does not has all
the updates provided by Freescale official BSP so the new GPU version
does not work with it. The added patch fix this specific issue.

Change-Id: I1456b5d94e2bdaf83866b4a3a04bf4ab7c0ef2c0
Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 ...1005-gpu-4.6.9p11-kernel-code-integration.patch | 6294 ++++++++++++++++++++
 .../linux/linux-wandboard-3.0.35/defconfig         |  258 +-
 recipes-kernel/linux/linux-wandboard.inc           |    2 +-
 recipes-kernel/linux/linux-wandboard_3.0.35.bb     |    6 +-
 4 files changed, 6394 insertions(+), 166 deletions(-)
 create mode 100644 recipes-kernel/linux/linux-wandboard-3.0.35/0001-ENGR00251005-gpu-4.6.9p11-kernel-code-integration.patch

Patch

diff --git a/recipes-kernel/linux/linux-wandboard-3.0.35/0001-ENGR00251005-gpu-4.6.9p11-kernel-code-integration.patch b/recipes-kernel/linux/linux-wandboard-3.0.35/0001-ENGR00251005-gpu-4.6.9p11-kernel-code-integration.patch
new file mode 100644
index 0000000..1e64c4f
--- /dev/null
+++ b/recipes-kernel/linux/linux-wandboard-3.0.35/0001-ENGR00251005-gpu-4.6.9p11-kernel-code-integration.patch
@@ -0,0 +1,6294 @@ 
+From 9af09f417b8f9d2205087f23e88931f64d649995 Mon Sep 17 00:00:00 2001
+From: Loren Huang <b02279@freescale.com>
+Date: Fri, 15 Feb 2013 23:34:51 +0800
+Subject: [PATCH] ENGR00251005 [gpu]4.6.9p11 kernel code integration
+
+-4.6.9p11 kernel code integration
+-Additionally release runtime pm and regulator when destory gpu driver
+to avoid reference count mismatch.
+
+Upstream-Status: Pending
+
+Signed-off-by: Loren Huang <b02279@freescale.com>
+Acked-by: Lily Zhang
+---
+ drivers/mxc/gpu-viv/Kbuild                         |   3 +-
+ .../hal/kernel/gc_hal_kernel_hardware_command_vg.c |   4 +-
+ .../hal/kernel/gc_hal_kernel_hardware_command_vg.h |   5 +-
+ .../GC350/hal/kernel/gc_hal_kernel_hardware_vg.c   |   4 +-
+ .../GC350/hal/kernel/gc_hal_kernel_hardware_vg.h   |   5 +-
+ .../arch/XAQ2/hal/kernel/gc_hal_kernel_context.c   |  19 +-
+ .../arch/XAQ2/hal/kernel/gc_hal_kernel_context.h   |   4 +-
+ .../arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c  | 217 ++++++-
+ .../arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.h  |   4 +-
+ drivers/mxc/gpu-viv/config                         |   2 +-
+ drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c     | 700 +++++++++++++++++----
+ drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h     |  86 ++-
+ .../mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c |  24 +-
+ .../gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c  |  18 +-
+ drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c  |  57 +-
+ .../mxc/gpu-viv/hal/kernel/gc_hal_kernel_debug.c   |   4 +-
+ .../mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c   | 163 ++---
+ .../mxc/gpu-viv/hal/kernel/gc_hal_kernel_heap.c    |   4 +-
+ .../hal/kernel/gc_hal_kernel_interrupt_vg.c        |   4 +-
+ drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu.c |  23 +-
+ .../mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu_vg.c  |   4 +-
+ .../mxc/gpu-viv/hal/kernel/gc_hal_kernel_power.c   | 347 ++++++++++
+ .../mxc/gpu-viv/hal/kernel/gc_hal_kernel_precomp.h |   4 +-
+ drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c  | 130 ++--
+ drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.h  |   5 +-
+ .../hal/kernel/gc_hal_kernel_video_memory.c        |   4 +-
+ drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h        | 125 +++-
+ drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h   |  62 +-
+ .../mxc/gpu-viv/hal/kernel/inc/gc_hal_compiler.h   |  27 +-
+ drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h | 270 ++++----
+ .../mxc/gpu-viv/hal/kernel/inc/gc_hal_driver_vg.h  |   9 +-
+ drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_dump.h   |   3 +-
+ .../gpu-viv/hal/kernel/inc/gc_hal_eglplatform.h    |   4 +-
+ .../hal/kernel/inc/gc_hal_eglplatform_type.h       |   3 +-
+ drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine.h |  39 +-
+ .../mxc/gpu-viv/hal/kernel/inc/gc_hal_engine_vg.h  |  11 +-
+ drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h   |  16 +-
+ .../gpu-viv/hal/kernel/inc/gc_hal_kernel_buffer.h  |  49 +-
+ drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_mem.h    |  16 +-
+ .../mxc/gpu-viv/hal/kernel/inc/gc_hal_options.h    |  25 +-
+ .../mxc/gpu-viv/hal/kernel/inc/gc_hal_profiler.h   |   2 +-
+ drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_raster.h |   4 +-
+ drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_rename.h |   4 +-
+ .../mxc/gpu-viv/hal/kernel/inc/gc_hal_statistics.h |   3 +-
+ drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_types.h  |  27 +-
+ .../mxc/gpu-viv/hal/kernel/inc/gc_hal_version.h    |   6 +-
+ drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_vg.h     |   7 +-
+ .../hal/os/linux/kernel/gc_hal_kernel_debug.h      |   4 +-
+ .../hal/os/linux/kernel/gc_hal_kernel_debugfs.c    |   2 +-
+ .../hal/os/linux/kernel/gc_hal_kernel_debugfs.h    |   4 +-
+ .../hal/os/linux/kernel/gc_hal_kernel_device.c     |  59 +-
+ .../hal/os/linux/kernel/gc_hal_kernel_device.h     |   7 +-
+ .../hal/os/linux/kernel/gc_hal_kernel_driver.c     |  27 +-
+ .../hal/os/linux/kernel/gc_hal_kernel_linux.c      |  20 +-
+ .../hal/os/linux/kernel/gc_hal_kernel_linux.h      |   4 +-
+ .../hal/os/linux/kernel/gc_hal_kernel_math.c       |   4 +-
+ .../gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c | 158 ++++-
+ .../gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h |  12 +-
+ 58 files changed, 2170 insertions(+), 687 deletions(-)
+ create mode 100644 drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_power.c
+
+diff --git a/drivers/mxc/gpu-viv/Kbuild b/drivers/mxc/gpu-viv/Kbuild
+index bc5ec02..0b18a7b 100644
+--- a/drivers/mxc/gpu-viv/Kbuild
++++ b/drivers/mxc/gpu-viv/Kbuild
+@@ -54,7 +54,8 @@ OBJS += $(HAL_KERNEL_DIR)/gc_hal_kernel.o \
+         $(HAL_KERNEL_DIR)/gc_hal_kernel_event.o \
+         $(HAL_KERNEL_DIR)/gc_hal_kernel_heap.o \
+         $(HAL_KERNEL_DIR)/gc_hal_kernel_mmu.o \
+-        $(HAL_KERNEL_DIR)/gc_hal_kernel_video_memory.o
++        $(HAL_KERNEL_DIR)/gc_hal_kernel_video_memory.o \
++        $(HAL_KERNEL_DIR)/gc_hal_kernel_power.o
+ 
+ OBJS += $(ARCH_KERNEL_DIR)/gc_hal_kernel_context.o \
+         $(ARCH_KERNEL_DIR)/gc_hal_kernel_hardware.o
+diff --git a/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_command_vg.c b/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_command_vg.c
+index a8b9922..cf40e3f 100644
+--- a/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_command_vg.c
++++ b/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_command_vg.c
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #include "gc_hal.h"
+ #include "gc_hal_kernel.h"
+ 
+diff --git a/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_command_vg.h b/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_command_vg.h
+index e2a9f8e..aa767ee 100644
+--- a/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_command_vg.h
++++ b/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_command_vg.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,9 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+-
+ #ifndef __gc_hal_kernel_hardware_command_vg_h_
+ #define __gc_hal_kernel_hardware_command_vg_h_
+ 
+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
+index 29b3e8c..4a6010d 100644
+--- 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
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #include "gc_hal.h"
+ #include "gc_hal_kernel.h"
+ #include "gc_hal_kernel_hardware_command_vg.h"
+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
+index e3714b7..83a603e 100644
+--- 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
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,9 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+-
+ #ifndef __gc_hal_kernel_hardware_vg_h_
+ #define __gc_hal_kernel_hardware_vg_h_
+ 
+diff --git a/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_context.c b/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_context.c
+index a52c1c8..22e1f27 100644
+--- a/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_context.c
++++ b/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_context.c
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,9 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+-
+ #include "gc_hal.h"
+ #include "gc_hal_kernel.h"
+ #include "gc_hal_kernel_context.h"
+@@ -474,7 +471,7 @@ _InitializeContextBuffer(
+     index += _SwitchPipe(Context, index, gcvPIPE_3D);
+ 
+     /* Current context pointer. */
+-#if gcdDEBUG && 1
++#if gcdDEBUG 
+     index += _State(Context, index, 0x03850 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ #endif
+ 
+@@ -1257,11 +1254,11 @@ gckCONTEXT_Construct(
+             }
+ 
+             /* Copy the current context. */
+-            gcmkONERROR(gckOS_MemCopy(
++            gckOS_MemCopy(
+                 tempContext->logical,
+                 currContext->logical,
+                 context->totalSize
+-                ));
++                );
+ 
+             /* Get the next context buffer. */
+             tempContext = tempContext->next;
+@@ -1442,7 +1439,7 @@ gckCONTEXT_Update(
+             gcmkONERROR(gckKERNEL_OpenUserData(
+                 kernel, needCopy,
+                 Context->recordArray,
+-                kDelta->recordArray, Context->recordArraySize,
++                gcmUINT64_TO_PTR(kDelta->recordArray), Context->recordArraySize,
+                 (gctPOINTER *) &recordArray
+                 ));
+ 
+@@ -1551,13 +1548,13 @@ gckCONTEXT_Update(
+             gcmkASSERT(kDelta->refCount >= 0);
+ 
+             /* Get the next state delta. */
+-            nDelta = kDelta->next;
++            nDelta = gcmUINT64_TO_PTR(kDelta->next);
+ 
+             /* Get access to the state records. */
+             gcmkONERROR(gckKERNEL_CloseUserData(
+                 kernel, needCopy,
+                 gcvFALSE,
+-                kDelta->recordArray, Context->recordArraySize,
++                gcmUINT64_TO_PTR(kDelta->recordArray), Context->recordArraySize,
+                 (gctPOINTER *) &recordArray
+                 ));
+ 
+@@ -1704,7 +1701,7 @@ OnError:
+         gcmkVERIFY_OK(gckKERNEL_CloseUserData(
+             kernel, needCopy,
+             gcvFALSE,
+-            kDelta->recordArray, Context->recordArraySize,
++            gcmUINT64_TO_PTR(kDelta->recordArray), Context->recordArraySize,
+             (gctPOINTER *) &recordArray
+             ));
+ 	}
+diff --git a/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_context.h b/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_context.h
+index a5030de..7554045 100644
+--- a/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_context.h
++++ b/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_context.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #ifndef __gc_hal_kernel_context_h_
+ #define __gc_hal_kernel_context_h_
+ 
+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
+index d3624d1..a87259e 100644
+--- 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
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #include "gc_hal.h"
+ #include "gc_hal_kernel.h"
+ 
+@@ -258,6 +256,13 @@ _IdentifyHardware(
+             = ((((gctUINT32) (Identity->chipMinorFeatures2)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 5:5) - (0 ? 5:5) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 5:5) - (0 ? 5:5) + 1))))))) << (0 ? 5:5))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ? 5:5) - (0 ? 5:5) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 5:5) - (0 ? 5:5) + 1))))))) << (0 ? 5:5)));
+     }
+ 
++    if ((Identity->chipModel == gcv800) && (Identity->chipRevision == 0x4605))
++    {
++        /* Correct feature bit: RTL does not have such feature. */
++        Identity->chipFeatures
++            = ((((gctUINT32) (Identity->chipFeatures)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:31) - (0 ? 31:31) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:31) - (0 ? 31:31) + 1))))))) << (0 ? 31:31))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ? 31:31) - (0 ? 31:31) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:31) - (0 ? 31:31) + 1))))))) << (0 ? 31:31)));
++    }
++
+     gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+                    "Identity: chipFeatures=0x%08X",
+                    Identity->chipFeatures);
+@@ -819,7 +824,7 @@ OnError:
+         if (hardware->powerOffTimer != gcvNULL)
+         {
+             gcmkVERIFY_OK(gckOS_StopTimer(Os, hardware->powerOffTimer));
+-            gcmkVERIFY_OK(gckOS_DestoryTimer(Os, hardware->powerOffTimer));
++            gcmkVERIFY_OK(gckOS_DestroyTimer(Os, hardware->powerOffTimer));
+         }
+ #endif
+ 
+@@ -872,7 +877,7 @@ gckHARDWARE_Destroy(
+ 
+ #if gcdPOWEROFF_TIMEOUT
+     gcmkVERIFY_OK(gckOS_StopTimer(Hardware->os, Hardware->powerOffTimer));
+-    gcmkVERIFY_OK(gckOS_DestoryTimer(Hardware->os, Hardware->powerOffTimer));
++    gcmkVERIFY_OK(gckOS_DestroyTimer(Hardware->os, Hardware->powerOffTimer));
+ #endif
+ 
+     gcmkVERIFY_OK(gckOS_AtomDestroy(Hardware->os, Hardware->pageTableDirty));
+@@ -4399,6 +4404,13 @@ gckHARDWARE_SetPowerManagementState(
+     /* Save the new power state. */
+     Hardware->chipPowerState = State;
+ 
++#if gcdDVFS
++    if (State == gcvPOWER_ON && Hardware->kernel->dvfs)
++    {
++        gckDVFS_Start(Hardware->kernel->dvfs);
++    }
++#endif
++
+ #if gcdPOWEROFF_TIMEOUT
+     /* Reset power off time */
+     gcmkONERROR(gckOS_GetTicks(&currentTime));
+@@ -5476,7 +5488,9 @@ gckHARDWARE_IsFeatureAvailable(
+         available = ((((gctUINT32) (Hardware->identity.chipMinorFeatures)) >> (0 ? 22:22) & ((gctUINT32) ((((1 ? 22:22) - (0 ? 22:22) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 22:22) - (0 ? 22:22) + 1)))))) == (0x1  & ((gctUINT32) ((((1 ? 22:22) - (0 ? 22:22) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 22:22) - (0 ? 22:22) + 1)))))));
+         break;
+     case gcvFEATURE_DYNAMIC_FREQUENCY_SCALING:
+-        available = ((((gctUINT32) (Hardware->identity.chipMinorFeatures2)) >> (0 ? 14:14) & ((gctUINT32) ((((1 ? 14:14) - (0 ? 14:14) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 14:14) - (0 ? 14:14) + 1)))))) == (0x1 & ((gctUINT32) ((((1 ? 14:14) - (0 ? 14:14) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 14:14) - (0 ? 14:14) + 1)))))));
++        /* This feature doesn't apply for 2D cores. */
++        available = ((((gctUINT32) (Hardware->identity.chipMinorFeatures2)) >> (0 ? 14:14) & ((gctUINT32) ((((1 ? 14:14) - (0 ? 14:14) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 14:14) - (0 ? 14:14) + 1)))))) == (0x1 & ((gctUINT32) ((((1 ? 14:14) - (0 ? 14:14) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 14:14) - (0 ? 14:14) + 1)))))))
++            &&      ((((gctUINT32) (Hardware->identity.chipFeatures)) >> (0 ? 2:2) & ((gctUINT32) ((((1 ? 2:2) - (0 ? 2:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 2:2) - (0 ? 2:2) + 1)))))) == (0x1 & ((gctUINT32) ((((1 ? 2:2) - (0 ? 2:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 2:2) - (0 ? 2:2) + 1)))))));
+         break;
+ 
+     default:
+@@ -6231,3 +6245,194 @@ OnError:
+ }
+ #endif
+ 
++#if gcdDVFS
++#define READ_FROM_EATER1 0
++
++gceSTATUS
++gckHARDWARE_QueryLoad(
++    IN gckHARDWARE Hardware,
++    OUT gctUINT32 * Load
++    )
++{
++    gctUINT32 debug1;
++    gceSTATUS status;
++    gcmkHEADER_ARG("Hardware=0x%X", Hardware);
++
++    gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
++    gcmkVERIFY_ARGUMENT(Load != gcvNULL);
++
++    gckOS_AcquireMutex(Hardware->os, Hardware->powerMutex, gcvINFINITE);
++
++    if (Hardware->chipPowerState == gcvPOWER_ON)
++    {
++        gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
++                                         Hardware->core,
++                                         0x00110,
++                                         Load));
++#if READ_FROM_EATER1
++        gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
++                                         Hardware->core,
++                                         0x00134,
++                                         Load));
++#endif
++
++        gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
++                                         Hardware->core,
++                                         0x00114,
++                                         &debug1));
++
++        /* Patch result of 0x110 with result of 0x114. */
++        if ((debug1 & 0xFF) == 1)
++        {
++            *Load &= ~0xFF;
++            *Load |= 1;
++        }
++
++        if (((debug1 & 0xFF00) >> 8) == 1)
++        {
++            *Load &= ~(0xFF << 8);
++            *Load |= 1 << 8;
++        }
++
++        if (((debug1 & 0xFF0000) >> 16) == 1)
++        {
++            *Load &= ~(0xFF << 16);
++            *Load |= 1 << 16;
++        }
++
++        if (((debug1 & 0xFF000000) >> 24) == 1)
++        {
++            *Load &= ~(0xFF << 24);
++            *Load |= 1 << 24;
++        }
++    }
++    else
++    {
++        status = gcvSTATUS_INVALID_REQUEST;
++    }
++
++OnError:
++
++    gckOS_ReleaseMutex(Hardware->os, Hardware->powerMutex);
++
++    gcmkFOOTER();
++    return status;
++}
++
++gceSTATUS
++gckHARDWARE_SetDVFSPeroid(
++    IN gckHARDWARE Hardware,
++    OUT gctUINT32 Frequency
++    )
++{
++    gceSTATUS status;
++    gctUINT32 period;
++    gctUINT32 eater;
++
++#if READ_FROM_EATER1
++    gctUINT32 period1;
++    gctUINT32 eater1;
++#endif
++
++    gcmkHEADER_ARG("Hardware=0x%X Frequency=%d", Hardware, Frequency);
++
++    gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
++
++    period = 0;
++
++    while((64 << period) < (gcdDVFS_ANAYLSE_WINDOW * Frequency * 1000) )
++    {
++        period++;
++    }
++
++#if READ_FROM_EATER1
++    /*
++    *  Peroid = F * 1000 * 1000 / (60 * 16 * 1024);
++    */
++    period1 = Frequency * 6250 / 6114;
++#endif
++
++    gckOS_AcquireMutex(Hardware->os, Hardware->powerMutex, gcvINFINITE);
++
++    if (Hardware->chipPowerState == gcvPOWER_ON)
++    {
++        /* Get current configure. */
++        gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
++                                         Hardware->core,
++                                         0x0010C,
++                                         &eater));
++
++        /* Change peroid. */
++        gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
++                                          Hardware->core,
++                                          0x0010C,
++                                          ((((gctUINT32) (eater)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 15:8) - (0 ? 15:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ? 15:8))) | (((gctUINT32) ((gctUINT32) (period) & ((gctUINT32) ((((1 ? 15:8) - (0 ? 15:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ? 15:8)))));
++
++#if READ_FROM_EATER1
++        /* Config eater1. */
++        gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
++                                         Hardware->core,
++                                         0x00130,
++                                         &eater1));
++
++        gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
++                                          Hardware->core,
++                                          0x00130,
++                                          ((((gctUINT32) (eater1)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:16) - (0 ? 31:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:16) - (0 ? 31:16) + 1))))))) << (0 ? 31:16))) | (((gctUINT32) ((gctUINT32) (period1) & ((gctUINT32) ((((1 ? 31:16) - (0 ? 31:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:16) - (0 ? 31:16) + 1))))))) << (0 ? 31:16)))));
++#endif
++    }
++    else
++    {
++        status = gcvSTATUS_INVALID_REQUEST;
++    }
++
++OnError:
++    gckOS_ReleaseMutex(Hardware->os, Hardware->powerMutex);
++
++    gcmkFOOTER();
++    return status;
++}
++
++gceSTATUS
++gckHARDWARE_InitDVFS(
++    IN gckHARDWARE Hardware
++    )
++{
++    gceSTATUS status;
++    gctUINT32 data;
++
++    gcmkHEADER_ARG("Hardware=0x%X", Hardware);
++
++    gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
++
++    gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
++                                     Hardware->core,
++                                     0x0010C,
++                                     &data));
++
++    data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 16:16) - (0 ? 16:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 16:16) - (0 ? 16:16) + 1))))))) << (0 ? 16:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 16:16) - (0 ? 16:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 16:16) - (0 ? 16:16) + 1))))))) << (0 ? 16:16)));
++    data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 18:18) - (0 ? 18:18) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 18:18) - (0 ? 18:18) + 1))))))) << (0 ? 18:18))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 18:18) - (0 ? 18:18) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 18:18) - (0 ? 18:18) + 1))))))) << (0 ? 18:18)));
++    data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 19:19) - (0 ? 19:19) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:19) - (0 ? 19:19) + 1))))))) << (0 ? 19:19))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 19:19) - (0 ? 19:19) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:19) - (0 ? 19:19) + 1))))))) << (0 ? 19:19)));
++    data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 20:20) - (0 ? 20:20) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 20:20) - (0 ? 20:20) + 1))))))) << (0 ? 20:20))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 20:20) - (0 ? 20:20) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 20:20) - (0 ? 20:20) + 1))))))) << (0 ? 20:20)));
++    data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:23) - (0 ? 23:23) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:23) - (0 ? 23:23) + 1))))))) << (0 ? 23:23))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 23:23) - (0 ? 23:23) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:23) - (0 ? 23:23) + 1))))))) << (0 ? 23:23)));
++    data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 22:22) - (0 ? 22:22) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 22:22) - (0 ? 22:22) + 1))))))) << (0 ? 22:22))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 22:22) - (0 ? 22:22) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 22:22) - (0 ? 22:22) + 1))))))) << (0 ? 22:22)));
++
++    gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
++                   "DVFS Configure=0x%X",
++                   data);
++
++    gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
++                                      Hardware->core,
++                                      0x0010C,
++                                      data));
++
++    gcmkFOOTER_NO();
++    return gcvSTATUS_OK;
++
++OnError:
++    gcmkFOOTER();
++    return status;
++}
++#endif
++
++
+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
+index 9ecfca7..517b35c 100644
+--- 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
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #ifndef __gc_hal_kernel_hardware_h_
+ #define __gc_hal_kernel_hardware_h_
+ 
+diff --git a/drivers/mxc/gpu-viv/config b/drivers/mxc/gpu-viv/config
+index 7e6e867..1196efa 100644
+--- a/drivers/mxc/gpu-viv/config
++++ b/drivers/mxc/gpu-viv/config
+@@ -1,6 +1,6 @@
+ ##############################################################################
+ #
+-#    Copyright (C) 2005 - 2012 by Vivante Corp.
++#    Copyright (C) 2005 - 2013 by Vivante Corp.
+ #
+ #    This program is free software; you can redistribute it and/or modify
+ #    it under the terms of the GNU General Public License as published by
+diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
+index 0cb9244..c567640 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
++++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #include "gc_hal_kernel_precomp.h"
+ 
+ #define _GC_OBJ_ZONE    gcvZONE_KERNEL
+@@ -176,6 +174,15 @@ gckKERNEL_Construct(
+     kernel->command      = gcvNULL;
+     kernel->eventObj     = gcvNULL;
+     kernel->mmu          = gcvNULL;
++#if gcdDVFS
++    kernel->dvfs         = gcvNULL;
++#endif
++
++    /* Initialize the gckKERNEL object. */
++    kernel->object.type = gcvOBJ_KERNEL;
++    kernel->os          = Os;
++    kernel->core        = Core;
++
+ 
+     if (SharedDB == gcvNULL)
+     {
+@@ -200,6 +207,12 @@ gckKERNEL_Construct(
+ 
+         /* Construct a database mutex. */
+         gcmkONERROR(gckOS_CreateMutex(Os, &kernel->db->dbMutex));
++
++        /* Construct a id-pointer database. */
++        gcmkONERROR(gckKERNEL_CreateIntegerDatabase(kernel, &kernel->db->pointerDatabase));
++
++        /* Construct a id-pointer database mutex. */
++        gcmkONERROR(gckOS_CreateMutex(Os, &kernel->db->pointerDatabaseMutex));
+     }
+     else
+     {
+@@ -215,11 +228,6 @@ gckKERNEL_Construct(
+ 
+     kernel->timeOut      = gcdGPU_TIMEOUT;
+ 
+-    /* Initialize the gckKERNEL object. */
+-    kernel->object.type = gcvOBJ_KERNEL;
+-    kernel->os          = Os;
+-    kernel->core        = Core;
+-
+     /* Save context. */
+     kernel->context = Context;
+ 
+@@ -279,6 +287,16 @@ gckKERNEL_Construct(
+                               (gctTIMERFUNCTION)_ResetFinishFunction,
+                               (gctPOINTER)kernel,
+                               &kernel->resetFlagClearTimer));
++        kernel->resetTimeStamp = 0;
++#endif
++
++#if gcdDVFS
++        if (gckHARDWARE_IsFeatureAvailable(kernel->hardware,
++                                           gcvFEATURE_DYNAMIC_FREQUENCY_SCALING))
++        {
++            gcmkONERROR(gckDVFS_Construct(kernel->hardware, &kernel->dvfs));
++            gcmkONERROR(gckDVFS_Start(kernel->dvfs));
++        }
+ #endif
+     }
+ 
+@@ -346,7 +364,7 @@ OnError:
+         if (kernel->resetFlagClearTimer)
+         {
+             gcmkVERIFY_OK(gckOS_StopTimer(Os, kernel->resetFlagClearTimer));
+-            gcmkVERIFY_OK(gckOS_DestoryTimer(Os, kernel->resetFlagClearTimer));
++            gcmkVERIFY_OK(gckOS_DestroyTimer(Os, kernel->resetFlagClearTimer));
+         }
+ #endif
+ 
+@@ -369,6 +387,14 @@ OnError:
+         }
+ #endif
+ 
++#if gcdDVFS
++        if (kernel->dvfs)
++        {
++            gcmkVERIFY_OK(gckDVFS_Stop(kernel->dvfs));
++            gcmkVERIFY_OK(gckDVFS_Destroy(kernel->dvfs));
++        }
++#endif
++
+         gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Os, kernel));
+     }
+ 
+@@ -444,6 +470,13 @@ gckKERNEL_Destroy(
+ 
+         /* Destroy the database mutex. */
+         gcmkVERIFY_OK(gckOS_DeleteMutex(Kernel->os, Kernel->db->dbMutex));
++
++
++        /* Destroy id-pointer database. */
++        gcmkVERIFY_OK(gckKERNEL_DestroyIntegerDatabase(Kernel, Kernel->db->pointerDatabase));
++
++        /* Destroy id-pointer database mutex. */
++        gcmkVERIFY_OK(gckOS_DeleteMutex(Kernel->os, Kernel->db->pointerDatabaseMutex));
+     }
+ 
+ #if gcdENABLE_VG
+@@ -472,7 +505,7 @@ gckKERNEL_Destroy(
+         if (Kernel->resetFlagClearTimer)
+         {
+             gcmkVERIFY_OK(gckOS_StopTimer(Kernel->os, Kernel->resetFlagClearTimer));
+-            gcmkVERIFY_OK(gckOS_DestoryTimer(Kernel->os, Kernel->resetFlagClearTimer));
++            gcmkVERIFY_OK(gckOS_DestroyTimer(Kernel->os, Kernel->resetFlagClearTimer));
+         }
+ #endif
+     }
+@@ -484,6 +517,14 @@ gckKERNEL_Destroy(
+     gcmkVERIFY_OK(gckOS_DeleteMutex(Kernel->os, Kernel->virtualBufferLock));
+ #endif
+ 
++#if gcdDVFS
++    if (Kernel->dvfs)
++    {
++        gcmkVERIFY_OK(gckDVFS_Stop(Kernel->dvfs));
++        gcmkVERIFY_OK(gckDVFS_Destroy(Kernel->dvfs));
++    }
++#endif
++
+     /* Mark the gckKERNEL object as unknown. */
+     Kernel->object.type = gcvOBJ_UNKNOWN;
+ 
+@@ -848,11 +889,14 @@ gckKERNEL_Dispatch(
+     gcuVIDMEM_NODE_PTR node = gcvNULL;
+     gctBOOL locked = gcvFALSE;
+     gctPHYS_ADDR physical = gcvNULL;
++    gctPOINTER logical = gcvNULL;
++    gctPOINTER info = gcvNULL;
++    gckCONTEXT context = gcvNULL;
+     gctUINT32 address;
+     gctUINT32 processID;
++    gckKERNEL kernel = Kernel;
+ #if gcdSECURE_USER
+     gcskSECURE_CACHE_PTR cache;
+-    gctPOINTER logical;
+ #endif
+     gctBOOL asynchronous;
+     gctPOINTER paddr = gcvNULL;
+@@ -910,156 +954,185 @@ gckKERNEL_Dispatch(
+         break;
+ 
+     case gcvHAL_MAP_MEMORY:
+-        physical = Interface->u.MapMemory.physical;
++        physical = gcmINT2PTR(Interface->u.MapMemory.physical);
+ 
+         /* Map memory. */
+         gcmkONERROR(
+             gckKERNEL_MapMemory(Kernel,
+                                 physical,
+-                                Interface->u.MapMemory.bytes,
+-                                &Interface->u.MapMemory.logical));
++                                (gctSIZE_T) Interface->u.MapMemory.bytes,
++                                &logical));
++
++        Interface->u.MapMemory.logical = gcmPTR_TO_UINT64(logical);
++
+         gcmkVERIFY_OK(
+             gckKERNEL_AddProcessDB(Kernel,
+                                    processID, gcvDB_MAP_MEMORY,
+-                                   Interface->u.MapMemory.logical,
++                                   logical,
+                                    physical,
+-                                   Interface->u.MapMemory.bytes));
++                                   (gctSIZE_T) Interface->u.MapMemory.bytes));
+         break;
+ 
+     case gcvHAL_UNMAP_MEMORY:
+-        physical = Interface->u.UnmapMemory.physical;
++        physical = gcmINT2PTR(Interface->u.UnmapMemory.physical);
+ 
+         /* Unmap memory. */
+         gcmkONERROR(
+             gckKERNEL_UnmapMemory(Kernel,
+                                   physical,
+-                                  Interface->u.UnmapMemory.bytes,
+-                                  Interface->u.UnmapMemory.logical));
++                                  (gctSIZE_T) Interface->u.UnmapMemory.bytes,
++                                  gcmUINT64_TO_PTR(Interface->u.UnmapMemory.logical)));
+         gcmkVERIFY_OK(
+             gckKERNEL_RemoveProcessDB(Kernel,
+                                       processID, gcvDB_MAP_MEMORY,
+-                                      Interface->u.UnmapMemory.logical));
++                                      gcmUINT64_TO_PTR(Interface->u.UnmapMemory.logical)));
+         break;
+ 
+     case gcvHAL_ALLOCATE_NON_PAGED_MEMORY:
++        bytes = (gctSIZE_T) Interface->u.AllocateNonPagedMemory.bytes;
++
+         /* Allocate non-paged memory. */
+         gcmkONERROR(
+             gckOS_AllocateNonPagedMemory(
+                 Kernel->os,
+                 FromUser,
+-                &Interface->u.AllocateNonPagedMemory.bytes,
+-                &Interface->u.AllocateNonPagedMemory.physical,
+-                &Interface->u.AllocateNonPagedMemory.logical));
++                &bytes,
++                &physical,
++                &logical));
++
++        Interface->u.AllocateNonPagedMemory.bytes    = bytes;
++        Interface->u.AllocateNonPagedMemory.logical  = gcmPTR_TO_UINT64(logical);
++        Interface->u.AllocateNonPagedMemory.physical = gcmPTR_TO_NAME(physical);
+ 
+         gcmkVERIFY_OK(
+             gckKERNEL_AddProcessDB(Kernel,
+                                    processID, gcvDB_NON_PAGED,
+-                                   Interface->u.AllocateNonPagedMemory.logical,
+-                                   Interface->u.AllocateNonPagedMemory.physical,
+-                                   Interface->u.AllocateNonPagedMemory.bytes));
++                                   logical,
++                                   gcmINT2PTR(Interface->u.AllocateNonPagedMemory.physical),
++                                   bytes));
++
+         break;
+ 
+     case gcvHAL_ALLOCATE_VIRTUAL_COMMAND_BUFFER:
+ #if gcdVIRTUAL_COMMAND_BUFFER
++        bytes = (gctSIZE_T) Interface->u.AllocateVirtualCommandBuffer.bytes;
++
+         gcmkONERROR(
+             gckKERNEL_AllocateVirtualCommandBuffer(
+                 Kernel,
+                 FromUser,
+-                &Interface->u.AllocateVirtualCommandBuffer.bytes,
+-                &Interface->u.AllocateVirtualCommandBuffer.physical,
+-                &Interface->u.AllocateVirtualCommandBuffer.logical));
++                &bytes,
++                &physical,
++                &logical));
++
++        Interface->u.AllocateVirtualCommandBuffer.bytes    = bytes;
++        Interface->u.AllocateVirtualCommandBuffer.logical  = gcmPTR_TO_UINT64(logical);
++        Interface->u.AllocateVirtualCommandBuffer.physical = gcmPTR_TO_NAME(physical);
+ 
+         gcmkVERIFY_OK(
+             gckKERNEL_AddProcessDB(Kernel,
+                                    processID, gcvDB_COMMAND_BUFFER,
+-                                   Interface->u.AllocateVirtualCommandBuffer.logical,
+-                                   Interface->u.AllocateVirtualCommandBuffer.physical,
+-                                   Interface->u.AllocateVirtualCommandBuffer.bytes));
++                                   logical,
++                                   gcmINT2PTR(Interface->u.AllocateVirtualCommandBuffer.physical),
++                                   bytes));
+ #else
+         status = gcvSTATUS_NOT_SUPPORTED;
+ #endif
+         break;
+ 
+     case gcvHAL_FREE_NON_PAGED_MEMORY:
+-        physical = Interface->u.FreeNonPagedMemory.physical;
++        physical = gcmNAME_TO_PTR(Interface->u.FreeNonPagedMemory.physical);
+ 
+         /* Unmap user logical out of physical memory first. */
+         gcmkONERROR(gckOS_UnmapUserLogical(Kernel->os,
+                                            physical,
+-                                           Interface->u.FreeNonPagedMemory.bytes,
+-                                           Interface->u.FreeNonPagedMemory.logical));
++                                           (gctSIZE_T) Interface->u.FreeNonPagedMemory.bytes,
++                                           gcmUINT64_TO_PTR(Interface->u.FreeNonPagedMemory.logical)));
+ 
+         /* Free non-paged memory. */
+         gcmkONERROR(
+             gckOS_FreeNonPagedMemory(Kernel->os,
+-                                     Interface->u.FreeNonPagedMemory.bytes,
++                                     (gctSIZE_T) Interface->u.FreeNonPagedMemory.bytes,
+                                      physical,
+-                                     Interface->u.FreeNonPagedMemory.logical));
++                                     gcmUINT64_TO_PTR(Interface->u.FreeNonPagedMemory.logical)));
+ 
+         gcmkVERIFY_OK(
+             gckKERNEL_RemoveProcessDB(Kernel,
+                                       processID, gcvDB_NON_PAGED,
+-                                      Interface->u.FreeNonPagedMemory.logical));
++                                      gcmUINT64_TO_PTR(Interface->u.FreeNonPagedMemory.logical)));
+ 
+ #if gcdSECURE_USER
+         gcmkVERIFY_OK(gckKERNEL_FlushTranslationCache(
+             Kernel,
+             cache,
+-            Interface->u.FreeNonPagedMemory.logical,
++            gcmUINT64_TO_PTR(Interface->u.FreeNonPagedMemory.logical),
+             Interface->u.FreeNonPagedMemory.bytes));
+ #endif
++
++        gcmRELEASE_NAME(Interface->u.FreeNonPagedMemory.physical);
++
+         break;
+ 
+     case gcvHAL_ALLOCATE_CONTIGUOUS_MEMORY:
++        bytes = (gctSIZE_T) Interface->u.AllocateContiguousMemory.bytes;
++
+         /* Allocate contiguous memory. */
+         gcmkONERROR(gckOS_AllocateContiguous(
+             Kernel->os,
+             FromUser,
+-            &Interface->u.AllocateContiguousMemory.bytes,
+-            &Interface->u.AllocateContiguousMemory.physical,
+-            &Interface->u.AllocateContiguousMemory.logical));
++            &bytes,
++            &physical,
++            &logical));
++
++        Interface->u.AllocateContiguousMemory.bytes    = bytes;
++        Interface->u.AllocateContiguousMemory.logical  = gcmPTR_TO_UINT64(logical);
++        Interface->u.AllocateContiguousMemory.physical = gcmPTR_TO_NAME(physical);
+ 
+         gcmkONERROR(gckHARDWARE_ConvertLogical(
+             Kernel->hardware,
+-            Interface->u.AllocateContiguousMemory.logical,
++            gcmUINT64_TO_PTR(Interface->u.AllocateContiguousMemory.logical),
+             &Interface->u.AllocateContiguousMemory.address));
+ 
+         gcmkVERIFY_OK(gckKERNEL_AddProcessDB(
+             Kernel,
+             processID, gcvDB_CONTIGUOUS,
+-            Interface->u.AllocateContiguousMemory.logical,
+-            Interface->u.AllocateContiguousMemory.physical,
+-            Interface->u.AllocateContiguousMemory.bytes));
++            logical,
++            gcmINT2PTR(Interface->u.AllocateContiguousMemory.physical),
++            bytes));
++
+         break;
+ 
+     case gcvHAL_FREE_CONTIGUOUS_MEMORY:
+-        physical = Interface->u.FreeContiguousMemory.physical;
++        physical = gcmNAME_TO_PTR(Interface->u.FreeContiguousMemory.physical);
+ 
+         /* Unmap user logical out of physical memory first. */
+         gcmkONERROR(gckOS_UnmapUserLogical(Kernel->os,
+                                            physical,
+-                                           Interface->u.FreeContiguousMemory.bytes,
+-                                           Interface->u.FreeContiguousMemory.logical));
++                                           (gctSIZE_T) Interface->u.FreeContiguousMemory.bytes,
++                                           gcmUINT64_TO_PTR(Interface->u.FreeContiguousMemory.logical)));
+ 
+         /* Free contiguous memory. */
+         gcmkONERROR(
+             gckOS_FreeContiguous(Kernel->os,
+                                  physical,
+-                                 Interface->u.FreeContiguousMemory.logical,
+-                                 Interface->u.FreeContiguousMemory.bytes));
++                                 gcmUINT64_TO_PTR(Interface->u.FreeContiguousMemory.logical),
++                                 (gctSIZE_T) Interface->u.FreeContiguousMemory.bytes));
+ 
+         gcmkVERIFY_OK(
+             gckKERNEL_RemoveProcessDB(Kernel,
+                                       processID, gcvDB_CONTIGUOUS,
+-                                      Interface->u.FreeNonPagedMemory.logical));
++                                      gcmUINT64_TO_PTR(Interface->u.FreeNonPagedMemory.logical)));
+ 
+ #if gcdSECURE_USER
+         gcmkVERIFY_OK(gckKERNEL_FlushTranslationCache(
+             Kernel,
+             cache,
+-            Interface->u.FreeContiguousMemory.logical,
++            gcmUINT64_TO_PTR(Interface->u.FreeContiguousMemory.logical),
+             Interface->u.FreeContiguousMemory.bytes));
+ #endif
++
++        gcmRELEASE_NAME(Interface->u.FreeContiguousMemory.physical);
++
+         break;
+ 
+     case gcvHAL_ALLOCATE_VIDEO_MEMORY:
+@@ -1076,10 +1149,8 @@ gckKERNEL_Dispatch(
+                             Interface->u.AllocateLinearVideoMemory.bytes,
+                             Interface->u.AllocateLinearVideoMemory.alignment,
+                             Interface->u.AllocateLinearVideoMemory.type,
+-                            &Interface->u.AllocateLinearVideoMemory.node));
++                            &node));
+ 
+-        /* Get actual size of node. */
+-        node = Interface->u.AllocateLinearVideoMemory.node;
+         if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
+         {
+             bytes = node->VidMem.bytes;
+@@ -1092,14 +1163,17 @@ gckKERNEL_Dispatch(
+         gcmkONERROR(
+             gckKERNEL_AddProcessDB(Kernel,
+                                    processID, gcvDB_VIDEO_MEMORY,
+-                                   Interface->u.AllocateLinearVideoMemory.node,
++                                   node,
+                                    gcvNULL,
+                                    bytes));
++
++        /* Get the node. */
++        Interface->u.AllocateLinearVideoMemory.node = gcmPTR_TO_UINT64(node);
+         break;
+ 
+     case gcvHAL_FREE_VIDEO_MEMORY:
++        node = gcmUINT64_TO_PTR(Interface->u.FreeVideoMemory.node);
+ #ifdef __QNXNTO__
+-        node = Interface->u.FreeVideoMemory.node;
+         if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM
+          && node->VidMem.logical != gcvNULL)
+         {
+@@ -1113,25 +1187,27 @@ gckKERNEL_Dispatch(
+ #endif
+         /* Free video memory. */
+         gcmkONERROR(
+-            gckVIDMEM_Free(Interface->u.FreeVideoMemory.node));
++            gckVIDMEM_Free(node));
+ 
+         gcmkONERROR(
+             gckKERNEL_RemoveProcessDB(Kernel,
+                                       processID, gcvDB_VIDEO_MEMORY,
+-                                      Interface->u.FreeVideoMemory.node));
++                                      node));
++
+         break;
+ 
+     case gcvHAL_LOCK_VIDEO_MEMORY:
++        node = gcmUINT64_TO_PTR(Interface->u.LockVideoMemory.node);
++
+         /* Lock video memory. */
+         gcmkONERROR(
+             gckVIDMEM_Lock(Kernel,
+-                           Interface->u.LockVideoMemory.node,
++                           node,
+                            Interface->u.LockVideoMemory.cacheable,
+                            &Interface->u.LockVideoMemory.address));
+ 
+         locked = gcvTRUE;
+ 
+-        node = Interface->u.LockVideoMemory.node;
+         if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
+         {
+             /* Map video memory address into user space. */
+@@ -1148,18 +1224,20 @@ gckKERNEL_Dispatch(
+         }
+         gcmkASSERT(node->VidMem.logical != gcvNULL);
+ 
+-        Interface->u.LockVideoMemory.memory = node->VidMem.logical;
++        Interface->u.LockVideoMemory.memory = gcmPTR_TO_UINT64(node->VidMem.logical);
+ #else
+             gcmkONERROR(
+                 gckKERNEL_MapVideoMemory(Kernel,
+                                          FromUser,
+                                          Interface->u.LockVideoMemory.address,
+-                                         &Interface->u.LockVideoMemory.memory));
++                                         &logical));
++
++            Interface->u.LockVideoMemory.memory = gcmPTR_TO_UINT64(logical);
+ #endif
+         }
+         else
+         {
+-            Interface->u.LockVideoMemory.memory = node->Virtual.logical;
++            Interface->u.LockVideoMemory.memory = gcmPTR_TO_UINT64(node->Virtual.logical);
+ 
+             /* Success. */
+             status = gcvSTATUS_OK;
+@@ -1168,12 +1246,12 @@ gckKERNEL_Dispatch(
+ #if gcdSECURE_USER
+         /* Return logical address as physical address. */
+         Interface->u.LockVideoMemory.address =
+-            gcmPTR2INT(Interface->u.LockVideoMemory.memory);
++            Interface->u.LockVideoMemory.memory;
+ #endif
+         gcmkONERROR(
+             gckKERNEL_AddProcessDB(Kernel,
+                                    processID, gcvDB_VIDEO_MEMORY_LOCKED,
+-                                   Interface->u.LockVideoMemory.node,
++                                   node,
+                                    gcvNULL,
+                                    0));
+ 
+@@ -1181,7 +1259,7 @@ gckKERNEL_Dispatch(
+ 
+     case gcvHAL_UNLOCK_VIDEO_MEMORY:
+         /* Unlock video memory. */
+-        node = Interface->u.UnlockVideoMemory.node;
++        node = gcmUINT64_TO_PTR(Interface->u.UnlockVideoMemory.node);
+ 
+ #if gcdSECURE_USER
+         /* Save node information before it disappears. */
+@@ -1220,26 +1298,25 @@ gckKERNEL_Dispatch(
+             gcmkONERROR(
+                 gckKERNEL_RemoveProcessDB(Kernel,
+                                           processID, gcvDB_VIDEO_MEMORY_LOCKED,
+-                                          Interface->u.UnlockVideoMemory.node));
++                                          node));
+         }
+-
+         break;
+ 
+     case gcvHAL_EVENT_COMMIT:
+         /* Commit an event queue. */
+         gcmkONERROR(
+             gckEVENT_Commit(Kernel->eventObj,
+-                            Interface->u.Event.queue));
++                            gcmUINT64_TO_PTR(Interface->u.Event.queue)));
+         break;
+ 
+     case gcvHAL_COMMIT:
+         /* Commit a command and context buffer. */
+         gcmkONERROR(
+             gckCOMMAND_Commit(Kernel->command,
+-                              Interface->u.Commit.context,
+-                              Interface->u.Commit.commandBuffer,
+-                              Interface->u.Commit.delta,
+-                              Interface->u.Commit.queue,
++                              gcmNAME_TO_PTR(Interface->u.Commit.context),
++                              gcmUINT64_TO_PTR(Interface->u.Commit.commandBuffer),
++                              gcmUINT64_TO_PTR(Interface->u.Commit.delta),
++                              gcmUINT64_TO_PTR(Interface->u.Commit.queue),
+                               processID));
+         break;
+ 
+@@ -1253,42 +1330,49 @@ gckKERNEL_Dispatch(
+         gcmkONERROR(
+             gckOS_MapUserMemory(Kernel->os,
+                                 Kernel->core,
+-                                Interface->u.MapUserMemory.memory,
++                                gcmUINT64_TO_PTR(Interface->u.MapUserMemory.memory),
+                                 Interface->u.MapUserMemory.physical,
+-                                Interface->u.MapUserMemory.size,
+-                                &Interface->u.MapUserMemory.info,
++                                (gctSIZE_T) Interface->u.MapUserMemory.size,
++                                &info,
+                                 &Interface->u.MapUserMemory.address));
++
++        Interface->u.MapUserMemory.info = gcmPTR_TO_NAME(info);
++
+         gcmkVERIFY_OK(
+             gckKERNEL_AddProcessDB(Kernel,
+                                    processID, gcvDB_MAP_USER_MEMORY,
+-                                   Interface->u.MapUserMemory.info,
+-                                   Interface->u.MapUserMemory.memory,
+-                                   Interface->u.MapUserMemory.size));
++                                   gcmINT2PTR(Interface->u.MapUserMemory.info),
++                                   gcmUINT64_TO_PTR(Interface->u.MapUserMemory.memory),
++                                   (gctSIZE_T) Interface->u.MapUserMemory.size));
+         break;
+ 
+     case gcvHAL_UNMAP_USER_MEMORY:
+         address = Interface->u.UnmapUserMemory.address;
++        info = gcmNAME_TO_PTR(Interface->u.UnmapUserMemory.info);
+ 
+         /* Unmap user memory. */
+         gcmkONERROR(
+             gckOS_UnmapUserMemory(Kernel->os,
+                                   Kernel->core,
+-                                  Interface->u.UnmapUserMemory.memory,
+-                                  Interface->u.UnmapUserMemory.size,
+-                                  Interface->u.UnmapUserMemory.info,
++                                  gcmUINT64_TO_PTR(Interface->u.UnmapUserMemory.memory),
++                                  (gctSIZE_T) Interface->u.UnmapUserMemory.size,
++                                  info,
+                                   address));
+ 
+ #if gcdSECURE_USER
+         gcmkVERIFY_OK(gckKERNEL_FlushTranslationCache(
+             Kernel,
+             cache,
+-            Interface->u.UnmapUserMemory.memory,
++            gcmUINT64_TO_PTR(Interface->u.UnmapUserMemory.memory),
+             Interface->u.UnmapUserMemory.size));
+ #endif
+         gcmkVERIFY_OK(
+             gckKERNEL_RemoveProcessDB(Kernel,
+                                       processID, gcvDB_MAP_USER_MEMORY,
+-                                      Interface->u.UnmapUserMemory.info));
++                                      gcmINT2PTR(Interface->u.UnmapUserMemory.info)));
++
++        gcmRELEASE_NAME(Interface->u.UnmapUserMemory.info);
++
+         break;
+ 
+ #if !USE_NEW_LINUX_SIGNAL
+@@ -1537,7 +1621,7 @@ gckKERNEL_Dispatch(
+         gcmkONERROR(
+             gckHARDWARE_ProfileEngine2D(
+                 Kernel->hardware,
+-                Interface->u.RegisterProfileData2D.hwProfile2D));
++                gcmUINT64_TO_PTR(Interface->u.RegisterProfileData2D.hwProfile2D)));
+ #else
+         status = gcvSTATUS_OK;
+ #endif
+@@ -1652,14 +1736,15 @@ gckKERNEL_Dispatch(
+         break;
+ 
+     case gcvHAL_CACHE:
+-        if (Interface->u.Cache.node == gcvNULL)
++        node = gcmUINT64_TO_PTR(Interface->u.Cache.node);
++        if (node == gcvNULL)
+         {
+             /* FIXME Surface wrap some memory which is not allocated by us,
+             ** So we don't have physical address to handle outer cache, ignore it*/
+             status = gcvSTATUS_OK;
+             break;
+         }
+-        else if (Interface->u.Cache.node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
++        else if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
+         {
+             /* Video memory has no physical handles. */
+             physical = gcvNULL;
+@@ -1667,9 +1752,11 @@ gckKERNEL_Dispatch(
+         else
+         {
+             /* Grab physical handle. */
+-            physical = Interface->u.Cache.node->Virtual.physical;
++            physical = node->Virtual.physical;
+         }
+ 
++        logical = gcmUINT64_TO_PTR(Interface->u.Cache.logical);
++        bytes = (gctSIZE_T) Interface->u.Cache.bytes;
+         switch(Interface->u.Cache.operation)
+         {
+         case gcvCACHE_FLUSH:
+@@ -1678,8 +1765,8 @@ gckKERNEL_Dispatch(
+                                       processID,
+                                       physical,
+                                       paddr,
+-                                      Interface->u.Cache.logical,
+-                                      Interface->u.Cache.bytes);
++                                      logical,
++                                      bytes);
+             break;
+         case gcvCACHE_CLEAN:
+             /* Clean the cache. */
+@@ -1687,8 +1774,8 @@ gckKERNEL_Dispatch(
+                                       processID,
+                                       physical,
+                                       paddr,
+-                                      Interface->u.Cache.logical,
+-                                      Interface->u.Cache.bytes);
++                                      logical,
++                                      bytes);
+             break;
+         case gcvCACHE_INVALIDATE:
+             /* Invalidate the cache. */
+@@ -1696,13 +1783,13 @@ gckKERNEL_Dispatch(
+                                            processID,
+                                            physical,
+                                            paddr,
+-                                           Interface->u.Cache.logical,
+-                                           Interface->u.Cache.bytes);
++                                           logical,
++                                           bytes);
+             break;
+ 
+ 	case gcvCACHE_MEMORY_BARRIER:
+ 	   status = gckOS_MemoryBarrier(Kernel->os,
+-                                        Interface->u.Cache.logical);
++                                        logical);
+ 	   break;
+         default:
+             status = gcvSTATUS_INVALID_ARGUMENT;
+@@ -1802,14 +1889,17 @@ gckKERNEL_Dispatch(
+         /* Attach user process. */
+         gcmkONERROR(
+             gckCOMMAND_Attach(Kernel->command,
+-                              &Interface->u.Attach.context,
+-                              &Interface->u.Attach.stateCount,
++                              &context,
++                              &bytes,
+                               processID));
+ 
++        Interface->u.Attach.stateCount = bytes;
++        Interface->u.Attach.context = gcmPTR_TO_NAME(context);
++
+         gcmkVERIFY_OK(
+             gckKERNEL_AddProcessDB(Kernel,
+                                    processID, gcvDB_CONTEXT,
+-                                   Interface->u.Attach.context,
++                                   gcmINT2PTR(Interface->u.Attach.context),
+                                    gcvNULL,
+                                    0));
+         break;
+@@ -1818,15 +1908,18 @@ gckKERNEL_Dispatch(
+         /* Detach user process. */
+         gcmkONERROR(
+             gckCOMMAND_Detach(Kernel->command,
+-                              Interface->u.Detach.context));
++                              gcmNAME_TO_PTR(Interface->u.Detach.context)));
+ 
+         gcmkVERIFY_OK(
+             gckKERNEL_RemoveProcessDB(Kernel,
+                               processID, gcvDB_CONTEXT,
+-                              Interface->u.Detach.context));
++                              gcmINT2PTR(Interface->u.Detach.context)));
++
++        gcmRELEASE_NAME(Interface->u.Detach.context);
+         break;
+ 
+     case gcvHAL_COMPOSE:
++        Interface->u.Compose.physical = gcmPTR_TO_UINT64(gcmNAME_TO_PTR(Interface->u.Compose.physical));
+         /* Start composition. */
+         gcmkONERROR(
+             gckEVENT_Compose(Kernel->eventObj,
+@@ -1842,11 +1935,13 @@ gckKERNEL_Dispatch(
+     case gcvHAL_GET_FRAME_INFO:
+         gcmkONERROR(gckHARDWARE_GetFrameInfo(
+             Kernel->hardware,
+-            Interface->u.GetFrameInfo.frameInfo));
++            gcmUINT64_TO_PTR(Interface->u.GetFrameInfo.frameInfo)));
+         break;
+ #endif
+ 
+     case gcvHAL_GET_SHARED_INFO:
++        bytes = (gctSIZE_T) Interface->u.GetSharedInfo.size;
++
+         if (Interface->u.GetSharedInfo.dataId != 0)
+         {
+             gcmkONERROR(gckKERNEL_FindProcessDB(Kernel,
+@@ -1857,7 +1952,7 @@ gckKERNEL_Dispatch(
+                         &record));
+ 
+             /* find a record in db, check size */
+-            if (record.bytes != Interface->u.GetSharedInfo.size)
++            if (record.bytes != bytes)
+             {
+                 /* Size change is not allowed */
+                 gcmkONERROR(gcvSTATUS_INVALID_DATA);
+@@ -1867,13 +1962,13 @@ gckKERNEL_Dispatch(
+             gcmkONERROR(gckOS_CopyToUserData(
+                 Kernel->os,
+                 record.physical,
+-                Interface->u.GetSharedInfo.data,
+-                Interface->u.GetSharedInfo.size
++                gcmUINT64_TO_PTR(Interface->u.GetSharedInfo.data),
++                bytes
+                 ));
+ 
+         }
+ 
+-        if ((node = Interface->u.GetSharedInfo.node) != gcvNULL)
++        if ((node = gcmUINT64_TO_PTR(Interface->u.GetSharedInfo.node)) != gcvNULL)
+         {
+             switch (Interface->u.GetSharedInfo.infoType)
+                 {
+@@ -1892,7 +1987,7 @@ gckKERNEL_Dispatch(
+                          gcmkONERROR(gckOS_CopyToUserData(
+                              Kernel->os,
+                              data,
+-                             Interface->u.GetSharedInfo.nodeData,
++                             gcmUINT64_TO_PTR(Interface->u.GetSharedInfo.nodeData),
+                              sizeof(gcsVIDMEM_NODE_SHARED_INFO)
+                              ));
+                     }
+@@ -1930,7 +2025,7 @@ gckKERNEL_Dispatch(
+                         gcmkONERROR(gckOS_CopyToUserData(
+                             Kernel->os,
+                             &alignedSharedInfo,
+-                            Interface->u.GetSharedInfo.nodeData,
++                            gcmUINT64_TO_PTR(Interface->u.GetSharedInfo.nodeData),
+                             sizeof(gcsVIDMEM_NODE_SHARED_INFO)
+                             ));
+ 
+@@ -1953,6 +2048,8 @@ gckKERNEL_Dispatch(
+         break;
+ 
+     case gcvHAL_SET_SHARED_INFO:
++        bytes = (gctSIZE_T) Interface->u.SetSharedInfo.size;
++
+         if (Interface->u.SetSharedInfo.dataId != 0)
+         {
+             status = gckKERNEL_FindProcessDB(Kernel, processID, 0,
+@@ -1966,7 +2063,7 @@ gckKERNEL_Dispatch(
+                 /* Note: we count on DestoryProcessDB to free it */
+                 gcmkONERROR(gckOS_AllocateMemory(
+                     Kernel->os,
+-                    Interface->u.SetSharedInfo.size,
++                    bytes,
+                     &data
+                     ));
+ 
+@@ -1975,7 +2072,7 @@ gckKERNEL_Dispatch(
+                         gcvDB_SHARED_INFO,
+                         gcmINT2PTR(Interface->u.SetSharedInfo.dataId),
+                         data,
+-                        Interface->u.SetSharedInfo.size
++                        bytes
+                         ));
+             }
+             else
+@@ -1984,7 +2081,7 @@ gckKERNEL_Dispatch(
+                 gcmkONERROR(status);
+ 
+                 /* find a record in db, check size */
+-                if (record.bytes != Interface->u.SetSharedInfo.size)
++                if (record.bytes != bytes)
+                 {
+                     /* Size change is not allowed */
+                     gcmkONERROR(gcvSTATUS_INVALID_DATA);
+@@ -1997,12 +2094,12 @@ gckKERNEL_Dispatch(
+             gcmkONERROR(gckOS_CopyFromUserData(
+                 Kernel->os,
+                 data,
+-                Interface->u.SetSharedInfo.data,
+-                Interface->u.SetSharedInfo.size
++                gcmUINT64_TO_PTR(Interface->u.SetSharedInfo.data),
++                bytes
+                 ));
+         }
+ 
+-        if ((node = Interface->u.SetSharedInfo.node) != gcvNULL)
++        if ((node = gcmUINT64_TO_PTR(Interface->u.SetSharedInfo.node)) != gcvNULL)
+         {
+             switch (Interface->u.SetSharedInfo.infoType)
+                 {
+@@ -2020,7 +2117,7 @@ gckKERNEL_Dispatch(
+                         gcmkONERROR(gckOS_CopyFromUserData(
+                             Kernel->os,
+                             data,
+-                            Interface->u.SetSharedInfo.nodeData,
++                            gcmUINT64_TO_PTR(Interface->u.SetSharedInfo.nodeData),
+                             sizeof(gcsVIDMEM_NODE_SHARED_INFO)
+                             ));
+                     }
+@@ -2036,7 +2133,7 @@ gckKERNEL_Dispatch(
+                         gcmkONERROR(gckOS_CopyFromUserData(
+                             Kernel->os,
+                             &newSharedInfo,
+-                            Interface->u.SetSharedInfo.nodeData,
++                            gcmUINT64_TO_PTR(Interface->u.SetSharedInfo.nodeData),
+                             gcmSIZEOF(gcsVIDMEM_NODE_SHARED_INFO)
+                             ));
+ 
+@@ -2107,6 +2204,14 @@ gckKERNEL_Dispatch(
+ #endif
+         break;
+ 
++    case gcvHAL_QUERY_RESET_TIME_STAMP:
++#if gcdENABLE_RECOVERY
++        Interface->u.QueryResetTimeStamp.timeStamp = Kernel->resetTimeStamp;
++#else
++        Interface->u.QueryResetTimeStamp.timeStamp = 0;
++#endif
++        break;
++
+     default:
+         /* Invalid command. */
+         gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+@@ -2123,7 +2228,7 @@ OnError:
+             /* Roll back the lock. */
+             gcmkVERIFY_OK(
+                 gckVIDMEM_Unlock(Kernel,
+-                                 Interface->u.LockVideoMemory.node,
++                                 gcmUINT64_TO_PTR(Interface->u.LockVideoMemory.node),
+                                  gcvSURF_TYPE_UNKNOWN,
+                                  &asynchronous));
+ 
+@@ -2132,7 +2237,7 @@ OnError:
+                 /* Bottom Half */
+                 gcmkVERIFY_OK(
+                     gckVIDMEM_Unlock(Kernel,
+-                                     Interface->u.LockVideoMemory.node,
++                                     gcmUINT64_TO_PTR(Interface->u.LockVideoMemory.node),
+                                      gcvSURF_TYPE_UNKNOWN,
+                                      gcvNULL));
+             }
+@@ -2910,6 +3015,8 @@ gckKERNEL_Recovery(
+ #endif
+     gcmkONERROR(gckEVENT_Notify(eventObj, 2));
+ 
++    Kernel->resetTimeStamp++;
++
+     /* Success. */
+     gcmkFOOTER_NO();
+     return gcvSTATUS_OK;
+@@ -3438,6 +3545,361 @@ gckLINKQUEUE_GetData(
+ }
+ #endif
+ 
++/******************************************************************************\
++*************************** Pointer - ID translation ***************************
++\******************************************************************************/
++#define gcdID_TABLE_LENGTH 1024
++typedef struct _gcsINTEGERDB * gckINTEGERDB;
++typedef struct _gcsINTEGERDB
++{
++    gckOS                       os;
++    gctPOINTER*                 table;
++    gctPOINTER                  mutex;
++    gctUINT32                   tableLen;
++    gctUINT32                   currentID;
++    gctUINT32                   unused;
++}
++gcsINTEGERDB;
++
++gceSTATUS
++gckKERNEL_CreateIntegerDatabase(
++    IN gckKERNEL Kernel,
++    OUT gctPOINTER * Database
++    )
++{
++    gceSTATUS status;
++    gckINTEGERDB database = gcvNULL;
++
++    gcmkHEADER_ARG("Kernel=0x%08X Datbase=0x%08X", Kernel, Database);
++
++    gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
++    gcmkVERIFY_ARGUMENT(Database != gcvNULL);
++
++    /* Allocate a database. */
++    gcmkONERROR(gckOS_Allocate(
++        Kernel->os, gcmSIZEOF(gcsINTEGERDB), (gctPOINTER *)&database));
++
++    gckOS_ZeroMemory(database, gcmSIZEOF(gcsINTEGERDB));
++
++    /* Allocate a pointer table. */
++    gcmkONERROR(gckOS_Allocate(
++        Kernel->os, gcmSIZEOF(gctPOINTER) * gcdID_TABLE_LENGTH, (gctPOINTER *)&database->table));
++
++    gckOS_ZeroMemory(database->table, gcmSIZEOF(gctPOINTER) * gcdID_TABLE_LENGTH);
++
++    /* Allocate a database mutex. */
++    gcmkONERROR(gckOS_CreateMutex(Kernel->os, &database->mutex));
++
++    /* Initialize. */
++    database->currentID = 0;
++    database->unused = gcdID_TABLE_LENGTH;
++    database->os = Kernel->os;
++    database->tableLen = gcdID_TABLE_LENGTH;
++
++    *Database = database;
++
++    gcmkFOOTER_ARG("*Database=0x%08X", *Database);
++    return gcvSTATUS_OK;
++
++OnError:
++    /* Rollback. */
++    if (database)
++    {
++        if (database->table)
++        {
++            gcmkOS_SAFE_FREE(Kernel->os, database->table);
++        }
++
++        gcmkOS_SAFE_FREE(Kernel->os, database);
++    }
++
++    gcmkFOOTER();
++    return status;
++}
++
++gceSTATUS
++gckKERNEL_DestroyIntegerDatabase(
++    IN gckKERNEL Kernel,
++    IN gctPOINTER Database
++    )
++{
++    gckINTEGERDB database = Database;
++
++    gcmkHEADER_ARG("Kernel=0x%08X Datbase=0x%08X", Kernel, Database);
++
++    gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
++    gcmkVERIFY_ARGUMENT(Database != gcvNULL);
++
++    /* Destroy pointer table. */
++    gcmkOS_SAFE_FREE(Kernel->os, database->table);
++
++    /* Destroy database mutex. */
++    gcmkVERIFY_OK(gckOS_DeleteMutex(Kernel->os, database->mutex));
++
++    /* Destroy database. */
++    gcmkOS_SAFE_FREE(Kernel->os, database);
++
++    gcmkFOOTER_NO();
++    return gcvSTATUS_OK;
++}
++
++gceSTATUS
++gckKERNEL_AllocateIntegerId(
++    IN gctPOINTER Database,
++    IN gctPOINTER Pointer,
++    OUT gctUINT32 * Id
++    )
++{
++    gceSTATUS status;
++    gckINTEGERDB database = Database;
++    gctUINT32 i, unused, currentID, tableLen;
++    gctPOINTER * table;
++    gckOS os = database->os;
++    gctBOOL acquired = gcvFALSE;
++
++    gcmkHEADER_ARG("Database=0x%08X Pointer=0x%08X", Database, Pointer);
++
++    gcmkVERIFY_ARGUMENT(Id != gcvNULL);
++
++    gcmkVERIFY_OK(gckOS_AcquireMutex(os, database->mutex, gcvINFINITE));
++    acquired = gcvTRUE;
++
++    if (database->unused < 1)
++    {
++        /* Extend table. */
++        gcmkONERROR(
++            gckOS_Allocate(os,
++                           gcmSIZEOF(gctPOINTER) * (database->tableLen + gcdID_TABLE_LENGTH),
++                           (gctPOINTER *)&table));
++
++        gckOS_ZeroMemory(table + database->tableLen,
++                         gcmSIZEOF(gctPOINTER) * gcdID_TABLE_LENGTH);
++
++        /* Copy data from old table. */
++        gckOS_MemCopy(table,
++                      database->table,
++                      database->tableLen * gcmSIZEOF(gctPOINTER));
++
++        gcmkOS_SAFE_FREE(os, database->table);
++
++        /* Update databse with new allocated table. */
++        database->table = table;
++        database->currentID = database->tableLen;
++        database->tableLen += gcdID_TABLE_LENGTH;
++        database->unused += gcdID_TABLE_LENGTH;
++    }
++
++    table = database->table;
++    currentID = database->currentID;
++    tableLen = database->tableLen;
++    unused = database->unused;
++
++    /* Connect id with pointer. */
++    table[currentID] = Pointer;
++
++    *Id = currentID + 1;
++
++    /* Update the currentID. */
++    if (--unused > 0)
++    {
++        for (i = 0; i < tableLen; i++)
++        {
++            if (++currentID >= tableLen)
++            {
++                /* Wrap to the begin. */
++                currentID = 0;
++            }
++
++            if (table[currentID] == gcvNULL)
++            {
++                break;
++            }
++        }
++    }
++
++    database->table = table;
++    database->currentID = currentID;
++    database->tableLen = tableLen;
++    database->unused = unused;
++
++    gcmkVERIFY_OK(gckOS_ReleaseMutex(os, database->mutex));
++    acquired = gcvFALSE;
++
++    gcmkFOOTER_ARG("*Id=%d", *Id);
++    return gcvSTATUS_OK;
++
++OnError:
++    if (acquired)
++    {
++        gcmkVERIFY_OK(gckOS_ReleaseMutex(os, database->mutex));
++    }
++
++    gcmkFOOTER();
++    return status;
++}
++
++gceSTATUS
++gckKERNEL_FreeIntegerId(
++    IN gctPOINTER Database,
++    IN gctUINT32 Id
++    )
++{
++    gceSTATUS status;
++    gckINTEGERDB database = Database;
++    gckOS os = database->os;
++    gctBOOL acquired = gcvFALSE;
++
++    gcmkHEADER_ARG("Database=0x%08X Id=%d", Database, Id);
++
++    gcmkVERIFY_OK(gckOS_AcquireMutex(os, database->mutex, gcvINFINITE));
++    acquired = gcvTRUE;
++
++    if (!(Id > 0 && Id <= database->tableLen))
++    {
++        gcmkONERROR(gcvSTATUS_NOT_FOUND);
++    }
++
++    Id -= 1;
++
++    database->table[Id] = gcvNULL;
++
++    if (database->unused++ == 0)
++    {
++        database->currentID = Id;
++    }
++
++    gcmkVERIFY_OK(gckOS_ReleaseMutex(os, database->mutex));
++    acquired = gcvFALSE;
++
++    gcmkFOOTER_NO();
++    return gcvSTATUS_OK;
++
++OnError:
++    if (acquired)
++    {
++        gcmkVERIFY_OK(gckOS_ReleaseMutex(os, database->mutex));
++    }
++
++    gcmkFOOTER();
++    return status;
++}
++
++gceSTATUS
++gckKERNEL_QueryIntegerId(
++    IN gctPOINTER Database,
++    IN gctUINT32 Id,
++    OUT gctPOINTER * Pointer
++    )
++{
++    gceSTATUS status;
++    gckINTEGERDB database = Database;
++    gctPOINTER pointer;
++    gckOS os = database->os;
++    gctBOOL acquired = gcvFALSE;
++
++    gcmkHEADER_ARG("Database=0x%08X Id=%d", Database, Id);
++    gcmkVERIFY_ARGUMENT(Pointer != gcvNULL);
++
++    gcmkVERIFY_OK(gckOS_AcquireMutex(os, database->mutex, gcvINFINITE));
++    acquired = gcvTRUE;
++
++    if (!(Id > 0 && Id <= database->tableLen))
++    {
++        gcmkONERROR(gcvSTATUS_NOT_FOUND);
++    }
++
++    Id -= 1;
++
++    pointer = database->table[Id];
++
++    gcmkVERIFY_OK(gckOS_ReleaseMutex(os, database->mutex));
++    acquired = gcvFALSE;
++
++    if (pointer)
++    {
++        *Pointer = pointer;
++    }
++    else
++    {
++        gcmkONERROR(gcvSTATUS_NOT_FOUND);
++    }
++
++    gcmkFOOTER_ARG("*Pointer=0x%08X", *Pointer);
++    return gcvSTATUS_OK;
++
++OnError:
++    if (acquired)
++    {
++        gcmkVERIFY_OK(gckOS_ReleaseMutex(os, database->mutex));
++    }
++
++    gcmkFOOTER();
++    return status;
++}
++
++
++gctUINT32
++gckKERNEL_AllocateNameFromPointer(
++    IN gckKERNEL Kernel,
++    IN gctPOINTER Pointer
++    )
++{
++    gceSTATUS status;
++    gctUINT32 name;
++    gctPOINTER database = Kernel->db->pointerDatabase;
++
++    gcmkHEADER_ARG("Kernel=0x%X Pointer=0x%X", Kernel, Pointer);
++
++    gcmkONERROR(
++        gckKERNEL_AllocateIntegerId(database, Pointer, &name));
++
++    gcmkFOOTER_ARG("name=%d", name);
++    return name;
++
++OnError:
++    gcmkFOOTER();
++    return 0;
++}
++
++gctPOINTER
++gckKERNEL_QueryPointerFromName(
++    IN gckKERNEL Kernel,
++    IN gctUINT32 Name
++    )
++{
++    gceSTATUS status;
++    gctPOINTER pointer = gcvNULL;
++    gctPOINTER database = Kernel->db->pointerDatabase;
++
++    gcmkHEADER_ARG("Kernel=0x%X Name=%d", Kernel, Name);
++
++    /* Lookup in database to get pointer. */
++    gcmkONERROR(gckKERNEL_QueryIntegerId(database, Name, &pointer));
++
++    gcmkFOOTER_ARG("pointer=0x%X", pointer);
++    return pointer;
++
++OnError:
++    gcmkFOOTER();
++    return gcvNULL;
++}
++
++gceSTATUS
++gckKERNEL_DeleteName(
++    IN gckKERNEL Kernel,
++    IN gctUINT32 Name
++    )
++{
++    gctPOINTER database = Kernel->db->pointerDatabase;
++
++    gcmkHEADER_ARG("Kernel=0x%X Name=0x%X", Kernel, Name);
++
++    /* Free name if exists. */
++    gcmkVERIFY_OK(gckKERNEL_FreeIntegerId(database, Name));
++
++    gcmkFOOTER_NO();
++    return gcvSTATUS_OK;
++}
+ /*******************************************************************************
+ ***** Test Code ****************************************************************
+ *******************************************************************************/
+diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h
+index a53c8ce..1da80b7 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h
++++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #ifndef __gc_hal_kernel_h_
+ #define __gc_hal_kernel_h_
+ 
+@@ -194,6 +192,9 @@ typedef struct _gcsDATABASE
+     /* Secure cache. */
+     gcskSECURE_CACHE                    cache;
+ #endif
++
++    gctPOINTER                          handleDatabase;
++    gctPOINTER                          handleDatabaseMutex;
+ }
+ gcsDATABASE;
+ 
+@@ -258,6 +259,57 @@ gckKERNEL_DumpProcessDB(
+     IN gckKERNEL Kernel
+     );
+ 
++/* ID database */
++gceSTATUS
++gckKERNEL_CreateIntegerDatabase(
++    IN gckKERNEL Kernel,
++    OUT gctPOINTER * Database
++    );
++
++gceSTATUS
++gckKERNEL_DestroyIntegerDatabase(
++    IN gckKERNEL Kernel,
++    IN gctPOINTER Database
++    );
++
++gceSTATUS
++gckKERNEL_AllocateIntegerId(
++    IN gctPOINTER Database,
++    IN gctPOINTER Pointer,
++    OUT gctUINT32 * Id
++    );
++
++gceSTATUS
++gckKERNEL_FreeIntegerId(
++    IN gctPOINTER Database,
++    IN gctUINT32 Id
++    );
++
++gceSTATUS
++gckKERNEL_QueryIntegerId(
++    IN gctPOINTER Database,
++    IN gctUINT32 Id,
++    OUT gctPOINTER * Pointer
++    );
++
++gctUINT32
++gckKERNEL_AllocateNameFromPointer(
++    IN gckKERNEL Kernel,
++    IN gctPOINTER Pointer
++    );
++
++gctPOINTER
++gckKERNEL_QueryPointerFromName(
++    IN gckKERNEL Kernel,
++    IN gctUINT32 Name
++    );
++
++gceSTATUS
++gckKERNEL_DeleteName(
++    IN gckKERNEL Kernel,
++    IN gctUINT32 Name
++    );
++
+ #if gcdSECURE_USER
+ /* Get secure cache from the process database. */
+ gceSTATUS
+@@ -297,6 +349,9 @@ struct _gckDB
+     gctUINT64                   idleTime;
+     gctUINT64                   lastSlowdown;
+     gctUINT64                   lastSlowdownIdle;
++    /* ID - Pointer database*/
++    gctPOINTER                  pointerDatabase;
++    gctPOINTER                  pointerDatabaseMutex;
+ };
+ 
+ #if gcdVIRTUAL_COMMAND_BUFFER
+@@ -370,6 +425,7 @@ struct _gckKERNEL
+ #if gcdENABLE_RECOVERY
+     gctPOINTER                  resetFlagClearTimer;
+     gctPOINTER                  resetAtom;
++    gctUINT64                   resetTimeStamp;
+ #endif
+ 
+     /* Pointer to gckEVENT object. */
+@@ -385,6 +441,30 @@ struct _gckKERNEL
+     gckVIRTUAL_COMMAND_BUFFER_PTR virtualBufferTail;
+     gctPOINTER                    virtualBufferLock;
+ #endif
++
++#if gcdDVFS
++    gckDVFS                     dvfs;
++#endif
++};
++
++struct _FrequencyHistory
++{
++    gctUINT32                   frequency;
++    gctUINT32                   count;
++};
++
++/* gckDVFS object. */
++struct _gckDVFS
++{
++    gckOS                       os;
++    gckHARDWARE                 hardware;
++    gctPOINTER                  timer;
++    gctUINT32                   pollingTime;
++    gctBOOL                     stop;
++    gctUINT32                   totalConfig;
++    gctUINT32                   loads[8];
++    gctUINT8                    currentScale;
++    struct _FrequencyHistory    frequencyHistory[16];
+ };
+ 
+ /* gckCOMMAND object. */
+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
+index 952ee88..66ce0d1 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c
++++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #include "gc_hal_kernel_precomp.h"
+ #include "gc_hal_kernel_context.h"
+ 
+@@ -250,7 +248,7 @@ _ProcessHints(
+         if (Command->hintArrayAllocated &&
+             (Command->hintArraySize < CommandBuffer->hintArraySize))
+         {
+-            gcmkONERROR(gcmkOS_SAFE_FREE(Command->os, Command->hintArray));
++            gcmkONERROR(gcmkOS_SAFE_FREE(Command->os, gcmUINT64_TO_PTR(Command->hintArray)));
+             Command->hintArraySize = gcvFALSE;
+         }
+ 
+@@ -264,18 +262,18 @@ _ProcessHints(
+                 &pointer
+                 ));
+ 
+-            Command->hintArray          = pointer;
++            Command->hintArray          = gcmPTR_TO_UINT64(pointer);
+             Command->hintArrayAllocated = gcvTRUE;
+             Command->hintArraySize      = CommandBuffer->hintArraySize;
+         }
+ 
+-        hintArray = Command->hintArray;
++        hintArray = gcmUINT64_TO_PTR(Command->hintArray);
+         copySize   = hintCount * gcmSIZEOF(gctUINT32);
+ 
+         gcmkONERROR(gckOS_CopyFromUserData(
+             Command->os,
+             hintArray,
+-            CommandBuffer->hintArray,
++            gcmUINT64_TO_PTR(CommandBuffer->hintArray),
+             copySize
+             ));
+     }
+@@ -285,7 +283,7 @@ _ProcessHints(
+ 
+         gcmkONERROR(gckOS_MapUserPointer(
+             Command->os,
+-            CommandBuffer->hintArray,
++            gcmUINT64_TO_PTR(CommandBuffer->hintArray),
+             CommandBuffer->hintArraySize,
+             &pointer
+             ));
+@@ -311,7 +309,7 @@ OnError:
+     {
+         gcmkVERIFY_OK(gckOS_UnmapUserPointer(
+             Command->os,
+-            CommandBuffer->hintArray,
++            gcmUINT64_TO_PTR(CommandBuffer->hintArray),
+             CommandBuffer->hintArraySize,
+             hintArray
+             ));
+@@ -677,7 +675,7 @@ gckCOMMAND_Destroy(
+     /* Free state array. */
+     if (Command->hintArrayAllocated)
+     {
+-        gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Command->os, Command->hintArray));
++        gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Command->os, gcmUINT64_TO_PTR(Command->hintArray)));
+         Command->hintArrayAllocated = gcvFALSE;
+     }
+ #endif
+@@ -1219,7 +1217,7 @@ gckCOMMAND_Commit(
+ 
+     /* Compute the command buffer entry and the size. */
+     commandBufferLogical
+-        = (gctUINT8_PTR) commandBufferObject->logical
++        = (gctUINT8_PTR) gcmUINT64_TO_PTR(commandBufferObject->logical)
+         +                commandBufferObject->startOffset;
+ 
+     gcmkONERROR(gckOS_GetPhysicalAddress(
+@@ -1892,7 +1890,7 @@ gckCOMMAND_Commit(
+ 
+     /* Determine the location of the LINK command in the command buffer. */
+     commandBufferLink
+-        = (gctUINT8_PTR) commandBufferObject->logical
++        = (gctUINT8_PTR) gcmUINT64_TO_PTR(commandBufferObject->logical)
+         +                commandBufferObject->offset;
+ 
+     /* Generate a LINK from the end of the command buffer being scheduled
+@@ -2034,7 +2032,7 @@ gckCOMMAND_Commit(
+             ));
+ 
+         /* Next record in the queue. */
+-        nextEventRecord = eventRecord->next;
++        nextEventRecord = gcmUINT64_TO_PTR(eventRecord->next);
+ 
+         if (!needCopy)
+         {
+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
+index 31dce52..af053f9 100644
+--- 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
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #include "gc_hal_kernel_precomp.h"
+ 
+ #if gcdENABLE_VG
+@@ -630,7 +628,7 @@ _RemoveRecordFromProcesDB(
+                 Command->kernel->kernel,
+                 pid,
+                 gcvDB_VIDEO_MEMORY,
+-                freeVideoMemory->node));
++                gcmUINT64_TO_PTR(freeVideoMemory->node)));
+ 
+             /* Advance to next task. */
+             size -= sizeof(gcsTASK_FREE_VIDEO_MEMORY);
+@@ -645,7 +643,7 @@ _RemoveRecordFromProcesDB(
+                 Command->kernel->kernel,
+                 pid,
+                 gcvDB_VIDEO_MEMORY_LOCKED,
+-                unlockVideoMemory->node));
++                gcmUINT64_TO_PTR(unlockVideoMemory->node)));
+ 
+             /* Advance to next task. */
+             size -= sizeof(gcsTASK_UNLOCK_VIDEO_MEMORY);
+@@ -963,7 +961,7 @@ _ConvertUserCommandBufferPointer(
+         /* Translate the logical address to the kernel space. */
+         gcmkERR_BREAK(_HardwareToKernel(
+             Command->os,
+-            mappedUserCommandBuffer->node,
++            gcmUINT64_TO_PTR(mappedUserCommandBuffer->node),
+             headerAddress,
+             (gctPOINTER *) KernelCommandBuffer
+             ));
+@@ -1137,7 +1135,7 @@ _AllocateCommandBuffer(
+ 
+         /* Initialize the structure. */
+         commandBuffer->completion    = gcvVACANT_BUFFER;
+-        commandBuffer->node          = node;
++        commandBuffer->node          = gcmPTR_TO_UINT64(node);
+         commandBuffer->address       = address + alignedHeaderSize;
+         commandBuffer->bufferOffset  = alignedHeaderSize;
+         commandBuffer->size          = requestedSize;
+@@ -1192,7 +1190,7 @@ _FreeCommandBuffer(
+     gceSTATUS status;
+ 
+     /* Free the buffer. */
+-    status = _FreeLinear(Kernel, CommandBuffer->node);
++    status = _FreeLinear(Kernel, gcmUINT64_TO_PTR(CommandBuffer->node));
+ 
+     /* Return status. */
+     return status;
+@@ -1649,7 +1647,7 @@ _TaskUnlockVideoMemory(
+         /* Unlock video memory. */
+         gcmkERR_BREAK(gckVIDMEM_Unlock(
+             Command->kernel->kernel,
+-            task->node,
++            gcmUINT64_TO_PTR(task->node),
+             gcvSURF_TYPE_UNKNOWN,
+             gcvNULL));
+ 
+@@ -1680,7 +1678,7 @@ _TaskFreeVideoMemory(
+             = (gcsTASK_FREE_VIDEO_MEMORY_PTR) TaskHeader->task;
+ 
+         /* Free video memory. */
+-        gcmkERR_BREAK(gckVIDMEM_Free(task->node));
++        gcmkERR_BREAK(gckVIDMEM_Free(gcmUINT64_TO_PTR(task->node)));
+ 
+         /* Update the reference counter. */
+         TaskHeader->container->referenceCount -= 1;
+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
+index 50a95a1..1fb18fb 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c
++++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #include "gc_hal_kernel_precomp.h"
+ 
+ #define _GC_OBJ_ZONE    gcvZONE_DATABASE
+@@ -1085,6 +1083,9 @@ gckKERNEL_DestroyProcessDB(
+     gcsDATABASE_PTR database;
+     gcsDATABASE_RECORD_PTR record, next;
+     gctBOOL asynchronous;
++    gctPHYS_ADDR physical;
++    gcuVIDMEM_NODE_PTR node;
++    gckKERNEL kernel = Kernel;
+ 
+     gcmkHEADER_ARG("Kernel=0x%x ProcessID=%d", Kernel, ProcessID);
+ 
+@@ -1136,7 +1137,7 @@ gckKERNEL_DestroyProcessDB(
+         {
+         case gcvDB_VIDEO_MEMORY:
+             /* Free the video memory. */
+-            status = gckVIDMEM_Free(record->data);
++            status = gckVIDMEM_Free(gcmUINT64_TO_PTR(record->data));
+ 
+             gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
+                            "DB: VIDEO_MEMORY 0x%x (status=%d)",
+@@ -1144,17 +1145,19 @@ gckKERNEL_DestroyProcessDB(
+             break;
+ 
+         case gcvDB_NON_PAGED:
++            physical = gcmNAME_TO_PTR(record->physical);
+             /* Unmap user logical memory first. */
+             status = gckOS_UnmapUserLogical(Kernel->os,
+-                                            record->physical,
++                                            physical,
+                                             record->bytes,
+                                             record->data);
+ 
+             /* Free the non paged memory. */
+             status = gckOS_FreeNonPagedMemory(Kernel->os,
+                                               record->bytes,
+-                                              record->physical,
++                                              physical,
+                                               record->data);
++            gcmRELEASE_NAME(record->physical);
+ 
+             gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
+                            "DB: NON_PAGED 0x%x, bytes=%lu (status=%d)",
+@@ -1166,9 +1169,10 @@ gckKERNEL_DestroyProcessDB(
+             /* Free the command buffer. */
+             status = gckEVENT_DestroyVirtualCommandBuffer(record->kernel->eventObj,
+                                                           record->bytes,
+-                                                          record->physical,
++                                                          gcmNAME_TO_PTR(record->physical),
+                                                           record->data,
+                                                           gcvKERNEL_PIXEL);
++            gcmRELEASE_NAME(record->physical);
+ 
+             gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
+                            "DB: COMMAND_BUFFER 0x%x, bytes=%lu (status=%d)",
+@@ -1177,18 +1181,20 @@ gckKERNEL_DestroyProcessDB(
+ #endif
+ 
+         case gcvDB_CONTIGUOUS:
++            physical = gcmNAME_TO_PTR(record->physical);
+             /* Unmap user logical memory first. */
+             status = gckOS_UnmapUserLogical(Kernel->os,
+-                                            record->physical,
++                                            physical,
+                                             record->bytes,
+                                             record->data);
+ 
+             /* Free the contiguous memory. */
+             status = gckEVENT_FreeContiguousMemory(Kernel->eventObj,
+                                                    record->bytes,
+-                                                   record->physical,
++                                                   physical,
+                                                    record->data,
+                                                    gcvKERNEL_PIXEL);
++            gcmRELEASE_NAME(record->physical);
+ 
+             gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
+                            "DB: CONTIGUOUS 0x%x bytes=%lu (status=%d)",
+@@ -1210,9 +1216,10 @@ gckKERNEL_DestroyProcessDB(
+             break;
+ 
+         case gcvDB_VIDEO_MEMORY_LOCKED:
++            node = gcmUINT64_TO_PTR(record->data);
+             /* Unlock what we still locked */
+             status = gckVIDMEM_Unlock(record->kernel,
+-                                      record->data,
++                                      node,
+                                       gcvSURF_TYPE_UNKNOWN,
+                                       &asynchronous);
+ 
+@@ -1220,19 +1227,20 @@ gckKERNEL_DestroyProcessDB(
+             {
+                 /* TODO: we maybe need to schedule a event here */
+                 status = gckVIDMEM_Unlock(record->kernel,
+-                                          record->data,
++                                          node,
+                                           gcvSURF_TYPE_UNKNOWN,
+                                           gcvNULL);
+             }
+ 
+             gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
+                            "DB: VIDEO_MEMORY_LOCKED 0x%x (status=%d)",
+-                           record->data, status);
++                           node, status);
+             break;
+ 
+         case gcvDB_CONTEXT:
+             /* TODO: Free the context */
+-            status = gckCOMMAND_Detach(Kernel->command, record->data);
++            status = gckCOMMAND_Detach(Kernel->command, gcmNAME_TO_PTR(record->data));
++            gcmRELEASE_NAME(record->data);
+ 
+             gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
+                            "DB: CONTEXT 0x%x (status=%d)",
+@@ -1257,8 +1265,9 @@ gckKERNEL_DestroyProcessDB(
+                                            Kernel->core,
+                                            record->physical,
+                                            record->bytes,
+-                                           record->data,
++                                           gcmNAME_TO_PTR(record->data),
+                                            0);
++            gcmRELEASE_NAME(record->data);
+ 
+             gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
+                            "DB: MAP USER MEMORY %d (status=%d)",
+@@ -1350,21 +1359,21 @@ gckKERNEL_QueryProcessDB(
+     switch (Type)
+     {
+     case gcvDB_VIDEO_MEMORY:
+-        gcmkONERROR(gckOS_MemCopy(&Info->counters,
++        gckOS_MemCopy(&Info->counters,
+                                   &database->vidMem,
+-                                  gcmSIZEOF(database->vidMem)));
++                                  gcmSIZEOF(database->vidMem));
+         break;
+ 
+     case gcvDB_NON_PAGED:
+-        gcmkONERROR(gckOS_MemCopy(&Info->counters,
++        gckOS_MemCopy(&Info->counters,
+                                   &database->nonPaged,
+-                                  gcmSIZEOF(database->vidMem)));
++                                  gcmSIZEOF(database->vidMem));
+         break;
+ 
+     case gcvDB_CONTIGUOUS:
+-        gcmkONERROR(gckOS_MemCopy(&Info->counters,
++        gckOS_MemCopy(&Info->counters,
+                                   &database->contiguous,
+-                                  gcmSIZEOF(database->vidMem)));
++                                  gcmSIZEOF(database->vidMem));
+         break;
+ 
+     case gcvDB_IDLE:
+@@ -1373,15 +1382,15 @@ gckKERNEL_QueryProcessDB(
+         break;
+ 
+     case gcvDB_MAP_MEMORY:
+-        gcmkONERROR(gckOS_MemCopy(&Info->counters,
++        gckOS_MemCopy(&Info->counters,
+                                   &database->mapMemory,
+-                                  gcmSIZEOF(database->mapMemory)));
++                                  gcmSIZEOF(database->mapMemory));
+         break;
+ 
+     case gcvDB_MAP_USER_MEMORY:
+-        gcmkONERROR(gckOS_MemCopy(&Info->counters,
++        gckOS_MemCopy(&Info->counters,
+                                   &database->mapUserMemory,
+-                                  gcmSIZEOF(database->mapUserMemory)));
++                                  gcmSIZEOF(database->mapUserMemory));
+         break;
+ 
+     default:
+diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_debug.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_debug.c
+index 00decd9..a689bc3 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_debug.c
++++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_debug.c
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #include "gc_hal_kernel_precomp.h"
+ #include <gc_hal_kernel_debug.h>
+ 
+diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c
+index 75647c0..f78d096 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c
++++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #include "gc_hal_kernel_precomp.h"
+ #include "gc_hal_kernel_buffer.h"
+ 
+@@ -290,7 +288,7 @@ __RemoveRecordFromProcessDB(
+         {
+             /* TODO: Find a better place to bind signal to hardware.*/
+             gcmkVERIFY_OK(gckOS_SignalSetHardware(Event->os,
+-                        Record->info.u.Signal.signal,
++                        gcmUINT64_TO_PTR(Record->info.u.Signal.signal),
+                         Event->kernel->hardware));
+         }
+ 
+@@ -308,7 +306,7 @@ __RemoveRecordFromProcessDB(
+                 Event->kernel,
+                 Record->processID,
+                 gcvDB_NON_PAGED,
+-                Record->info.u.FreeNonPagedMemory.logical));
++                gcmUINT64_TO_PTR(Record->info.u.FreeNonPagedMemory.logical)));
+             break;
+ 
+         case gcvHAL_FREE_CONTIGUOUS_MEMORY:
+@@ -316,7 +314,7 @@ __RemoveRecordFromProcessDB(
+                 Event->kernel,
+                 Record->processID,
+                 gcvDB_CONTIGUOUS,
+-                Record->info.u.FreeContiguousMemory.logical));
++                gcmUINT64_TO_PTR(Record->info.u.FreeContiguousMemory.logical)));
+             break;
+ 
+         case gcvHAL_FREE_VIDEO_MEMORY:
+@@ -324,7 +322,7 @@ __RemoveRecordFromProcessDB(
+                 Event->kernel,
+                 Record->processID,
+                 gcvDB_VIDEO_MEMORY,
+-                Record->info.u.FreeVideoMemory.node));
++                gcmUINT64_TO_PTR(Record->info.u.FreeVideoMemory.node)));
+             break;
+ 
+         case gcvHAL_UNLOCK_VIDEO_MEMORY:
+@@ -332,7 +330,7 @@ __RemoveRecordFromProcessDB(
+                 Event->kernel,
+                 Record->processID,
+                 gcvDB_VIDEO_MEMORY_LOCKED,
+-                Record->info.u.UnlockVideoMemory.node));
++                gcmUINT64_TO_PTR(Record->info.u.UnlockVideoMemory.node)));
+             break;
+ 
+         case gcvHAL_UNMAP_USER_MEMORY:
+@@ -340,7 +338,7 @@ __RemoveRecordFromProcessDB(
+                 Event->kernel,
+                 Record->processID,
+                 gcvDB_MAP_USER_MEMORY,
+-                Record->info.u.UnmapUserMemory.info));
++                gcmINT2PTR(Record->info.u.UnmapUserMemory.info)));
+             break;
+ 
+         case gcvHAL_FREE_VIRTUAL_COMMAND_BUFFER:
+@@ -348,7 +346,7 @@ __RemoveRecordFromProcessDB(
+                 Event->kernel,
+                 Record->processID,
+                 gcvDB_COMMAND_BUFFER,
+-                Record->info.u.FreeVirtualCommandBuffer.logical));
++                gcmUINT64_TO_PTR(Record->info.u.FreeVirtualCommandBuffer.logical)));
+             break;
+ 
+         default:
+@@ -551,7 +549,7 @@ gckEVENT_Destroy(
+     if (Event->submitTimer != gcvNULL)
+     {
+         gcmkVERIFY_OK(gckOS_StopTimer(Event->os, Event->submitTimer));
+-        gcmkVERIFY_OK(gckOS_DestoryTimer(Event->os, Event->submitTimer));
++        gcmkVERIFY_OK(gckOS_DestroyTimer(Event->os, Event->submitTimer));
+     }
+ 
+     /* Delete the queue mutex. */
+@@ -908,6 +906,7 @@ gckEVENT_AddList(
+     gctBOOL acquired = gcvFALSE;
+     gcsEVENT_PTR record = gcvNULL;
+     gcsEVENT_QUEUE_PTR queue;
++    gckKERNEL kernel = Event->kernel;
+ 
+     gcmkHEADER_ARG("Event=0x%x Interface=0x%x",
+                    Event, Interface);
+@@ -951,7 +950,7 @@ gckEVENT_AddList(
+     record->fromKernel = FromKernel;
+ 
+     /* Copy the event interface into the record. */
+-    gcmkONERROR(gckOS_MemCopy(&record->info, Interface, gcmSIZEOF(record->info)));
++    gckOS_MemCopy(&record->info, Interface, gcmSIZEOF(record->info));
+ 
+     /* Get process ID. */
+     gcmkONERROR(gckOS_GetProcessID(&record->processID));
+@@ -1013,16 +1012,16 @@ gckEVENT_AddList(
+     case gcvHAL_FREE_NON_PAGED_MEMORY:
+         gcmkONERROR(gckOS_UnmapUserLogical(
+                         Event->os,
+-                        Interface->u.FreeNonPagedMemory.physical,
+-                        Interface->u.FreeNonPagedMemory.bytes,
+-                        Interface->u.FreeNonPagedMemory.logical));
++                        gcmNAME_TO_PTR(Interface->u.FreeNonPagedMemory.physical),
++                        (gctSIZE_T) Interface->u.FreeNonPagedMemory.bytes,
++                        gcmUINT64_TO_PTR(Interface->u.FreeNonPagedMemory.logical)));
+         break;
+     case gcvHAL_FREE_CONTIGUOUS_MEMORY:
+         gcmkONERROR(gckOS_UnmapUserLogical(
+                         Event->os,
+-                        Interface->u.FreeContiguousMemory.physical,
+-                        Interface->u.FreeContiguousMemory.bytes,
+-                        Interface->u.FreeContiguousMemory.logical));
++                        gcmNAME_TO_PTR(Interface->u.FreeContiguousMemory.physical),
++                        (gctSIZE_T) Interface->u.FreeContiguousMemory.bytes,
++                        gcmUINT64_TO_PTR(Interface->u.FreeContiguousMemory.logical)));
+         break;
+     default:
+         break;
+@@ -1098,7 +1097,7 @@ gckEVENT_Unlock(
+ 
+     /* Mark the event as an unlock. */
+     iface.command                           = gcvHAL_UNLOCK_VIDEO_MEMORY;
+-    iface.u.UnlockVideoMemory.node          = Node;
++    iface.u.UnlockVideoMemory.node          = gcmPTR_TO_UINT64(Node);
+     iface.u.UnlockVideoMemory.type          = Type;
+     iface.u.UnlockVideoMemory.asynchroneous = 0;
+ 
+@@ -1155,7 +1154,7 @@ gckEVENT_FreeVideoMemory(
+ 
+     /* Create an event. */
+     iface.command = gcvHAL_FREE_VIDEO_MEMORY;
+-    iface.u.FreeVideoMemory.node = VideoMemory;
++    iface.u.FreeVideoMemory.node = gcmPTR_TO_UINT64(VideoMemory);
+ 
+     /* Append it to the queue. */
+     gcmkONERROR(gckEVENT_AddList(Event, &iface, FromWhere, gcvFALSE, gcvTRUE));
+@@ -1204,6 +1203,7 @@ gckEVENT_FreeNonPagedMemory(
+ {
+     gceSTATUS status;
+     gcsHAL_INTERFACE iface;
++    gckKERNEL kernel = Event->kernel;
+ 
+     gcmkHEADER_ARG("Event=0x%x Bytes=%lu Physical=0x%x Logical=0x%x "
+                    "FromWhere=%d",
+@@ -1218,8 +1218,8 @@ gckEVENT_FreeNonPagedMemory(
+     /* Create an event. */
+     iface.command = gcvHAL_FREE_NON_PAGED_MEMORY;
+     iface.u.FreeNonPagedMemory.bytes    = Bytes;
+-    iface.u.FreeNonPagedMemory.physical = Physical;
+-    iface.u.FreeNonPagedMemory.logical  = Logical;
++    iface.u.FreeNonPagedMemory.physical = gcmPTR_TO_NAME(Physical);
++    iface.u.FreeNonPagedMemory.logical  = gcmPTR_TO_UINT64(Logical);
+ 
+     /* Append it to the queue. */
+     gcmkONERROR(gckEVENT_AddList(Event, &iface, FromWhere, gcvFALSE, gcvTRUE));
+@@ -1245,6 +1245,7 @@ gckEVENT_DestroyVirtualCommandBuffer(
+ {
+     gceSTATUS status;
+     gcsHAL_INTERFACE iface;
++    gckKERNEL kernel = Event->kernel;
+ 
+     gcmkHEADER_ARG("Event=0x%x Bytes=%lu Physical=0x%x Logical=0x%x "
+                    "FromWhere=%d",
+@@ -1259,8 +1260,8 @@ gckEVENT_DestroyVirtualCommandBuffer(
+     /* Create an event. */
+     iface.command = gcvHAL_FREE_VIRTUAL_COMMAND_BUFFER;
+     iface.u.FreeVirtualCommandBuffer.bytes    = Bytes;
+-    iface.u.FreeVirtualCommandBuffer.physical = Physical;
+-    iface.u.FreeVirtualCommandBuffer.logical  = Logical;
++    iface.u.FreeVirtualCommandBuffer.physical = gcmPTR_TO_NAME(Physical);
++    iface.u.FreeVirtualCommandBuffer.logical  = gcmPTR_TO_UINT64(Logical);
+ 
+     /* Append it to the queue. */
+     gcmkONERROR(gckEVENT_AddList(Event, &iface, FromWhere, gcvFALSE, gcvTRUE));
+@@ -1309,6 +1310,7 @@ gckEVENT_FreeContiguousMemory(
+ {
+     gceSTATUS status;
+     gcsHAL_INTERFACE iface;
++    gckKERNEL kernel = Event->kernel;
+ 
+     gcmkHEADER_ARG("Event=0x%x Bytes=%lu Physical=0x%x Logical=0x%x "
+                    "FromWhere=%d",
+@@ -1323,8 +1325,8 @@ gckEVENT_FreeContiguousMemory(
+     /* Create an event. */
+     iface.command = gcvHAL_FREE_CONTIGUOUS_MEMORY;
+     iface.u.FreeContiguousMemory.bytes    = Bytes;
+-    iface.u.FreeContiguousMemory.physical = Physical;
+-    iface.u.FreeContiguousMemory.logical  = Logical;
++    iface.u.FreeContiguousMemory.physical = gcmPTR_TO_NAME(Physical);
++    iface.u.FreeContiguousMemory.logical  = gcmPTR_TO_UINT64(Logical);
+ 
+     /* Append it to the queue. */
+     gcmkONERROR(gckEVENT_AddList(Event, &iface, FromWhere, gcvFALSE, gcvTRUE));
+@@ -1379,13 +1381,13 @@ gckEVENT_Signal(
+ 
+     /* Mark the event as a signal. */
+     iface.command            = gcvHAL_SIGNAL;
+-    iface.u.Signal.signal    = Signal;
++    iface.u.Signal.signal    = gcmPTR_TO_UINT64(Signal);
+ #ifdef __QNXNTO__
+     iface.u.Signal.coid      = 0;
+     iface.u.Signal.rcvid     = 0;
+ #endif
+-    iface.u.Signal.auxSignal = gcvNULL;
+-    iface.u.Signal.process   = gcvNULL;
++    iface.u.Signal.auxSignal = 0;
++    iface.u.Signal.process   = 0;
+ 
+     /* Append it to the queue. */
+     gcmkONERROR(gckEVENT_AddList(Event, &iface, FromWhere, gcvFALSE, gcvTRUE));
+@@ -1690,7 +1692,7 @@ gckEVENT_Commit(
+             gckEVENT_AddList(Event, &record->iface, gcvKERNEL_PIXEL, gcvTRUE, gcvFALSE));
+ 
+         /* Next record in the queue. */
+-        next = record->next;
++        next = gcmUINT64_TO_PTR(record->next);
+ 
+         if (!needCopy)
+         {
+@@ -1783,12 +1785,12 @@ gckEVENT_Compose(
+     tempRecord->info.u.Signal.rcvid     = Info->rcvid;
+ #endif
+     tempRecord->info.u.Signal.signal    = Info->signal;
+-    tempRecord->info.u.Signal.auxSignal = gcvNULL;
++    tempRecord->info.u.Signal.auxSignal = 0;
+     tempRecord->next = gcvNULL;
+     tempRecord->processID = processID;
+ 
+     /* Allocate another record for user signal #1. */
+-    if (Info->userSignal1 != gcvNULL)
++    if (gcmUINT64_TO_PTR(Info->userSignal1) != gcvNULL)
+     {
+         /* Allocate a record. */
+         gcmkONERROR(gckEVENT_AllocateRecord(Event, gcvTRUE, &tempRecord));
+@@ -1803,13 +1805,13 @@ gckEVENT_Compose(
+         tempRecord->info.u.Signal.rcvid     = Info->rcvid;
+ #endif
+         tempRecord->info.u.Signal.signal    = Info->userSignal1;
+-        tempRecord->info.u.Signal.auxSignal = gcvNULL;
++        tempRecord->info.u.Signal.auxSignal = 0;
+         tempRecord->next = gcvNULL;
+         tempRecord->processID = processID;
+     }
+ 
+     /* Allocate another record for user signal #2. */
+-    if (Info->userSignal2 != gcvNULL)
++    if (gcmUINT64_TO_PTR(Info->userSignal2) != gcvNULL)
+     {
+         /* Allocate a record. */
+         gcmkONERROR(gckEVENT_AllocateRecord(Event, gcvTRUE, &tempRecord));
+@@ -1824,7 +1826,7 @@ gckEVENT_Compose(
+         tempRecord->info.u.Signal.rcvid     = Info->rcvid;
+ #endif
+         tempRecord->info.u.Signal.signal    = Info->userSignal2;
+-        tempRecord->info.u.Signal.auxSignal = gcvNULL;
++        tempRecord->info.u.Signal.auxSignal = 0;
+         tempRecord->next = gcvNULL;
+         tempRecord->processID = processID;
+     }
+@@ -1835,7 +1837,7 @@ gckEVENT_Compose(
+     /* Start composition. */
+     gcmkONERROR(gckHARDWARE_Compose(
+         Event->kernel->hardware, processID,
+-        Info->physical, Info->logical, Info->offset, Info->size, id
++        gcmUINT64_TO_PTR(Info->physical), gcmUINT64_TO_PTR(Info->logical), Info->offset, Info->size, id
+         ));
+ 
+     /* Success. */
+@@ -1918,10 +1920,11 @@ gckEVENT_Notify(
+     gcsEVENT_QUEUE * queue;
+     gctUINT mask = 0;
+     gctBOOL acquired = gcvFALSE;
+-#ifdef __QNXNTO__
+     gcuVIDMEM_NODE_PTR node;
+-#endif
++    gctPOINTER info;
++    gctSIGNAL signal;
+     gctUINT pending;
++    gckKERNEL kernel = Event->kernel;
+ #if !gcdSMP
+     gctBOOL suspended = gcvFALSE;
+ #endif
+@@ -2182,14 +2185,14 @@ gckEVENT_Notify(
+             case gcvHAL_FREE_NON_PAGED_MEMORY:
+                 gcmkTRACE_ZONE(gcvLEVEL_VERBOSE, gcvZONE_EVENT,
+                                "gcvHAL_FREE_NON_PAGED_MEMORY: 0x%x",
+-                               record->info.u.FreeNonPagedMemory.physical);
++                               gcmNAME_TO_PTR(record->info.u.FreeNonPagedMemory.physical));
+ 
+                 /* Free non-paged memory. */
+                 status = gckOS_FreeNonPagedMemory(
+                             Event->os,
+-                            record->info.u.FreeNonPagedMemory.bytes,
+-                            record->info.u.FreeNonPagedMemory.physical,
+-                            record->info.u.FreeNonPagedMemory.logical);
++                            (gctSIZE_T) record->info.u.FreeNonPagedMemory.bytes,
++                            gcmNAME_TO_PTR(record->info.u.FreeNonPagedMemory.physical),
++                            gcmUINT64_TO_PTR(record->info.u.FreeNonPagedMemory.logical));
+ 
+                 if (gcmIS_SUCCESS(status))
+                 {
+@@ -2197,24 +2200,25 @@ gckEVENT_Notify(
+                     gcmkVERIFY_OK(gckKERNEL_FlushTranslationCache(
+                         Event->kernel,
+                         cache,
+-                        record->event.u.FreeNonPagedMemory.logical,
+-                        record->event.u.FreeNonPagedMemory.bytes));
++                        gcmUINT64_TO_PTR(record->record.u.FreeNonPagedMemory.logical),
++                        (gctSIZE_T) record->record.u.FreeNonPagedMemory.bytes));
+ #endif
+                 }
++                gcmRELEASE_NAME(record->info.u.FreeNonPagedMemory.physical);
+                 break;
+ 
+             case gcvHAL_FREE_CONTIGUOUS_MEMORY:
+                 gcmkTRACE_ZONE(
+                     gcvLEVEL_VERBOSE, gcvZONE_EVENT,
+                     "gcvHAL_FREE_CONTIGUOUS_MEMORY: 0x%x",
+-                    record->info.u.FreeContiguousMemory.physical);
++                    gcmNAME_TO_PTR(record->info.u.FreeContiguousMemory.physical));
+ 
+                 /* Unmap the user memory. */
+                 status = gckOS_FreeContiguous(
+                             Event->os,
+-                            record->info.u.FreeContiguousMemory.physical,
+-                            record->info.u.FreeContiguousMemory.logical,
+-                            record->info.u.FreeContiguousMemory.bytes);
++                            gcmNAME_TO_PTR(record->info.u.FreeContiguousMemory.physical),
++                            gcmUINT64_TO_PTR(record->info.u.FreeContiguousMemory.logical),
++                            (gctSIZE_T) record->info.u.FreeContiguousMemory.bytes);
+ 
+                 if (gcmIS_SUCCESS(status))
+                 {
+@@ -2222,19 +2226,19 @@ gckEVENT_Notify(
+                     gcmkVERIFY_OK(gckKERNEL_FlushTranslationCache(
+                         Event->kernel,
+                         cache,
+-                        event->event.u.FreeContiguousMemory.logical,
+-                        event->event.u.FreeContiguousMemory.bytes));
++                        gcmUINT64_TO_PTR(record->record.u.FreeContiguousMemory.logical),
++                        (gctSIZE_T) record->record.u.FreeContiguousMemory.bytes));
+ #endif
+                 }
++                gcmRELEASE_NAME(record->info.u.FreeContiguousMemory.physical);
+                 break;
+ 
+             case gcvHAL_FREE_VIDEO_MEMORY:
++                node = gcmUINT64_TO_PTR(record->info.u.FreeVideoMemory.node);
+                 gcmkTRACE_ZONE(gcvLEVEL_VERBOSE, gcvZONE_EVENT,
+                                "gcvHAL_FREE_VIDEO_MEMORY: 0x%x",
+-                               record->info.u.FreeVideoMemory.node);
+-
++                               node);
+ #ifdef __QNXNTO__
+-                node = record->info.u.FreeVideoMemory.node;
+ #if gcdUSE_VIDMEM_PER_PID
+                 /* Check if the VidMem object still exists. */
+                 if (gckKERNEL_GetVideoMemoryPoolPid(record->kernel,
+@@ -2263,7 +2267,7 @@ gckEVENT_Notify(
+ 
+                 /* Free video memory. */
+                 status =
+-                    gckVIDMEM_Free(record->info.u.FreeVideoMemory.node);
++                    gckVIDMEM_Free(node);
+ 
+                 break;
+ 
+@@ -2298,13 +2302,14 @@ gckEVENT_Notify(
+                 break;
+ 
+             case gcvHAL_UNLOCK_VIDEO_MEMORY:
++                node = gcmUINT64_TO_PTR(record->info.u.UnlockVideoMemory.node);
++
+                 gcmkTRACE_ZONE(gcvLEVEL_VERBOSE, gcvZONE_EVENT,
+                                "gcvHAL_UNLOCK_VIDEO_MEMORY: 0x%x",
+-                               record->info.u.UnlockVideoMemory.node);
++                               node);
+ 
+                 /* Save node information before it disappears. */
+ #if gcdSECURE_USER
+-                node = event->event.u.UnlockVideoMemory.node;
+                 if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
+                 {
+                     logical = gcvNULL;
+@@ -2320,7 +2325,7 @@ gckEVENT_Notify(
+                 /* Unlock. */
+                 status = gckVIDMEM_Unlock(
+                     Event->kernel,
+-                    record->info.u.UnlockVideoMemory.node,
++                    node,
+                     record->info.u.UnlockVideoMemory.type,
+                     gcvNULL);
+ 
+@@ -2337,9 +2342,10 @@ gckEVENT_Notify(
+                 break;
+ 
+             case gcvHAL_SIGNAL:
++                signal = gcmUINT64_TO_PTR(record->info.u.Signal.signal);
+                 gcmkTRACE_ZONE(gcvLEVEL_VERBOSE, gcvZONE_EVENT,
+                                "gcvHAL_SIGNAL: 0x%x",
+-                               record->info.u.Signal.signal);
++                               signal);
+ 
+ #ifdef __QNXNTO__
+                 if ((record->info.u.Signal.coid == 0)
+@@ -2349,7 +2355,7 @@ gckEVENT_Notify(
+                     /* Kernel signal. */
+                     gcmkERR_BREAK(
+                         gckOS_Signal(Event->os,
+-                                     record->info.u.Signal.signal,
++                                     signal,
+                                      gcvTRUE));
+                 }
+                 else
+@@ -2357,18 +2363,18 @@ gckEVENT_Notify(
+                     /* User signal. */
+                     gcmkERR_BREAK(
+                         gckOS_UserSignal(Event->os,
+-                                         record->info.u.Signal.signal,
++                                         signal,
+                                          record->info.u.Signal.rcvid,
+                                          record->info.u.Signal.coid));
+                 }
+ #else
+                 /* Set signal. */
+-                if (record->info.u.Signal.process == gcvNULL)
++                if (gcmUINT64_TO_PTR(record->info.u.Signal.process) == gcvNULL)
+                 {
+                     /* Kernel signal. */
+                     gcmkERR_BREAK(
+                         gckOS_Signal(Event->os,
+-                                     record->info.u.Signal.signal,
++                                     signal,
+                                      gcvTRUE));
+                 }
+                 else
+@@ -2376,26 +2382,27 @@ gckEVENT_Notify(
+                     /* User signal. */
+                     gcmkERR_BREAK(
+                         gckOS_UserSignal(Event->os,
+-                                         record->info.u.Signal.signal,
+-                                         record->info.u.Signal.process));
++                                         signal,
++                                         gcmUINT64_TO_PTR(record->info.u.Signal.process)));
+                 }
+ 
+-                gcmkASSERT(record->info.u.Signal.auxSignal == gcvNULL);
++                gcmkASSERT(record->info.u.Signal.auxSignal == 0);
+ #endif
+                 break;
+ 
+             case gcvHAL_UNMAP_USER_MEMORY:
++                info = gcmNAME_TO_PTR(record->info.u.UnmapUserMemory.info);
+                 gcmkTRACE_ZONE(gcvLEVEL_VERBOSE, gcvZONE_EVENT,
+                                "gcvHAL_UNMAP_USER_MEMORY: 0x%x",
+-                               record->info.u.UnmapUserMemory.info);
++                               info);
+ 
+                 /* Unmap the user memory. */
+                 status = gckOS_UnmapUserMemory(
+                     Event->os,
+                     Event->kernel->core,
+-                    record->info.u.UnmapUserMemory.memory,
+-                    record->info.u.UnmapUserMemory.size,
+-                    record->info.u.UnmapUserMemory.info,
++                    gcmUINT64_TO_PTR(record->info.u.UnmapUserMemory.memory),
++                    (gctSIZE_T) record->info.u.UnmapUserMemory.size,
++                    info,
+                     record->info.u.UnmapUserMemory.address);
+ 
+ #if gcdSECURE_USER
+@@ -2404,10 +2411,11 @@ gckEVENT_Notify(
+                     gcmkVERIFY_OK(gckKERNEL_FlushTranslationCache(
+                         Event->kernel,
+                         cache,
+-                        event->event.u.UnmapUserMemory.memory,
+-                        event->event.u.UnmapUserMemory.size));
++                        gcmUINT64_TO_PTR(record->info.u.UnmapUserMemory.memory),
++                        (gctSIZE_T) record->info.u.UnmapUserMemory.size));
+                 }
+ #endif
++                gcmRELEASE_NAME(record->info.u.UnmapUserMemory.info);
+                 break;
+ 
+             case gcvHAL_TIMESTAMP:
+@@ -2448,10 +2456,11 @@ gckEVENT_Notify(
+              case gcvHAL_FREE_VIRTUAL_COMMAND_BUFFER:
+                  gcmkVERIFY_OK(
+                      gckKERNEL_DestroyVirtualCommandBuffer(Event->kernel,
+-                         record->info.u.FreeVirtualCommandBuffer.bytes,
+-                         record->info.u.FreeVirtualCommandBuffer.physical,
+-                         record->info.u.FreeVirtualCommandBuffer.logical
++                         (gctSIZE_T) record->info.u.FreeVirtualCommandBuffer.bytes,
++                         gcmNAME_TO_PTR(record->info.u.FreeVirtualCommandBuffer.physical),
++                         gcmUINT64_TO_PTR(record->info.u.FreeVirtualCommandBuffer.logical)
+                          ));
++                 gcmRELEASE_NAME(record->info.u.FreeVirtualCommandBuffer.physical);
+                  break;
+ #endif
+ 
+@@ -2701,13 +2710,13 @@ gckEVENT_Stop(
+     record->next = gcvNULL;
+     record->processID               = ProcessID;
+     record->info.command            = gcvHAL_SIGNAL;
+-    record->info.u.Signal.signal    = Signal;
++    record->info.u.Signal.signal    = gcmPTR_TO_UINT64(Signal);
+ #ifdef __QNXNTO__
+     record->info.u.Signal.coid      = 0;
+     record->info.u.Signal.rcvid     = 0;
+ #endif
+-    record->info.u.Signal.auxSignal = gcvNULL;
+-    record->info.u.Signal.process   = gcvNULL;
++    record->info.u.Signal.auxSignal = 0;
++    record->info.u.Signal.process   = 0;
+ 
+     /* Append the record. */
+     Event->queues[id].head      = record;
+diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_heap.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_heap.c
+index c68e0c1..a5affb9 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_heap.c
++++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_heap.c
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ /**
+ **  @file
+ **  gckHEAP object for kernel HAL layer.  The heap implemented here is an arena-
+diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_interrupt_vg.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_interrupt_vg.c
+index e2f84f6..8ac187b 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_interrupt_vg.c
++++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_interrupt_vg.c
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #include "gc_hal_kernel_precomp.h"
+ 
+ #if gcdENABLE_VG
+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
+index 7358f9c..0c71e28 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu.c
++++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu.c
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #include "gc_hal_kernel_precomp.h"
+ 
+ #define _GC_OBJ_ZONE    gcvZONE_MMU
+@@ -1304,8 +1302,11 @@ gckMMU_AllocatePages(
+     gctUINT32 address;
+     gctINT i;
+     gckMMU mmu;
++    gctBOOL acquired = gcvFALSE;
++    gctBOOL allocated = gcvFALSE;
+ 
+     gckOS_AcquireMutex(Mmu->os, mirrorPageTableMutex, gcvINFINITE);
++    acquired = gcvTRUE;
+ 
+     /* Allocate page table for current MMU. */
+     for (i = 0; i < mirrorPageTable->reference; i++)
+@@ -1313,6 +1314,7 @@ gckMMU_AllocatePages(
+         if (Mmu == mirrorPageTable->mmus[i])
+         {
+             gcmkONERROR(_AllocatePages(Mmu, PageCount, PageTable, Address));
++            allocated = gcvTRUE;
+         }
+     }
+ 
+@@ -1329,9 +1331,24 @@ gckMMU_AllocatePages(
+     }
+ 
+     gckOS_ReleaseMutex(Mmu->os, mirrorPageTableMutex);
++    acquired = gcvFALSE;
+ 
+     return gcvSTATUS_OK;
+ OnError:
++
++    if (allocated)
++    {
++        /* Page tables for multiple GPU always keep the same. So it is impossible
++         * the fist one allocates successfully but others fail.
++         */
++        gcmkASSERT(0);
++    }
++
++    if (acquired)
++    {
++        gckOS_ReleaseMutex(Mmu->os, mirrorPageTableMutex);
++    }
++
+     return status;
+ #else
+     return _AllocatePages(Mmu, PageCount, PageTable, Address);
+diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu_vg.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu_vg.c
+index 46d1761..0c20290 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu_vg.c
++++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu_vg.c
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #include "gc_hal_kernel_precomp.h"
+ 
+ #if gcdENABLE_VG
+diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_power.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_power.c
+new file mode 100644
+index 0000000..df7579d
+--- /dev/null
++++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_power.c
+@@ -0,0 +1,347 @@
++/****************************************************************************
++*
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
++*
++*    This program is free software; you can redistribute it and/or modify
++*    it under the terms of the GNU General Public License as published by
++*    the Free Software Foundation; either version 2 of the license, or
++*    (at your option) any later version.
++*
++*    This program is distributed in the hope that it will be useful,
++*    but WITHOUT ANY WARRANTY; without even the implied warranty of
++*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++*    GNU General Public License for more details.
++*
++*    You should have received a copy of the GNU General Public License
++*    along with this program; if not write to the Free Software
++*    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*
++*****************************************************************************/
++
++
++#include "gc_hal_kernel_precomp.h"
++
++#define _GC_OBJ_ZONE    gcvZONE_POWER
++
++/******************************************************************************\
++************************ Dynamic Voltage Frequency Setting *********************
++\******************************************************************************/
++#if gcdDVFS
++static gctUINT32
++_GetLoadHistory(
++    IN gckDVFS Dvfs,
++    IN gctUINT32 Select,
++    IN gctUINT32 Index
++)
++{
++    return Dvfs->loads[Index];
++}
++
++static void
++_IncreaseScale(
++    IN gckDVFS Dvfs,
++    IN gctUINT32 Load,
++    OUT gctUINT8 *Scale
++    )
++{
++    if (Dvfs->currentScale < 32)
++    {
++        *Scale = Dvfs->currentScale + 8;
++    }
++    else
++    {
++        *Scale = Dvfs->currentScale + 8;
++        *Scale = gcmMIN(64, *Scale);
++    }
++}
++
++static void
++_RecordFrequencyHistory(
++    gckDVFS Dvfs,
++    gctUINT32 Frequency
++    )
++{
++    gctUINT32 i = 0;
++
++    struct _FrequencyHistory *history = Dvfs->frequencyHistory;
++
++    for (i = 0; i < 16; i++)
++    {
++        if (history->frequency == Frequency)
++        {
++            break;
++        }
++
++        if (history->frequency == 0)
++        {
++            history->frequency = Frequency;
++            break;
++        }
++
++        history++;
++    }
++
++    if (i < 16)
++    {
++        history->count++;
++    }
++}
++
++static gctUINT32
++_GetFrequencyHistory(
++    gckDVFS Dvfs,
++    gctUINT32 Frequency
++    )
++{
++    gctUINT32 i = 0;
++
++    struct _FrequencyHistory * history = Dvfs->frequencyHistory;
++
++    for (i = 0; i < 16; i++)
++    {
++        if (history->frequency == Frequency)
++        {
++            break;
++        }
++
++        history++;
++    }
++
++    if (i < 16)
++    {
++        return history->count;
++    }
++
++    return 0;
++}
++
++static void
++_Policy(
++    IN gckDVFS Dvfs,
++    IN gctUINT32 Load,
++    OUT gctUINT8 *Scale
++    )
++{
++    gctUINT8 load[4], nextLoad;
++    gctUINT8 scale;
++
++    /* Last 4 history. */
++    load[0] = (Load & 0xFF);
++    load[1] = (Load & 0xFF00) >> 8;
++    load[2] = (Load & 0xFF0000) >> 16;
++    load[3] = (Load & 0xFF000000) >> 24;
++
++    /* Determine target scale. */
++    if (load[0] > 54)
++    {
++        _IncreaseScale(Dvfs, Load, &scale);
++    }
++    else
++    {
++        nextLoad = (load[0] + load[1] + load[2] + load[3])/4;
++
++        scale = Dvfs->currentScale * (nextLoad) / 54;
++
++        scale = gcmMAX(1, scale);
++        scale = gcmMIN(64, scale);
++    }
++
++    Dvfs->totalConfig++;
++
++    Dvfs->loads[(load[0]-1)/8]++;
++
++    *Scale = scale;
++
++
++    if (Dvfs->totalConfig % 100 == 0)
++    {
++        gcmkPRINT("=======================================================");
++        gcmkPRINT("GPU Load:       %-8d %-8d %-8d %-8d %-8d %-8d %-8d %-8d",
++                                   8, 16, 24, 32, 40, 48, 56, 64);
++        gcmkPRINT("                %-8d %-8d %-8d %-8d %-8d %-8d %-8d %-8d",
++                  _GetLoadHistory(Dvfs,2, 0),
++                  _GetLoadHistory(Dvfs,2, 1),
++                  _GetLoadHistory(Dvfs,2, 2),
++                  _GetLoadHistory(Dvfs,2, 3),
++                  _GetLoadHistory(Dvfs,2, 4),
++                  _GetLoadHistory(Dvfs,2, 5),
++                  _GetLoadHistory(Dvfs,2, 6),
++                  _GetLoadHistory(Dvfs,2, 7)
++                  );
++
++        gcmkPRINT("Frequency(MHz)  %-8d %-8d %-8d %-8d %-8d",
++                  58, 120, 240, 360, 480);
++        gcmkPRINT("                %-8d %-8d %-8d %-8d %-8d",
++                  _GetFrequencyHistory(Dvfs, 58),
++                  _GetFrequencyHistory(Dvfs,120),
++                  _GetFrequencyHistory(Dvfs,240),
++                  _GetFrequencyHistory(Dvfs,360),
++                  _GetFrequencyHistory(Dvfs,480)
++                  );
++    }
++}
++
++static void
++_TimerFunction(
++    gctPOINTER Data
++    )
++{
++    gceSTATUS status;
++    gckDVFS dvfs = (gckDVFS) Data;
++    gckHARDWARE hardware = dvfs->hardware;
++    gctUINT32 value;
++    gctUINT32 frequency;
++    gctUINT8 scale;
++    gctUINT32 t1, t2, consumed;
++
++    gckOS_GetTicks(&t1);
++
++    gcmkONERROR(gckHARDWARE_QueryLoad(hardware, &value));
++
++    /* determine target sacle. */
++    _Policy(dvfs, value, &scale);
++
++    /* Set frequency and voltage. */
++    gcmkONERROR(gckOS_SetGPUFrequency(hardware->os, hardware->core, scale));
++
++    /* Query real frequency. */
++    gcmkONERROR(
++        gckOS_QueryGPUFrequency(hardware->os,
++                                hardware->core,
++                                &frequency,
++                                &dvfs->currentScale));
++
++    _RecordFrequencyHistory(dvfs, frequency);
++
++    gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_POWER,
++                   "Current frequency = %d",
++                   frequency);
++
++    /* Set period. */
++    gcmkONERROR(gckHARDWARE_SetDVFSPeroid(hardware, frequency));
++
++OnError:
++    /* Determine next querying time. */
++    gckOS_GetTicks(&t2);
++
++    consumed = gcmMIN(((long)t2 - (long)t1), 5);
++
++    if (dvfs->stop == gcvFALSE)
++    {
++        gcmkVERIFY_OK(gckOS_StartTimer(hardware->os,
++                                       dvfs->timer,
++                                       dvfs->pollingTime - consumed));
++    }
++
++    return;
++}
++
++gceSTATUS
++gckDVFS_Construct(
++    IN gckHARDWARE Hardware,
++    OUT gckDVFS * Dvfs
++    )
++{
++    gceSTATUS status;
++    gctPOINTER pointer;
++    gckDVFS dvfs = gcvNULL;
++    gckOS os = Hardware->os;
++
++    gcmkHEADER_ARG("Hardware=0x%X", Hardware);
++
++    gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
++    gcmkVERIFY_ARGUMENT(Dvfs != gcvNULL);
++
++    /* Allocate a gckDVFS manager. */
++    gcmkONERROR(gckOS_Allocate(os, gcmSIZEOF(struct _gckDVFS), &pointer));
++
++    gckOS_ZeroMemory(pointer, gcmSIZEOF(struct _gckDVFS));
++
++    dvfs = pointer;
++
++    /* Initialization. */
++    dvfs->hardware = Hardware;
++    dvfs->pollingTime = gcdDVFS_POLLING_TIME;
++    dvfs->os = Hardware->os;
++    dvfs->currentScale = 64;
++
++    /* Create a polling timer. */
++    gcmkONERROR(gckOS_CreateTimer(os, _TimerFunction, pointer, &dvfs->timer));
++
++    /* Initialize frequency and voltage adjustment helper. */
++    gcmkONERROR(gckOS_PrepareGPUFrequency(os, Hardware->core));
++
++    /* Return result. */
++    *Dvfs = dvfs;
++
++    gcmkFOOTER_NO();
++    return gcvSTATUS_OK;
++
++OnError:
++    /* Roll back. */
++    if (dvfs)
++    {
++        if (dvfs->timer)
++        {
++            gcmkVERIFY_OK(gckOS_DestroyTimer(os, dvfs->timer));
++        }
++
++        gcmkOS_SAFE_FREE(os, dvfs);
++    }
++
++    gcmkFOOTER();
++    return status;
++}
++
++gceSTATUS
++gckDVFS_Destroy(
++    IN gckDVFS Dvfs
++    )
++{
++    gcmkHEADER_ARG("Dvfs=0x%X", Dvfs);
++    gcmkVERIFY_ARGUMENT(Dvfs != gcvNULL);
++
++    /* Deinitialize helper fuunction. */
++    gcmkVERIFY_OK(gckOS_FinishGPUFrequency(Dvfs->os, Dvfs->hardware->core));
++
++    /* DestroyTimer. */
++    gcmkVERIFY_OK(gckOS_DestroyTimer(Dvfs->os, Dvfs->timer));
++
++    gcmkOS_SAFE_FREE(Dvfs->os, Dvfs);
++
++    gcmkFOOTER_NO();
++    return gcvSTATUS_OK;
++}
++
++gceSTATUS
++gckDVFS_Start(
++    IN gckDVFS Dvfs
++    )
++{
++    gcmkHEADER_ARG("Dvfs=0x%X", Dvfs);
++    gcmkVERIFY_ARGUMENT(Dvfs != gcvNULL);
++
++    gckHARDWARE_InitDVFS(Dvfs->hardware);
++
++    Dvfs->stop = gcvFALSE;
++
++    gckOS_StartTimer(Dvfs->os, Dvfs->timer, Dvfs->pollingTime);
++
++    gcmkFOOTER_NO();
++    return gcvSTATUS_OK;
++}
++
++gceSTATUS
++gckDVFS_Stop(
++    IN gckDVFS Dvfs
++    )
++{
++    gcmkHEADER_ARG("Dvfs=0x%X", Dvfs);
++    gcmkVERIFY_ARGUMENT(Dvfs != gcvNULL);
++
++    Dvfs->stop = gcvTRUE;
++
++    gcmkFOOTER_NO();
++    return gcvSTATUS_OK;
++}
++#endif
+diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_precomp.h b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_precomp.h
+index 004e6bd..1e764c2 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_precomp.h
++++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_precomp.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #ifndef __gc_hal_kernel_precomp_h_
+ #define __gc_hal_kernel_precomp_h_
+ 
+diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c
+index 72ed5b8..7d0032e 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c
++++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #include "gc_hal_kernel_precomp.h"
+ 
+ #if gcdENABLE_VG
+@@ -397,6 +395,11 @@ gceSTATUS gckVGKERNEL_Dispatch(
+     gcsHAL_INTERFACE * kernelInterface = Interface;
+     gcuVIDMEM_NODE_PTR node;
+     gctUINT32 processID;
++    gckKERNEL kernel = Kernel;
++    gctPOINTER info = gcvNULL;
++    gctPHYS_ADDR physical = gcvNULL;
++    gctPOINTER logical = gcvNULL;
++    gctSIZE_T bytes = 0;
+ 
+     gcmkHEADER_ARG("Kernel=0x%x Interface=0x%x ", Kernel, Interface);
+ 
+@@ -436,61 +439,78 @@ gceSTATUS gckVGKERNEL_Dispatch(
+             ));
+         break;
+     case gcvHAL_ALLOCATE_NON_PAGED_MEMORY:
++        bytes = (gctSIZE_T) kernelInterface->u.AllocateNonPagedMemory.bytes;
+         /* Allocate non-paged memory. */
+         gcmkERR_BREAK(gckOS_AllocateContiguous(
+             Kernel->os,
+             gcvTRUE,
+-            &kernelInterface->u.AllocateNonPagedMemory.bytes,
+-            &kernelInterface->u.AllocateNonPagedMemory.physical,
+-            &kernelInterface->u.AllocateNonPagedMemory.logical
++            &bytes,
++            &physical,
++            &logical
+             ));
++
++        kernelInterface->u.AllocateNonPagedMemory.bytes    = bytes;
++        kernelInterface->u.AllocateNonPagedMemory.logical  = gcmPTR_TO_UINT64(logical);
++        kernelInterface->u.AllocateNonPagedMemory.physical = gcmPTR_TO_NAME(physical);
+         break;
+ 
+     case gcvHAL_FREE_NON_PAGED_MEMORY:
++        physical = gcmNAME_TO_PTR(kernelInterface->u.AllocateNonPagedMemory.physical);
++
+         /* Unmap user logical out of physical memory first. */
+         gcmkERR_BREAK(gckOS_UnmapUserLogical(
+             Kernel->os,
+-            kernelInterface->u.AllocateNonPagedMemory.physical,
+-            kernelInterface->u.AllocateNonPagedMemory.bytes,
+-            kernelInterface->u.AllocateNonPagedMemory.logical
++            physical,
++            (gctSIZE_T) kernelInterface->u.AllocateNonPagedMemory.bytes,
++            gcmUINT64_TO_PTR(kernelInterface->u.AllocateNonPagedMemory.logical)
+             ));
+ 
+         /* Free non-paged memory. */
+         gcmkERR_BREAK(gckOS_FreeNonPagedMemory(
+             Kernel->os,
+-            kernelInterface->u.AllocateNonPagedMemory.bytes,
+-            kernelInterface->u.AllocateNonPagedMemory.physical,
+-            kernelInterface->u.AllocateNonPagedMemory.logical
++            (gctSIZE_T) kernelInterface->u.AllocateNonPagedMemory.bytes,
++            physical,
++            gcmUINT64_TO_PTR(kernelInterface->u.AllocateNonPagedMemory.logical)
+             ));
++
++        gcmRELEASE_NAME(kernelInterface->u.AllocateNonPagedMemory.physical);
+         break;
+ 
+     case gcvHAL_ALLOCATE_CONTIGUOUS_MEMORY:
++        bytes = (gctSIZE_T) kernelInterface->u.AllocateNonPagedMemory.bytes;
+         /* Allocate contiguous memory. */
+         gcmkERR_BREAK(gckOS_AllocateContiguous(
+             Kernel->os,
+             gcvTRUE,
+-            &kernelInterface->u.AllocateNonPagedMemory.bytes,
+-            &kernelInterface->u.AllocateNonPagedMemory.physical,
+-            &kernelInterface->u.AllocateNonPagedMemory.logical
++            &bytes,
++            &physical,
++            &logical
+             ));
++
++        kernelInterface->u.AllocateNonPagedMemory.bytes    = bytes;
++        kernelInterface->u.AllocateNonPagedMemory.logical  = gcmPTR_TO_UINT64(logical);
++        kernelInterface->u.AllocateNonPagedMemory.physical = gcmPTR_TO_NAME(physical);
+         break;
+ 
+     case gcvHAL_FREE_CONTIGUOUS_MEMORY:
++        physical = gcmNAME_TO_PTR(kernelInterface->u.AllocateNonPagedMemory.physical);
+         /* Unmap user logical out of physical memory first. */
+         gcmkERR_BREAK(gckOS_UnmapUserLogical(
+             Kernel->os,
+-            kernelInterface->u.AllocateNonPagedMemory.physical,
+-            kernelInterface->u.AllocateNonPagedMemory.bytes,
+-            kernelInterface->u.AllocateNonPagedMemory.logical
++            physical,
++            (gctSIZE_T) kernelInterface->u.AllocateNonPagedMemory.bytes,
++            gcmUINT64_TO_PTR(kernelInterface->u.AllocateNonPagedMemory.logical)
+             ));
+ 
+         /* Free contiguous memory. */
+         gcmkERR_BREAK(gckOS_FreeContiguous(
+             Kernel->os,
+-            kernelInterface->u.AllocateNonPagedMemory.physical,
+-            kernelInterface->u.AllocateNonPagedMemory.logical,
+-            kernelInterface->u.AllocateNonPagedMemory.bytes
++            physical,
++            gcmUINT64_TO_PTR(kernelInterface->u.AllocateNonPagedMemory.logical),
++            (gctSIZE_T) kernelInterface->u.AllocateNonPagedMemory.bytes
+             ));
++
++        gcmRELEASE_NAME(kernelInterface->u.AllocateNonPagedMemory.physical);
+         break;
+ 
+     case gcvHAL_ALLOCATE_VIDEO_MEMORY:
+@@ -532,8 +552,10 @@ gceSTATUS gckVGKERNEL_Dispatch(
+                 bytes,
+                 64,
+                 kernelInterface->u.AllocateVideoMemory.type,
+-                &kernelInterface->u.AllocateVideoMemory.node
++                &node
+                 ));
++
++            kernelInterface->u.AllocateVideoMemory.node = gcmPTR_TO_UINT64(node);
+         }
+         break;
+ 
+@@ -545,22 +567,23 @@ gceSTATUS gckVGKERNEL_Dispatch(
+             kernelInterface->u.AllocateLinearVideoMemory.bytes,
+             kernelInterface->u.AllocateLinearVideoMemory.alignment,
+             kernelInterface->u.AllocateLinearVideoMemory.type,
+-            &kernelInterface->u.AllocateLinearVideoMemory.node
++            &node
+             ));
+ 
+         gcmkERR_BREAK(gckKERNEL_AddProcessDB(Kernel,
+            processID, gcvDB_VIDEO_MEMORY,
+-           Interface->u.AllocateLinearVideoMemory.node,
++           node,
+            gcvNULL,
+            kernelInterface->u.AllocateLinearVideoMemory.bytes
+            ));
+ 
++        kernelInterface->u.AllocateLinearVideoMemory.node = gcmPTR_TO_UINT64(node);
+         break;
+ 
+     case gcvHAL_FREE_VIDEO_MEMORY:
++        node = gcmUINT64_TO_PTR(Interface->u.FreeVideoMemory.node);
+ #ifdef __QNXNTO__
+         /* Unmap the video memory */
+-        node = Interface->u.FreeVideoMemory.node;
+ 
+         if ((node->VidMem.memory->object.type == gcvOBJ_VIDMEM) &&
+             (node->VidMem.logical != gcvNULL))
+@@ -575,13 +598,13 @@ gceSTATUS gckVGKERNEL_Dispatch(
+ 
+         /* Free video memory. */
+         gcmkERR_BREAK(gckVIDMEM_Free(
+-            Interface->u.FreeVideoMemory.node
++            node
+             ));
+ 
+         gcmkERR_BREAK(gckKERNEL_RemoveProcessDB(
+             Kernel,
+             processID, gcvDB_VIDEO_MEMORY,
+-            Interface->u.FreeVideoMemory.node
++            node
+             ));
+ 
+         break;
+@@ -590,19 +613,20 @@ gceSTATUS gckVGKERNEL_Dispatch(
+         /* Map memory. */
+         gcmkERR_BREAK(gckKERNEL_MapMemory(
+             Kernel,
+-            kernelInterface->u.MapMemory.physical,
+-            kernelInterface->u.MapMemory.bytes,
+-            &kernelInterface->u.MapMemory.logical
++            gcmINT2PTR(kernelInterface->u.MapMemory.physical),
++            (gctSIZE_T) kernelInterface->u.MapMemory.bytes,
++            &logical
+             ));
++        kernelInterface->u.MapMemory.logical = gcmPTR_TO_UINT64(logical);
+         break;
+ 
+     case gcvHAL_UNMAP_MEMORY:
+         /* Unmap memory. */
+         gcmkERR_BREAK(gckKERNEL_UnmapMemory(
+             Kernel,
+-            kernelInterface->u.MapMemory.physical,
+-            kernelInterface->u.MapMemory.bytes,
+-            kernelInterface->u.MapMemory.logical
++            gcmINT2PTR(kernelInterface->u.MapMemory.physical),
++            (gctSIZE_T) kernelInterface->u.MapMemory.bytes,
++            gcmUINT64_TO_PTR(kernelInterface->u.MapMemory.logical)
+             ));
+         break;
+ 
+@@ -611,12 +635,14 @@ gceSTATUS gckVGKERNEL_Dispatch(
+         gcmkERR_BREAK(gckOS_MapUserMemory(
+             Kernel->os,
+             gcvCORE_VG,
+-            kernelInterface->u.MapUserMemory.memory,
++            gcmUINT64_TO_PTR(kernelInterface->u.MapUserMemory.memory),
+             kernelInterface->u.MapUserMemory.physical,
+-            kernelInterface->u.MapUserMemory.size,
+-            &kernelInterface->u.MapUserMemory.info,
++            (gctSIZE_T) kernelInterface->u.MapUserMemory.size,
++            &info,
+             &kernelInterface->u.MapUserMemory.address
+             ));
++
++        kernelInterface->u.MapUserMemory.info = gcmPTR_TO_NAME(info);
+         break;
+ 
+     case gcvHAL_UNMAP_USER_MEMORY:
+@@ -624,21 +650,22 @@ gceSTATUS gckVGKERNEL_Dispatch(
+         gcmkERR_BREAK(gckOS_UnmapUserMemory(
+             Kernel->os,
+             gcvCORE_VG,
+-            kernelInterface->u.UnmapUserMemory.memory,
+-            kernelInterface->u.UnmapUserMemory.size,
+-            kernelInterface->u.UnmapUserMemory.info,
++            gcmUINT64_TO_PTR(kernelInterface->u.UnmapUserMemory.memory),
++            (gctSIZE_T) kernelInterface->u.UnmapUserMemory.size,
++            gcmNAME_TO_PTR(kernelInterface->u.UnmapUserMemory.info),
+             kernelInterface->u.UnmapUserMemory.address
+             ));
+         break;
+     case gcvHAL_LOCK_VIDEO_MEMORY:
++        node = gcmUINT64_TO_PTR(Interface->u.LockVideoMemory.node);
++
+         /* Lock video memory. */
+         gcmkERR_BREAK(
+             gckVIDMEM_Lock(Kernel,
+-                           Interface->u.LockVideoMemory.node,
++                           node,
+ 						   gcvFALSE,
+                            &Interface->u.LockVideoMemory.address));
+ 
+-        node = Interface->u.LockVideoMemory.node;
+         if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
+         {
+             /* Map video memory address into user space. */
+@@ -654,19 +681,20 @@ gceSTATUS gckVGKERNEL_Dispatch(
+                                          &node->VidMem.logical));
+         }
+ 
+-        Interface->u.LockVideoMemory.memory = node->VidMem.logical;
++        Interface->u.LockVideoMemory.memory = gcmPTR_TO_UINT64(node->VidMem.logical);
+ #else
+             gcmkERR_BREAK(
+                 gckKERNEL_MapVideoMemoryEx(Kernel,
+                                          gcvCORE_VG,
+                                          FromUser,
+                                          Interface->u.LockVideoMemory.address,
+-                                         &Interface->u.LockVideoMemory.memory));
++                                         &logical));
++            Interface->u.LockVideoMemory.memory = gcmPTR_TO_UINT64(logical);
+ #endif
+         }
+         else
+         {
+-            Interface->u.LockVideoMemory.memory = node->Virtual.logical;
++            Interface->u.LockVideoMemory.memory = gcmPTR_TO_UINT64(node->Virtual.logical);
+ 
+             /* Success. */
+             status = gcvSTATUS_OK;
+@@ -675,19 +703,19 @@ gceSTATUS gckVGKERNEL_Dispatch(
+ #if gcdSECURE_USER
+         /* Return logical address as physical address. */
+         Interface->u.LockVideoMemory.address =
+-            gcmPTR2INT(Interface->u.LockVideoMemory.memory);
++            (gctUINT32)(Interface->u.LockVideoMemory.memory);
+ #endif
+         gcmkERR_BREAK(
+             gckKERNEL_AddProcessDB(Kernel,
+                                    processID, gcvDB_VIDEO_MEMORY_LOCKED,
+-                                   Interface->u.LockVideoMemory.node,
++                                   node,
+                                    gcvNULL,
+                                    0));
+         break;
+ 
+     case gcvHAL_UNLOCK_VIDEO_MEMORY:
+         /* Unlock video memory. */
+-        node = Interface->u.UnlockVideoMemory.node;
++        node = gcmUINT64_TO_PTR(Interface->u.UnlockVideoMemory.node);
+ 
+ #if gcdSECURE_USER
+         /* Save node information before it disappears. */
+@@ -727,7 +755,7 @@ gceSTATUS gckVGKERNEL_Dispatch(
+             gcmkERR_BREAK(
+                     gckKERNEL_RemoveProcessDB(Kernel,
+                         processID, gcvDB_VIDEO_MEMORY_LOCKED,
+-                        Interface->u.UnlockVideoMemory.node));
++                        node));
+         }
+ 
+         break;
+@@ -789,10 +817,10 @@ gceSTATUS gckVGKERNEL_Dispatch(
+         /* Commit a command and context buffer. */
+         gcmkERR_BREAK(gckVGCOMMAND_Commit(
+             Kernel->vg->command,
+-            kernelInterface->u.VGCommit.context,
+-            kernelInterface->u.VGCommit.queue,
++            gcmUINT64_TO_PTR(kernelInterface->u.VGCommit.context),
++            gcmUINT64_TO_PTR(kernelInterface->u.VGCommit.queue),
+             kernelInterface->u.VGCommit.entryCount,
+-            kernelInterface->u.VGCommit.taskTable
++            gcmUINT64_TO_PTR(kernelInterface->u.VGCommit.taskTable)
+             ));
+         break;
+     case gcvHAL_VERSION:
+diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.h b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.h
+index b86b0c9..b6c6d7e 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.h
++++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,9 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+-
+ #ifndef __gc_hal_kernel_vg_h_
+ #define __gc_hal_kernel_vg_h_
+ 
+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
+index b681a65..d9370e2 100644
+--- 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
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #include "gc_hal_kernel_precomp.h"
+ 
+ #define _GC_OBJ_ZONE    gcvZONE_VIDMEM
+diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h
+index dc936c7..7077412 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h
++++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #ifndef __gc_hal_h_
+ #define __gc_hal_h_
+ 
+@@ -67,6 +65,59 @@ extern "C" {
+ )
+ 
+ /******************************************************************************\
++********************************* Cast Macro **********************************
++\******************************************************************************/
++#define gcmNAME_TO_PTR(na) \
++        gckKERNEL_QueryPointerFromName(kernel, gcmALL_TO_UINT32(na))
++
++#define gcmPTR_TO_NAME(ptr) \
++        gckKERNEL_AllocateNameFromPointer(kernel, ptr)
++
++#define gcmRELEASE_NAME(na) \
++        gckKERNEL_DeleteName(kernel, gcmALL_TO_UINT32(na))
++
++#ifdef __LP64__
++
++#define gcmALL_TO_UINT32(t) \
++( \
++    (gctUINT32) (gctUINTPTR_T) (t)\
++)
++
++#define gcmPTR_TO_UINT64(p) \
++( \
++    (gctUINT64) (p)\
++)
++
++#define gcmUINT64_TO_PTR(u) \
++( \
++    (gctPOINTER) (u)\
++)
++
++#else /* 32 bit */
++
++#define gcmALL_TO_UINT32(t) \
++( \
++    (gctUINT32) (t)\
++)
++
++#define gcmPTR_TO_UINT64(p) \
++( \
++    (gctUINT64) (gctUINTPTR_T) (p)\
++)
++
++#define gcmUINT64_TO_PTR(u) \
++( \
++    (gctPOINTER) (gctUINTPTR_T) (u)\
++)
++
++#endif
++
++#define gcmUINT64_TO_TYPE(u, t) \
++( \
++    (t) (gctUINTPTR_T) (u)\
++)
++
++/******************************************************************************\
+ ******************************** Useful Macro *********************************
+ \******************************************************************************/
+ 
+@@ -1275,6 +1326,33 @@ gckOS_ResetGPU(
+     IN gceCORE Core
+     );
+ 
++gceSTATUS
++gckOS_PrepareGPUFrequency(
++    IN gckOS Os,
++    IN gceCORE Core
++    );
++
++gceSTATUS
++gckOS_FinishGPUFrequency(
++    IN gckOS Os,
++    IN gceCORE Core
++    );
++
++gceSTATUS
++gckOS_QueryGPUFrequency(
++    IN gckOS Os,
++    IN gceCORE Core,
++    OUT gctUINT32 * Frequency,
++    OUT gctUINT8 * Scale
++    );
++
++gceSTATUS
++gckOS_SetGPUFrequency(
++    IN gckOS Os,
++    IN gceCORE Core,
++    IN gctUINT8 Scale
++    );
++
+ /*******************************************************************************
+ ** Semaphores.
+ */
+@@ -1339,7 +1417,7 @@ gckOS_CreateTimer(
+ 
+ /* Destory a timer. */
+ gceSTATUS
+-gckOS_DestoryTimer(
++gckOS_DestroyTimer(
+     IN gckOS Os,
+     IN gctPOINTER Timer
+     );
+@@ -1414,6 +1492,7 @@ gckHEAP_ProfileEnd(
+ typedef struct _gckVIDMEM *         gckVIDMEM;
+ typedef struct _gckKERNEL *         gckKERNEL;
+ typedef struct _gckDB *             gckDB;
++typedef struct _gckDVFS *           gckDVFS;
+ 
+ /* Construct a new gckVIDMEM object. */
+ gceSTATUS
+@@ -1704,6 +1783,27 @@ gckKERNEL_CloseUserData(
+     OUT gctPOINTER * KernelPointer
+     );
+ 
++gceSTATUS
++gckDVFS_Construct(
++    IN gckHARDWARE Hardware,
++    OUT gckDVFS * Frequency
++    );
++
++gceSTATUS
++gckDVFS_Destroy(
++    IN gckDVFS Dvfs
++    );
++
++gceSTATUS
++gckDVFS_Start(
++    IN gckDVFS Dvfs
++    );
++
++gceSTATUS
++gckDVFS_Stop(
++    IN gckDVFS Dvfs
++    );
++
+ /******************************************************************************\
+ ******************************* gckHARDWARE Object *****************************
+ \******************************************************************************/
+@@ -2058,6 +2158,23 @@ gckHARDWARE_DumpGPUState(
+     IN gckHARDWARE Hardware
+     );
+ 
++gceSTATUS
++gckHARDWARE_InitDVFS(
++    IN gckHARDWARE Hardware
++    );
++
++gceSTATUS
++gckHARDWARE_QueryLoad(
++    IN gckHARDWARE Hardware,
++    OUT gctUINT32 * Load
++    );
++
++gceSTATUS
++gckHARDWARE_SetDVFSPeroid(
++    IN gckHARDWARE Hardware,
++    IN gctUINT32 Frequency
++    );
++
+ #if !gcdENABLE_VG
+ /******************************************************************************\
+ ***************************** gckINTERRUPT Object ******************************
+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
+index 7f2de33..ac86399 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h
++++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #ifndef __gc_hal_base_h_
+ #define __gc_hal_base_h_
+ 
+@@ -68,6 +66,11 @@ typedef struct _gcsCONTEXT_MAP *		gcsCONTEXT_MAP_PTR;
+ typedef void *                          gcoVG;
+ #endif
+ 
++#if gcdSYNC
++typedef struct _gcoFENCE *              gcoFENCE;
++typedef struct _gcsSYNC_CONTEXT  *      gcsSYNC_CONTEXT_PTR;
++#endif
++
+ /******************************************************************************\
+ ******************************* Process local storage *************************
+ \******************************************************************************/
+@@ -140,6 +143,9 @@ typedef struct _gcsTLS
+ #ifndef VIVANTE_NO_3D
+ 	gco3D						engine3D;
+ #endif
++#if gcdSYNC
++    gctBOOL                     fenceEnable;
++#endif
+ 	gco2D						engine2D;
+     gctBOOL                     copied;
+ }
+@@ -1022,29 +1028,6 @@ gcoOS_GetPos(
+     OUT gctUINT32 * Position
+     );
+ 
+-/* Perform a memory copy. */
+-gceSTATUS
+-gcoOS_MemCopy(
+-    IN gctPOINTER Destination,
+-    IN gctCONST_POINTER Source,
+-    IN gctSIZE_T Bytes
+-    );
+-
+-/* Perform a memory fill. */
+-gceSTATUS
+-gcoOS_MemFill(
+-    IN gctPOINTER Destination,
+-    IN gctUINT8 Filler,
+-    IN gctSIZE_T Bytes
+-    );
+-
+-/* Zero memory. */
+-gceSTATUS
+-gcoOS_ZeroMemory(
+-    IN gctPOINTER Memory,
+-    IN gctSIZE_T Bytes
+-    );
+-
+ /* Same as strstr. */
+ gceSTATUS
+ gcoOS_StrStr(
+@@ -1062,12 +1045,6 @@ gcoOS_StrFindReverse(
+     );
+ 
+ gceSTATUS
+-gcoOS_StrLen(
+-    IN gctCONST_STRING String,
+-    OUT gctSIZE_T * Length
+-    );
+-
+-gceSTATUS
+ gcoOS_StrDup(
+     IN gcoOS Os,
+     IN gctCONST_STRING String,
+@@ -1113,13 +1090,15 @@ gcoOS_StrToFloat(
+     );
+ 
+ /* Convert hex string to integer. */
+-gceSTATUS gcoOS_HexStrToInt(
++gceSTATUS
++gcoOS_HexStrToInt(
+ 	IN gctCONST_STRING String,
+ 	OUT gctINT * Int
+ 	);
+ 
+ /* Convert hex string to float. */
+-gceSTATUS gcoOS_HexStrToFloat(
++gceSTATUS
++gcoOS_HexStrToFloat(
+ 	IN gctCONST_STRING String,
+ 	OUT gctFLOAT * Float
+ 	);
+@@ -1228,6 +1207,11 @@ gcoOS_DetectProcessByName(
+     IN gctCONST_STRING Name
+     );
+ 
++gceSTATUS
++gcoOS_DetectProcessByEncryptedName(
++    IN gctCONST_STRING Name
++    );
++
+ /*----------------------------------------------------------------------------*/
+ /*----- Atoms ----------------------------------------------------------------*/
+ 
+@@ -1440,7 +1424,7 @@ gcoOS_ReadRegister(
+ gceSTATUS
+ gcoOS_CacheClean(
+     IN gcoOS Os,
+-    IN gcuVIDMEM_NODE_PTR Node,
++    IN gctUINT64 Node,
+     IN gctPOINTER Logical,
+     IN gctSIZE_T Bytes
+     );
+@@ -1448,7 +1432,7 @@ gcoOS_CacheClean(
+ gceSTATUS
+ gcoOS_CacheFlush(
+     IN gcoOS Os,
+-    IN gcuVIDMEM_NODE_PTR Node,
++    IN gctUINT64 Node,
+     IN gctPOINTER Logical,
+     IN gctSIZE_T Bytes
+     );
+@@ -1456,7 +1440,7 @@ gcoOS_CacheFlush(
+ gceSTATUS
+ gcoOS_CacheInvalidate(
+     IN gcoOS Os,
+-    IN gcuVIDMEM_NODE_PTR Node,
++    IN gctUINT64 Node,
+     IN gctPOINTER Logical,
+     IN gctSIZE_T Bytes
+     );
+@@ -1786,7 +1770,7 @@ gcoSURF_MapUserSurface(
+ gceSTATUS
+ gcoSURF_QueryVidMemNode(
+     IN gcoSURF Surface,
+-    OUT gcuVIDMEM_NODE_PTR * Node,
++    OUT gctUINT64 * Node,
+     OUT gcePOOL * Pool,
+     OUT gctUINT_PTR Bytes
+     );
+@@ -2450,6 +2434,7 @@ gcoOS_DebugTrace(
+ #define gcvZONE_DEVICE          (1 << 10)
+ #define gcvZONE_DATABASE        (1 << 11)
+ #define gcvZONE_INTERRUPT       (1 << 12)
++#define gcvZONE_POWER           (1 << 13)
+ 
+ /* User zones. */
+ #define gcvZONE_HAL             (1 << 3)
+@@ -3664,6 +3649,7 @@ gckOS_DebugStatus2Name(
+ #   define gcmDEBUG_VERIFY_ARGUMENT(arg)
+ #   define gcmkDEBUG_VERIFY_ARGUMENT(arg)
+ #endif
++
+ /*******************************************************************************
+ **
+ **  gcmVERIFY_ARGUMENT_RETURN
+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
+index 64a8f1a..4a0870f 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_compiler.h
++++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_compiler.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ /*
+ **	Include file the defines the front- and back-end compilers, as well as the
+ **	objects they use.
+@@ -41,6 +39,9 @@ extern "C" {
+ #define GC_ENABLE_LOADTIME_OPT      1
+ #endif
+ 
++#define TEMP_OPT_CONSTANT_TEXLD_COORD    1
++
++#define TEMP_SHADER_PATCH            1
+ /******************************* IR VERSION ******************/
+ #define gcdSL_IR_VERSION gcmCC('\0','\0','\0','\1')
+ 
+@@ -266,6 +267,7 @@ typedef enum _gcSL_OPCODE
+ 	gcSL_ADDSAT,						/* 0x5C */  /* Integer only. */
+ 	gcSL_SUBSAT,						/* 0x5D */  /* Integer only. */
+ 	gcSL_MULSAT,						/* 0x5E */  /* Integer only. */
++	gcSL_MAXOPCODE
+ }
+ gcSL_OPCODE;
+ 
+@@ -507,8 +509,15 @@ struct _gcsHINT
+     gctUINT32   colorKillInstruction[3];
+ #endif
+ 
++#if TEMP_SHADER_PATCH
++	gctUINT32	pachedShaderIdentifier;
++#endif
+ };
+ 
++#if TEMP_SHADER_PATCH
++#define INVALID_SHADER_IDENTIFIER 0xFFFFFFFF
++#endif
++
+ /* gcSHADER_TYPE enumeration. */
+ typedef enum _gcSHADER_TYPE
+ {
+@@ -893,6 +902,16 @@ typedef struct _gcOPTIMIZER_OPTION
+           Note: n must be decimal number
+      */
+     gctUINT     featureBits;
++
++    /* inline level (default 2 at O1):
++
++          VC_OPTION=-INLINELEVEL:[0-3]
++             0:  no inline
++             1:  only inline the function only called once or small function
++             2:  inline functions be called less than 5 times or medium size function
++             3:  inline everything possible
++     */
++    gctUINT     inlineLevel;
+ } gcOPTIMIZER_OPTION;
+ 
+ extern gcOPTIMIZER_OPTION theOptimizerOption;
+@@ -926,6 +945,8 @@ extern gcOPTIMIZER_OPTION theOptimizerOption;
+ #define gcmOPT_PACKVARYING_triageStart()   (gcmGetOptimizerOption()->_triageStart)
+ #define gcmOPT_PACKVARYING_triageEnd()     (gcmGetOptimizerOption()->_triageEnd)
+ 
++#define gcmOPT_INLINELEVEL()     (gcmGetOptimizerOption()->inlineLevel)
++
+ /* Setters */
+ #define gcmOPT_SetPatchTexld(m,n) (gcmGetOptimizerOption()->patchEveryTEXLDs = (m),\
+                                    gcmGetOptimizerOption()->patchDummyTEXLDs = (n))
+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
+index e577809..028bbd1 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h
++++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #ifndef __gc_hal_driver_h_
+ #define __gc_hal_driver_h_
+ 
+@@ -164,7 +162,10 @@ typedef enum _gceHAL_COMMAND_CODES
+ 
+     /* FSCALE_VAL. */
+     gcvHAL_SET_FSCALE_VALUE,
+-    gcvHAL_GET_FSCALE_VALUE
++    gcvHAL_GET_FSCALE_VALUE,
++
++    /* Reset time stamp. */
++    gcvHAL_QUERY_RESET_TIME_STAMP,
+ }
+ gceHAL_COMMAND_CODES;
+ 
+@@ -252,19 +253,19 @@ typedef struct _gcsHAL_COMPOSE * gcsHAL_COMPOSE_PTR;
+ typedef struct _gcsHAL_COMPOSE
+ {
+     /* Composition state buffer. */
+-    gctPHYS_ADDR                physical;
+-    gctPOINTER                  logical;
+-    gctSIZE_T                   offset;
+-    gctSIZE_T                   size;
++    gctUINT64                   physical;
++    gctUINT64                   logical;
++    gctUINT                     offset;
++    gctUINT                     size;
+ 
+     /* Composition end signal. */
+-    gctHANDLE                   process;
+-    gctSIGNAL                   signal;
++    gctUINT64                   process;
++    gctUINT64                   signal;
+ 
+     /* User signals. */
+-    gctHANDLE                   userProcess;
+-    gctSIGNAL                   userSignal1;
+-    gctSIGNAL                   userSignal2;
++    gctUINT64                   userProcess;
++    gctUINT64                   userSignal1;
++    gctUINT64                   userSignal2;
+ 
+ #if defined(__QNXNTO__)
+     /* Client pulse side-channel connection ID. */
+@@ -276,6 +277,7 @@ typedef struct _gcsHAL_COMPOSE
+ }
+ gcsHAL_COMPOSE;
+ 
++
+ typedef struct _gcsHAL_INTERFACE
+ {
+     /* Command code. */
+@@ -288,7 +290,7 @@ typedef struct _gcsHAL_INTERFACE
+     gceSTATUS                   status;
+ 
+     /* Handle to this interface channel. */
+-    gctHANDLE                   handle;
++    gctUINT64                   handle;
+ 
+     /* Pid of the client. */
+     gctUINT32                   pid;
+@@ -307,23 +309,23 @@ typedef struct _gcsHAL_INTERFACE
+         /* gcvHAL_QUERY_VIDEO_MEMORY */
+         struct _gcsHAL_QUERY_VIDEO_MEMORY
+         {
+-            /* Physical memory address of internal memory. */
+-            OUT gctPHYS_ADDR            internalPhysical;
++            /* Physical memory address of internal memory. Just a name. */
++            OUT gctUINT32               internalPhysical;
+ 
+-            /* Size in bytes of internal memory.*/
+-            OUT gctSIZE_T               internalSize;
++            /* Size in bytes of internal memory. */
++            OUT gctUINT64               internalSize;
+ 
+-            /* Physical memory address of external memory. */
+-            OUT gctPHYS_ADDR            externalPhysical;
++            /* Physical memory address of external memory. Just a name. */
++            OUT gctUINT32               externalPhysical;
+ 
+             /* Size in bytes of external memory.*/
+-            OUT gctSIZE_T               externalSize;
++            OUT gctUINT64               externalSize;
+ 
+-            /* Physical memory address of contiguous memory. */
+-            OUT gctPHYS_ADDR            contiguousPhysical;
++            /* Physical memory address of contiguous memory. Just a name. */
++            OUT gctUINT32               contiguousPhysical;
+ 
+             /* Size in bytes of contiguous memory.*/
+-            OUT gctSIZE_T               contiguousSize;
++            OUT gctUINT64               contiguousSize;
+         }
+         QueryVideoMemory;
+ 
+@@ -333,28 +335,28 @@ typedef struct _gcsHAL_INTERFACE
+         /* gcvHAL_MAP_MEMORY */
+         struct _gcsHAL_MAP_MEMORY
+         {
+-            /* Physical memory address to map. */
+-            IN gctPHYS_ADDR             physical;
++            /* Physical memory address to map. Just a name on Linux/Qnx. */
++            IN gctUINT32                physical;
+ 
+             /* Number of bytes in physical memory to map. */
+-            IN gctSIZE_T                bytes;
++            IN gctUINT64                bytes;
+ 
+             /* Address of mapped memory. */
+-            OUT gctPOINTER              logical;
++            OUT gctUINT64               logical;
+         }
+         MapMemory;
+ 
+         /* gcvHAL_UNMAP_MEMORY */
+         struct _gcsHAL_UNMAP_MEMORY
+         {
+-            /* Physical memory address to unmap. */
+-            IN gctPHYS_ADDR             physical;
++            /* Physical memory address to unmap. Just a name on Linux/Qnx. */
++            IN gctUINT32                physical;
+ 
+             /* Number of bytes in physical memory to unmap. */
+-            IN gctSIZE_T                bytes;
++            IN gctUINT64                bytes;
+ 
+             /* Address of mapped memory to unmap. */
+-            IN gctPOINTER               logical;
++            IN gctUINT64                logical;
+         }
+         UnmapMemory;
+ 
+@@ -373,8 +375,8 @@ typedef struct _gcsHAL_INTERFACE
+             /* Memory pool to allocate from. */
+             IN OUT gcePOOL              pool;
+ 
+-            /* Allocated video memory. */
+-            OUT gcuVIDMEM_NODE_PTR      node;
++            /* Allocated video memory in gcuVIDMEM_NODE. */
++            OUT gctUINT64               node;
+         }
+         AllocateLinearVideoMemory;
+ 
+@@ -399,24 +401,24 @@ typedef struct _gcsHAL_INTERFACE
+             /* Memory pool to allocate from. */
+             IN OUT gcePOOL              pool;
+ 
+-            /* Allocated video memory. */
+-            OUT gcuVIDMEM_NODE_PTR      node;
++            /* Allocated video memory in gcuVIDMEM_NODE. */
++            OUT gctUINT64               node;
+         }
+         AllocateVideoMemory;
+ 
+         /* gcvHAL_FREE_VIDEO_MEMORY */
+         struct _gcsHAL_FREE_VIDEO_MEMORY
+         {
+-            /* Allocated video memory. */
+-            IN gcuVIDMEM_NODE_PTR       node;
++            /* Allocated video memory in gcuVIDMEM_NODE. */
++            IN gctUINT64        node;
+ 
+ #ifdef __QNXNTO__
+ /* TODO: This is part of the unlock - why is it here? */
+             /* Mapped logical address to unmap in user space. */
+-            OUT gctPOINTER              memory;
++            OUT gctUINT64       memory;
+ 
+             /* Number of bytes to allocated. */
+-            OUT gctSIZE_T               bytes;
++            OUT gctUINT64       bytes;
+ #endif
+         }
+         FreeVideoMemory;
+@@ -424,33 +426,33 @@ typedef struct _gcsHAL_INTERFACE
+         /* gcvHAL_LOCK_VIDEO_MEMORY */
+         struct _gcsHAL_LOCK_VIDEO_MEMORY
+         {
+-            /* Allocated video memory. */
+-            IN gcuVIDMEM_NODE_PTR       node;
++            /* Allocated video memory gcuVIDMEM_NODE gcuVIDMEM_NODE. */
++            IN gctUINT64            node;
+ 
+             /* Cache configuration. */
+             /* Only gcvPOOL_CONTIGUOUS and gcvPOOL_VIRUTAL
+             ** can be configured */
+-            IN gctBOOL                  cacheable;
++            IN gctBOOL              cacheable;
+ 
+             /* Hardware specific address. */
+-            OUT gctUINT32               address;
++            OUT gctUINT32           address;
+ 
+             /* Mapped logical address. */
+-            OUT gctPOINTER              memory;
++            OUT gctUINT64           memory;
+         }
+         LockVideoMemory;
+ 
+         /* gcvHAL_UNLOCK_VIDEO_MEMORY */
+         struct _gcsHAL_UNLOCK_VIDEO_MEMORY
+         {
+-            /* Allocated video memory. */
+-            IN gcuVIDMEM_NODE_PTR       node;
++            /* Allocated video memory in gcuVIDMEM_NODE. */
++            IN gctUINT64            node;
+ 
+             /* Type of surface. */
+-            IN gceSURF_TYPE             type;
++            IN gceSURF_TYPE         type;
+ 
+             /* Flag to unlock surface asynchroneously. */
+-            IN OUT gctBOOL              asynchroneous;
++            IN OUT gctBOOL          asynchroneous;
+         }
+         UnlockVideoMemory;
+ 
+@@ -458,13 +460,13 @@ typedef struct _gcsHAL_INTERFACE
+         struct _gcsHAL_ALLOCATE_NON_PAGED_MEMORY
+         {
+             /* Number of bytes to allocate. */
+-            IN OUT gctSIZE_T            bytes;
++            IN OUT gctUINT64        bytes;
+ 
+-            /* Physical address of allocation. */
+-            OUT gctPHYS_ADDR            physical;
++            /* Physical address of allocation. Just a name. */
++            OUT gctUINT32           physical;
+ 
+             /* Logical address of allocation. */
+-            OUT gctPOINTER              logical;
++            OUT gctUINT64           logical;
+         }
+         AllocateNonPagedMemory;
+ 
+@@ -472,13 +474,13 @@ typedef struct _gcsHAL_INTERFACE
+         struct _gcsHAL_FREE_NON_PAGED_MEMORY
+         {
+             /* Number of bytes allocated. */
+-            IN gctSIZE_T                bytes;
++            IN gctUINT64            bytes;
+ 
+-            /* Physical address of allocation. */
+-            IN gctPHYS_ADDR             physical;
++            /* Physical address of allocation. Just a name. */
++            IN gctUINT32            physical;
+ 
+             /* Logical address of allocation. */
+-            IN gctPOINTER               logical;
++            IN gctUINT64            logical;
+         }
+         FreeNonPagedMemory;
+ 
+@@ -486,13 +488,13 @@ typedef struct _gcsHAL_INTERFACE
+         struct _gcsHAL_ALLOCATE_VIRTUAL_COMMAND_BUFFER
+         {
+             /* Number of bytes to allocate. */
+-            IN OUT gctSIZE_T            bytes;
++            IN OUT gctUINT64        bytes;
+ 
+-            /* Physical address of allocation. */
+-            OUT gctPHYS_ADDR            physical;
++            /* Physical address of allocation. Just a name. */
++            OUT gctUINT32           physical;
+ 
+             /* Logical address of allocation. */
+-            OUT gctPOINTER              logical;
++            OUT gctUINT64           logical;
+         }
+         AllocateVirtualCommandBuffer;
+ 
+@@ -500,38 +502,38 @@ typedef struct _gcsHAL_INTERFACE
+         struct _gcsHAL_FREE_VIRTUAL_COMMAND_BUFFER
+         {
+             /* Number of bytes allocated. */
+-            IN gctSIZE_T                bytes;
++            IN gctUINT64            bytes;
+ 
+-            /* Physical address of allocation. */
+-            IN gctPHYS_ADDR             physical;
++            /* Physical address of allocation. Just a name. */
++            IN gctUINT32            physical;
+ 
+             /* Logical address of allocation. */
+-            IN gctPOINTER               logical;
++            IN gctUINT64            logical;
+         }
+         FreeVirtualCommandBuffer;
+ 
+         /* gcvHAL_EVENT_COMMIT. */
+         struct _gcsHAL_EVENT_COMMIT
+         {
+-            /* Event queue. */
+-            IN gcsQUEUE_PTR             queue;
++            /* Event queue in gcsQUEUE. */
++            IN gctUINT64             queue;
+         }
+         Event;
+ 
+         /* gcvHAL_COMMIT */
+         struct _gcsHAL_COMMIT
+         {
+-            /* Context buffer object. */
+-            IN gckCONTEXT               context;
++            /* Context buffer object gckCONTEXT. */
++            IN gctUINT64            context;
+ 
+-            /* Command buffer. */
+-            IN gcoCMDBUF                commandBuffer;
++            /* Command buffer gcoCMDBUF. */
++            IN gctUINT64            commandBuffer;
+ 
+-            /* State delta buffer. */
+-            gcsSTATE_DELTA_PTR          delta;
++            /* State delta buffer in gcsSTATE_DELTA. */
++            gctUINT64               delta;
+ 
+-            /* Event queue. */
+-            IN gcsQUEUE_PTR             queue;
++            /* Event queue in gcsQUEUE. */
++            IN gctUINT64            queue;
+         }
+         Commit;
+ 
+@@ -539,16 +541,16 @@ typedef struct _gcsHAL_INTERFACE
+         struct _gcsHAL_MAP_USER_MEMORY
+         {
+             /* Base address of user memory to map. */
+-            IN gctPOINTER               memory;
++            IN gctUINT64                memory;
+ 
+             /* Physical address of user memory to map. */
+             IN gctUINT32                physical;
+ 
+             /* Size of user memory in bytes to map. */
+-            IN gctSIZE_T                size;
++            IN gctUINT64                size;
+ 
+-            /* Info record required by gcvHAL_UNMAP_USER_MEMORY. */
+-            OUT gctPOINTER              info;
++            /* Info record required by gcvHAL_UNMAP_USER_MEMORY. Just a name. */
++            OUT gctUINT32               info;
+ 
+             /* Physical address of mapped memory. */
+             OUT gctUINT32               address;
+@@ -559,13 +561,13 @@ typedef struct _gcsHAL_INTERFACE
+         struct _gcsHAL_UNMAP_USER_MEMORY
+         {
+             /* Base address of user memory to unmap. */
+-            IN gctPOINTER               memory;
++            IN gctUINT64                memory;
+ 
+             /* Size of user memory in bytes to unmap. */
+-            IN gctSIZE_T                size;
++            IN gctUINT64                size;
+ 
+-            /* Info record returned by gcvHAL_MAP_USER_MEMORY. */
+-            IN gctPOINTER               info;
++            /* Info record returned by gcvHAL_MAP_USER_MEMORY. Just a name. */
++            IN gctUINT32                info;
+ 
+             /* Physical address of mapped memory as returned by
+                gcvHAL_MAP_USER_MEMORY. */
+@@ -597,14 +599,14 @@ typedef struct _gcsHAL_INTERFACE
+         /* gcvHAL_SIGNAL. */
+         struct _gcsHAL_SIGNAL
+         {
+-            /* Signal handle to signal. */
+-            IN gctSIGNAL                signal;
++            /* Signal handle to signal gctSIGNAL. */
++            IN gctUINT64                signal;
+ 
+-            /* Reserved. */
+-            IN gctSIGNAL                auxSignal;
++            /* Reserved gctSIGNAL. */
++            IN gctUINT64                auxSignal;
+ 
+-            /* Process owning the signal. */
+-            IN gctHANDLE                process;
++            /* Process owning the signal gctHANDLE. */
++            IN gctUINT64                process;
+ 
+ #if defined(__QNXNTO__)
+             /* Client pulse side-channel connection ID. Set by client in gcoOS_CreateSignal. */
+@@ -633,16 +635,16 @@ typedef struct _gcsHAL_INTERFACE
+         struct _gcsHAL_ALLOCATE_CONTIGUOUS_MEMORY
+         {
+             /* Number of bytes to allocate. */
+-            IN OUT gctSIZE_T            bytes;
++            IN OUT gctUINT64            bytes;
+ 
+             /* Hardware address of allocation. */
+             OUT gctUINT32               address;
+ 
+-            /* Physical address of allocation. */
+-            OUT gctPHYS_ADDR            physical;
++            /* Physical address of allocation. Just a name. */
++            OUT gctUINT32               physical;
+ 
+             /* Logical address of allocation. */
+-            OUT gctPOINTER              logical;
++            OUT gctUINT64               logical;
+         }
+         AllocateContiguousMemory;
+ 
+@@ -650,13 +652,13 @@ typedef struct _gcsHAL_INTERFACE
+         struct _gcsHAL_FREE_CONTIGUOUS_MEMORY
+         {
+             /* Number of bytes allocated. */
+-            IN gctSIZE_T                bytes;
++            IN gctUINT64                bytes;
+ 
+-            /* Physical address of allocation. */
+-            IN gctPHYS_ADDR             physical;
++            /* Physical address of allocation. Just a name. */
++            IN gctUINT32                physical;
+ 
+             /* Logical address of allocation. */
+-            IN gctPOINTER               logical;
++            IN gctUINT64                logical;
+         }
+         FreeContiguousMemory;
+ 
+@@ -726,8 +728,8 @@ typedef struct _gcsHAL_INTERFACE
+         /* gcvHAL_PROFILE_REGISTERS_2D */
+         struct _gcsHAL_PROFILE_REGISTERS_2D
+         {
+-            /* Data read. */
+-            OUT gcs2D_PROFILE_PTR       hwProfile2D;
++            /* Data read in gcs2D_PROFILE. */
++            OUT gctUINT64       hwProfile2D;
+         }
+         RegisterProfileData2D;
+ #endif
+@@ -766,7 +768,7 @@ typedef struct _gcsHAL_INTERFACE
+             IN gctBOOL                  map;
+ 
+             /* Physical address. */
+-            IN OUT gctPHYS_ADDR         physical;
++            IN OUT gctUINT64            physical;
+         }
+         MapPhysical;
+ 
+@@ -791,10 +793,12 @@ typedef struct _gcsHAL_INTERFACE
+         struct _gcsHAL_CACHE
+         {
+             IN gceCACHEOPERATION        operation;
+-            IN gctHANDLE                process;
+-            IN gctPOINTER               logical;
+-            IN gctSIZE_T                bytes;
+-            IN gcuVIDMEM_NODE_PTR       node;
++            /* gctHANDLE */
++            IN gctUINT64                process;
++            IN gctUINT64                logical;
++            IN gctUINT64                bytes;
++            /* gcuVIDMEM_NODE_PTR */
++            IN gctUINT64                node;
+         }
+         Cache;
+ 
+@@ -861,29 +865,30 @@ typedef struct _gcsHAL_INTERFACE
+         /* gcvHAL_ATTACH */
+         struct _gcsHAL_ATTACH
+         {
+-            /* Context buffer object. */
+-            OUT gckCONTEXT              context;
++            /* Context buffer object gckCONTEXT. Just a name. */
++            OUT gctUINT32               context;
+ 
+             /* Number of states in the buffer. */
+-            OUT gctSIZE_T               stateCount;
++            OUT gctUINT64               stateCount;
+         }
+         Attach;
+ 
+         /* gcvHAL_DETACH */
+         struct _gcsHAL_DETACH
+         {
+-            /* Context buffer object. */
+-            IN gckCONTEXT               context;
++            /* Context buffer object gckCONTEXT. Just a name. */
++            IN gctUINT32                context;
+         }
+         Detach;
+ 
+         /* gcvHAL_COMPOSE. */
+-        gcsHAL_COMPOSE                  Compose;
++        gcsHAL_COMPOSE            Compose;
+ 
+         /* gcvHAL_GET_FRAME_INFO. */
+         struct _gcsHAL_GET_FRAME_INFO
+         {
+-            OUT gcsHAL_FRAME_INFO *     frameInfo;
++            /* gcsHAL_FRAME_INFO* */
++            OUT gctUINT64     frameInfo;
+         }
+         GetFrameInfo;
+ 
+@@ -898,17 +903,17 @@ typedef struct _gcsHAL_INTERFACE
+ 		/* gcvHAL_COMMIT */
+ 		struct _gcsHAL_VGCOMMIT
+ 		{
+-			/* Context buffer. */
+-			IN gcsVGCONTEXT_PTR			context;
++			/* Context buffer in gcsVGCONTEXT. */
++			IN gctUINT64			context;
+ 
+-			/* Command queue. */
+-			IN gcsVGCMDQUEUE_PTR			queue;
++			/* Command queue in gcsVGCMDQUEUE. */
++			IN gctUINT64			queue;
+ 
+ 			/* Number of entries in the queue. */
+-			IN gctUINT					entryCount;
++			IN gctUINT			entryCount;
+ 
+-			/* Task table. */
+-			IN gcsTASK_MASTER_TABLE_PTR	taskTable;
++			/* Task table in gcsTASK_MASTER_TABLE. */
++			IN gctUINT64	                taskTable;
+ 		}
+ 		VGCommit;
+ 
+@@ -926,11 +931,13 @@ typedef struct _gcsHAL_INTERFACE
+         {
+             IN gctUINT32            pid;
+             IN gctUINT32            dataId;
+-            IN gcuVIDMEM_NODE_PTR   node;
+-            OUT gctUINT8_PTR        data;
+-            /* fix size */
+-            OUT gctUINT8_PTR        nodeData;
+-            gctSIZE_T               size;
++            /* gcuVIDMEM_NODE_PTR */
++            IN gctUINT64            node;
++            /* gctUINT8_PTR */
++            OUT gctUINT64           data;
++            /* fix size. gctUINT8_PTR*/
++            OUT gctUINT64           nodeData;
++            gctUINT64               size;
+             IN gceVIDMEM_NODE_SHARED_INFO_TYPE infoType;
+         }
+         GetSharedInfo;
+@@ -938,10 +945,13 @@ typedef struct _gcsHAL_INTERFACE
+         struct _gcsHAL_SET_SHARED_INFO
+         {
+             IN gctUINT32            dataId;
+-            IN gcuVIDMEM_NODE_PTR   node;
+-            IN gctUINT8_PTR         data;
+-            IN gctUINT8_PTR         nodeData;
+-            IN gctSIZE_T            size;
++            /* gcuVIDMEM_NODE_PTR */
++            IN gctUINT64   node;
++            /* gctUINT8_PTR */
++            IN gctUINT64         data;
++            /* gctUINT8_PTR */
++            IN gctUINT64         nodeData;
++            IN gctUINT64            size;
+             IN gceVIDMEM_NODE_SHARED_INFO_TYPE infoType;
+         }
+         SetSharedInfo;
+@@ -959,6 +969,12 @@ typedef struct _gcsHAL_INTERFACE
+             OUT gctUINT             maxValue;
+         }
+         GetFscaleValue;
++
++        struct _gcsHAL_QUERY_RESET_TIME_STAMP
++        {
++            OUT gctUINT64           timeStamp;
++        }
++        QueryResetTimeStamp;
+     }
+     u;
+ }
+diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver_vg.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver_vg.h
+index c447dcf..b54752f 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver_vg.h
++++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver_vg.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,9 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+-
+ #ifndef __gc_hal_driver_vg_h_
+ #define __gc_hal_driver_vg_h_
+ 
+@@ -213,7 +210,7 @@ typedef struct _gcsTASK_UNLOCK_VIDEO_MEMORY
+     IN gceTASK                  id;
+ 
+     /* Allocated video memory. */
+-    IN gcuVIDMEM_NODE_PTR       node;
++    IN gctUINT64                node;
+ }
+ gcsTASK_UNLOCK_VIDEO_MEMORY;
+ 
+@@ -224,7 +221,7 @@ typedef struct _gcsTASK_FREE_VIDEO_MEMORY
+     IN gceTASK                  id;
+ 
+     /* Allocated video memory. */
+-    IN gcuVIDMEM_NODE_PTR       node;
++    IN gctUINT64                node;
+ }
+ gcsTASK_FREE_VIDEO_MEMORY;
+ 
+diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_dump.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_dump.h
+index 9b2db22..ffd45e8 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_dump.h
++++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_dump.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,7 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+ #ifndef __gc_hal_dump_h_
+ #define __gc_hal_dump_h_
+ 
+diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform.h
+index 3be4c77..496276e 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform.h
++++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #ifndef __gc_hal_eglplatform_h_
+ #define __gc_hal_eglplatform_h_
+ 
+diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform_type.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform_type.h
+index 727758f..4f5c3ce 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform_type.h
++++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform_type.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,7 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+ #ifndef __gc_hal_eglplatform_type_h_
+ #define __gc_hal_eglplatform_type_h_
+ 
+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
+index c462e57..d441d1d 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine.h
++++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #ifndef __gc_hal_engine_h_
+ #define __gc_hal_engine_h_
+ 
+@@ -391,6 +389,37 @@ gcoSURF_IsRenderable(
+     IN gcoSURF Surface
+     );
+ 
++#if gcdSYNC
++gceSTATUS
++gcoSURF_GetFence(
++    IN gcoSURF Surface
++    );
++gceSTATUS
++gcoSURF_WaitFence(
++    IN gcoSURF Surface
++    );
++
++gceSTATUS
++gcoSTREAM_GetFence(
++    IN gcoSTREAM stream
++    );
++
++gceSTATUS
++gcoSTREAM_WaitFence(
++    IN gcoSTREAM stream
++    );
++
++gceSTATUS
++gcoINDEX_GetFence(
++    IN gcoINDEX index
++    );
++
++gceSTATUS
++gcoINDEX_WaitFence(
++    IN gcoINDEX index
++    );
++#endif
++
+ /******************************************************************************\
+ ******************************** gcoINDEX Object *******************************
+ \******************************************************************************/
+@@ -1976,7 +2005,7 @@ gcoHAL_GetSharedInfo(
+     IN gctUINT32 DataId,
+     OUT gctUINT8_PTR Data,
+     IN gctSIZE_T Bytes,
+-    IN gcuVIDMEM_NODE_PTR Node,
++    IN gctUINT64 Node,
+     OUT gctUINT8_PTR NodeData,
+     IN gceVIDMEM_NODE_SHARED_INFO_TYPE SharedInfoType
+     );
+@@ -1986,7 +2015,7 @@ gcoHAL_SetSharedInfo(
+     IN gctUINT32 DataId,
+     IN gctUINT8_PTR Data,
+     IN gctSIZE_T Bytes,
+-    IN gcuVIDMEM_NODE_PTR Node,
++    IN gctUINT64 Node,
+     IN gctUINT8_PTR NodeData,
+     IN gceVIDMEM_NODE_SHARED_INFO_TYPE SharedInfoType
+     );
+diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine_vg.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine_vg.h
+index 1526b0c..4bb6772 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine_vg.h
++++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine_vg.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,9 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+-
+ #ifndef __gc_hal_engine_vg_h_
+ #define __gc_hal_engine_vg_h_
+ 
+@@ -527,14 +524,14 @@ gcoHAL_CombineAddress(
+ gceSTATUS
+ gcoHAL_ScheduleVideoMemory(
+     IN gcoHAL Hal,
+-    IN gcuVIDMEM_NODE_PTR Node
++    IN gctUINT64 Node
+     );
+ 
+ /* Free linear video memory allocated with gcoHAL_AllocateLinearVideoMemory. */
+ gceSTATUS
+ gcoHAL_FreeVideoMemory(
+     IN gcoHAL Hal,
+-    IN gcuVIDMEM_NODE_PTR Node
++    IN gctUINT64 Node
+     );
+ 
+ /* Query command buffer attributes. */
+@@ -550,7 +547,7 @@ gcoHAL_AllocateLinearVideoMemory(
+     IN gctUINT Size,
+     IN gctUINT Alignment,
+     IN gcePOOL Pool,
+-    OUT gcuVIDMEM_NODE_PTR * Node,
++    OUT gctUINT64 * Node,
+     OUT gctUINT32 * Address,
+     OUT gctPOINTER * Memory
+     );
+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
+index 6c71df9..cf6b425 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h
++++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #ifndef __gc_hal_enum_h_
+ #define __gc_hal_enum_h_
+ 
+@@ -150,6 +148,8 @@ typedef enum _gceFEATURE
+     gcvFEATURE_TEXTURE_YUV_ASSEMBLER,
+     gcvFEATURE_DYNAMIC_FREQUENCY_SCALING,
+     gcvFEATURE_BUGFIX15,
++    gcvFEATURE_2D_MIRROR_EXTENSION,
++    gcvFEATURE_ELEMENT_INDEX_UINT,
+ }
+ gceFEATURE;
+ 
+@@ -351,6 +351,16 @@ typedef enum _gceSURF_FORMAT
+     gcvSURF_DXT5,
+     gcvSURF_CXV8U8,
+     gcvSURF_ETC1,
++    gcvSURF_R11_EAC,
++    gcvSURF_SIGNED_R11_EAC,
++    gcvSURF_RG11_EAC,
++    gcvSURF_SIGNED_RG11_EAC,
++    gcvSURF_RGB8_ETC2,
++    gcvSURF_SRGB8_ETC2,
++    gcvSURF_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,
++    gcvSURF_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2,
++    gcvSURF_RGBA8_ETC2_EAC,
++    gcvSURF_SRGB8_ALPHA8_ETC2_EAC,
+ 
+     /* YUV formats. */
+     gcvSURF_YUY2                = 500,
+diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_kernel_buffer.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_kernel_buffer.h
+index 24edc0b..0608e43 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_kernel_buffer.h
++++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_kernel_buffer.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #ifndef __gc_hal_kernel_buffer_h_
+ #define __gc_hal_kernel_buffer_h_
+ 
+@@ -59,11 +57,6 @@ typedef struct _gcsSTATE_DELTA
+     gctUINT                     num;
+ #endif
+ 
+-    /* For dumping. */
+-#if gcdDUMP
+-    gcoOS                       os;
+-#endif
+-
+     /* Main state delta ID. Every time state delta structure gets reinitialized,
+        main ID is incremented. If main state ID overflows, all map entry IDs get
+        reinitialized to make sure there is no potential erroneous match after
+@@ -79,22 +72,22 @@ typedef struct _gcsSTATE_DELTA
+     /* Number of states currently stored in the record array. */
+     gctUINT                     recordCount;
+ 
+-    /* Record array; holds all modified states. */
+-    gcsSTATE_DELTA_RECORD_PTR   recordArray;
++    /* Record array; holds all modified states in gcsSTATE_DELTA_RECORD. */
++    gctUINT64                   recordArray;
+ 
+     /* Map entry ID is used for map entry validation. If map entry ID does not
+        match the main state delta ID, the entry and the corresponding state are
+        considered not in use. */
+-    gctUINT_PTR                 mapEntryID;
++    gctUINT64                   mapEntryID;
+     gctUINT                     mapEntryIDSize;
+ 
+     /* If the map entry ID matches the main state delta ID, index points to
+        the state record in the record array. */
+-    gctUINT_PTR                 mapEntryIndex;
++    gctUINT64                   mapEntryIndex;
+ 
+-    /* Previous and next state deltas. */
+-    gcsSTATE_DELTA_PTR          prev;
+-    gcsSTATE_DELTA_PTR          next;
++    /* Previous and next state deltas in gcsSTATE_DELTA. */
++    gctUINT64                   prev;
++    gctUINT64                   next;
+ }
+ gcsSTATE_DELTA;
+ 
+@@ -114,38 +107,38 @@ struct _gcoCMDBUF
+     gctBOOL                     usingFilterBlit;
+     gctBOOL                     usingPalette;
+ 
+-    /* Physical address of command buffer. */
+-    gctPHYS_ADDR                physical;
++    /* Physical address of command buffer. Just a name. */
++    gctUINT32                   physical;
+ 
+     /* Logical address of command buffer. */
+-    gctPOINTER                  logical;
++    gctUINT64                   logical;
+ 
+     /* Number of bytes in command buffer. */
+-    gctSIZE_T                   bytes;
++    gctUINT                     bytes;
+ 
+     /* Start offset into the command buffer. */
+-    gctUINT32                   startOffset;
++    gctUINT                     startOffset;
+ 
+     /* Current offset into the command buffer. */
+-    gctUINT32                   offset;
++    gctUINT                     offset;
+ 
+     /* Number of free bytes in command buffer. */
+-    gctSIZE_T                   free;
++    gctUINT                     free;
+ 
+     /* Location of the last reserved area. */
+-    gctPOINTER                  lastReserve;
++    gctUINT64                   lastReserve;
+     gctUINT                     lastOffset;
+ 
+ #if gcdSECURE_USER
+     /* Hint array for the current command buffer. */
+     gctUINT                     hintArraySize;
+-    gctUINT32_PTR               hintArray;
+-    gctUINT32_PTR               hintArrayTail;
++    gctUINT64                   hintArray;
++    gctUINT64                   hintArrayTail;
+ #endif
+ 
+ #if gcmIS_DEBUG(gcdDEBUG_CODE)
+     /* Last load state command location and hardware address. */
+-    gctUINT32_PTR               lastLoadStatePtr;
++    gctUINT64                   lastLoadStatePtr;
+     gctUINT32                   lastLoadStateAddress;
+     gctUINT32                   lastLoadStateCount;
+ #endif
+@@ -153,8 +146,8 @@ struct _gcoCMDBUF
+ 
+ typedef struct _gcsQUEUE
+ {
+-    /* Pointer to next gcsQUEUE structure. */
+-    gcsQUEUE_PTR                next;
++    /* Pointer to next gcsQUEUE structure in gcsQUEUE. */
++    gctUINT64                   next;
+ 
+     /* Event information. */
+     gcsHAL_INTERFACE            iface;
+diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_mem.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_mem.h
+index e64f7e7..9e32878 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_mem.h
++++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_mem.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ /*
+ **	Include file for the local memory management.
+ */
+@@ -176,7 +174,7 @@ Prefix##_CAllocate##TypeName( \
+ 	gceSTATUS				status; \
+     gcmHEADER_ARG("MemPool=0x%x Pointer=0x%x", MemPool, Pointer); \
+ 	gcmERR_RETURN(gcfMEM_FSMemPoolGetANode(MemPool, (gctPOINTER *) Pointer)); \
+-	gcmVERIFY_OK(gcoOS_ZeroMemory(*(gctPOINTER *) Pointer, gcmSIZEOF(Type))); \
++	gcoOS_ZeroMemory(*(gctPOINTER *) Pointer, gcmSIZEOF(Type)); \
+     gcmFOOTER(); \
+ 	return gcvSTATUS_OK; \
+ } \
+@@ -233,7 +231,7 @@ gceSTATUS \
+ 	gceSTATUS				status; \
+     gcmHEADER_ARG("MemPool=0x%x Pointer=0x%x Size=%u", MemPool, Pointer, Size); \
+ 	gcmERR_RETURN(gcfMEM_VSMemPoolGetANode(MemPool, Size, (gctPOINTER *) Pointer)); \
+-	gcmVERIFY_OK(gcoOS_ZeroMemory(*(gctPOINTER *) Pointer, size)); \
++	gcoOS_ZeroMemory(*(gctPOINTER *) Pointer, size); \
+     gcmFOOTER(); \
+ 	return gcvSTATUS_OK; \
+ } \
+@@ -276,7 +274,7 @@ Prefix##_CAllocate##TypeName( \
+ 	gceSTATUS				status; \
+     gcmHEADER_ARG("MemPool=0x%x Pointer=0x%x Count=%u", MemPool, Pointer, Count); \
+ 	gcmERR_RETURN(gcfMEM_AFSMemPoolGetANode(MemPool, Count, (gctPOINTER *) Pointer)); \
+-	gcmVERIFY_OK(gcoOS_ZeroMemory(*(gctPOINTER *) Pointer, Count * gcmSIZEOF(Type))); \
++	gcoOS_ZeroMemory(*(gctPOINTER *) Pointer, Count * gcmSIZEOF(Type)); \
+     gcmFOOTER(); \
+ 	return gcvSTATUS_OK; \
+ } \
+@@ -323,7 +321,7 @@ Prefix##_CAllocate##TypeName( \
+ 	gcmERR_RETURN(gcoOS_Allocate(MemPool, \
+ 							gcmSIZEOF(Type), \
+ 							(gctPOINTER *) Pointer)); \
+-	gcmVERIFY_OK(gcoOS_ZeroMemory(*(gctPOINTER *) Pointer, gcmSIZEOF(Type))); \
++	gcoOS_ZeroMemory(*(gctPOINTER *) Pointer, gcmSIZEOF(Type)); \
+     gcmFOOTER(); \
+ 	return gcvSTATUS_OK; \
+ } \
+@@ -370,7 +368,7 @@ Prefix##_CAllocate##TypeName( \
+ 	gcmERR_RETURN(gcoOS_Allocate(MemPool, \
+ 							Size, \
+ 							(gctPOINTER *) Pointer)); \
+-	gcmVERIFY_OK(gcoOS_ZeroMemory(*(gctPOINTER *) Pointer, Size)); \
++	gcoOS_ZeroMemory(*(gctPOINTER *) Pointer, Size); \
+     gcmFOOTER(); \
+ 	return gcvSTATUS_OK; \
+ } \
+@@ -417,7 +415,7 @@ Prefix##_CAllocate##TypeName( \
+ 	gcmERR_RETURN(gcoOS_Allocate(MemPool, \
+ 							Count * gcmSIZEOF(Type), \
+ 							(gctPOINTER *) Pointer)); \
+-	gcmVERIFY_OK(gcoOS_ZeroMemory(*(gctPOINTER *) Pointer, Count * gcmSIZEOF(Type))); \
++	gcoOS_ZeroMemory(*(gctPOINTER *) Pointer, Count * gcmSIZEOF(Type)); \
+     gcmFOOTER(); \
+ 	return gcvSTATUS_OK; \
+ } \
+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
+index 8478745..86e9133 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_options.h
++++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_options.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #ifndef __gc_hal_options_h_
+ #define __gc_hal_options_h_
+ 
+@@ -755,6 +753,10 @@
+ #   define  gcdANDROID_UNALIGNED_LINEAR_COMPOSITION_ADJUST    0
+ #endif
+ 
++#ifndef gcdENABLE_PE_DITHER_FIX
++#   define gcdENABLE_PE_DITHER_FIX              1
++#endif
++
+ #ifndef gcdSHARED_PAGETABLE
+ #   define gcdSHARED_PAGETABLE                  1
+ #endif
+@@ -839,4 +841,21 @@
+ #define gcdUSE_NPOT_PATCH                       1
+ #endif
+ 
++
++#ifndef gcdSYNC
++#   define gcdSYNC                              1
++#endif
++
++/*
++    gcdDVFS
++
++        When non-zero, software will make use of dynamic voltage and
++        frequency feature.
++ */
++#ifndef gcdDVFS
++#   define gcdDVFS                               0
++#   define gcdDVFS_ANAYLSE_WINDOW                4
++#   define gcdDVFS_POLLING_TIME                  (gcdDVFS_ANAYLSE_WINDOW * 4)
++#endif
++
+ #endif /* __gc_hal_options_h_ */
+diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_profiler.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_profiler.h
+index d486b53..3e450ba 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_profiler.h
++++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_profiler.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_raster.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_raster.h
+index d9b2993..bc4171e 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_raster.h
++++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_raster.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #ifndef __gc_hal_raster_h_
+ #define __gc_hal_raster_h_
+ 
+diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_rename.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_rename.h
+index ed6718d..6c10fbf 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_rename.h
++++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_rename.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #ifndef __gc_hal_rename_h_
+ #define __gc_hal_rename_h_
+ 
+diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_statistics.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_statistics.h
+index 1e85458..82336e8 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_statistics.h
++++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_statistics.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,7 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+ #ifndef __gc_hal_statistics_h_
+ #define __gc_hal_statistics_h_
+ 
+diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_types.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_types.h
+index 70c4b4f..5c0877d 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_types.h
++++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_types.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #ifndef __gc_hal_types_h_
+ #define __gc_hal_types_h_
+ 
+@@ -588,13 +586,13 @@ gceSTATUS;
+ #if gcmIS_DEBUG(gcdDEBUG_CODE)
+ 
+ #   define gcmSTORELOADSTATE(CommandBuffer, Memory, Address, Count) \
+-        CommandBuffer->lastLoadStatePtr     = Memory; \
++        CommandBuffer->lastLoadStatePtr     = gcmPTR_TO_UINT64(Memory); \
+         CommandBuffer->lastLoadStateAddress = Address; \
+         CommandBuffer->lastLoadStateCount   = Count
+ 
+ #   define gcmVERIFYLOADSTATE(CommandBuffer, Memory, Address) \
+         gcmASSERT( \
+-            (gctUINT) (Memory  - CommandBuffer->lastLoadStatePtr - 1) \
++            (gctUINT) (Memory  - gcmUINT64_TO_TYPE(CommandBuffer->lastLoadStatePtr, gctUINT32_PTR) - 1) \
+             == \
+             (gctUINT) (Address - CommandBuffer->lastLoadStateAddress) \
+             ); \
+@@ -623,10 +621,10 @@ gceSTATUS;
+ #   define gcmBEGINSECUREUSER() \
+         __secure_user_offset__ = reserve->lastOffset; \
+         \
+-        __secure_user_hintArray__ = reserve->hintArrayTail
++        __secure_user_hintArray__ = gcmUINT64_TO_PTR(reserve->hintArrayTail)
+ 
+ #   define gcmENDSECUREUSER() \
+-        reserve->hintArrayTail = __secure_user_hintArray__
++        reserve->hintArrayTail = gcmPTR_TO_UINT64(__secure_user_hintArray__)
+ 
+ #   define gcmSKIPSECUREUSER() \
+         __secure_user_offset__ += gcmSIZEOF(gctUINT32)
+@@ -682,7 +680,7 @@ gceSTATUS;
+         Hardware->buffer, ReserveSize, gcvTRUE, &CommandBuffer \
+         )); \
+     \
+-    Memory = (gctUINT32_PTR) CommandBuffer->lastReserve; \
++    Memory =  gcmUINT64_TO_PTR(CommandBuffer->lastReserve); \
+     \
+     StateDelta = Hardware->delta; \
+     \
+@@ -694,7 +692,7 @@ gceSTATUS;
+     gcmENDSECUREUSER(); \
+     \
+     gcmASSERT( \
+-        ((gctUINT8_PTR) CommandBuffer->lastReserve) + ReserveSize \
++        gcmUINT64_TO_TYPE(CommandBuffer->lastReserve, gctUINT8_PTR) + ReserveSize \
+         == \
+          (gctUINT8_PTR) Memory \
+         ); \
+@@ -704,7 +702,8 @@ gceSTATUS;
+ 
+ #define gcmBEGINSTATEBATCH(CommandBuffer, Memory, FixedPoint, Address, Count) \
+ { \
+-    gcmASSERT(((Memory - (gctUINT32_PTR) CommandBuffer->lastReserve) & 1) == 0); \
++    gcmASSERT(((Memory - gcmUINT64_TO_TYPE(CommandBuffer->lastReserve, gctUINT32_PTR)) & 1) == 0); \
++    gcmASSERT((gctUINT32)Count <= 1024); \
+     \
+     gcmVERIFYLOADSTATEDONE(CommandBuffer); \
+     \
+@@ -723,7 +722,7 @@ gceSTATUS;
+ { \
+     gcmVERIFYLOADSTATEDONE(CommandBuffer); \
+     \
+-    gcmASSERT(((Memory - (gctUINT32_PTR) CommandBuffer->lastReserve) & 1) == 0); \
++    gcmASSERT(((Memory - gcmUINT64_TO_TYPE(CommandBuffer->lastReserve, gctUINT32_PTR)) & 1) == 0); \
+ }
+ 
+ /*----------------------------------------------------------------------------*/
+@@ -902,13 +901,13 @@ gceSTATUS;
+ typedef struct _gcsDATABASE_COUNTERS
+ {
+     /* Number of currently allocated bytes. */
+-    gctSIZE_T                   bytes;
++    gctUINT64                   bytes;
+ 
+     /* Maximum number of bytes allocated (memory footprint). */
+-    gctSIZE_T                   maxBytes;
++    gctUINT64                   maxBytes;
+ 
+     /* Total number of bytes allocated. */
+-    gctSIZE_T                   totalBytes;
++    gctUINT64                   totalBytes;
+ }
+ gcsDATABASE_COUNTERS;
+ 
+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
+index f98742e..2881604 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_version.h
++++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_version.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #ifndef __gc_hal_version_h_
+ #define __gc_hal_version_h_
+ 
+@@ -30,7 +28,7 @@
+ 
+ #define gcvVERSION_PATCH        9
+ 
+-#define gcvVERSION_BUILD        1478
++#define gcvVERSION_BUILD     1210
+ 
+ #define gcvVERSION_DATE      __DATE__
+ 
+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
+index 8731137..5ff0281 100644
+--- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_vg.h
++++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_vg.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,9 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+-
+ #ifndef __gc_hal_vg_h_
+ #define __gc_hal_vg_h_
+ 
+@@ -588,7 +585,7 @@ typedef struct _gcsCMDBUFFER
+     /* The user sets this to the node of the container buffer whitin which
+        this particular command buffer resides. The kernel sets this to the
+        node of the internally allocated buffer. */
+-    gcuVIDMEM_NODE_PTR          node;
++    gctUINT64                   node;
+ 
+     /* Command buffer hardware address. */
+     gctUINT32                   address;
+diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_debug.h b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_debug.h
+index a6754fe..339dff4 100644
+--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_debug.h
++++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_debug.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #ifndef __gc_hal_kernel_debug_h_
+ #define __gc_hal_kernel_debug_h_
+ 
+diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_debugfs.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_debugfs.c
+index 99d7d9a..6bdc5a6 100644
+--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_debugfs.c
++++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_debugfs.c
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_debugfs.h b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_debugfs.h
+index e0b6142..78d8199 100644
+--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_debugfs.h
++++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_debugfs.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #include <stdarg.h>
+ 
+ #ifndef __gc_hal_kernel_debugfs_h_
+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
+index 7690bb2..7168f0e 100644
+--- 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
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #include "gc_hal_kernel_linux.h"
+ #include <linux/pagemap.h>
+ #include <linux/seq_file.h>
+@@ -320,6 +318,7 @@ gckGALDEVICE_Construct(
+     gctINT32 i;
+     gceHARDWARE_TYPE type;
+     gckDB sharedDB = gcvNULL;
++    gckKERNEL kernel = gcvNULL;
+ 
+     gcmkHEADER_ARG("IrqLine=%d RegisterMemBase=0x%08x RegisterMemSize=%u "
+                    "IrqLine2D=%d RegisterMemBase2D=0x%08x RegisterMemSize2D=%u "
+@@ -692,6 +691,16 @@ gckGALDEVICE_Construct(
+     }
+ 
+ 
++    /* Grab the first availiable kernel */
++    for (i = 0; i < gcdMAX_GPU_COUNT; i++)
++    {
++        if (device->irqLines[i] != -1)
++        {
++            kernel = device->kernels[i];
++            break;
++        }
++    }
++
+     /* Set up the internal memory region. */
+     if (device->internalSize > 0)
+     {
+@@ -718,6 +727,7 @@ gckGALDEVICE_Construct(
+             }
+ 
+             device->internalPhysical = (gctPHYS_ADDR)(gctUINTPTR_T) physical;
++            device->internalPhysicalName = gcmPTR_TO_NAME(device->internalPhysical);
+             physical += device->internalSize;
+         }
+     }
+@@ -748,6 +758,7 @@ gckGALDEVICE_Construct(
+             }
+ 
+             device->externalPhysical = (gctPHYS_ADDR)(gctUINTPTR_T) physical;
++            device->externalPhysicalName = gcmPTR_TO_NAME(device->externalPhysical);
+             physical += device->externalSize;
+         }
+     }
+@@ -772,6 +783,7 @@ gckGALDEVICE_Construct(
+ 
+                 if (gcmIS_SUCCESS(status))
+                 {
++                    device->contiguousPhysicalName = gcmPTR_TO_NAME(device->contiguousPhysical);
+                     status = gckVIDMEM_Construct(
+                         device->os,
+                         physAddr | device->systemMemoryBaseAddress,
+@@ -792,6 +804,7 @@ gckGALDEVICE_Construct(
+                         device->contiguousPhysical
+                         ));
+ 
++                    gcmRELEASE_NAME(device->contiguousPhysicalName);
+                     device->contiguousBase     = gcvNULL;
+                     device->contiguousPhysical = gcvNULL;
+                 }
+@@ -864,6 +877,7 @@ gckGALDEVICE_Construct(
+ #endif
+ 
+                 device->contiguousPhysical = gcvNULL;
++                device->contiguousPhysicalName = 0;
+                 device->contiguousSize     = ContiguousSize;
+                 device->contiguousMapped   = gcvTRUE;
+             }
+@@ -908,11 +922,38 @@ gckGALDEVICE_Destroy(
+ {
+     gctINT i;
+     gceSTATUS status = gcvSTATUS_OK;
++    gckKERNEL kernel = gcvNULL;
+ 
+     gcmkHEADER_ARG("Device=0x%x", Device);
+ 
+     if (Device != gcvNULL)
+     {
++        /* Grab the first availiable kernel */
++        for (i = 0; i < gcdMAX_GPU_COUNT; i++)
++        {
++            if (Device->irqLines[i] != -1)
++            {
++                kernel = Device->kernels[i];
++                break;
++            }
++        }
++        if (Device->internalPhysicalName != 0)
++        {
++            gcmRELEASE_NAME(Device->internalPhysicalName);
++            Device->internalPhysicalName = 0;
++        }
++        if (Device->externalPhysicalName != 0)
++        {
++            gcmRELEASE_NAME(Device->externalPhysicalName);
++            Device->externalPhysicalName = 0;
++        }
++        if (Device->contiguousPhysicalName != 0)
++        {
++            gcmRELEASE_NAME(Device->contiguousPhysicalName);
++            Device->contiguousPhysicalName = 0;
++        }
++
++
+         for (i = 0; i < gcdMAX_GPU_COUNT; i++)
+         {
+             if (Device->kernels[i] != gcvNULL)
+@@ -1050,7 +1091,19 @@ gckGALDEVICE_Destroy(
+            Device->clk_vg_axi = NULL;
+         }
+ 
++#ifdef CONFIG_PM
++        if(Device->pmdev)
++            pm_runtime_disable(Device->pmdev);
++#endif
+ 
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
++        /*NULL*/
++#else
++        if (Device->gpu_regulator) {
++           regulator_put(Device->gpu_regulator);
++           Device->gpu_regulator = NULL;
++        }
++#endif
+ 
+         /* Destroy the gckOS object. */
+         if (Device->os != gcvNULL)
+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
+index f990adf..460f022 100644
+--- 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
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #ifndef __gc_hal_kernel_device_h_
+ #define __gc_hal_kernel_device_h_
+ 
+@@ -37,15 +35,18 @@ typedef struct _gckGALDEVICE
+     /* Attributes. */
+     gctSIZE_T           internalSize;
+     gctPHYS_ADDR        internalPhysical;
++    gctUINT32           internalPhysicalName;
+     gctPOINTER          internalLogical;
+     gckVIDMEM           internalVidMem;
+     gctSIZE_T           externalSize;
+     gctPHYS_ADDR        externalPhysical;
++    gctUINT32           externalPhysicalName;
+     gctPOINTER          externalLogical;
+     gckVIDMEM           externalVidMem;
+     gckVIDMEM           contiguousVidMem;
+     gctPOINTER          contiguousBase;
+     gctPHYS_ADDR        contiguousPhysical;
++    gctUINT32           contiguousPhysicalName;
+     gctSIZE_T           contiguousSize;
+     gctBOOL             contiguousMapped;
+     gctPOINTER          contiguousMappedUser;
+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
+index c691b35..4e3819c 100644
+--- 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
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *    Copyright (C) 2011-2012 Freescale Semiconductor, Inc.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+@@ -20,8 +20,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #include <linux/device.h>
+ #include <linux/slab.h>
+ #include <linux/notifier.h>
+@@ -180,6 +178,9 @@ static struct file_operations driver_fops =
+     .open       = drv_open,
+     .release    = drv_release,
+     .unlocked_ioctl = drv_ioctl,
++#ifdef HAVE_COMPAT_IOCTL
++    .compat_ioctl = drv_ioctl,
++#endif
+     .mmap       = drv_mmap,
+ };
+ 
+@@ -492,7 +493,7 @@ long drv_ioctl(
+     }
+ 
+     copyLen = copy_from_user(
+-        &iface, drvArgs.InputBuffer, sizeof(gcsHAL_INTERFACE)
++        &iface, gcmUINT64_TO_PTR(drvArgs.InputBuffer), sizeof(gcsHAL_INTERFACE)
+         );
+ 
+     if (copyLen != 0)
+@@ -570,25 +571,26 @@ long drv_ioctl(
+ 
+     if (gcmIS_SUCCESS(status) && (iface.command == gcvHAL_LOCK_VIDEO_MEMORY))
+     {
++        gcuVIDMEM_NODE_PTR node = gcmUINT64_TO_PTR(iface.u.LockVideoMemory.node);
+         /* Special case for mapped memory. */
+         if ((data->mappedMemory != gcvNULL)
+-        &&  (iface.u.LockVideoMemory.node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
++        &&  (node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
+         )
+         {
+             /* Compute offset into mapped memory. */
+             gctUINT32 offset
+-                = (gctUINT8 *) iface.u.LockVideoMemory.memory
++                = (gctUINT8 *) gcmUINT64_TO_PTR(iface.u.LockVideoMemory.memory)
+                 - (gctUINT8 *) device->contiguousBase;
+ 
+             /* Compute offset into user-mapped region. */
+             iface.u.LockVideoMemory.memory =
+-                (gctUINT8 *) data->mappedMemory + offset;
++                gcmPTR_TO_UINT64((gctUINT8 *) data->mappedMemory + offset);
+         }
+     }
+ 
+     /* Copy data back to the user. */
+     copyLen = copy_to_user(
+-        drvArgs.OutputBuffer, &iface, sizeof(gcsHAL_INTERFACE)
++        gcmUINT64_TO_PTR(drvArgs.OutputBuffer), &iface, sizeof(gcsHAL_INTERFACE)
+         );
+ 
+     if (copyLen != 0)
+@@ -616,7 +618,7 @@ static int drv_mmap(
+     struct vm_area_struct* vma
+     )
+ {
+-    gceSTATUS status;
++    gceSTATUS status = gcvSTATUS_OK;
+     gcsHAL_PRIVATE_DATA_PTR data;
+     gckGALDEVICE device;
+ 
+@@ -704,11 +706,12 @@ static int drv_mmap(
+         }
+ 
+         data->mappedMemory = (gctPOINTER) vma->vm_start;
++
++        /* Success. */
++        gcmkFOOTER_NO();
++        return 0;
+     }
+ 
+-    /* Success. */
+-    gcmkFOOTER_NO();
+-    return 0;
+ 
+ OnError:
+     gcmkFOOTER();
+diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.c
+index cba2040..22c4071 100644
+--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.c
++++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.c
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #include "gc_hal_kernel_linux.h"
+ 
+ #define _GC_OBJ_ZONE    gcvZONE_KERNEL
+@@ -65,15 +63,15 @@ gckKERNEL_QueryVideoMemory(
+ 
+     /* Get internal memory size and physical address. */
+     Interface->u.QueryVideoMemory.internalSize = device->internalSize;
+-    Interface->u.QueryVideoMemory.internalPhysical = device->internalPhysical;
++    Interface->u.QueryVideoMemory.internalPhysical = device->internalPhysicalName;
+ 
+     /* Get external memory size and physical address. */
+     Interface->u.QueryVideoMemory.externalSize = device->externalSize;
+-    Interface->u.QueryVideoMemory.externalPhysical = device->externalPhysical;
++    Interface->u.QueryVideoMemory.externalPhysical = device->externalPhysicalName;
+ 
+     /* Get contiguous memory size and physical address. */
+     Interface->u.QueryVideoMemory.contiguousSize = device->contiguousSize;
+-    Interface->u.QueryVideoMemory.contiguousPhysical = device->contiguousPhysical;
++    Interface->u.QueryVideoMemory.contiguousPhysical = device->contiguousPhysicalName;
+ 
+     /* Success. */
+     gcmkFOOTER_NO();
+@@ -181,7 +179,10 @@ gckKERNEL_MapMemory(
+     OUT gctPOINTER * Logical
+     )
+ {
+-    return gckOS_MapMemory(Kernel->os, Physical, Bytes, Logical);
++    gckKERNEL kernel = Kernel;
++    gctPHYS_ADDR physical = gcmNAME_TO_PTR(Physical);
++
++    return gckOS_MapMemory(Kernel->os, physical, Bytes, Logical);
+ }
+ 
+ /*******************************************************************************
+@@ -216,7 +217,10 @@ gckKERNEL_UnmapMemory(
+     IN gctPOINTER Logical
+     )
+ {
+-    return gckOS_UnmapMemory(Kernel->os, Physical, Bytes, Logical);
++    gckKERNEL kernel = Kernel;
++    gctPHYS_ADDR physical = gcmNAME_TO_PTR(Physical);
++
++    return gckOS_UnmapMemory(Kernel->os, physical, Bytes, Logical);
+ }
+ 
+ /*******************************************************************************
+diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.h b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.h
+index a6ed03f..9c0bcd5 100644
+--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.h
++++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.h
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #ifndef __gc_hal_kernel_linux_h_
+ #define __gc_hal_kernel_linux_h_
+ 
+diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_math.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_math.c
+index a4cb717..992aeff 100644
+--- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_math.c
++++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_math.c
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #include "gc_hal_kernel_linux.h"
+ 
+ gctINT
+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
+index af20f0b..c07ded8 100644
+--- 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
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #include "gc_hal_kernel_linux.h"
+ 
+ #include <linux/pagemap.h>
+@@ -1873,12 +1871,14 @@ gckOS_AllocateNonPagedMemory(
+     mdl->kaddr      = vaddr;
+     mdl->u.contiguousPages = page;
+ 
++#if !defined(CONFIG_PPC)
+     /* Cache invalidate. */
+     dma_sync_single_for_device(
+                 gcvNULL,
+                 page_to_phys(page),
+                 bytes,
+                 DMA_FROM_DEVICE);
++#endif
+ 
+     while (size > 0)
+     {
+@@ -3851,7 +3851,7 @@ gckOS_AllocatePagedMemoryEx(
+         {
+             gcmkVERIFY_OK(
+                 gckOS_CacheFlush(Os, _GetProcessID(), gcvNULL,
+-                                 (gctPOINTER)page_to_phys(page),
++                                 (gctPOINTER)(gctUINTPTR_T)page_to_phys(page),
+                                  page_address(page),
+                                  PAGE_SIZE));
+         }
+@@ -5333,7 +5333,7 @@ OnError:
+             {
+                 /* Flush(clean) the data cache. */
+                 gcmkONERROR(gckOS_CacheFlush(Os, _GetProcessID(), gcvNULL,
+-                                 (gctPOINTER)page_to_phys(pages[i]),
++                                 (gctPOINTER)(gctUINTPTR_T)page_to_phys(pages[i]),
+                                  (gctPOINTER)(memory & PAGE_MASK) + i*PAGE_SIZE,
+                                  PAGE_SIZE));
+             }
+@@ -6020,6 +6020,10 @@ gckOS_CacheClean(
+ 
+     dma_cache_wback((unsigned long) Logical, Bytes);
+ 
++#elif defined(CONFIG_PPC)
++
++    /* TODO */
++
+ #else
+     dma_sync_single_for_device(
+               gcvNULL,
+@@ -6097,6 +6101,8 @@ gckOS_CacheInvalidate(
+ 
+ #elif defined(CONFIG_MIPS)
+     dma_cache_inv((unsigned long) Logical, Bytes);
++#elif defined(CONFIG_PPC)
++    /* TODO */
+ #else
+     dma_sync_single_for_device(
+               gcvNULL,
+@@ -6169,6 +6175,8 @@ gckOS_CacheFlush(
+ 
+ #elif defined(CONFIG_MIPS)
+     dma_cache_wback_inv((unsigned long) Logical, Bytes);
++#elif defined(CONFIG_PPC)
++    /* TODO */
+ #else
+     dma_sync_single_for_device(
+               gcvNULL,
+@@ -6921,6 +6929,134 @@ gckOS_ResetGPU(
+     return gcvSTATUS_OK;
+ }
+ 
++/*******************************************************************************
++**
++**  gckOS_PrepareGPUFrequency
++**
++**  Prepare to set GPU frequency and voltage.
++**
++**  INPUT:
++**
++**      gckOS Os
++**          Pointer to a gckOS object.
++**
++**      gckCORE Core
++**          GPU whose frequency and voltage will be set.
++**
++**  OUTPUT:
++**
++**      Nothing.
++*/
++gceSTATUS
++gckOS_PrepareGPUFrequency(
++    IN gckOS Os,
++    IN gceCORE Core
++    )
++{
++    return gcvSTATUS_OK;
++}
++
++/*******************************************************************************
++**
++**  gckOS_FinishGPUFrequency
++**
++**  Finish GPU frequency setting.
++**
++**  INPUT:
++**
++**      gckOS Os
++**          Pointer to a gckOS object.
++**
++**      gckCORE Core
++**          GPU whose frequency and voltage is set.
++**
++**  OUTPUT:
++**
++**      Nothing.
++*/
++gceSTATUS
++gckOS_FinishGPUFrequency(
++    IN gckOS Os,
++    IN gceCORE Core
++    )
++{
++    return gcvSTATUS_OK;
++}
++
++/*******************************************************************************
++**
++**  gckOS_QueryGPUFrequency
++**
++**  Query the current frequency of the GPU.
++**
++**  INPUT:
++**
++**      gckOS Os
++**          Pointer to a gckOS object.
++**
++**      gckCORE Core
++**          GPU whose power is set.
++**
++**      gctUINT32 * Frequency
++**          Pointer to a gctUINT32 to obtain current frequency, in MHz.
++**
++**      gctUINT8 * Scale
++**          Pointer to a gctUINT8 to obtain current scale(1 - 64).
++**
++**  OUTPUT:
++**
++**      Nothing.
++*/
++gceSTATUS
++gckOS_QueryGPUFrequency(
++    IN gckOS Os,
++    IN gceCORE Core,
++    OUT gctUINT32 * Frequency,
++    OUT gctUINT8 * Scale
++    )
++{
++    return gcvSTATUS_OK;
++}
++
++/*******************************************************************************
++**
++**  gckOS_SetGPUFrequency
++**
++**  Set frequency and voltage of the GPU.
++**
++**      1. DVFS manager gives the target scale of full frequency, BSP must find
++**         a real frequency according to this scale and board's configure.
++**
++**      2. BSP should find a suitable voltage for this frequency.
++**
++**      3. BSP must make sure setting take effect before this function returns.
++**
++**  INPUT:
++**
++**      gckOS Os
++**          Pointer to a gckOS object.
++**
++**      gckCORE Core
++**          GPU whose power is set.
++**
++**      gctUINT8 Scale
++**          Target scale of full frequency, range is [1, 64]. 1 means 1/64 of
++**          full frequency and 64 means 64/64 of full frequency.
++**
++**  OUTPUT:
++**
++**      Nothing.
++*/
++gceSTATUS
++gckOS_SetGPUFrequency(
++    IN gckOS Os,
++    IN gceCORE Core,
++    IN gctUINT8 Scale
++    )
++{
++    return gcvSTATUS_OK;
++}
++
+ /*----------------------------------------------------------------------------*/
+ /*----- Profile --------------------------------------------------------------*/
+ 
+@@ -7669,8 +7805,14 @@ gckOS_CreateUserSignal(
+     OUT gctINT * SignalID
+     )
+ {
++    gceSTATUS status;
++    gctSIZE_T signal;
++
+     /* Create a new signal. */
+-    return gckOS_CreateSignal(Os, ManualReset, (gctSIGNAL *) SignalID);
++    status = gckOS_CreateSignal(Os, ManualReset, (gctSIGNAL *) &signal);
++    *SignalID = (gctINT) signal;
++
++    return status;
+ }
+ 
+ /*******************************************************************************
+@@ -8102,7 +8244,7 @@ OnError:
+ 
+ /*******************************************************************************
+ **
+-**  gckOS_DestoryTimer
++**  gckOS_DestroyTimer
+ **
+ **  Destory a software timer.
+ **
+@@ -8119,7 +8261,7 @@ OnError:
+ **      Nothing.
+ */
+ gceSTATUS
+-gckOS_DestoryTimer(
++gckOS_DestroyTimer(
+     IN gckOS Os,
+     IN gctPOINTER Timer
+     )
+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
+index 577fb38..e970477 100644
+--- 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
+@@ -1,6 +1,6 @@
+ /****************************************************************************
+ *
+-*    Copyright (C) 2005 - 2012 by Vivante Corp.
++*    Copyright (C) 2005 - 2013 by Vivante Corp.
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+@@ -19,8 +19,6 @@
+ *****************************************************************************/
+ 
+ 
+-
+-
+ #ifndef __gc_hal_kernel_os_h_
+ #define __gc_hal_kernel_os_h_
+ 
+@@ -71,10 +69,10 @@ FindMdlMap(
+ 
+ typedef struct _DRIVER_ARGS
+ {
+-    gctPOINTER              InputBuffer;
+-    gctUINT32               InputBufferSize;
+-    gctPOINTER              OutputBuffer;
+-    gctUINT32               OutputBufferSize;
++    gctUINT64               InputBuffer;
++    gctUINT64               InputBufferSize;
++    gctUINT64               OutputBuffer;
++    gctUINT64               OutputBufferSize;
+ }
+ DRIVER_ARGS;
+ 
+-- 
+1.8.3.1
+
diff --git a/recipes-kernel/linux/linux-wandboard-3.0.35/defconfig b/recipes-kernel/linux/linux-wandboard-3.0.35/defconfig
index 9e25aea..2e443c6 100644
--- a/recipes-kernel/linux/linux-wandboard-3.0.35/defconfig
+++ b/recipes-kernel/linux/linux-wandboard-3.0.35/defconfig
@@ -1,19 +1,27 @@ 
 CONFIG_EXPERIMENTAL=y
-CONFIG_LOCALVERSION="-wandboard+yocto"
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_KERNEL_LZMA=y
+CONFIG_DEFAULT_HOSTNAME="wandboard"
 CONFIG_SYSVIPC=y
-CONFIG_IKCONFIG=y
-CONFIG_IKCONFIG_PROC=y
 CONFIG_LOG_BUF_SHIFT=14
 CONFIG_CGROUPS=y
+CONFIG_CGROUP_SCHED=y
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+# CONFIG_BUG is not set
+# CONFIG_ELF_CORE is not set
+CONFIG_ASHMEM=y
+# CONFIG_AIO is not set
 CONFIG_EMBEDDED=y
 CONFIG_PERF_EVENTS=y
+# CONFIG_VM_EVENT_COUNTERS is not set
+CONFIG_SLAB=y
 CONFIG_MODULES=y
+CONFIG_MODULE_FORCE_LOAD=y
 CONFIG_MODULE_UNLOAD=y
-CONFIG_MODULE_FORCE_UNLOAD=y
 CONFIG_MODVERSIONS=y
 # CONFIG_BLK_DEV_BSG is not set
+# CONFIG_IOSCHED_DEADLINE is not set
 CONFIG_ARCH_MXC=y
-CONFIG_GPIO_PCA953X=y
 CONFIG_ARCH_MX6=y
 CONFIG_FORCE_MAX_ZONEORDER=14
 CONFIG_MACH_WANDBOARD=y
@@ -21,42 +29,33 @@  CONFIG_IMX_PCIE=y
 CONFIG_USB_EHCI_ARC_H1=y
 CONFIG_USB_FSL_ARC_OTG=y
 # CONFIG_ISP1504_MXC is not set
-CONFIG_MXC_PWM=y
-CONFIG_MXC_REBOOT_MFGMODE=y
-CONFIG_CLK_DEBUG=y
-CONFIG_DMA_ZONE_SIZE=184
+CONFIG_DMA_ZONE_SIZE=96
+CONFIG_ARM_THUMBEE=y
 # CONFIG_SWP_EMULATE is not set
 CONFIG_ARM_ERRATA_743622=y
-CONFIG_ARM_ERRATA_751472=y
-CONFIG_ARM_ERRATA_754322=y
-CONFIG_ARM_ERRATA_764369=y
+CONFIG_ARM_ERRATA_753970=y
+CONFIG_PCIEPORTBUS=y
 CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
 CONFIG_SMP=y
-CONFIG_VMSPLIT_2G=y
 CONFIG_PREEMPT=y
 CONFIG_AEABI=y
 # CONFIG_OABI_COMPAT is not set
 CONFIG_HIGHMEM=y
 CONFIG_COMPACTION=y
 CONFIG_KSM=y
+CONFIG_ARM_FLUSH_CONSOLE_ON_RESTART=y
 CONFIG_ZBOOT_ROM_TEXT=0x0
 CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="noinitrd console=ttymxc0,115200 root=/dev/mtdblock2 rw rootfstype=jffs2 ip=off"
+CONFIG_CMDLINE="noinitrd console=ttymxc0,115200"
 CONFIG_CPU_FREQ=y
-CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE=y
-CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
-CONFIG_CPU_FREQ_GOV_POWERSAVE=y
-CONFIG_CPU_FREQ_GOV_USERSPACE=y
-CONFIG_CPU_FREQ_GOV_ONDEMAND=y
-CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
 CONFIG_CPU_FREQ_IMX=y
+CONFIG_CPU_IDLE=y
 CONFIG_VFP=y
 CONFIG_NEON=y
-# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
-CONFIG_SUSPEND_DEVICE_TIME_DEBUG=y
 CONFIG_PM_RUNTIME=y
-CONFIG_PM_DEBUG=y
 CONFIG_APM_EMULATION=y
 CONFIG_NET=y
 CONFIG_PACKET=y
@@ -65,234 +64,167 @@  CONFIG_INET=y
 CONFIG_IP_MULTICAST=y
 CONFIG_IP_PNP=y
 CONFIG_IP_PNP_DHCP=y
-CONFIG_IP_PNP_BOOTP=y
-# CONFIG_INET_LRO is not set
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
 # CONFIG_IPV6 is not set
-CONFIG_NETFILTER=y
-CONFIG_LLC2=y
-CONFIG_CAN=y
-CONFIG_CAN_RAW=y
-CONFIG_CAN_BCM=y
-CONFIG_CAN_VCAN=y
+# CONFIG_ANDROID_PARANOID_NETWORK is not set
+# CONFIG_NET_ACTIVITY_STATS is not set
 CONFIG_BT=y
 CONFIG_BT_L2CAP=y
 CONFIG_BT_SCO=y
 CONFIG_BT_RFCOMM=y
-CONFIG_BT_RFCOMM_TTY=y
 CONFIG_BT_BNEP=y
 CONFIG_BT_BNEP_MC_FILTER=y
-CONFIG_BT_BNEP_PROTO_FILTER=y
 CONFIG_BT_HIDP=y
-CONFIG_BT_HCIBTUSB=y
+CONFIG_BT_HCIBTUSB=m
 CONFIG_BT_HCIUART=y
-CONFIG_BT_HCIUART_ATH3K=y
-CONFIG_BT_HCIVHCI=y
+CONFIG_BT_HCIUART_H4=y
 CONFIG_CFG80211=y
-CONFIG_RFKILL=y
-CONFIG_RFKILL_INPUT=y
+# CONFIG_CFG80211_DEFAULT_PS is not set
+# CONFIG_WIRELESS_EXT_SYSFS is not set
+CONFIG_RFKILL_REGULATOR=y
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
-CONFIG_CONNECTOR=y
-CONFIG_MTD=y
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_BLOCK=y
-CONFIG_MTD_CFI=y
-CONFIG_MTD_CFI_AMDSTD=y
-CONFIG_MTD_PHYSMAP=y
-CONFIG_MTD_M25P80=y
-CONFIG_MTD_NAND=y
-CONFIG_MTD_NAND_GPMI_NAND=y
-CONFIG_MTD_UBI=y
-CONFIG_BLK_DEV_LOOP=y
-CONFIG_MISC_DEVICES=y
-CONFIG_MXS_PERFMON=m
+# CONFIG_STANDALONE is not set
+CONFIG_SCSI=y
+# CONFIG_SCSI_PROC_FS is not set
 CONFIG_BLK_DEV_SD=y
-CONFIG_SCSI_MULTI_LUN=y
-CONFIG_ATA=y
-# CONFIG_SATA_PMP is not set
-CONFIG_SATA_AHCI_PLATFORM=y
+# CONFIG_SCSI_WAIT_SCAN is not set
+# CONFIG_SCSI_LOWLEVEL is not set
 CONFIG_NETDEVICES=y
-CONFIG_MICREL_PHY=y
 CONFIG_NET_ETHERNET=y
-CONFIG_SMSC911X=y
 CONFIG_FEC_NAPI=y
 # CONFIG_NETDEV_1000 is not set
 # CONFIG_NETDEV_10000 is not set
-CONFIG_ATH_COMMON=m
-CONFIG_ATH6KL=m
 CONFIG_BRCMFMAC=m
-CONFIG_BRCMDBG=y
-CONFIG_HOSTAP=y
-CONFIG_INPUT_POLLDEV=y
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1280
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=720
 CONFIG_INPUT_EVDEV=y
-CONFIG_KEYBOARD_GPIO=y
+# CONFIG_INPUT_KEYBOARD is not set
 # CONFIG_INPUT_MOUSE is not set
-CONFIG_INPUT_TOUCHSCREEN=y
-CONFIG_TOUCHSCREEN_EGALAX=y
-CONFIG_TOUCHSCREEN_ELAN=y
-CONFIG_TOUCHSCREEN_MAX11801=y
-CONFIG_INPUT_MISC=y
-CONFIG_INPUT_UINPUT=y
-CONFIG_INPUT_ISL29023=y
-CONFIG_VT_HW_CONSOLE_BINDING=y
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_CONSOLE_TRANSLATIONS is not set
+# CONFIG_LEGACY_PTYS is not set
+# CONFIG_DEVMEM is not set
+# CONFIG_DEVKMEM is not set
 CONFIG_SERIAL_IMX=y
 CONFIG_SERIAL_IMX_CONSOLE=y
-CONFIG_FSL_OTP=y
-CONFIG_HW_RANDOM=y
-CONFIG_MXS_VIIM=y
-CONFIG_I2C=y
+# CONFIG_HW_RANDOM is not set
+# CONFIG_I2C_COMPAT is not set
 CONFIG_I2C_CHARDEV=y
 CONFIG_I2C_IMX=y
 CONFIG_SPI=y
 CONFIG_SPI_IMX=y
 CONFIG_GPIO_SYSFS=y
-CONFIG_SABRESD_MAX8903=y
-CONFIG_SENSORS_MAX17135=y
-CONFIG_SENSORS_MAG3110=y
-# CONFIG_MXC_MMA8450 is not set
+# CONFIG_HWMON is not set
 CONFIG_WATCHDOG=y
-CONFIG_WATCHDOG_NOWAYOUT=y
 CONFIG_IMX2_WDT=y
-CONFIG_MFD_WM8994=y
-CONFIG_MFD_PFUZE=y
-CONFIG_MFD_MAX17135=y
 CONFIG_REGULATOR=y
+CONFIG_REGULATOR_DUMMY=y
 CONFIG_REGULATOR_FIXED_VOLTAGE=y
-CONFIG_REGULATOR_PFUZE100=y
-CONFIG_REGULATOR_MAX17135=y
 CONFIG_MEDIA_SUPPORT=y
 CONFIG_VIDEO_DEV=y
 # CONFIG_RC_CORE is not set
 # CONFIG_MEDIA_TUNER_CUSTOMISE is not set
-CONFIG_VIDEO_MXC_CAMERA=m
-CONFIG_MXC_CAMERA_OV3640=m
-CONFIG_MXC_CAMERA_OV5640=m
-CONFIG_MXC_CAMERA_OV8820_MIPI=m
-CONFIG_MXC_CAMERA_OV5642=m
-CONFIG_MXC_CAMERA_OV5640_MIPI=m
-CONFIG_MXC_IPU_DEVICE_QUEUE_SDC=m
-CONFIG_USB_VIDEO_CLASS=m
+# CONFIG_VIDEO_MXC_CAMERA is not set
+CONFIG_USB_VIDEO_CLASS=y
+# CONFIG_USB_GSPCA is not set
 # CONFIG_RADIO_ADAPTERS is not set
-CONFIG_DRM=m
-CONFIG_DRM_VIVANTE=m
+CONFIG_DRM=y
+CONFIG_DRM_VIVANTE=y
+CONFIG_VIDEO_OUTPUT_CONTROL=y
 CONFIG_FB=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
-# CONFIG_LCD_CLASS_DEVICE is not set
-CONFIG_BACKLIGHT_CLASS_DEVICE=y
-# CONFIG_BACKLIGHT_GENERIC is not set
-CONFIG_BACKLIGHT_PWM=y
+CONFIG_DISPLAY_SUPPORT=y
 CONFIG_FB_MXC_LDB=y
-CONFIG_FB_MXC_MIPI_DSI=y
-CONFIG_FB_MXC_TRULY_WVGA_SYNC_PANEL=y
-CONFIG_FB_MXC_EINK_PANEL=y
 CONFIG_FB_MXC_HDMI=y
 CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
 CONFIG_FONTS=y
 CONFIG_FONT_8x16=y
+CONFIG_FONT_10x18=y
 CONFIG_LOGO=y
+# CONFIG_LOGO_LINUX_MONO is not set
+# CONFIG_LOGO_LINUX_VGA16 is not set
 CONFIG_SOUND=y
 CONFIG_SND=y
+# CONFIG_SND_SUPPORT_OLD_API is not set
+# CONFIG_SND_VERBOSE_PROCFS is not set
+# CONFIG_SND_DRIVERS is not set
+# CONFIG_SND_ARM is not set
+# CONFIG_SND_SPI is not set
 CONFIG_SND_USB_AUDIO=y
 CONFIG_SND_SOC=y
 CONFIG_SND_IMX_SOC=y
 CONFIG_SND_SOC_IMX_SGTL5000=y
-CONFIG_SND_SOC_IMX_WM8962=y
 CONFIG_SND_SOC_IMX_SPDIF=y
 CONFIG_SND_SOC_IMX_HDMI=y
 CONFIG_HIDRAW=y
-CONFIG_HID_A4TECH=m
-CONFIG_HID_APPLE=m
-CONFIG_HID_BELKIN=m
-CONFIG_HID_CHERRY=m
-CONFIG_HID_CHICONY=m
-CONFIG_HID_CYPRESS=m
-CONFIG_HID_EZKEY=m
-CONFIG_HID_GYRATION=m
+CONFIG_USB_HIDDEV=y
 CONFIG_HID_LOGITECH=m
 CONFIG_HID_MICROSOFT=m
-CONFIG_HID_MONTEREY=m
-CONFIG_HID_PANTHERLORD=m
-CONFIG_HID_PETALYNX=m
-CONFIG_HID_SAMSUNG=m
 CONFIG_HID_SONY=m
-CONFIG_HID_SUNPLUS=m
 CONFIG_USB=y
+CONFIG_USB_DEVICEFS=y
 # CONFIG_USB_DEVICE_CLASS is not set
-CONFIG_USB_SUSPEND=y
-# CONFIG_USB_OTG_WHITELIST is not set
 CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_EHCI_ARC=y
 CONFIG_USB_EHCI_ROOT_HUB_TT=y
-# CONFIG_USB_EHCI_TT_NEWSCHED is not set
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
-CONFIG_USB_AUDIO=m
-CONFIG_USB_ETH=m
-CONFIG_USB_FILE_STORAGE=m
-CONFIG_USB_G_SERIAL=m
-CONFIG_MXC_OTG=y
+CONFIG_USB_GADGET_VBUS_DRAW=100
+CONFIG_USB_MASS_STORAGE=y
+CONFIG_USB_GPIO_VBUS=y
+CONFIG_USB_ULPI=y
 CONFIG_MMC=y
 CONFIG_MMC_UNSAFE_RESUME=y
+CONFIG_MMC_CLKGATE=y
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_PLTFM=y
 CONFIG_MMC_SDHCI_ESDHC_IMX=y
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-CONFIG_LEDS_GPIO=y
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_GPIO=y
-CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
 CONFIG_SWITCH=y
 CONFIG_RTC_CLASS=y
-CONFIG_RTC_INTF_DEV_UIE_EMUL=y
+# CONFIG_RTC_INTF_ALARM is not set
 CONFIG_RTC_DRV_SNVS=y
 CONFIG_DMADEVICES=y
-CONFIG_MXC_PXP_V2=y
 CONFIG_IMX_SDMA=y
+CONFIG_STAGING=y
+CONFIG_ZRAM=y
 CONFIG_MXC_IPU=y
 CONFIG_MXC_SSI=y
 # CONFIG_MXC_HMP4E is not set
 # CONFIG_MXC_HWEVENT is not set
 CONFIG_MXC_ASRC=y
-CONFIG_MXC_MLB150=m
 CONFIG_MXC_GPU_VIV=y
-CONFIG_MXC_MIPI_CSI2=y
-CONFIG_EXT2_FS=y
-CONFIG_EXT3_FS=y
-# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
 CONFIG_EXT4_FS=y
-CONFIG_AUTOFS4_FS=m
-CONFIG_MSDOS_FS=y
+# CONFIG_DNOTIFY is not set
 CONFIG_VFAT_FS=y
+# CONFIG_PROC_PAGE_MONITOR is not set
 CONFIG_TMPFS=y
-CONFIG_JFFS2_FS=y
-CONFIG_UBIFS_FS=y
-CONFIG_CRAMFS=y
+# CONFIG_MISC_FILESYSTEMS is not set
 CONFIG_NFS_FS=y
 CONFIG_NFS_V3=y
+CONFIG_NFS_V4=y
+CONFIG_NFS_V4_1=y
 CONFIG_ROOT_NFS=y
 CONFIG_PARTITION_ADVANCED=y
 CONFIG_EFI_PARTITION=y
 CONFIG_NLS_CODEPAGE_437=y
-CONFIG_NLS_ASCII=m
+CONFIG_NLS_ASCII=y
 CONFIG_NLS_ISO8859_1=y
-CONFIG_NLS_UTF8=m
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_DEBUG_FS=y
+CONFIG_NLS_UTF8=y
+CONFIG_PRINTK_TIME=y
+CONFIG_FRAME_WARN=4096
+CONFIG_STRIP_ASM_SYMS=y
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_SCHED_DEBUG is not set
+# CONFIG_STACKTRACE is not set
+# CONFIG_RCU_CPU_STALL_VERBOSE is not set
 CONFIG_SYSCTL_SYSCALL_CHECK=y
-# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set
-CONFIG_CRYPTO_TEST=m
-CONFIG_CRYPTO_CCM=y
-CONFIG_CRYPTO_GCM=y
-CONFIG_CRYPTO_CBC=y
-CONFIG_CRYPTO_CTS=y
-CONFIG_CRYPTO_LRW=y
-CONFIG_CRYPTO_PCBC=y
-CONFIG_CRYPTO_XTS=y
-CONFIG_CRYPTO_DES=y
+# CONFIG_FTRACE is not set
+# CONFIG_ARM_UNWIND is not set
 # CONFIG_CRYPTO_ANSI_CPRNG is not set
-CONFIG_CRYPTO_DEV_FSL_CAAM=y
-CONFIG_CRYPTO_DEV_FSL_CAAM_SM=y
-CONFIG_CRYPTO_DEV_FSL_CAAM_SM_TEST=y
-CONFIG_CRYPTO_DEV_FSL_CAAM_SECVIO=y
-CONFIG_CRC_CCITT=m
+# CONFIG_CRYPTO_HW is not set
diff --git a/recipes-kernel/linux/linux-wandboard.inc b/recipes-kernel/linux/linux-wandboard.inc
index 41c1bfb..1cbe93e 100644
--- a/recipes-kernel/linux/linux-wandboard.inc
+++ b/recipes-kernel/linux/linux-wandboard.inc
@@ -1,4 +1,4 @@ 
-# Adapted from linux-imx.inc, copyright (C) 2012 O.S. Systems Software LTDA
+# Adapted from linux-imx.inc, copyright (C) 2012, 2013 O.S. Systems Software LTDA
 # Released under the MIT license (see COPYING.MIT for the terms)
 
 DESCRIPTION = "Linux kernel for Wandboard"
diff --git a/recipes-kernel/linux/linux-wandboard_3.0.35.bb b/recipes-kernel/linux/linux-wandboard_3.0.35.bb
index 0d23d4a..79fea5e 100644
--- a/recipes-kernel/linux/linux-wandboard_3.0.35.bb
+++ b/recipes-kernel/linux/linux-wandboard_3.0.35.bb
@@ -1,10 +1,12 @@ 
-# adapted from linux-imx.inc, copyright (C) 2012 O.S. Systems Software LTDA
+# adapted from linux-imx.inc, copyright (C) 2012-2013 O.S. Systems Software LTDA
 # Released under the MIT license (see COPYING.MIT for the terms)
 
 include linux-wandboard.inc
 
 # Wandboard branch
-SRCREV = "64fee2d5ee42688a813a33b0d2f047f3dcc6b56f"
+SRCREV = "86429847b5152f040f190015faedcac49b243328"
 LOCALVERSION = "-wandboard+yocto"
 
+SRC_URI += "file://0001-ENGR00251005-gpu-4.6.9p11-kernel-code-integration.patch"
+
 COMPATIBLE_MACHINE = "(wandboard)"