[Feature]Upload Modem source code

Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/tools/AutoGen/postBuild/AMMS_POSinfo.pm b/mcu/tools/AutoGen/postBuild/AMMS_POSinfo.pm
new file mode 100644
index 0000000..fcbabfe
--- /dev/null
+++ b/mcu/tools/AutoGen/postBuild/AMMS_POSinfo.pm
@@ -0,0 +1,98 @@
+#!/usr/bin/perl
+#
+#  Copyright Statement:
+#  --------------------
+#  This software is protected by Copyright and the information contained
+#  herein is confidential. The software may not be copied and the information
+#  contained herein may not be used or disclosed except with the written
+#  permission of MediaTek Inc. (C) 2006
+#
+#  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+#  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+#  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+#  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+#  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+#  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+#  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+#  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+#  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+#  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+#  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+#  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+#
+#  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+#  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+#  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+#  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+#  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+#
+#  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+#  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+#  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+#  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+#  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+#
+#*****************************************************************************
+#*
+#* Filename:
+#* ---------
+#*   AMMS_POSInfo.pm
+#*
+#* Project:
+#* --------
+#*
+#*
+#* Description:
+#* ------------
+#*   This script is used to get linker symbol for setting EMI RMPU
+#* 
+#*
+#* Author:
+#* -------
+#*   Tee-Yuen Chun (mtk10524)
+#*
+#*------------------------------------------------------------------------------
+#* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+#*============================================================================
+#****************************************************************************/
+
+BEGIN { push @INC, './tools/MemoryUtility/' }  # add additional library path
+use LinkerOutputParser;
+use CommonUtility;
+use FileInfoParser;
+
+package AMMS_POSinfo;
+
+
+
+#######################################
+
+my $version = "u0.01";
+                         # u0.01,  2018/01/16,  tee yuen, for AMMS POS usage
+sub retrieveAMMS_POS_Support
+{
+	my ($isTurnOn) = $_[0];
+    my ($mdVersion) = $_[1];
+		
+	if( $isTurnOn eq "TRUE" )
+    {
+        if( $mdVersion eq "MT6293" )
+        {
+            return (0x00400000);
+        }
+        if( $mdVersion eq "MT6295" )
+        {
+            return (0x00800000);
+        }
+
+        if( $mdVersion eq "MT6297" )
+        {
+            return (0);
+        }
+	}
+	else
+	{
+        return (0);
+    }
+}          
+ 
diff --git a/mcu/tools/AutoGen/postBuild/BAT_buffer_info.pm b/mcu/tools/AutoGen/postBuild/BAT_buffer_info.pm
new file mode 100644
index 0000000..b0fe41c
--- /dev/null
+++ b/mcu/tools/AutoGen/postBuild/BAT_buffer_info.pm
@@ -0,0 +1,104 @@
+#!/usr/bin/perl

+#

+#  Copyright Statement:

+#  --------------------

+#  This software is protected by Copyright and the information contained

+#  herein is confidential. The software may not be copied and the information

+#  contained herein may not be used or disclosed except with the written

+#  permission of MediaTek Inc. (C) 2006

+#

+#  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES

+#  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")

+#  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON

+#  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,

+#  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF

+#  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.

+#  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE

+#  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR

+#  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH

+#  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO

+#  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S

+#  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.

+#

+#  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE

+#  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,

+#  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,

+#  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO

+#  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.

+#

+#  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE

+#  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF

+#  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND

+#  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER

+#  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).

+#

+#*****************************************************************************

+#*

+#* Filename:

+#* ---------

+#*   BAT_buffer_info.pm

+#*

+#* Project:

+#* --------

+#*

+#*

+#* Description:

+#* ------------

+#*   This script is used to get linker symbol for setting EMI RMPU

+#* 

+#*

+#* Author:

+#* -------

+#*   Tee-Yuen Chun (mtk10524)

+#*

+#*------------------------------------------------------------------------------

+#* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!

+#*============================================================================

+#****************************************************************************/

+

+BEGIN { push @INC, './tools/MemoryUtility/' }  # add additional library path

+use LinkerOutputParser;

+use CommonUtility;

+use FileInfoParser;

+

+package BAT_buffer_info;

+

+#######################################

+

+my $version = "u0.01";

+

+sub retrieveBAT_Buffer_Info

+{

+    my ($prj_fo_hash) = @_;

+

+    my $totalBATSize = 0x0;

+

+	#ENLARGE_BAT_OPTION

+    if($prj_fo_hash->{'enlarge_bat_option'} eq "0")

+    {

+		$totalBATSize = 0x2000;

+    }

+    elsif($prj_fo_hash->{'enlarge_bat_option'} eq "1")

+    {

+        $totalBATSize = 0x2800;

+    }

+    elsif($prj_fo_hash->{'enlarge_bat_option'} eq "2")

+    {

+        $totalBATSize = 0x3000;

+    }

+    elsif($prj_fo_hash->{'enlarge_bat_option'} eq "3")

+    {

+        $totalBATSize = 0x3800;

+    }

+    elsif($prj_fo_hash->{'enlarge_bat_option'} eq "4")

+    {

+        $totalBATSize = 0x4000;

+    }

+    elsif($prj_fo_hash->{'enlarge_bat_option'} eq "5")

+    {

+        $totalBATSize = 0x2000;

+    }

+

+    return($totalBATSize);

+}          

+ 

diff --git a/mcu/tools/AutoGen/postBuild/CONSYS_info.pm b/mcu/tools/AutoGen/postBuild/CONSYS_info.pm
new file mode 100644
index 0000000..734a15b
--- /dev/null
+++ b/mcu/tools/AutoGen/postBuild/CONSYS_info.pm
@@ -0,0 +1,98 @@
+#!/usr/bin/perl
+#
+#  Copyright Statement:
+#  --------------------
+#  This software is protected by Copyright and the information contained
+#  herein is confidential. The software may not be copied and the information
+#  contained herein may not be used or disclosed except with the written
+#  permission of MediaTek Inc. (C) 2006
+#
+#  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+#  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+#  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+#  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+#  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+#  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+#  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+#  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+#  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+#  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+#  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+#  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+#
+#  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+#  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+#  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+#  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+#  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+#
+#  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+#  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+#  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+#  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+#  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+#
+#*****************************************************************************
+#*
+#* Filename:
+#* ---------
+#*   CONSYS_info.pm
+#*
+#* Project:
+#* --------
+#*
+#*
+#* Description:
+#* ------------
+#*   This script is used to get linker symbol for setting EMI RMPU
+#* 
+#*
+#* Author:
+#* -------
+#*   Tee-Yuen Chun (mtk10524)
+#*
+#*------------------------------------------------------------------------------
+#* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+#*============================================================================
+#****************************************************************************/
+
+BEGIN { push @INC, './tools/MemoryUtility/' }  # add additional library path
+use LinkerOutputParser;
+use CommonUtility;
+use FileInfoParser;
+
+package CONSYS_info;
+
+#######################################
+
+my $version = "u0.02";
+
+sub retrieveCONSYS_Support
+{
+    #my ($isCtrlBuffTurnOn,$isDataBuffTurnOn,$mdVersion) = @_;
+    my ($prj_fo_hash, $mdVersion) = @_;
+
+    my $totalBuffSize = 0;
+    
+    #if( $mdVersion eq "MT6295" )
+    #{
+    #}
+
+    #(Control Path only) 256KB = 256*1024B = 0x40000
+    $totalBuffSize = 0x00040000;
+
+    if( $prj_fo_hash->{'mcif_wifi_support'} eq "TRUE" )
+    {
+        #(Control Path + Data Path for IMS only) 1.5MB = 1536*1024B = 0x180000B
+        $totalBuffSize = 0x00180000;
+    }
+
+    if( $prj_fo_hash->{'mddp_wh_support'} eq "TRUE" )
+    {
+        #(Control Path + Data Path for IMS and MDDP-WH) 13.5MB = 1.5MB + 12MB(WH) = 0xD80000B
+        $totalBuffSize = 0x00D80000;
+    }
+
+    return($totalBuffSize);
+}          
+ 
diff --git a/mcu/tools/AutoGen/postBuild/EMI_MPUinfo.pm b/mcu/tools/AutoGen/postBuild/EMI_MPUinfo.pm
new file mode 100644
index 0000000..c17d4ea
--- /dev/null
+++ b/mcu/tools/AutoGen/postBuild/EMI_MPUinfo.pm
@@ -0,0 +1,237 @@
+#!/usr/bin/perl
+#
+#  Copyright Statement:
+#  --------------------
+#  This software is protected by Copyright and the information contained
+#  herein is confidential. The software may not be copied and the information
+#  contained herein may not be used or disclosed except with the written
+#  permission of MediaTek Inc. (C) 2006
+#
+#  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+#  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+#  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+#  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+#  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+#  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+#  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+#  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+#  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+#  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+#  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+#  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+#
+#  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+#  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+#  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+#  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+#  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+#
+#  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+#  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+#  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+#  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+#  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+#
+#*****************************************************************************
+#*
+#* Filename:
+#* ---------
+#*   EMI_MPIinfo.pm
+#*
+#* Project:
+#* --------
+#*
+#*
+#* Description:
+#* ------------
+#*   This script is used to get linker symbol for setting EMI RMPU
+#* 
+#*
+#* Author:
+#* -------
+#*   KC Tsai (mtk06471)
+#*
+#*------------------------------------------------------------------------------
+#* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+#*============================================================================
+#****************************************************************************/
+
+BEGIN { push @INC, './common/tools/MemoryUtility/' }  # add additional library path
+use LinkerOutputParser;
+use CommonUtility;
+use FileInfoParser;
+
+package EMI_MPUinfo;
+
+use constant ATTR__NO_PROTECTION  => 0x0;
+use constant ATTR_________SEC_RW  => 0x1;
+use constant ATTR__SEC_RW_NSEC_R  => 0x2;
+use constant ATTR__SEC_RW_NSEC_W  => 0x3;
+use constant ATTR___SEC_R_NSEC_R  => 0x4;
+use constant ATTR______FORBIDDEN  => 0x5;
+use constant ATTR__SEC_R_NSEC_RW  => 0x6;
+use constant ATTR________UNUNSED  => 0xF;
+
+
+
+############# user configuration##############
+
+my $nKBalign = 64; # 64KB alignment  
+#
+# please align this setting with EMI_MPU_REGION in custom_scatstruct.c.template
+#
+my @aEMI_MPU_config = (
+    # Bas of    MCURO   HWRW
+    [LinkerSymPrefix::Image, "MCURO_HWRW",LinkerSymPostfix::Base, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED],     # 0
+    # Bas of    MCURW   HWRO
+    [LinkerSymPrefix::Image,"EXTSRAM"           ,LinkerSymPostfix::Base, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED],     # 1
+    # Bas of    MCURW   HWRW
+    [LinkerSymPrefix::Image,"EXTSRAM_MCURW_HWRW",LinkerSymPostfix::Base, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED],     # 2
+    # Bas of    MD end
+    [LinkerSymPrefix::Image,"DUMMY_END"         ,LinkerSymPostfix::Base, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED],     # 3
+    [0                     ,""                  ,0                     , ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED],     # 4
+    [0                     ,""                  ,0                     , ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED],     # 5
+    [0                     ,""                  ,0                     , ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED],     # 6
+    [0                     ,""                  ,0                     , ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED],     # 7
+);
+
+#######################################
+
+my $version = "u0.08";
+                         # u0.08,  2016/05/17,  Carl, refine setting for ELBRUS
+                         # u0.07,  2016/03/09,  Carl, refine setting for ELBRUS
+                         # u0.06,  2015/08/26,  Carl, return directly for ELBRUS
+                         # u0.05,  2015/07/06,  Carl, return directly when processing TCM only load
+                         # u0.04,  2015/04/15,  Carl, refine setting for (MCU RO, MDHW RW)  DNC+NC, (MCU RW, MDHW RW)  DNC+NC
+                         # u0.03,  2015/04/02,  Carl, refine setting 
+                         # u0.02,  2015/03/30,  Carl, refine setting 
+                         # u0.01,  2015/01/31,  Carl, return EMI RMPU settion
+           
+sub retrieveEMI_MPU_info()
+{
+    my ($strFilePath, $themf) = @_;
+    my $nAvailableChannel=-1;
+    my @aEMI_MPU;
+    my @aEMI_Domain;
+
+
+    &FileInfo::Parse_MAKEFILE($themf, \%g_MAKEFILE_OPTIONS);
+    if (FileInfo::is("MTK_MODEM_ARCH", "MT6297") or FileInfo::is("MTK_MODEM_ARCH", "MT6297P")) {
+      @aEMI_MPU_config = (
+			  # Bas of    MCURO   HWRW
+			  [LinkerSymPrefix::Image,"MCURO_HWRW"        ,LinkerSymPostfix::Base, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED],     # 0
+			  # Bas of    MCURW   HWRO
+			  [LinkerSymPrefix::Image,"EXTSRAM"      ,LinkerSymPostfix::Base, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED],     # 1
+			  # Bas of    MCURW   HWRW
+			  [LinkerSymPrefix::Image,"DYNAMIC_CACHEABLE_EXTSRAM_DEFAULT_NONCACHEABLE_MCURW_HWRW",LinkerSymPostfix::Base, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED],     # 2
+			  # Bas of    MD end
+			  [LinkerSymPrefix::Image,"DUMMY_END"         ,LinkerSymPostfix::Base, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED],     # 3
+			  [0                     ,""                  ,0                     , ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED],     # 4
+			  [0                     ,""                  ,0                     , ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED],     # 5
+			  [0                     ,""                  ,0                     , ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED],     # 6
+			  [0                     ,""                  ,0                     , ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED],     # 7
+			 );
+    } else {
+      @aEMI_MPU_config = (
+			  # Bas of    MCURO   HWRW
+			  [LinkerSymPrefix::Image, "MCURO_HWRW",LinkerSymPostfix::Base, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED],     # 0
+			  # Bas of    MCURW   HWRO
+			  [LinkerSymPrefix::Image,"EXTSRAM"           ,LinkerSymPostfix::Base, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED],     # 1
+			  # Bas of    MCURW   HWRW
+			  [LinkerSymPrefix::Image,"EXTSRAM_MCURW_HWRW",LinkerSymPostfix::Base, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED],     # 2
+			  # Bas of    MD end
+			  [LinkerSymPrefix::Image,"DUMMY_END"         ,LinkerSymPostfix::Base, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED],     # 3
+			  [0                     ,""                  ,0                     , ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED],     # 4
+			  [0                     ,""                  ,0                     , ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED],     # 5
+			  [0                     ,""                  ,0                     , ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED],     # 6
+			  [0                     ,""                  ,0                     , ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED, ATTR________UNUNSED],     # 7
+			 );
+    }
+    if( &FileInfo::find("TCM_ONLY_LOAD", "TRUE") )
+    {
+        return (0, undef, undef);
+    }
+
+
+    LinkerOutputParser::FileParse($strFilePath);
+
+    
+# offset(base), size
+    my $base=0;
+    for( my $i=0; $i<scalar(@aEMI_MPU_config); ++$i)
+    {
+        my $channel_ref = @aEMI_MPU_config[$i];
+        if( @{$channel_ref}[1] ne ""  )
+        {
+            my $end_addr = &get_Physical_Addr(@{$channel_ref}[0],@{$channel_ref}[1],@{$channel_ref}[2]);
+            push @aEMI_MPU, [$base, $end_addr-$base];
+            $base = $end_addr;
+        }
+        else
+        {
+            $nAvailableChannel = $i if ($nAvailableChannel==-1);
+            push @aEMI_MPU, [0,0];
+            $base = 0;
+        }
+    }
+
+# domain, 4 = nNumEmiMuDomain
+    for( my $i=0; $i<4; ++$i) 
+    {
+        my $nChannelAttr = 0;    	
+        for( my $j=0; $j<scalar(@aEMI_MPU_config); ++$j)
+        {
+            my $channel_ref = @aEMI_MPU_config[$j];
+            $nChannelAttr |= @{$channel_ref}[3+$i] << ($j*4);
+        }
+        push @aEMI_Domain, $nChannelAttr;
+    }
+
+    return ($nAvailableChannel, \@aEMI_MPU, \@aEMI_Domain);
+}
+
+sub get_Physical_Addr()
+{
+    my ($nPrefix, $strName, $nPostfix) = @_;
+
+    my $strSymbol = "0x0FFFFFFF & ";
+    
+    $strSymbol.= "Image\$\$" if( $nPrefix == LinkerSymPrefix::Image );
+    $strSymbol.= "Load\$\$" if( $nPrefix == LinkerSymPrefix::Load );
+    $strSymbol.= $strName;
+    $strSymbol.= "\$\$Base" if( $nPostfix == LinkerSymPostfix::Base );
+    $strSymbol.= "\$\$Limit" if( $nPostfix == LinkerSymPostfix::Limit );
+    $strSymbol.= "\$\$ZIBase" if( $nPostfix == LinkerSymPostfix::ZIBase );
+    $strSymbol.= "\$\$ZILimit" if( $nPostfix == LinkerSymPostfix::ZILimit );
+
+    my $strAddr = &LinkerOutputParser::GetLinkerSymbolAddress( $strName, $nPostfix, $nPrefix );
+    &EMP_MPUinfo_die("no linker symbol $strSymbol") if (defined $strAddr == undef);
+    
+    my $nAddr = hex($strAddr);
+    #mask the Bank bits
+    if(($nAddr & 0xF0000000) == 0x70000000) {
+        $nAddr = $end_addr & 0x1FFFFFFF;
+    } elsif(($nAddr & 0xF0000000) > 0x10000000) {
+        $nAddr = $nAddr & 0x0FFFFFFF;
+    }
+    $strAddr = CommonUtil::Dec2Hex($nAddr);
+    &EMP_MPUinfo_die("symbol $strSymbol address $strAddr is not $nKBalign KB alignment") if ($nAddr != &CommonUtil::GetKBAligned($nAddr, $nKBalign));
+
+    $strSymbol.= " = $strAddr = $nAddr\n";
+    print $strSymbol;
+
+    return $nAddr;    
+}
+
+sub EMP_MPUinfo_die
+{
+    my ($error_msg, $file, $line_no) = @_;
+    my $pack_name = undef;
+    if(!defined $file or !defined $line_no)
+    {
+        ($pack_name, $file, $line_no) = caller;    
+    }
+    &CommonUtil::error_handler($error_msg, $file, $line_no, 'EMP_MPUinfo');    
+}
+
+
diff --git a/mcu/tools/AutoGen/postBuild/FreeRam_info.pm b/mcu/tools/AutoGen/postBuild/FreeRam_info.pm
new file mode 100644
index 0000000..8ffe513
--- /dev/null
+++ b/mcu/tools/AutoGen/postBuild/FreeRam_info.pm
@@ -0,0 +1,121 @@
+#!/usr/bin/perl
+#
+#  Copyright Statement:
+#  --------------------
+#  This software is protected by Copyright and the information contained
+#  herein is confidential. The software may not be copied and the information
+#  contained herein may not be used or disclosed except with the written
+#  permission of MediaTek Inc. (C) 2006
+#
+#  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+#  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+#  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+#  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+#  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+#  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+#  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+#  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+#  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+#  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+#  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+#  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+#
+#  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+#  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+#  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+#  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+#  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+#
+#  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+#  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+#  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+#  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+#  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+#
+#*****************************************************************************
+
+use strict;
+BEGIN { push @INC, './common/tools/MemoryUtility/' }  # add additional library path
+use LinkerOutputParser;
+use CommonUtility;
+use FileInfoParser;
+
+package FreeRam_info;
+
+my @symbol_list = (["LOAD_VIEW_END",LinkerSymPostfix::ZILimit,0],
+		   ["MCURO_HWRW", LinkerSymPostfix::Base,0],
+		   ["CACHED_EXTSRAM_MCURO_HWRW", LinkerSymPostfix::ZILimit,1],
+		   ["EXTSRAM",LinkerSymPostfix::Base,1],
+		   ["CACHED_EXTSRAM_NVRAM_LTABLE", LinkerSymPostfix::ZILimit,2],
+		   ["EXTSRAM_MCURW_HWRW", LinkerSymPostfix::Base,2],
+		   ["CACHED_EXTSRAM_MCURW_HWRW", LinkerSymPostfix::ZILimit,3],
+		   ["EXTSRAM_DSP_TX", LinkerSymPostfix::Base,3],
+		   ["EXTSRAM_DSP_TX", LinkerSymPostfix::ZILimit,4],
+		   ["EXTSRAM_DSP_RX", LinkerSymPostfix::Base,4],
+		   ["EXTSRAM_DSP_RX", LinkerSymPostfix::ZILimit,5],
+		   ["CACHED_EXTSRAM_IOCU2_MCURW_HWRW", LinkerSymPostfix::Base,5],
+		   ["CACHED_EXTSRAM_IOCU2_MCURW_HWRW", LinkerSymPostfix::ZILimit,6],
+		   ["CACHED_EXTSRAM_IOCU3_READ_ALLOC_MCURW_HWRW", LinkerSymPostfix::Base,6],
+		   ["CACHED_EXTSRAM_IOCU3_READ_ALLOC_MCURW_HWRW", LinkerSymPostfix::ZILimit,7],
+		   ["CACHED_EXTSRAM_L2CACHE_LOCK_DATA", LinkerSymPostfix::Base,7],
+		   ["CACHED_EXTSRAM_L2CACHE_LOCK_DATA", LinkerSymPostfix::ZILimit,8],
+		   ["DYNAMIC_SECTION_L2CACHE_LOCK_0", LinkerSymPostfix::Base,8],
+		   ["DYNAMIC_SECTION_L2CACHE_LOCK_0", LinkerSymPostfix::ZILimit,9],
+		   ["EXTSRAM_CORE0", LinkerSymPostfix::Base,9],
+		   ["CACHED_EXTSRAM_CORE0", LinkerSymPostfix::ZILimit,10],
+		   ["EXTSRAM_CORE1", LinkerSymPostfix::Base,10],
+		   ["CACHED_EXTSRAM_CORE1", LinkerSymPostfix::ZILimit,11],
+		   ["DRDI", LinkerSymPostfix::Base,11],
+		   ["DRDI", LinkerSymPostfix::Limit,12],
+		   ["EXTSRAM_L1DSP_ZI", LinkerSymPostfix::Base,12],
+		   ["EXTSRAM_L1DSP_ZI", LinkerSymPostfix::ZILimit,13],
+		   ["DUMMY_END", LinkerSymPostfix::Base,13]);
+
+
+
+#&GetFreeRamInfo(shift);
+
+
+sub GetFreeRamInfo
+  {
+    my ($g_sym_file) = @_;
+    my $g_area_begin = 0;
+    my $g_area_end = 0;
+    my $g_area_length = 0;
+    my @freemem  =([0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]);
+
+    LinkerOutputParser::FileParse($g_sym_file) if(-e $g_sym_file) or die("Can't open symbol file: $g_sym_file\n");
+
+    for(my $i = 0 ; $i<$#symbol_list; $i = $i+2) {
+      $g_area_begin = hex(LinkerOutputParser::GetLinkerSymbolAddress($symbol_list[$i][0],$symbol_list[$i][1], 0));
+      $g_area_begin &= 0x0fffffff if($g_area_begin > 0x10000000);
+      $g_area_begin &= 0x0fffffff if($g_area_begin > 0x10000000);
+      # Adjust Free area begin address to 64kB
+      $g_area_begin = ($g_area_begin + hex("ffff") >> 16) << 16;
+      $g_area_end = hex(LinkerOutputParser::GetLinkerSymbolAddress($symbol_list[$i+1][0],$symbol_list[$i+1][1], 0));
+      $g_area_end &= 0x0fffffff if($g_area_end > 0x10000000);
+      $g_area_end &= 0x0fffffff if($g_area_end > 0x10000000);
+
+      # Adjust Free area end address to 64kB
+      $g_area_end = ($g_area_end  >> 16) << 16;
+      # Calculate length
+      $g_area_length = $g_area_end - $g_area_begin;
+      print $symbol_list[$i][0] . " Start: " .&CommonUtil::Dec2Hex($g_area_begin) . " ". $symbol_list[$i+1][0]. " Start: " .&CommonUtil::Dec2Hex($g_area_end) . " Length :$g_area_length\n";
+      if ($g_area_length > 0) {
+	#Check that can we merge new free area to previous free area if not add as new free region
+	if (($freemem[-1][0]+$freemem[-1][1]) == $g_area_begin) {
+	  print "Insert from ".&CommonUtil::Dec2Hex($g_area_begin)." Length ".&CommonUtil::Dec2Hex($g_area_length) . " to " . &CommonUtil::Dec2Hex($freemem[-1][0]+$freemem[-1][1]) ."\n";
+	  $freemem[-1][1]+=$g_area_length;
+	} else {
+	  push @freemem,[$g_area_begin, $g_area_length];
+#	  print  &CommonUtil::Dec2Hex($g_area_begin) . "\t(" . $g_area_begin . ")\t\t" . &CommonUtil::Dec2Hex($g_area_length) . "\t(" . $g_area_length . ")\n";
+	}
+      }
+    }
+    foreach my $entry (@freemem) {
+      	  print  &CommonUtil::Dec2Hex($entry->[0]) . "\t(" . $entry->[0] . ")\t\t" . &CommonUtil::Dec2Hex($entry->[1]) . "\t(" . $entry->[1] . ")\n";
+    }
+    @freemem = sort {$b->[1] <=> $a->[1]} @freemem;
+    splice @freemem, 8;
+    return @freemem;
+  }
diff --git a/mcu/tools/AutoGen/postBuild/NV_cache_shm_info.pm b/mcu/tools/AutoGen/postBuild/NV_cache_shm_info.pm
new file mode 100644
index 0000000..1b0148a
--- /dev/null
+++ b/mcu/tools/AutoGen/postBuild/NV_cache_shm_info.pm
@@ -0,0 +1,91 @@
+#!/usr/bin/perl
+#
+#  Copyright Statement:
+#  --------------------
+#  This software is protected by Copyright and the information contained
+#  herein is confidential. The software may not be copied and the information
+#  contained herein may not be used or disclosed except with the written
+#  permission of MediaTek Inc. (C) 2006
+#
+#  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+#  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+#  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+#  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+#  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+#  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+#  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+#  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+#  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+#  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+#  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+#  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+#
+#  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+#  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+#  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+#  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+#  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+#
+#  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+#  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+#  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+#  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+#  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+#
+#*****************************************************************************
+#*
+#* Filename:
+#* ---------
+#*   CONSYS_info.pm
+#*
+#* Project:
+#* --------
+#*
+#*
+#* Description:
+#* ------------
+#*   This script is used to get linker symbol for setting EMI RMPU
+#* 
+#*
+#* Author:
+#* -------
+#*   Tee-Yuen Chun (mtk10524)
+#*
+#*------------------------------------------------------------------------------
+#* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+#*============================================================================
+#****************************************************************************/
+
+BEGIN { push @INC, './tools/MemoryUtility/' }  # add additional library path
+use LinkerOutputParser;
+use CommonUtility;
+use FileInfoParser;
+
+package NV_cache_shm_info;
+
+#######################################
+
+my $version = "u0.01";
+
+sub retrieveNV_CACHE_Support
+{
+    #my ($isCtrlBuffTurnOn,$isDataBuffTurnOn,$mdVersion) = @_;
+    my ($prj_fo_hash) = @_;
+
+    my $totalNVCacheSHMSize = 0x0;
+
+	#NVRAM_LID_CACHE, NVRAM_PARTIAL_CACHE
+    if( $prj_fo_hash->{'nvram_lid_cache'} eq "TRUE" )
+    {
+        if( $prj_fo_hash->{'nvram_partial_cache'} eq "TRUE" )
+        {
+			$totalNVCacheSHMSize = 0x700000;
+        }else
+        {
+			$totalNVCacheSHMSize = 0x1200000;
+        }
+    }
+
+    return($totalNVCacheSHMSize);
+}          
+ 
diff --git a/mcu/tools/AutoGen/postBuild/Parsing_ARM7_info.pm b/mcu/tools/AutoGen/postBuild/Parsing_ARM7_info.pm
new file mode 100644
index 0000000..c88f0d3
--- /dev/null
+++ b/mcu/tools/AutoGen/postBuild/Parsing_ARM7_info.pm
@@ -0,0 +1,107 @@
+#!/usr/bin/perl
+#
+#  Copyright Statement:
+#  --------------------
+#  This software is protected by Copyright and the information contained
+#  herein is confidential. The software may not be copied and the information
+#  contained herein may not be used or disclosed except with the written
+#  permission of MediaTek Inc. (C) 2006
+#
+#  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+#  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+#  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+#  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+#  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+#  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+#  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+#  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+#  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+#  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+#  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+#  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+#
+#  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+#  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+#  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+#  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+#  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+#
+#  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+#  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+#  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+#  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+#  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+#
+#*****************************************************************************
+#*
+#* Filename:
+#* ---------
+#*   Parsing_ARM7_info.pm
+#*
+#* Project:
+#* --------
+#*
+#*
+#* Description:
+#* ------------
+#*   This module collects the ARM7 ROM base address and return. User: Append2.pl
+#*       
+#*
+#* Author:
+#* -------
+#*   Carl Kao (mtk08237)
+#*
+#****************************************************************************/
+use strict;
+BEGIN { push @INC, './pcore/tools/', './common/tools/MemoryUtility/' }  # add additional library path         
+use SymFileParser;
+use sysGenUtility;
+
+package Parsing_ARM7_info;
+
+my $VERNO = " u0.01";
+            # u0.01 , 2015/07/24, Carl, Initial revision. Provide ARM7 ROM space information for MD header
+
+sub getARM7symbol{
+
+    my $MAIN_SYM_FILE = shift;
+    my $INFO_MAKE_FILE = shift;
+    my $SYM_NAME = "spc_rom_base";
+
+
+    my %CmplOption;
+    my %relOption;
+
+    BuildInfo::Parse_InfoMakeLog($INFO_MAKE_FILE,\%CmplOption,\%relOption);
+    if(!BuildInfo::exist(BuildOPT::CMPL, "__SPEECH_EVS_SUPPORT__"))
+    {
+        print "no ARM7 in this flavor!\n";
+        return (0xCDCDCDAA, 0x0);
+    }
+
+
+    SymFileParser::ParseSYM($MAIN_SYM_FILE);
+
+
+    my  $symbol_ref = SymFileParser::GetSymbol();
+
+    if( defined $symbol_ref->{$SYM_NAME} )
+    {
+        #print   map {$_." "} @{$symbol_ref->{$SYM_NAME}};
+        #print "\n";
+
+        my $addr = hex(@{$symbol_ref->{$SYM_NAME}}[Symbol::Addr]);
+        my $size = hex(@{$symbol_ref->{$SYM_NAME}}[Symbol::Size]);
+
+        $addr -= (&sysUtil::GetCacheablePrefix()) if ($addr >= &sysUtil::GetCacheablePrefix());
+
+        return ($addr, $size);
+
+    }
+    else
+    {
+        #print "NO~~\n";
+        return (0xCDCDCDAA, 0x0);
+    }
+
+}
diff --git a/mcu/tools/AutoGen/postBuild/Parsing_Padding_Info.pm b/mcu/tools/AutoGen/postBuild/Parsing_Padding_Info.pm
new file mode 100644
index 0000000..df58ff1
--- /dev/null
+++ b/mcu/tools/AutoGen/postBuild/Parsing_Padding_Info.pm
@@ -0,0 +1,204 @@
+#!/usr/bin/perl
+#
+#  Copyright Statement:
+#  --------------------
+#  This software is protected by Copyright and the information contained
+#  herein is confidential. The software may not be copied and the information
+#  contained herein may not be used or disclosed except with the written
+#  permission of MediaTek Inc. (C) 2006
+#
+#  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+#  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+#  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+#  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+#  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+#  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+#  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+#  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+#  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+#  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+#  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+#  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+#
+#  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+#  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+#  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+#  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+#  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+#
+#  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+#  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+#  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+#  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+#  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+#
+#*****************************************************************************
+#*
+#* Filename:
+#* ---------
+#*   Parsing_Padding_Info.pm
+#*
+#* Project:
+#* --------
+#*
+#*
+#* Description:
+#* ------------
+#*   This script is used to get unused memory info.
+#* 
+#*
+#* Author:
+#* -------
+#*   Yao Liu (mtk15073)
+#*
+#*------------------------------------------------------------------------------
+#* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+#*============================================================================
+#****************************************************************************/
+use strict;
+
+BEGIN { push @INC, './tools/MemoryUtility/' }  # add additional library path
+use BasicMemInfoQuery;
+use LinkerOutputParser;
+
+package Parsing_Padding_Info;
+use constant LOG        => 0;
+use constant WARNING    => 1;
+use constant FATAL      => 2;
+
+sub get_padding_info
+{
+    my ($platform, $c2k_mode_support, $themf, $scat, $map_file, $sym_file) = @_;
+    
+    my ($nRAMUsage, @raminfo);
+    if ($platform eq "MT6297" || $platform eq "MT6885" || $platform eq "MT6873" || $platform eq "MT6893" || $platform eq "MT6853") {
+        ($nRAMUsage, @raminfo) = &BasicMemInfo::DispatchCommand("CMD_GetRAMUsage", $themf, $scat, $map_file, $sym_file, undef);
+        return @raminfo;
+    } else {
+        &LinkerOutputParser::FileParse($sym_file);
+        my $ERinRAM_aref = &BasicMemInfo::GetERsInRAM($themf, $scat, $map_file, $sym_file, undef);
+
+        my $nDummyEndBase = hex(&LinkerOutputParser::Get_DUMMY_END_Base());
+        my $ROM_size = &BasicMemInfo::CMD_GetROMSize($themf, $scat, $map_file, $sym_file);
+        my @FreeRAMAreas;
+        my @UsedRAMAreas;
+        
+        foreach my $ER (@$ERinRAM_aref) #Go through all regions in ram
+        {
+            my $strERsize = LinkerOutputParser::GetExeRegionInfo($ER, Region::Size);
+            my $strERbase = &LinkerOutputParser::GetExeRegionInfo($ER, Region::VMA);
+            my $nERaddr = get_EMI_offset(hex($strERbase), $ER, $platform, $c2k_mode_support);
+            msg_handler(FATAL, "Section $ER base address($strERbase) or end address($strERbase + $strERsize) is bigger than total memory size!\nEMI offset is $nERaddr.\n")
+            if ($nERaddr > $nDummyEndBase || ($nERaddr + hex($strERsize)) > $nDummyEndBase);
+
+            if (hex($strERsize)) {
+                my $ERsize = hex($strERsize);
+                my $append = 0;
+                my $note = undef;
+ 
+                foreach my $used (@UsedRAMAreas) {
+                    if(($used->[0]<=$nERaddr) and (($used->[0]+$used->[1])>=$nERaddr)) {
+                        if (($used->[0]+$used->[1])<($nERaddr+$ERsize)){
+                        $used->[1]= ($nERaddr+$ERsize)-$used->[0];
+                        }
+                        $append = 1;
+                    } elsif (($used->[0]<=($nERaddr+$ERsize)) and (($used->[0]+$used->[1])>=($nERaddr+$ERsize))) {
+                        if ($used->[0] > $nERaddr) {
+                            $used->[1] += $used->[0] - $nERaddr;
+                            $used->[0] = $nERaddr;
+                        }
+                        $append = 1;
+                    }
+                    if ($append == 1) {
+                        $used->[2] = $note if($note ne undef);
+                       }
+                }
+
+                if ($append == 1) {
+                    $append = 0;
+                } else {
+                    push @UsedRAMAreas, [$nERaddr, $ERsize, $note]
+                }
+            }
+        }
+
+        @UsedRAMAreas = sort {$a->[0]<=>$b->[0]} @UsedRAMAreas;
+
+        if($ROM_size < $UsedRAMAreas[0][0]) {
+            push @FreeRAMAreas, [$ROM_size,$UsedRAMAreas[0][0] - $ROM_size];
+        }
+        for( my $i = 0;$i < $#UsedRAMAreas;$i+=1)
+        {
+            my $freeStart =$UsedRAMAreas[$i][0]+$UsedRAMAreas[$i][1];
+            my $freeSize  =$UsedRAMAreas[$i+1][0]-$freeStart;
+            push @FreeRAMAreas, [$freeStart,$freeSize]	 if ($freeSize > 0);
+        }
+
+        @FreeRAMAreas =sort {$b->[1] <=> $a->[1]} @FreeRAMAreas;
+        my @RAMMargins;
+        foreach my $refUsed (@FreeRAMAreas) {
+            my $MarginStart = ($refUsed->[0]+ 0xffff) & 0xffff0000;
+            my $MarginLength = (($refUsed->[0] + $refUsed->[1]) & 0xffff0000) - $MarginStart;
+            next if($MarginLength < 0x10000);
+
+            push @RAMMargins, [$MarginStart,$MarginLength];
+        }
+
+        for (my $item_count = $#RAMMargins+1; $item_count < 8; $item_count+=1) {
+            push @RAMMargins, [0,0];
+        }
+        @RAMMargins = sort {$b->[1] <=> $a->[1]} @RAMMargins;
+        splice @RAMMargins, 8;
+    
+        return @RAMMargins;
+    }  
+}
+
+
+sub get_EMI_offset()
+{
+    my ($address, $section_name, $platform, $c2k_support) = @_;
+    my $addr_mask = 0x0fffffff;
+    my $bank = $address>>28;
+    if (($bank == 1) || ($bank == 7)) 
+    {
+        $addr_mask = 0x1fffffff;
+    }
+    my $phsical_addr = $address & $addr_mask;
+    if ($section_name eq "EXTSRAM_L1DSP_ZI" and ($platform eq "MT6880" or $platform eq "MT6890" or $platform eq "MT2735")) {
+        if ($c2k_support eq "NONE"){
+            $phsical_addr -= 0xE000000;
+        } elsif ($c2k_support ne "NONE") {
+            $phsical_addr -= 0xA000000;
+        } else {
+            msg_handler(FATAL, "Please check the C2K_SUPPORT status($c2k_support).\n");
+        }
+    }
+
+    return $phsical_addr;
+}
+
+sub msg_handler
+{
+    my ($type, $msg, $line_no, $file_name) = (@_);
+    my $prompt_prefix;
+    if($type == LOG) {
+        print $msg . "\n";
+    }
+    elsif($type == WARNING) {
+        $prompt_prefix = ">> AAIS Warning : ";
+        my $location = (defined $file_name) ? "[$file_name] " : "";
+        print $prompt_prefix . $location . $msg . "\n";
+    }
+    elsif($type == FATAL) {
+        $prompt_prefix = ">> *** AAIS Fatal : ";
+        my $location = (defined $file_name) ? "[$file_name] " : "";
+        $location .= "[at line $line_no] ";
+        die $prompt_prefix . $location . $msg . "\n";
+    }
+}
+
+
+
+1;
+
diff --git a/mcu/tools/AutoGen/postBuild/Parsing_Ramdisk_Info.pm b/mcu/tools/AutoGen/postBuild/Parsing_Ramdisk_Info.pm
new file mode 100644
index 0000000..e4b9849
--- /dev/null
+++ b/mcu/tools/AutoGen/postBuild/Parsing_Ramdisk_Info.pm
@@ -0,0 +1,99 @@
+#!/usr/bin/perl
+#
+#  Copyright Statement:
+#  --------------------
+#  This software is protected by Copyright and the information contained
+#  herein is confidential. The software may not be copied and the information
+#  contained herein may not be used or disclosed except with the written
+#  permission of MediaTek Inc. (C) 2006
+#
+#  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+#  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+#  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+#  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+#  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+#  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+#  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+#  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+#  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+#  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+#  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+#  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+#
+#  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+#  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+#  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+#  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+#  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+#
+#  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+#  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+#  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+#  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+#  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+#
+#*****************************************************************************
+#*
+#* Filename:
+#* ---------
+#*   Parsing_Ramidisk_Info.pm
+#*
+#* Project:
+#* --------
+#*
+#*
+#* Description:
+#* ------------
+#*   This module return base address and length of ramdisk section. User: Append2.pl
+#*       
+#*
+#* Author:
+#* -------
+#*   Carl Kao (mtk08237)
+#*
+#****************************************************************************/
+use strict;
+BEGIN { push @INC, './pcore/tools/', './common/tools/MemoryUtility/' }  # add additional library path         
+use SymFileParser;
+use sysGenUtility;
+
+package Parsing_Ramdisk_Info;
+
+my $VERNO = " LR12_0.01";
+            # LR12_0.01 , 2016/06/03, Carl, Initial revision. Provide ramdisk space information for MD header
+
+sub getRamdisksymbol{
+
+    my $MAIN_SYM_FILE   = shift;
+    my $INFO_MAKE_FILE  = shift;
+    
+    my ($hexRamdisk_Base, $hexRamdisk_End)  = (0,0 );
+    my ($nRamdisk_Base, $nRamdisk_Length)   = (0xCDCDCDAA, 0x0);
+
+    my %CmplOption;
+    my %relOption;
+
+    BuildInfo::Parse_InfoMakeLog($INFO_MAKE_FILE,\%CmplOption,\%relOption);
+    if(!BuildInfo::exist(BuildOPT::CMPL, "__FS_RAMDISK__"))
+    {
+        print "no ramdisk in this flavor!\n";
+        return ($nRamdisk_Base, $nRamdisk_Length);
+    }
+
+    SymFileParser::ParseSYM($MAIN_SYM_FILE);
+
+    $hexRamdisk_Base  = SymFileParser::GetLinkerSymbolAddress("EXTSRAM_FS_ZI", LinkerSymPostfix::Base, LinkerSymPrefix::Image);
+    $hexRamdisk_End   = SymFileParser::GetLinkerSymbolAddress("EXTSRAM_FS_ZI", LinkerSymPostfix::ZILimit, LinkerSymPrefix::Image);    
+
+    #print " hexRamdisk_Base = $hexRamdisk_Base, hexRamdisk_End = $hexRamdisk_End\n";
+
+    if( 0 != hex($hexRamdisk_Base) )
+    {
+        $nRamdisk_Base    = hex($hexRamdisk_Base);
+        $nRamdisk_Length  = hex($hexRamdisk_End) - $nRamdisk_Base;            
+        
+        $nRamdisk_Base -= (&sysUtil::GetCacheablePrefix()) if ($nRamdisk_Base >= &sysUtil::GetCacheablePrefix());
+    }
+    
+    return ($nRamdisk_Base, $nRamdisk_Length);
+}
diff --git a/mcu/tools/AutoGen/postBuild/Parsing_VoLTE_Core_Info.pm b/mcu/tools/AutoGen/postBuild/Parsing_VoLTE_Core_Info.pm
new file mode 100644
index 0000000..8d3a997
--- /dev/null
+++ b/mcu/tools/AutoGen/postBuild/Parsing_VoLTE_Core_Info.pm
@@ -0,0 +1,102 @@
+#!/usr/bin/perl
+#
+#  Copyright Statement:
+#  --------------------
+#  This software is protected by Copyright and the information contained
+#  herein is confidential. The software may not be copied and the information
+#  contained herein may not be used or disclosed except with the written
+#  permission of MediaTek Inc. (C) 2006
+#
+#  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+#  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+#  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+#  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+#  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+#  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+#  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+#  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+#  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+#  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+#  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+#  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+#
+#  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+#  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+#  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+#  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+#  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+#
+#  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+#  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+#  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+#  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+#  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+#
+#*****************************************************************************
+#*
+#* Filename:
+#* ---------
+#*   Parsing_VoLTE_Core_Info.pm
+#*
+#* Project:
+#* --------
+#*
+#*
+#* Description:
+#* ------------
+#*   This module return base address and length of VoLTE core section. User: Append2.pl
+#*       
+#*
+#* Author:
+#* -------
+#*   Carl Kao (mtk08237)
+#*
+#****************************************************************************/
+use strict;
+BEGIN { push @INC, './pcore/tools/', './common/tools/MemoryUtility/' }  # add additional library path         
+use SymFileParser;
+use sysGenUtility;
+
+package Parsing_VoLTE_Core_Info;
+
+my $VERNO = " LR12_0.02";
+            # LR12_0.02 , 2015/12/23, Carl, rename CACHED_EXTSRAM_VOLTE_CORE_ZI to CACHED_EXTSRAM_ZI_VOLTE_CORE3
+            # LR12_0.01 , 2015/12/22, Carl, Initial revision. Provide VoLTE Linux space information for MD header
+
+sub getVoLTECoresymbol{
+
+    my $MAIN_SYM_FILE   = shift;
+    my $INFO_MAKE_FILE  = shift;
+    
+    my ($hexVoLTECore_Base, $hexVoLTECore_End)  = (0,0 );
+    my ($nVoLTECore_Base, $nVoLTECore_Length)   = (0xCDCDCDAA, 0x0);
+
+if(0){
+    my %CmplOption;
+    my %relOption;
+
+    BuildInfo::Parse_InfoMakeLog($INFO_MAKE_FILE,\%CmplOption,\%relOption);
+    if(!BuildInfo::exist(BuildOPT::CMPL, "__DUOS_HAS_VOLTECORE__"))
+    {
+        print "no VoLTE Core in this flavor!\n";
+        return ($nVoLTECore_Base, $nVoLTECore_Length);
+    }
+}
+
+    SymFileParser::ParseSYM($MAIN_SYM_FILE);
+
+    $hexVoLTECore_Base  = SymFileParser::GetLinkerSymbolAddress("CACHED_EXTSRAM_ZI_VOLTE_CORE3", LinkerSymPostfix::Base, LinkerSymPrefix::Image);
+    $hexVoLTECore_End   = SymFileParser::GetLinkerSymbolAddress("CACHED_EXTSRAM_ZI_VOLTE_CORE3", LinkerSymPostfix::ZILimit, LinkerSymPrefix::Image);    
+
+    #print " hexVoLTECore_Base = $hexVoLTECore_Base, hexVoLTECore_End = $hexVoLTECore_End\n";
+
+    if( 0 != hex($hexVoLTECore_Base) )
+    {
+        $nVoLTECore_Base    = hex($hexVoLTECore_Base);
+        $nVoLTECore_Length  = hex($hexVoLTECore_End) - $nVoLTECore_Base;            
+        
+        $nVoLTECore_Base -= (&sysUtil::GetCacheablePrefix()) if ($nVoLTECore_Base >= &sysUtil::GetCacheablePrefix());
+    }
+    
+    return ($nVoLTECore_Base, $nVoLTECore_Length);
+}
diff --git a/mcu/tools/AutoGen/postBuild/ckL2CacheSection.pl b/mcu/tools/AutoGen/postBuild/ckL2CacheSection.pl
new file mode 100644
index 0000000..4401bd4
--- /dev/null
+++ b/mcu/tools/AutoGen/postBuild/ckL2CacheSection.pl
@@ -0,0 +1,222 @@
+#!/usr/bin/perl
+#
+#  Copyright Statement:
+#  --------------------
+#  This software is protected by Copyright and the information contained
+#  herein is confidential. The software may not be copied and the information
+#  contained herein may not be used or disclosed except with the written
+#  permission of MediaTek Inc. (C) 2018
+#
+#  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+#  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+#  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+#  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+#  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+#  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+#  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+#  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+#  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+#  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+#  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+#  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+#
+#  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+#  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+#  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+#  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+#  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+#
+#  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+#  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+#  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+#  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+#  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+#
+#*****************************************************************************
+#*
+#* Filename:
+#* ---------
+#*   ckL2CacheSection.pl
+#*
+#* Project:
+#* --------
+#*
+#*
+#* Description:
+#* ------------
+#*   This scripts is used to check if all symbols allocated in L2$ Lock section register to config file.
+#*
+#* Author:
+#* -------
+#*   Yao Liu (mtk15073)
+#*
+#****************************************************************************/
+
+use strict;
+use warnings;
+
+BEGIN { push @INC , './tools/' }  # add additional library path
+use FileInfoParser;
+use constant {
+    LOG        => 0,
+    WARNING    => 1,
+    FATAL      => 2,
+};
+
+my ($MapFile, $Tempdir) = (@ARGV);
+&msg_handler(LOG, "Input file: $MapFile, $Tempdir\n");
+
+#record all official config info
+my %official_config;
+#record all symbols in L2Cache Lock Section
+my %symbol_hash;
+#record all symbols info from sym file
+my %addr_to_symbol;
+
+my $official_config = $Tempdir."~official_config.ldf";
+&msg_handler(FATAL, "official config file do not exist!\n") if(!-e $official_config);
+
+&Parse_Config_File();
+&Parse_MAP_File($MapFile);
+
+&Symbol_Check();
+
+exit 0;
+
+sub Parse_Config_File
+{
+    open CFG, "$official_config" or &msg_handler(FATAL, "Can not open $official_config!", __LINE__);
+    local $/ = undef;
+    my $tempOutput = <CFG>;
+    close CFG;
+
+    my ($SubSection, $bFlag, $sFlag) = (undef, 0, 0);
+    my @TotalSecArray;
+    my $BreakRegExp = "[\\*]{20}\\s[<]\\sGROUP\\s*CFG\\s[>]\\s[\\*]{20}";
+
+    #split entire config file into several configuration groups.
+    foreach my $line (split /\n/, $tempOutput) {
+        if($bFlag == 0) {
+            $bFlag = 1 if(($line =~ m/^\[Symbol\]\s+\[Obj\]\s+\[Lib\]$/));
+            next;
+        }
+        next if($line =~ m/^\s*$/);
+
+        if($line =~ m/^\s*$BreakRegExp\s*$/) {
+            $sFlag = 1;
+            if(defined $SubSection) {
+                push @TotalSecArray, $SubSection;
+                undef $SubSection;
+            }
+            next;
+        }
+        $SubSection .= $line."\n" if($sFlag == 1);
+    }
+    push @TotalSecArray, $SubSection if(defined $SubSection);
+
+    foreach my $content (@TotalSecArray) {
+        my @tempArray = split /\n/, $content;
+        my ($Section_ID, $name_flag, $size_flag);
+        foreach my $line (@tempArray) {
+            if($line =~ /^Section ID\s*:\s*(.*)$/) {
+                $Section_ID = $1;
+                $name_flag = 1;
+                next;
+            } elsif($line =~ /^Reserved size\s*:\s*(.*)$/ && $name_flag == 1) {
+                $official_config{$Section_ID}{"size"} = $1;
+                $size_flag = 1;
+                next;
+            } elsif(!($name_flag == 1 && $size_flag == 1)) {
+                &msg_handler(FATAL, "Wrong config format in $Section_ID!", __LINE__, $official_config);
+            }
+      
+            if($line =~ m/^(\S+)\s+(\S+)\s+(\S+)\s*$/) {
+                    $official_config{$Section_ID}{$1.":".$2.":".$3}{"symbol_name"} = $1;
+                    $official_config{$Section_ID}{$1.":".$2.":".$3}{"obj"} = $2;
+                    $official_config{$Section_ID}{$1.":".$2.":".$3}{"lib"} = $3;
+            } elsif($Section_ID =~ /L2CACHE_LOCK_RO_SECTION_\w+/) {
+                my $msg = "Illegal Line Format: $line";
+                &msg_handler(FATAL, "Illegal Line Format: $line", __LINE__, $official_config);
+                next;
+            }
+        }
+    }
+}
+
+sub Parse_MAP_File
+{
+    my ($map) = @_;
+    my $sym = $MapFile;
+    $sym =~ s/map/sym/;
+
+    open SYM, "<$sym" or &msg_handler(FATAL, "Can not open map $sym!", __LINE__);
+    map {$addr_to_symbol{uc($1)} = $5 if(/^(\w{8})\s+(\w)\s+(\w\s+)?CACHED_EXTSRAM_L2CACHE_LOCK_RO\s+(\w{8})\s+(\w+)$/)} (<SYM>);
+    close SYM;
+    
+    my $flag = 0;
+    my ($input_section, $addr, $lib, $obj);
+    open MAP, "<$map" or &msg_handler(FATAL, "Can not open map $map!", __LINE__);
+    foreach my $line (<MAP>){
+        $flag = 1 if ($line =~ /^CACHED_EXTSRAM_L2CACHE_LOCK_RO$/);
+        next if (!($line =~ /^CACHED_EXTSRAM_L2CACHE_LOCK_RO$/ || $flag == 1));
+        last if ($line =~ /Image\$\$CACHED_EXTSRAM_L2CACHE_LOCK_RO\$\$ZI\$\$Limit = \.$/ && $flag == 1);
+
+        if ($line =~ /^\s(\w+)$/){
+            $input_section = $1;
+            ($addr, $lib, $obj) = (undef, undef, undef);
+        } elsif ($line =~ /\s+(\S+)?\s+0x(\w+)\s+(0x\w+)\s+.*\/?\/(\w+\.a)\((\w+\.obj)\)/){
+            #                0x91e5e3c0       0x8a ./build/MT6885_SP/NLWCTG/bin/lib/libsys_drv.a(idle_task.obj)
+             ($addr, $lib, $obj) = (uc($2), $4, $5);
+             my $symbol_name = $addr_to_symbol{$addr};
+             my $key = $symbol_name.":".$obj.":".$lib;
+             $symbol_hash{$input_section}{$key}{"symbol_name"} = $symbol_name;
+             $symbol_hash{$input_section}{$key}{"obj"} = $obj;
+             $symbol_hash{$input_section}{$key}{"lib"} = $lib;
+        } elsif ($line =~ /^\s+0x(\w+)\s+(\w+)$/) {
+            my $symbol_name = $2;
+            my $key = $symbol_name.":".$obj.":".$lib;
+            next if (exists $symbol_hash{$input_section}{$key});
+            $symbol_hash{$input_section}{$key}{"symbol_name"} = $symbol_name;
+            $symbol_hash{$input_section}{$key}{"obj"} = $obj;
+            $symbol_hash{$input_section}{$key}{"lib"} = $lib;
+        }
+    }
+}
+
+sub Symbol_Check
+{
+    foreach my $section (keys %symbol_hash){
+        next if(!exists $official_config{$section});
+        foreach my $key (keys %{$symbol_hash{$section}}){
+            &msg_handler(FATAL, "Symbol $symbol_hash{$section}{$key}{\"symbol_name\"} doesn't register to official congfig file!", __LINE__) if(!exists $official_config{$section}{$key});
+        }
+    }
+    &msg_handler(LOG, "The following symbols don't exist in current load:\n");
+    my $index = 0;
+    foreach my $section (keys %official_config){
+        foreach my $key (keys %{$official_config{$section}}){
+            next if ($key eq "size");
+            &msg_handler(LOG, "[$index]  $official_config{$section}{$key}{\"symbol_name\"}  $official_config{$section}{$key}{\"obj\"}  $official_config{$section}{$key}{\"lib\"}", __LINE__) if(!exists $symbol_hash{$section}{$key});
+            $index++;
+        }
+    }
+    &msg_handler(LOG, "[Done]: Section check!");
+}
+
+sub msg_handler
+{
+    my ($type, $msg, $line_no) = (@_);
+    my $prompt_prefix;
+    if($type == LOG) {
+        print $msg . "\n";
+    }
+    elsif($type == WARNING) {
+        $prompt_prefix = ">> AAIS Warning : ";
+        print $prompt_prefix . $msg . "\n";
+    }
+    elsif($type == FATAL) {
+        $prompt_prefix = ">> *** AAIS Fatal : ";
+        my $location = "[at line $line_no] ";
+        die $prompt_prefix . $location . $msg . "\n";
+    }
+}
diff --git a/mcu/tools/AutoGen/postBuild/ckRegion.pl b/mcu/tools/AutoGen/postBuild/ckRegion.pl
new file mode 100644
index 0000000..35b970d
--- /dev/null
+++ b/mcu/tools/AutoGen/postBuild/ckRegion.pl
@@ -0,0 +1,148 @@
+#!/usr/bin/perl
+#
+#  Copyright Statement:
+#  --------------------
+#  This software is protected by Copyright and the information contained
+#  herein is confidential. The software may not be copied and the information
+#  contained herein may not be used or disclosed except with the written
+#  permission of MediaTek Inc. (C) 2006
+#
+#  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+#  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+#  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+#  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+#  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+#  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+#  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+#  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+#  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+#  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+#  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+#  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+#
+#  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+#  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+#  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+#  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+#  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+#
+#  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+#  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+#  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+#  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+#  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+#
+#*****************************************************************************
+#*
+#* Filename:
+#* ---------
+#*   ckRegion.pl
+#*
+#* Project:
+#* --------
+#*
+#*
+#* Description:
+#* ------------
+#*   This scripts parses symbolfile and checks does it have any overlapping
+#*   regions in physical SRAM
+#*       
+#*
+#* Author:
+#* -------
+#*   Tero Jarkko (mtk09602)
+#*
+#****************************************************************************/
+
+#****************************************************************************
+# Verno
+#****************************************************************************
+my $version = "Gen93_v0.02";
+             # Gen93_v0.02, 2017/09/01,  Carl, support overlapped drdi sections
+             # Gen93_v0.01, 2017/06/16,  Carl, support overlapped rom sections
+             # LR12_v0.03,  2016/05/26,  Carl, avoid checking dynamic sections 
+             # LR12_v0.02,  2016/03/17,  Carl, avoid checking SIGNATURE section 
+             # LR12_v0.01,  2015/12/04,  Tero, 1st version 
+
+use strict;
+BEGIN { push @INC, './tools/MemoryUtility/' }  # add additional library path
+use SymFileParser;
+my @ex_reg = qw(ISPRAM DSPRAM CACHED_EXTSRAM_MCURO_HWRW_DRDI_);
+
+my $g_sym_file = $ARGV[0];
+my $g_exit_val = 0;
+if (!-e $g_sym_file) { die "$g_sym_file does not exist!!!\n";}
+SymFileParser::ParseSYM($g_sym_file);
+my $exe_regions =SymFileParser::ListAllExeRegion(1);
+my @regions;
+my $index=0;
+foreach my $region (@$exe_regions) {
+  foreach my $strPattern (@ex_reg) {
+    if($region =~ /$strPattern/) {
+      delete @$exe_regions[$index];
+    }
+  }
+  $index++;
+}
+foreach my $region (@$exe_regions) {
+  my $reg_begin =SymFileParser::GetExeRegionInfo($region,Region::VMA);
+  my $reg_size = SymFileParser::GetExeRegionInfo($region,Region::Size);
+  my $phy_loc = sprintf("0x%.8x",hex(get_physical_address($reg_begin)));
+  if(hex($reg_size)) {
+#    print("\tpush $region\n");
+    push @regions,[$reg_begin,$reg_size,$phy_loc,$region];
+  }
+}
+@regions = sort {$a->[0] cmp $b->[0] } @regions;
+#print("\nSections which has data:\n");
+#print("|Begin     |Length    |SRAM addr |Section name\n");
+#foreach my $reg (@regions) {
+#  print(" @$reg[0] @$reg[1] @$reg[2] @$reg[3]\n");
+#}
+print("\nCheck overlapping sections...\n");
+foreach my $reg (@regions) {
+  my $reg_begin = hex(@$reg[2]);
+  my $reg_end = $reg_begin + hex(@$reg[1])-1;
+  my ($index) = grep { $regions[$_][3] eq @$reg[3] } 0..$#regions;
+  my @sregions =();
+  push @sregions,@regions[$index..$#regions];
+  foreach my $reg_lap (@sregions) {
+    if (!(@$reg[3] eq @$reg_lap[3])) {
+      my $reg_lap_begin = hex(@$reg_lap[2]);
+      my $reg_lap_end = $reg_lap_begin+hex(@$reg_lap[1])-1;
+      if((($reg_begin > $reg_lap_begin) and ($reg_begin < $reg_lap_end)) or (($reg_end > $reg_lap_begin) and ($reg_end < $reg_lap_end))) {
+	my $begin1 = sprintf("0x%.8x",$reg_begin);
+	my $begin2 = sprintf("0x%.8x",$reg_lap_begin);
+	my $end1 = sprintf("0x%.8x",$reg_end);
+	my $end2 = sprintf("0x%.8x",$reg_lap_end);
+	if (($reg_begin < $reg_lap_begin) and ($reg_end > $reg_lap_end)) {
+	  print(" @$reg[3] ($begin1-$end1) is inside of @$reg_lap[3] ($begin2-$end2)\n");
+	  $g_exit_val = 1;
+	} elsif (($reg_begin > $reg_lap_begin) and ($reg_begin < $reg_lap_end)) {
+	  my $ol_size = $reg_lap_end - $reg_begin;
+	  $ol_size = sprintf("0x%.8x",$ol_size);
+	  print(" @$reg[3] ($begin1-$end1) begin overlaps ($ol_size) @$reg_lap[3] ($begin2-$end2)\n");
+	  $g_exit_val = 1;
+	} elsif (($reg_end > $reg_lap_begin) and ($reg_end < $reg_lap_end)) {
+	  my $ol_size = $reg_end - $reg_lap_begin;
+	  $ol_size = sprintf("0x%.8x",$ol_size);
+	  print(" @$reg[3] ($begin1-$end1) end overlaps  ($ol_size) @$reg_lap[3] ($begin2-$end2)\n");
+	  $g_exit_val = 1;
+	}
+      }
+    }
+  }
+}
+print("\nDone, check overlapping sections\n");
+exit $g_exit_val;
+
+sub get_physical_address
+  {
+    my ($str_address) = @_;
+    my $addr_mask = 0x0fffffff;
+    my $bank = hex($str_address)>>28;
+    if (($bank == 1) || ($bank == 7)) {
+      $addr_mask = 0x1fffffff;
+    }
+    return sprintf("0x%.8x",hex($str_address) & $addr_mask);
+  }
diff --git a/mcu/tools/AutoGen/postBuild/drdi_info.pm b/mcu/tools/AutoGen/postBuild/drdi_info.pm
new file mode 100644
index 0000000..0f072bf
--- /dev/null
+++ b/mcu/tools/AutoGen/postBuild/drdi_info.pm
@@ -0,0 +1,142 @@
+#!/usr/bin/perl
+#
+#  Copyright Statement:
+#  --------------------
+#  This software is protected by Copyright and the information contained
+#  herein is confidential. The software may not be copied and the information
+#  contained herein may not be used or disclosed except with the written
+#  permission of MediaTek Inc. (C) 2006
+#
+#  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+#  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+#  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+#  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+#  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+#  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+#  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+#  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+#  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+#  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+#  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+#  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+#
+#  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+#  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+#  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+#  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+#  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+#
+#  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+#  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+#  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+#  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+#  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+#
+#*****************************************************************************
+#*
+#* Filename:
+#* ---------
+#*   EMI_MPIinfo.pm
+#*
+#* Project:
+#* --------
+#*
+#*
+#* Description:
+#* ------------
+#*   This script is used to get linker symbol for setting EMI RMPU
+#* 
+#*
+#* Author:
+#* -------
+#*   KC Tsai (mtk06471)
+#*
+#*------------------------------------------------------------------------------
+#* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+#*------------------------------------------------------------------------------
+#* $Revision: $
+#* $Modtime: $
+#* $Log: $
+#*
+#* 12 06 2019 yao.liu
+#* [MOLY00462117] [VMOLY] Extend DRDI set to 64.
+#* [VMOLY] Extend DRDI set to 64.
+#*
+#* 12 27 2017 carl.kao
+#* [MOLY00294629] [Gen93] [SystemService] [Auto-Gen] [MT6763] [ZION] [AMMS] [DRDI] AMMS-DRDI and Security Boot can be enabled simultaneously
+#* .
+#*
+#* 12 27 2017 carl.kao
+#* [MOLY00294629] [Gen93] [SystemService] [Auto-Gen] [MT6763] [ZION] [AMMS] [DRDI] AMMS-DRDI and Security Boot can be enabled simultaneously
+#* .
+#*
+#* 12 27 2017 carl.kao
+#* [MOLY00294629] [Gen93] [SystemService] [Auto-Gen] [MT6763] [ZION] [AMMS] [DRDI] AMMS-DRDI and Security Boot can be enabled simultaneously
+#* .
+#*
+#* 12 27 2017 carl.kao
+#* [MOLY00294629] [Gen93] [SystemService] [Auto-Gen] [MT6763] [ZION] [AMMS] [DRDI] AMMS-DRDI and Security Boot can be enabled simultaneously
+#* .
+#*
+#* 12 27 2017 carl.kao
+#* [MOLY00294629] [Gen93] [SystemService] [Auto-Gen] [MT6763] [ZION] [AMMS] [DRDI] AMMS-DRDI and Security Boot can be enabled simultaneously
+#* .
+#*
+#* 12 27 2017 carl.kao
+#* [MOLY00294629] [Gen93] [SystemService] [Auto-Gen] [MT6763] [ZION] [AMMS] [DRDI] AMMS-DRDI and Security Boot can be enabled simultaneously
+#* .
+#*
+#* 12 27 2017 carl.kao
+#* [MOLY00294629] [Gen93] [SystemService] [Auto-Gen] [MT6763] [ZION] [AMMS] [DRDI] AMMS-DRDI and Security Boot can be enabled simultaneously
+#* .
+#*
+#*
+#****************************************************************************/
+
+
+use strict;
+BEGIN { push @INC, './common/tools/MemoryUtility/' }  # add additional library path
+use LinkerOutputParser;
+use CommonUtility;
+use FileInfoParser;
+
+package drdi_info;
+return 1;
+sub GetDRDIInfo
+  {
+    my ($g_sym_file) = @_;
+    my $g_area_begin = 0;
+    my $g_area_end = 0;
+    my $g_area_length = 0;
+    my @drdi_info = (0xCDCDCDAA,0,0xCDCDCDAA,0);
+    LinkerOutputParser::FileParse($g_sym_file) if(-e $g_sym_file) or die("Can't open symbol file: $g_sym_file\n");
+
+    # LOAD VIEW
+    $g_area_begin   = hex(LinkerOutputParser::GetLinkerSymbolAddress("CACHED_EXTSRAM_MCURO_HWRW_DRDI_2G_00",    LinkerSymPostfix::Base,     LinkerSymPrefix::Load));
+    $g_area_end     = hex(LinkerOutputParser::GetLinkerSymbolAddress("CACHED_EXTSRAM_MCURO_HWRW_DRDI_NR_63",   LinkerSymPostfix::Base,     LinkerSymPrefix::Load))
+                    + hex(LinkerOutputParser::GetLinkerSymbolAddress("CACHED_EXTSRAM_MCURO_HWRW_DRDI_NR_63",   LinkerSymPostfix::Length,   LinkerSymPrefix::Image));
+    $g_area_length = $g_area_end - $g_area_begin;
+    if ($g_area_length > 0)
+    {
+        # (0) load base
+        $drdi_info[0] = $g_area_begin & 0x0fffffff;
+        # (1) load length
+        $drdi_info[1] = $g_area_length;
+
+        # EXEC VIEW        
+        # (2) exec base
+        $g_area_begin = hex(LinkerOutputParser::GetLinkerSymbolAddress("CACHED_EXTSRAM_MCURO_HWRW_DRDI_2G_00",  LinkerSymPostfix::Base,     LinkerSymPrefix::Image));
+        $drdi_info[2] = $g_area_begin & 0x0fffffff;  
+        # (3) exec length
+        $drdi_info[3]=0;
+        for (my $i=0; $i < 64; $i++) {
+            my $str_section_name = "CACHED_EXTSRAM_MCURO_HWRW_DRDI_LTE_";
+            $str_section_name = $str_section_name."0" if ($i<10);
+            my $n_tmp_len = hex(LinkerOutputParser::GetLinkerSymbolAddress($str_section_name.$i, LinkerSymPostfix::Length,   LinkerSymPrefix::Image)); 
+            $drdi_info[3] = $n_tmp_len if ($drdi_info[3]<$n_tmp_len);
+        }
+        $drdi_info[3] += hex(LinkerOutputParser::GetLinkerSymbolAddress("CACHED_EXTSRAM_MCURO_HWRW_DRDI_LTE_00",  LinkerSymPostfix::Base,     LinkerSymPrefix::Image));
+        $drdi_info[3] -= $g_area_begin;
+    }
+    return @drdi_info;
+  }
diff --git a/mcu/tools/AutoGen/postBuild/update_drdi_table.pl b/mcu/tools/AutoGen/postBuild/update_drdi_table.pl
new file mode 100644
index 0000000..5fc2597
--- /dev/null
+++ b/mcu/tools/AutoGen/postBuild/update_drdi_table.pl
@@ -0,0 +1,215 @@
+#!/usr/bin/perl
+#
+#  Copyright Statement:
+#  --------------------
+#  This software is protected by Copyright and the information contained
+#  herein is confidential. The software may not be copied and the information
+#  contained herein may not be used or disclosed except with the written
+#  permission of MediaTek Inc. (C) 2018
+#
+#  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+#  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+#  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+#  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+#  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+#  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+#  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+#  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+#  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+#  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+#  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+#  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+#
+#  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+#  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+#  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+#  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+#  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+#
+#  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+#  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+#  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+#  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+#  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+#
+#*****************************************************************************
+#*
+#* Filename:
+#* ---------
+#*   update_drdi_table.pl
+#*
+#* Project:
+#* --------
+#*
+#*
+#* Description:
+#* ------------
+#*   This scripts is used to gen md5 checksum of all RATs DRDI, which will be used to check if data corruption
+#*   occurs during run-time or exception stage
+#*
+#* Author:
+#* -------
+#*   Frank Hu (mtk12175)
+#*
+#****************************************************************************/
+
+use strict;
+use warnings;
+
+package Region;
+use constant Size       => 0;
+use constant VMA        => 1;
+use constant LMA        => 2;
+use constant Fileoffset => 3;
+
+package Symbol;
+use constant VMA        => 0;
+use constant Region     => 1;
+use constant Size       => 2;
+
+package MSG;
+use constant Log       => 0;
+use constant Warning   => 1;
+use constant Fatal     => 2;
+
+my ($output, $warning) = (undef, undef);
+
+&msg_handler(MSG::Fatal, "Wrong Parameters, Usage: update_drdi_table.pl <ELF_FILE> <SYM_FILE>", __LINE__)
+    if($#ARGV != 1);
+
+my ($elf_file, $sym_file) = @ARGV;
+
+my $templog = "Input: ELF is $elf_file\n       SYM is $sym_file\n\n";
+$templog .= sprintf("%-10s%-50s%-15s%-15s%-15s%-s\n", "Idx", "SectionName", "LMA", "VMA", "Size", "RCU_CS");
+&msg_handler(MSG::Log, $templog, __LINE__);
+
+my @rat_array = qw/2G 3GFDD 3GTDD MMRF C2K LTE NR/;
+my @symbol_array = qw/DRDI_RCUCS_Array DRDI_VMA_Array/;
+
+my %sym_file_hash;
+map{ $sym_file_hash{'symbol_info'}->{$_} = 0 } (@symbol_array);
+
+&parse_sym_file();
+
+my @rcu_cs_array;
+my @drdi_vma_info_array;
+
+&drdi_gen_rcu_cs();
+&drdi_update_elf();
+
+exit 0;
+
+sub parse_sym_file
+{
+    my ($bBegin, $sum_hit_sym) = (undef, 0);
+    open SYM, "< $sym_file" or &msg_handler(MSG::Fatal, "fail to open $sym_file", __LINE__);
+    while(my $line = <SYM>) {
+        $bBegin = 1 if($line =~ /^Sections:$/);
+        $bBegin = 2 if($line =~ /^SYMBOL TABLE:$/);
+        next unless(defined $bBegin);
+
+        #Idx Name          Size      VMA       LMA       File off  Algn 
+        #  0 ROM_GFH    0000084c  00000000  00000000  00000fd4  2**2
+        if($bBegin == 1 and $line =~ /\s*(\d+)\s+(\S+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\S+)/) {
+            my $section_name = $2;
+            $sym_file_hash{'section_info'}->{$section_name} = [$3, $4, $5, $6];
+        }
+        #91437ed0 g     O ROM	00000180 DRDI_RCUCS_Array
+        elsif($bBegin == 2 and $line =~ /^([0-9a-fA-F]{8})\s+g\s+O\s+(\S+)\s+(\S+)\s+(?:\S+\s+)?(\S+)$/) {
+            my $symbol_name = $4;
+            next unless(exists $sym_file_hash{'symbol_info'}->{$symbol_name});
+            $sym_file_hash{'symbol_info'}->{$symbol_name} = [$1, $2, $3];
+            last if(($sum_hit_sym ++) == $#symbol_array);
+        }
+    }
+    close SYM;
+}
+
+sub drdi_gen_rcu_cs
+{
+    open (ELF_FILE, "< $elf_file") or die "Open $elf_file file failed\n";
+    binmode ELF_FILE;
+    my $idx = 0;
+    foreach my $rat (@rat_array) {
+        foreach my $index (0 .. 63) {
+            my $section_name = 'CACHED_EXTSRAM_MCURO_HWRW_DRDI_' . $rat . '_' . sprintf("%02d", $index);
+            &msg_handler(MSG::Fatal, "can't find the section: $section_name", __LINE__)
+                unless(exists $sym_file_hash{'section_info'}->{$section_name});
+
+            my $offset = hex($sym_file_hash{'section_info'}->{$section_name}->[Region::Fileoffset]);
+            my $length = hex($sym_file_hash{'section_info'}->{$section_name}->[Region::Size]);
+
+            &msg_handler(MSG::Fatal, "$section_name is not 4 Byte alignment(Length is $length)", __LINE__)
+                if($length % 4);
+
+            seek ELF_FILE, $offset, 0;
+            my ($content, $temp_rcu_cs) = (undef, 0);
+            &msg_handler(MSG::Fatal, "fail to read the data fragment of $section_name", __LINE__)
+                if(read(ELF_FILE, $content, $length) != $length);
+
+            my @tmp = unpack("V*", $content);
+            map { $temp_rcu_cs = $temp_rcu_cs ^ $_ } (@tmp);
+
+            push @rcu_cs_array, $temp_rcu_cs;
+            push @drdi_vma_info_array, hex($sym_file_hash{'section_info'}->{$section_name}->[Region::VMA]), $length;
+
+            $templog = sprintf("%-10s%-50s%-15s%-15s%-15s%-08x", $idx, $section_name, 
+                               $sym_file_hash{'section_info'}->{$section_name}->[Region::LMA], 
+                               $sym_file_hash{'section_info'}->{$section_name}->[Region::VMA], 
+                               $sym_file_hash{'section_info'}->{$section_name}->[Region::Size], $temp_rcu_cs);
+            &msg_handler(MSG::Log, $templog, __LINE__);
+            $idx = $idx + 1;
+        }
+    }
+    close ELF_FILE;
+}
+
+sub drdi_update_elf
+{
+    open (ELF_FILE, "+< $elf_file") or die "Open $elf_file file failed\n";
+    binmode ELF_FILE;
+    foreach my $symbol (@symbol_array) {
+        if($sym_file_hash{'symbol_info'}->{$symbol} == 0) {
+            &msg_handler(MSG::Fatal, "can't find symbol: $symbol", __LINE__);
+            next;
+        }
+        my $sym_region = $sym_file_hash{'symbol_info'}->{$symbol}->[Symbol::Region];
+        my $offset = (hex($sym_file_hash{'symbol_info'}->{$symbol}->[Symbol::VMA]) - hex($sym_file_hash{'section_info'}->{$sym_region}->[Region::VMA])) +
+                      hex($sym_file_hash{'section_info'}->{$sym_region}->[Region::Fileoffset]);
+
+        seek ELF_FILE, $offset, 0;
+        my ($sym_size, $data_frag, $updated_content_size) = (hex($sym_file_hash{'symbol_info'}->{$symbol}->[Symbol::Size]), undef, undef);
+        if($symbol eq 'DRDI_RCUCS_Array') {
+            $updated_content_size = ($#rcu_cs_array + 1) * 4;
+            $data_frag = pack('V*',@rcu_cs_array);
+        }
+        elsif($symbol eq 'DRDI_VMA_Array') {
+            $updated_content_size = ($#drdi_vma_info_array + 1) * 4;
+            $data_frag = pack('V*',@drdi_vma_info_array);
+        }
+
+        &msg_handler(MSG::Fatal, $templog, __LINE__)
+            if($sym_size != $updated_content_size);
+
+        print ELF_FILE $data_frag;
+    }
+    close ELF_FILE;
+    &msg_handler(MSG::Log, "\n\nUpdate Elf succeed ^O^", __LINE__);
+}
+
+sub msg_handler
+{
+    my ($type, $msg, $line_no) = (@_);
+    my $prompt_prefix;
+    if($type == MSG::Log) {
+        print $msg . "\n";
+    }
+    elsif($type == MSG::Warning) {
+        $prompt_prefix = ">> DRDI Warning : ";
+        print "\n" . $prompt_prefix . "[at line $line_no] " . $msg . "\n";
+    }
+    elsif($type == MSG::Fatal) {
+        $prompt_prefix = ">> *** DRDI Fatal : ";
+        die $prompt_prefix . "[at line $line_no] " . "$msg" . "\n";
+    }
+}
\ No newline at end of file
diff --git a/mcu/tools/AutoGen/postBuild/update_dump_table.pl b/mcu/tools/AutoGen/postBuild/update_dump_table.pl
new file mode 100644
index 0000000..3f39188
--- /dev/null
+++ b/mcu/tools/AutoGen/postBuild/update_dump_table.pl
@@ -0,0 +1,228 @@
+#!/usr/bin/perl
+#
+#  Copyright Statement:
+#  --------------------
+#  This software is protected by Copyright and the information contained
+#  herein is confidential. The software may not be copied and the information
+#  contained herein may not be used or disclosed except with the written
+#  permission of MediaTek Inc. (C) 2018
+#
+#  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+#  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+#  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+#  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+#  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+#  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+#  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+#  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+#  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+#  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+#  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+#  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+#
+#  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+#  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+#  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+#  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+#  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+#
+#  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+#  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+#  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+#  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+#  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+#
+#*****************************************************************************
+#*
+#* Filename:
+#* ---------
+#*   update_dump_table.pl
+#*
+#* Project:
+#* --------
+#*
+#*
+#* Description:
+#* ------------
+#*   This script is to update the value of dump table.
+#*
+#* Author:
+#* -------
+#*   Yao Liu (mtk15073)
+#*
+#****************************************************************************/
+
+use strict;
+use warnings;
+BEGIN { push @INC, './tools/', './tools/MemoryUtility/' }
+use FileInfoParser;
+use constant {
+  Section_Size          =>0,
+  Section_VMA           =>1,
+  Section_LMA           =>2,
+  Section_Fileoffset    =>3,
+  Symbol_VMA            =>0,
+  Symbol_Section        =>1,
+  Symbol_Size           =>2,
+};
+#****************************************************************************
+# Input
+#****************************************************************************
+my $debug = 1;
+&msg_handler("Fatal", "Wrong Parameters, Usage: update_drdi_table.pl <ELF_FILE> <SYM_FILE> <DUMP_FILE> <MAKEFILE>", __LINE__) if($#ARGV != 3);
+
+my ($elf_file, $sym_file, $dump_file, $makefile) = @ARGV;
+
+my $templog = "Input: ELF is $elf_file\nSYM is $sym_file\nDUMP_TABLE is $dump_file\nmakefile is $makefile\n\n";
+&msg_handler("Log", $templog, __LINE__);
+
+my %g_MAKEFILE_OPTIONS;
+&msg_handler("Fatal", "Failed to parse makefile!!!\n", __LINE__) if(1!=&FileInfo::Parse_MAKEFILE($makefile, \%g_MAKEFILE_OPTIONS));
+&msg_handler("Log", "This load do not support DHL!!!\n", __LINE__) if(FileInfo::is("DHL_SUPPORT", "FALSE"));
+exit 0 if(FileInfo::is("DHL_SUPPORT", "FALSE"));
+
+my @symbol_array = qw/dhl_dump_profile/;
+
+my %sym_file_hash;
+map{ $sym_file_hash{'symbol_info'}->{$_} = 0 } (@symbol_array);
+&parse_sym_file();
+
+my @CRC32_Table;
+&Init_CRC32_Table();
+
+my $init = 0x1A424650;
+my $constant = 1;	#If the value of $init is not 0xFFFFFFFF, please set $constant to 1.
+my $update_content = &get_table_info();
+
+&dump_update_elf();
+
+exit 0;
+
+sub parse_sym_file
+{
+    my ($bBegin, $sum_hit_sym) = (undef, 0);
+    open SYM, "< $sym_file" or &msg_handler("Fatal", "fail to open $sym_file", __LINE__);
+    while(my $line = <SYM>) {
+        $bBegin = 1 if($line =~ /^Sections:$/);
+        $bBegin = 2 if($line =~ /^SYMBOL TABLE:$/);
+        next unless(defined $bBegin);
+
+        #Idx Name          Size      VMA       LMA       File off  Algn 
+        #  0 ROM_GFH    0000084c  00000000  00000000  00000fd4  2**2
+        if($bBegin == 1 and $line =~ /\s*(\d+)\s+(\S+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\S+)/) {
+            my $section_name = $2;
+            $sym_file_hash{'section_info'}->{$section_name} = [$3, $4, $5, $6];
+        }
+        #91437ed0 g     O ROM	00000180 DRDI_RCUCS_Array
+        elsif($bBegin == 2 and $line =~ /^([0-9a-fA-F]{8})\s+g\s+O\s+(\S+)\s+(\S+)\s+(?:\S+\s+)?(\S+)$/) {
+            my $symbol_name = $4;
+            next unless(exists $sym_file_hash{'symbol_info'}->{$symbol_name});
+            $sym_file_hash{'symbol_info'}->{$symbol_name} = [$1, $2, hex($3)];
+            &msg_handler("Log", "[Symbol]:$symbol_name  [VMA]:0x$1  [Section]:$2  [Size]:0x$3\n", __LINE__) if($debug);
+            last if(($sum_hit_sym ++) == $#symbol_array);
+        }
+    }
+    close SYM;
+    map {&msg_handler("Fatal", "can't find symbol: $_!!!", __LINE__) if ($sym_file_hash{'symbol_info'}->{$_} == 0)} (@symbol_array);
+}
+
+ sub get_table_info
+{
+    my @temp = stat($dump_file);
+    #Check total size
+    &msg_handler("Fatal", "The sie of $dump_file is biffer than symbol size!!!\n", __LINE__) if($temp[7] > $sym_file_hash{'symbol_info'}->{"dhl_dump_profile"}->[Symbol_Size]);
+
+    my $header = unpack("V", read_memory_from_file($dump_file, 0, 4,__LINE__));
+    my $table_value = read_memory_from_file($dump_file, 0, ($temp[7] - 4),__LINE__);
+    my $check_sum = unpack("V", read_memory_from_file($dump_file, ($temp[7] - 4), 4,__LINE__));
+    my $content = read_memory_from_file($dump_file, 0, $temp[7],__LINE__);
+
+    #Check header
+    &msg_handler("Fatal", "The magic pattern mismatch!!!\n", __LINE__) if($header != 0x1A424650);
+    #Check CRC32 checksum
+    my $check_value = CRC32_CheckSum($table_value);
+    &msg_handler("Log", "[File Size]:$temp[7]  [Old CHecksum]:$check_sum  [New Checksum]:$check_value\n", __LINE__) if($debug);
+
+    &msg_handler("Fatal", "The checksum mismatch!!!\n", __LINE__) if($check_value != $check_sum);
+    return $content;
+}
+
+sub dump_update_elf
+{
+    open (ELF_FILE, "+< $elf_file") or &msg_handler("Fatal", "Open $elf_file file failed!!!\n", __LINE__);
+    binmode ELF_FILE;
+    foreach my $symbol (@symbol_array) {
+        if($sym_file_hash{'symbol_info'}->{$symbol} == 0) {
+            &msg_handler("Fatal", "can't find symbol: $symbol", __LINE__);
+            next;
+        }
+        my $sym_region = $sym_file_hash{'symbol_info'}->{$symbol}->[Symbol_Section];
+        my $offset = (hex($sym_file_hash{'symbol_info'}->{$symbol}->[Symbol_VMA]) - hex($sym_file_hash{'section_info'}->{$sym_region}->[Section_VMA])) +
+                      hex($sym_file_hash{'section_info'}->{$sym_region}->[Section_Fileoffset]);
+        &msg_handler("Log", "The addr of symbol in ELF is $offset.\n", __LINE__);
+
+        seek ELF_FILE, $offset, 0;
+        print ELF_FILE $update_content;
+    }
+    close ELF_FILE;
+    &msg_handler("Log", "\n\nUpdate Elf succeed ^O^", __LINE__);
+}
+
+sub read_memory_from_file
+{
+    &msg_handler("Fatal", "[Error]: argument of $0 is insufficient\n", __LINE__) if(@_ != 4);
+    my ($file,$off,$len,$file_line_no) = @_;
+    
+    my $content;
+    open(FH, $file) or &msg_handler("Fatal", "Fail to open $file: $!\n", __LINE__);
+    binmode FH;
+    &msg_handler("Fatal", "Can not seek to $off\n", __LINE__) if not seek FH, $off, 0;
+    &msg_handler("Fatal", "At line $file_line_no! Can't read offset $off, length $len from file $file\n", __LINE__) if read(FH, $content, $len) != $len;
+    close FH;
+    return $content;
+}
+
+sub Init_CRC32_Table
+{
+    foreach my $index (0..255){
+        my $crc = $index;
+        foreach (0..7){
+            $crc = ($crc >> 1) ^ ($crc & 1 && 0xEDB88320);
+        }
+        my $value = $crc & 2 ** 32 - 1;
+        push @CRC32_Table, $value;
+    }
+}
+
+sub CRC32_CheckSum
+{    
+    my ($data) = @_;
+    $init ^= 0xFFFFFFFF if ($constant);
+    my $check_sum = $init;
+    my $len = length $data;
+    foreach my $pos (0..$len-1){
+        my $temp = ($check_sum ^ ord(substr($data, $pos, 1))) & 0xFF;
+        $check_sum = ($check_sum >> 8) ^ $CRC32_Table[$temp];
+    }    
+    $check_sum ^= 0xFFFFFFFF;
+    return ($check_sum & 0xFFFFFFFF);
+}
+
+sub msg_handler
+{
+    my ($type, $msg, $line_no) = (@_);
+    my $prompt_prefix;
+    if($type eq "Log") {
+        print $msg . "\n";
+    }
+    elsif($type eq "Warning") {
+        $prompt_prefix = ">> Warning : ";
+        print "\n" . $prompt_prefix . "[at line $line_no] " . $msg . "\n";
+    }
+    elsif($type eq "Fatal") {
+        $prompt_prefix = ">> Fatal : ";
+        die $prompt_prefix . "[at line $line_no] " . "$msg" . "\n";
+    }
+}
+
+
diff --git a/mcu/tools/AutoGen/postBuild/update_mpu_table.pl b/mcu/tools/AutoGen/postBuild/update_mpu_table.pl
new file mode 100644
index 0000000..2907290
--- /dev/null
+++ b/mcu/tools/AutoGen/postBuild/update_mpu_table.pl
@@ -0,0 +1,847 @@
+#!/usr/bin/perl
+#
+#  Copyright Statement:
+#  --------------------
+#  This software is protected by Copyright and the information contained
+#  herein is confidential. The software may not be copied and the information
+#  contained herein may not be used or disclosed except with the written
+#  permission of MediaTek Inc. (C) 2011
+#
+#  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+#  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+#  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+#  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+#  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+#  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+#  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+#  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+#  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+#  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+#  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+#  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+#
+#  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+#  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+#  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+#  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+#  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+#
+#  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+#  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+#  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+#  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+#  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+#
+#
+#*****************************************************************************
+#*============================================================================
+#*             HISTORY
+#* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+#*------------------------------------------------------------------------------
+#* $Revision$
+#* $Modtime$
+#* $Log$
+#*
+#* 11 11 2020 elvin.wang
+#* [MOLY00593559] [Gen97][Colgin] NR15.R3.MD700.MP branch out & call for check-in
+#* Merge patch from NR15.R3.T700.MP to NR15.R3.MD700.MP
+#*
+#* 09 18 2020 yao.liu
+#* [MOLY00569908] [Layout] Colgin patch back to NR15.R3.MP.
+#* [NR15.R3.MP] Porting Colgin layout to R3.MP branch.
+#*
+#* 09 08 2020 yao.liu
+#* [MOLY00372891] [MT6297][CM] Code change
+#* [Petrus-P] Move CSIF section to Bank0.
+#*
+#* 07 15 2020 yao.liu
+#* [MOLY00546498] [MT6893] Porting layout for Palmer.
+#* [NR15.R3.MP] Porting layout for MT6893.
+#*
+#* 06 11 2020 yao.liu
+#* [MOLY00521482] [MT6297][NR][SMT]Petrus NA SKU SMT4 for ATT & VZW Sku ???
+#* 	
+#* [NR15.R3.MP] Move CSIF section to Bank0.
+#*
+#* 04 17 2020 yao.liu
+#* [MOLY00511795] [NR15.R3.MP]L2cache lock new solution
+#* [NR15.R3.MP] New L2Cache Lock-AutoGen patch.
+#*
+#* 01 09 2020 yao.liu
+#* [MOLY00470528] [VMOLY]Remove L2C lock feature
+#* [VMOLY] Remove L2$ LOCK sections.
+#*
+#* 01 08 2020 yao.liu
+#* [MOLY00470423] [GEN98 FPGA Phone Call][Gen97] MPU/AutoGen bug fix. NMI cannot be servicve by non-offending VPEs.
+#* 	
+#* [VMOLY] Add mpu to protect bootslave.
+#*
+#* 12 06 2019 yao.liu
+#* [MOLY00462117] [VMOLY] Extend DRDI set to 64.
+#* [VMOLY] Extend DRDI set to 64.
+#*
+#* 12 04 2019 yao.liu
+#* [MOLY00462595] [VMOLY] Rename sections for memory utility.
+#* 	
+#* [VMOLY] Rename section for memory utility.
+#*
+#* 12 02 2019 yao.liu
+#* [MOLY00462186] [VMOLY] Change mpu setting for Security Develop.
+#* [Gen97] MPU setting review.
+#*
+#* 10 08 2019 yao.liu
+#* [MOLY00447280] [Gen97][Image Layout] DRDI feature cause DSP Base address move to Bank 1 from Bank 0
+#* [MT6885] Move DSP to the end of Bank1.
+#*
+#* 08 21 2019 yao.liu
+#* [MOLY00433621] Porting feature and add Mercury option to AutoGen.
+#* [VMOLY.APOLLO.SQC]Porting ALPS03884302 feature and add Mercury option for Auto-Gen.
+#*
+#* 07 04 2019 yao.liu
+#* [MOLY00418931] [VMOLY] Change Gen97 prefetch range.
+#* [VMOLY] Adjust prefetch range.
+#*
+#* 03 18 2019 yao.liu
+#* [MOLY00391736] Change L2CACHE_LOCK attribute from RW to RO.
+#* [VMOLY] Adjust L2C_LOCK vma= lma.
+#*
+#* 01 14 2019 frank.hu
+#* [MOLY00363660] [Auto-Gen] Merge 2 links to 1 link to save more build time.
+#* 	
+#* 	VMOLY.DEV.SEPT - Merge 2Links -> 1Link.
+#*
+#* 12 11 2018 tero.jarkko
+#* [MOLY00372134] [Gen97][SystemService][AutoGen]Fixed MT6885_FPGA mpu table
+#* 	
+#* 	.
+#*
+#* 12 07 2018 tero.jarkko
+#* [MOLY00371534] [Gen97][SystemService]Increased HARQ buffer size for MT6297 EVB
+#* 	
+#* 	.
+#*
+#* 12 03 2018 tero.jarkko
+#* [MOLY00369424] [Gen97][SystemService]Fix build error for MT6297
+#* 	
+#* 	.
+#*
+#* 11 13 2018 tero.jarkko
+#* [MOLY00364280] [Gen97][SystemService][AutoGen]Added ULTRA region to memory layout
+#* 	
+#* 	.
+#*
+#* 11 07 2018 tero.jarkko
+#* [MOLY00363118] [BusMPU][Gen97] the IOCU protection framework
+#* 	
+#* 	.
+#*
+#* 11 02 2018 tero.jarkko
+#* [MOLY00359227] [Gen97][SystemService][AutoGen]512MB memory map configured for MT6297 EVB
+#* 	
+#* 	.
+#*
+#* 10 29 2018 tero.jarkko
+#* [MOLY00359227] [Gen97][SystemService][AutoGen]512MB memory map configured for MT6297 EVB
+#* 	
+#* 	.
+#*
+#* 10 26 2018 tero.jarkko
+#* [MOLY00359227] [Gen97][SystemService][AutoGen]512MB memory map configured for MT6297 EVB
+#* 	
+#* 	.
+#*
+#* 10 17 2018 tero.jarkko
+#* [MOLY00359227] [Gen97][SystemService][AutoGen]512MB memory map configured for MT6297 EVB
+#* 	
+#* 	.
+#*
+#* 09 26 2018 tero.jarkko
+#* [MOLY00355587] [Gen97][SystemService]Updated MT6297 MPU maximum region count
+#* 	
+#* 	.
+#*
+#* 09 24 2018 tero.jarkko
+#* [MOLY00351701] [Gen97][SystemService][Auto-Gen]Added L2-WB areas
+#* 	
+#* 	.
+#*
+#* 09 04 2018 tero.jarkko
+#* [MOLY00349311] [VMOLY build] Solve VMOLY build error
+#* 	
+#* 	.
+#*
+#* 08 29 2018 tero.jarkko
+#* [MOLY00345457] [Gen97][SystemService][AutoGen]MT6297 merge
+#* 	
+#* 	.
+#*
+#* 08 14 2018 tero.jarkko
+#* [MOLY00345457] [Gen97][SystemService][AutoGen]MT6297 merge
+#* 	
+#* 	.
+#*
+#* 07 30 2018 frank.hu
+#* [MOLY00343013] [Create New Project][PMA used]
+#* Add LDS for MT6779.
+#*
+#* 07 13 2018 tero.jarkko
+#* [MOLY00338780] [MT6295] New MPU APIs for pretecting Consys MD-AP share memory.
+#* 	
+#* 	.
+#*
+#* 06 19 2018 tero.jarkko
+#* [MOLY00334042] [System Service][MOLY Kernel Internal Request] DRDI Patch on LR13
+#* 	
+#* 	.
+#*
+#* 05 28 2018 tero.jarkko
+#* [MOLY00327744] [Gen95][SystemService][Auto-Gen]Added L2-WB areas
+#* 	
+#* 	.
+#*
+#* 05 22 2018 tero.jarkko
+#* [MOLY00327744] [Gen95][SystemService][Auto-Gen]Added L2-WB areas
+#* 	
+#* 	.
+#*
+#* 02 27 2018 tero.jarkko
+#* [MOLY00310353] [Gen95][System Service][Auto-Gen]Static L2C locked input sections are placed into EMI
+#* 	
+#* 	.
+#*
+#* 01 18 2018 tero.jarkko
+#* [MOLY00303145] [Gen95] [SystemService][DSMGR] Dynamic L2CACHE lock implementation
+#* 	
+#* 	.
+#*
+#* 01 18 2018 tero.jarkko
+#* [MOLY00303145] [Gen95] [SystemService][DSMGR] Dynamic L2CACHE lock implementation
+#* 	
+#* 	.
+#*
+#* 12 05 2017 tero.jarkko
+#* [MOLY00294063] [Gen93][MT6739][SystemService][Auto-Gen]Fix DRDI memory dump
+#* 	
+#* 	.
+#*
+#* 11 22 2017 tero.jarkko
+#* [MOLY00290966] [Gen93][MT6739][SystemService][Auto-Gen] AMMS DRDI stage 4 (Modify layout)
+#* 	
+#* 	.
+#*
+#* 11 10 2017 tero.jarkko
+#* [MOLY00281660] [MT6295M][SystemService][Autogen] Updated MT6295M memory map
+#* 	
+#* 	.
+#*
+#* 08 29 2017 tero.jarkko
+#* [MOLY00269781] [Gen93][SystemService][Auto-Gen]I/DSPRAM  MPU settings update
+#* 	
+#* 	.
+#*
+#* 08 28 2017 tero.jarkko
+#* [MOLY00269781] [Gen93][SystemService][Auto-Gen]I/DSPRAM  MPU settings update
+#* 	
+#* 	.
+#*
+#* 08 23 2017 tero.jarkko
+#* [MOLY00269781] [Gen93][SystemService][Auto-Gen]I/DSPRAM  MPU settings update
+#* 	
+#* 	.
+#*
+#* 08 10 2017 tero.jarkko
+#* [MOLY00269510] [BIANCO][MT6763][RDIT][PHONE][PHYTest][SW] Modem only load can't boot in trunk/R2 branch
+#* 	
+#* 	.
+#*
+#* 07 31 2017 carl.kao
+#* [MOLY00267693] [Gen93] [SystemService] [Auto-Gen] Modify MPU for setting RAMDISK to RW
+#* .
+#*
+#* 07 25 2017 carl.kao
+#* [MOLY00265930] [Gen93] [SystemService] [Auto-Gen] AMMS DRDI stage 3 (integrate AMMS with MD DRDI)
+#* [AMMS STAGE 3/DRDI] main code
+#*
+#* 07 12 2017 tero.jarkko
+#* [MOLY00263922] [Gen93][SystemService][Auto-Gen]MPU size optimization
+#* 	
+#* 	.
+#*
+#* 06 08 2017 tero.jarkko
+#* [MOLY00256019] [BIANCO][MT6763][RDIT][FT][FDD][CU][SH][SIM1:CU][SIM2:NA][Fatal error(task)] err_code1:0x00003104 err_code2:0x00000000 err_code3:0xCCCCCCCC
+#* 	
+#* 	.
+#*
+#* 05 18 2017 tero.jarkko
+#* [MOLY00250578] [System Software]change backdoor as UC to avoid coherence issue
+#* 	
+#* 	.
+#*
+#* 05 16 2017 tero.jarkko
+#* [MOLY00249784] [Gen93][SystemService][Auto-Gen]Split static L2C LOCK and dynamic L2C LOCK  section to different output section
+#* 	
+#* 	.
+#*
+#* 05 03 2017 carl.kao
+#* [MOLY00245670] [Gen93] [SystemService] [Auto-Gen] (1) Reduce MPU entry and (2) Set CUIF bank6 as cacheable
+#* Set EXTSRAM as RW
+#*
+#* 05 03 2017 carl.kao
+#* [MOLY00245670] [Gen93] [SystemService] [Auto-Gen] (1) Reduce MPU entry and (2) Set CUIF bank6 as cacheable
+#* 1 MB MPU granularity taken in use
+#*
+#* 05 02 2017 carl.kao
+#* [MOLY00245670] [Gen93] [SystemService] [Auto-Gen] (1) Reduce MPU entry and (2) Set CUIF bank6 as cacheable
+#* Rollback "cross core access to I/DSPRAM enabled" to save MPU entries
+#*
+#* 05 02 2017 carl.kao
+#* [MOLY00245670] [Gen93] [SystemService] [Auto-Gen] (1) Reduce MPU entry and (2) Set CUIF bank6 as cacheable
+#* AutoGen, regioninit, DSM part
+#*
+#* 04 04 2017 tero.jarkko
+#* [MOLY00239310] [Gen93/LR13][SystemService][Auto-Gen][MT6763]Fix core1 null protection
+#* 	
+#* 	.
+#*
+#* 03 02 2017 tero.jarkko
+#* [MOLY00232738] [Gen93][MT6763][SystemService][DSMGR]DSMGR support for MT6763
+#* 	
+#* 	.
+#*
+#* 01 20 2017 tero.jarkko
+#* [MOLY00226093] [Gen93/LR13][SystemService][Auto-Gen][Bianco Bring-up]Modify SPRAM size and address
+#* 	
+#* 	.
+#*
+#* 01 20 2017 tero.jarkko
+#* [MOLY00226093] [Gen93/LR13][SystemService][Auto-Gen][Bianco Bring-up]Modify SPRAM size and address
+#* 	
+#* 	.
+#*
+#* 01 18 2017 tero.jarkko
+#* [MOLY00225658] [Gen93/LR13][SystemService][Auto-Gen][Bianco Bring-up]Modify/Add IOCU section in bank 2/3
+#* 	
+#* 	.
+#*
+#* 12 13 2016 tero.jarkko
+#* [MOLY00218335] [Gen93/LR13][SystemService][Auto-Gen][MPU]Bank1 MPU protection
+#* 	
+#* 	.
+#*
+#* 11 29 2016 tero.jarkko
+#* [MOLY00215759] [Gen93/LR13][SystemService][Auto-Gen][MPU] Null pointer protection
+#* 	
+#* 	.
+#*
+#* 11 17 2016 tero.jarkko
+#* [MOLY00213928] [Gen93/LR13][SystemService][Auto-Gen] AutoGen generated lds file
+#* 	
+#* 	.
+#*
+#* 11 08 2016 tero.jarkko
+#* [MOLY00205040] [Gen93/LR13][SystemService][Auto-Gen] AutoGen generated MPU settings
+#* 	
+#* 	.
+#*
+#* 10 20 2016 tero.jarkko
+#* [MOLY00205040] [Gen93/LR13][SystemService][Auto-Gen] AutoGen generated MPU settings
+#* 	
+#* 	.
+#*
+#*------------------------------------------------------------------------------
+#* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+#*============================================================================
+#****************************************************************************/
+#****************************************************************************
+# Included Modules
+#****************************************************************************
+use strict;
+BEGIN { push @INC, './tools/', './tools/MemoryUtility/' }
+use LinkerOutputParser;
+use FileInfoParser;
+use scatInfo;
+use CommonUtility;
+use Switch;
+use constant {
+  MPU_NA   => 0x00000038,
+  MPU_RO   => 0x00000018,
+  MPU_ROEX => 0x00000010,
+  MPU_WO   => 0x00000028,
+  MPU_RW   => 0x00000008,
+  MPU_RWEX => 0x00000000,
+  MPU_CCA_UC   => 0x00000002,
+  MPU_CCA_WB   => 0x00000003,
+  MPU_CCA_CWBE => 0x00000004,
+  MPU_CCA_CWB  => 0x00000005,
+  MPU_CCA_UCA  => 0x00000007,
+  MPU_DYNAMIC => 0,
+  MPU_FIXED => 1,
+  MPU_NULL => 2,
+};
+#****************************************************************************
+# Variables
+#****************************************************************************
+my @MPU_table_core0;
+my @MPU_table_core1;
+my @MPU_table_core2;
+my @MPU_table_core3;
+my $mpu_null_index = undef;
+my $g_MakeFile_ref = undef;
+my @dynamic_regions = undef;
+my $g_bb = undef;
+my $mpu_dynamic_max = 0;
+#****************************************************************************
+# Input
+#****************************************************************************
+my ($elf_file, $sym_file, $lds_file, $MakeFile) = @ARGV;
+
+print "Parse symbol file $sym_file\n";
+LinkerOutputParser::FileParse($sym_file);
+my $dummy_end = hex(LinkerOutputParser::Get_DUMMY_END_Base());
+
+print "Parse lds file $lds_file\n\n";
+my $LinkInfo = lds_new scatInfo($lds_file, "ROM");
+my %MemInfo;
+map { $MemInfo{$_->[0]} = [hex($_->[1]),hex($_->[2])] } (@{$LinkInfo->{ldsInfo}->{MEMORYInfo}});
+
+$g_MakeFile_ref = &FileInfo::GetMakeFileRef($MakeFile);
+$g_bb = &sysUtil::SwitchToClonedChip(&FileInfo::get("BOARD_VER"));
+print "Modem Arch: ".$g_MakeFile_ref->{MTK_MODEM_ARCH}."\n";
+print "Board ver: ".$g_bb."\n";
+if ($g_MakeFile_ref->{MTK_MODEM_ARCH} =~ /MT6295/)
+{
+    $mpu_null_index =27;
+    $mpu_dynamic_max = 13;
+    @dynamic_regions = (
+            [[0]                                                                                          ,["MCURO_HWRW", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                   ,MPU_ROEX,MPU_CCA_UCA,0x111],
+            [["MCURO_HWRW",LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                 ,["CACHED_EXTSRAM_MCURO_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                 ,MPU_RO  ,MPU_CCA_UCA,0x111,0],
+            [["EXTSRAM", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                   ,["L2CACHE_LOCK", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                              ,MPU_RW  ,MPU_CCA_UCA,0x111,0],
+            [["EXTSRAM_FS_ZI", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                             ,["EXTSRAM_FS_ZI", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                             ,MPU_RW  ,MPU_CCA_UCA,0x111,0],
+            [["MCURO_HWRW", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                ,["CACHED_EXTSRAM_MCURO_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                 ,MPU_RO  ,MPU_CCA_CWB,0x111,2],
+            [["MCURO_HWRW", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                ,["CACHED_EXTSRAM_MCURO_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                 ,MPU_RO  ,MPU_CCA_CWB,0x111,6],
+            [["EXTSRAM", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                   ,["CACHED_EXTSRAM_IOCU2_MCURW_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]           ,MPU_RW  ,MPU_CCA_CWB,0x111,2],
+            [["EXTSRAM", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                   ,["CACHED_EXTSRAM_IOCU3_READ_ALLOC_MCURW_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image],MPU_RW  ,MPU_CCA_CWB,0x111,6],
+            [["DRDI", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                      ,["DRDI", LinkerSymPostfix::Limit,LinkerSymPrefix::Image]                                        ,MPU_RO  ,MPU_CCA_CWB,0x111,6],
+            [["DRDI", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                      ,["DRDI", LinkerSymPostfix::Limit,LinkerSymPrefix::Image]                                        ,MPU_RO  ,MPU_CCA_CWB,0x111,0],
+            [["L2CACHE_LOCK", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                              ,["L2CACHE_LOCK", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                              ,MPU_RWEX,MPU_CCA_CWB,0x111,9],
+            [["CACHED_EXTSRAM_IOCU3_READ_ALLOC_MCURW_HWRW", LinkerSymPostfix::Base,LinkerSymPrefix::Image],["CACHED_EXTSRAM_IOCU3_READ_ALLOC_MCURW_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image],MPU_RW  ,MPU_CCA_CWB,0x111,3],
+            [["EXTSRAM_CORE0", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                             ,["CACHED_EXTSRAM_CORE0", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                      ,MPU_RW  ,MPU_CCA_WB ,0x001,2],
+            [["EXTSRAM_CORE0", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                             ,["CACHED_EXTSRAM_CORE0", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                      ,MPU_NA  ,MPU_CCA_UCA,0x110,0],
+            [["EXTSRAM_CORE1", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                             ,["CACHED_EXTSRAM_CORE1", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                      ,MPU_RW  ,MPU_CCA_WB ,0x010,2],
+            [["EXTSRAM_CORE1", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                             ,["CACHED_EXTSRAM_CORE1", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                      ,MPU_NA  ,MPU_CCA_UCA,0x101,0],
+            [[0x1f000000]                                                                                 ,[0x1f020000]                                                                                    ,MPU_RW  ,MPU_CCA_UC ,0x111],
+            [[0x1fC00000]                                                                                 ,[0x1fC20000]                                                                                    ,MPU_RW  ,MPU_CCA_UC ,0x111]);
+} elsif ($g_MakeFile_ref->{MTK_MODEM_ARCH} =~ /MT6297/) {
+    $mpu_null_index =31;
+    $mpu_dynamic_max = 19;
+    if ((($g_bb =~ /MT6297_FPGA/) and (FileInfo::get("CUSTOM_FLAVOR") =~/_SAP/)) or ($g_bb =~ /MT6885_FPGA/)) {
+        @dynamic_regions = (
+            [[0]                                                                                          ,["MCURO_HWRW", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                   ,MPU_ROEX,MPU_CCA_UCA,0x1111],
+            [["MCURO_HWRW",LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                 ,["CACHED_EXTSRAM_MCURO_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                 ,MPU_RO  ,MPU_CCA_UCA,0x1111,0],
+            [["MCURO_HWRW", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                ,["CACHED_EXTSRAM_MCURO_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                 ,MPU_RO  ,MPU_CCA_CWB,0x1111,6],
+            [["DRDI", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                      ,["DRDI", LinkerSymPostfix::Limit,LinkerSymPrefix::Image]                                        ,MPU_RO  ,MPU_CCA_CWB,0x1111,2],
+            #[["DRDI", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                      ,["DRDI", LinkerSymPostfix::Limit,LinkerSymPrefix::Image]                                        ,MPU_RO  ,MPU_CCA_CWB,0x111,0],
+            [["EXTSRAM", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                   ,["CACHED_EXTSRAM_MCURW_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                 ,MPU_RW  ,MPU_CCA_UCA,0x1111,0],
+            [["EXTSRAM", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                   ,["CACHED_EXTSRAM_MCURW_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                 ,MPU_RW  ,MPU_CCA_CWB,0x1111,6],
+            [["EXTSRAM", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                   ,["CACHED_EXTSRAM_IOCU2_ULTRA_DATA", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]           ,MPU_RW  ,MPU_CCA_CWB,0x1111,2],
+            [["EXTSRAM_ULTRA_DATA", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                        ,["CACHED_EXTSRAM_IOCU3_MCURW_HWRW_15", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]        ,MPU_RW  ,MPU_CCA_CWB,0x1111,3],
+            [["EXTSRAM_FS_ZI", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                             ,["EXTSRAM_FS_ZI", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                             ,MPU_RW  ,MPU_CCA_UCA,0x1111,0],
+            [["L2SRAM_L2C_CODE", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                           ,["L2SRAM_L2C_DATA", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                           ,MPU_RWEX,MPU_CCA_CWB,0x1111,9],
+            [["USPRAM_CODE", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                               ,["USPRAM_DATA", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                               ,MPU_RWEX,MPU_CCA_CWB,0x1111,9],
+            [[0x1f000000]                                                                                 ,[0x1f020000]                                                                                    ,MPU_RW  ,MPU_CCA_UC ,0x1111],
+            [[0x1fC00000]                                                                                 ,[0x1fC20000]                                                                                    ,MPU_RW  ,MPU_CCA_UC ,0x1111]);
+    } elsif (FileInfo::is("PLATFORM", "MT6297")){
+        @dynamic_regions = (
+            [[0]                                                                                          ,["MCURO_HWRW", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                   ,MPU_ROEX,MPU_CCA_UCA,0x1111],
+            [["MCURO_HWRW",LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                 ,["CACHED_EXTSRAM_MCURO_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                 ,MPU_RO  ,MPU_CCA_UCA,0x1111,0],
+            [["MCURO_HWRW", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                ,["CACHED_EXTSRAM_MCURO_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                 ,MPU_RO  ,MPU_CCA_CWB,0x1111,6],
+            [["DRDI", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                      ,["DRDI", LinkerSymPostfix::Limit,LinkerSymPrefix::Image]                                        ,MPU_RO  ,MPU_CCA_CWB,0x1111,2],
+            #[["DRDI", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                      ,["DRDI", LinkerSymPostfix::Limit,LinkerSymPrefix::Image]                                        ,MPU_RO  ,MPU_CCA_CWB,0x111,0],
+            [["EXTSRAM", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                   ,["EXTSRAM_DSP_RX_ZI", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                            ,MPU_RW  ,MPU_CCA_UCA,0x1111,0],
+            [[0x10000000]                                                                                 ,["CACHED_EXTSRAM_MCURW_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                 ,MPU_RW  ,MPU_CCA_UCA,0x1111,1],
+            [["EXTSRAM", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                   ,["EXTSRAM_DSP_RX_ZI", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                            ,MPU_RW  ,MPU_CCA_CWB,0x1111,6],
+            [[0x70000000]                                                                                 ,["CACHED_EXTSRAM_MCURW_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                 ,MPU_RW  ,MPU_CCA_CWB,0x1111,7],
+            [["EXTSRAM", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                   ,["CACHED_EXTSRAM_IOCU2_ULTRA_DATA", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]           ,MPU_RW  ,MPU_CCA_CWB,0x1111,2],
+            [["EXTSRAM_ULTRA_DATA", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                        ,["CACHED_EXTSRAM_IOCU3_MCURW_HWRW_15", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]        ,MPU_RW  ,MPU_CCA_CWB,0x1111,3],
+            [["EXTSRAM_FS_ZI", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                             ,["EXTSRAM_FS_ZI", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                             ,MPU_RW  ,MPU_CCA_UCA,0x1111,1],
+            [["L2SRAM_L2C_CODE", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                           ,["L2SRAM_L2C_CODE", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                           ,MPU_ROEX,MPU_CCA_CWB,0x1111,9],
+            [["L2SRAM_L2C_DATA", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                           ,["L2SRAM_L2C_DATA", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                           ,MPU_RW  ,MPU_CCA_CWB,0x1111,9],
+            [[0x1f000000]                                                                                 ,[0x1f020000]                                                                                    ,MPU_RW  ,MPU_CCA_UC ,0x1111],
+            [[0x1fC00000]                                                                                 ,[0x1fC20000]                                                                                    ,MPU_RW  ,MPU_CCA_UC ,0x1111])
+
+    } elsif (FileInfo::is("PLATFORM", "MT6885") || FileInfo::is("PLATFORM", "MT6873")) {
+        @dynamic_regions = (
+            [[0]                                                                                          ,["MCURO_HWRW", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                   ,MPU_ROEX,MPU_CCA_UCA,0x1111],
+            [["MCURO_HWRW",LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                 ,["CACHED_EXTSRAM_MCURO_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                 ,MPU_RO  ,MPU_CCA_UCA,0x1111,0],
+            [["MCURO_HWRW", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                ,["CACHED_EXTSRAM_MCURO_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                 ,MPU_RO  ,MPU_CCA_CWB,0x1111,6],
+            [["EXTSRAM", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                   ,["CACHED_EXTSRAM_MCURW_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                 ,MPU_RW  ,MPU_CCA_UCA,0x1111,0],
+            [["EXTSRAM", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                   ,["CACHED_EXTSRAM_MCURW_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                 ,MPU_RW  ,MPU_CCA_CWB,0x1111,6],
+            [["EXTSRAM", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                   ,["CACHED_EXTSRAM_IOCU2_ULTRA_DATA", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]           ,MPU_RW  ,MPU_CCA_CWB,0x1111,2],
+            [["EXTSRAM_ULTRA_DATA", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                        ,["CACHED_EXTSRAM_IOCU3_MCURW_HWRW_ZI_15", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]     ,MPU_RW  ,MPU_CCA_CWB,0x1111,3],
+            [["DRDI", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                      ,["DRDI", LinkerSymPostfix::Limit,LinkerSymPrefix::Image]                                        ,MPU_RO  ,MPU_CCA_UCA,0x1111,0],
+            [["DRDI", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                      ,["DRDI", LinkerSymPostfix::Limit,LinkerSymPrefix::Image]                                        ,MPU_RO  ,MPU_CCA_CWB,0x1111,6],
+            [["EXTSRAM_FS_ZI", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                             ,["EXTSRAM_FS_ZI", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                             ,MPU_RW  ,MPU_CCA_UCA,0x1111,1],
+            [["L2SRAM_L2C_CODE", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                           ,["L2SRAM_L2C_CODE", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                           ,MPU_ROEX,MPU_CCA_CWB,0x1111,9],
+            [["L2SRAM_L2C_DATA", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                           ,["L2SRAM_L2C_DATA", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                           ,MPU_RW  ,MPU_CCA_CWB,0x1111,9],
+            [["MCURW_HWRW_DNC_SS_EXT_CSIF", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                ,["MCURW_HWRW_DNC_NL1_EXT_CSIF", LinkerSymPostfix::Limit,LinkerSymPrefix::Image]                 ,MPU_RW  ,MPU_CCA_UCA,0x1111,0],
+            [["MCURW_HWRW_DNC_SS_EXT_CSIF", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                ,["MCURW_HWRW_DNC_NL1_EXT_CSIF", LinkerSymPostfix::Limit,LinkerSymPrefix::Image]                 ,MPU_RW  ,MPU_CCA_CWB,0x1111,6],
+            [[0x1f000000]                                                                                 ,[0x1f020000]                                                                                    ,MPU_RW  ,MPU_CCA_UC ,0x1111],
+            [[0x1fC00000]                                                                                 ,[0x1fC20000]                                                                                    ,MPU_RW  ,MPU_CCA_UC ,0x1111])
+    } else {
+        @dynamic_regions = (
+            [[0]                                                                                          ,["MCURO_HWRW", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                   ,MPU_ROEX,MPU_CCA_UCA,0x1111],
+            [["MCURO_HWRW",LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                 ,["CACHED_EXTSRAM_MCURO_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                 ,MPU_RO  ,MPU_CCA_UCA,0x1111,0],
+            [["MCURO_HWRW", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                ,["CACHED_EXTSRAM_MCURO_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                 ,MPU_RO  ,MPU_CCA_CWB,0x1111,6],
+            [["EXTSRAM", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                   ,["CACHED_EXTSRAM_MCURW_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                 ,MPU_RW  ,MPU_CCA_UCA,0x1111,0],
+            [["EXTSRAM", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                   ,["CACHED_EXTSRAM_MCURW_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                 ,MPU_RW  ,MPU_CCA_CWB,0x1111,6],
+            [["EXTSRAM", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                   ,["CACHED_EXTSRAM_IOCU2_ULTRA_DATA", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]           ,MPU_RW  ,MPU_CCA_CWB,0x1111,2],
+            [["EXTSRAM_ULTRA_DATA", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                        ,["CACHED_EXTSRAM_IOCU3_MCURW_HWRW_ZI_15", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]     ,MPU_RW  ,MPU_CCA_CWB,0x1111,3],
+            [["DRDI", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                      ,["DRDI", LinkerSymPostfix::Limit,LinkerSymPrefix::Image]                                        ,MPU_RO  ,MPU_CCA_UCA,0x1111,0],
+            [["DRDI", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                      ,["DRDI", LinkerSymPostfix::Limit,LinkerSymPrefix::Image]                                        ,MPU_RO  ,MPU_CCA_CWB,0x1111,6],
+            [["EXTSRAM_FS_ZI", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                             ,["EXTSRAM_FS_ZI", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                             ,MPU_RW  ,MPU_CCA_UCA,0x1111,1],
+            [["L2SRAM_L2C_CODE", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                           ,["L2SRAM_L2C_CODE", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                           ,MPU_ROEX,MPU_CCA_CWB,0x1111,9],
+            [["L2SRAM_L2C_DATA", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                           ,["L2SRAM_L2C_DATA", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                           ,MPU_RW  ,MPU_CCA_CWB,0x1111,9],
+            [[0x1f000000]                                                                                 ,[0x1f020000]                                                                                    ,MPU_RW  ,MPU_CCA_UC ,0x1111],
+            [[0x1fC00000]                                                                                 ,[0x1fC20000]                                                                                    ,MPU_RW  ,MPU_CCA_UC ,0x1111])
+    }
+    unshift @dynamic_regions, [[0],["MCURO_HWRW", LinkerSymPostfix::Base,LinkerSymPrefix::Image],MPU_ROEX,MPU_CCA_CWB,0x1111,9] if(FileInfo::is("MTK_MODEM_ARCH", "MT6297") or FileInfo::is("MTK_MODEM_ARCH", "MT6297P"));
+} else {
+    $mpu_null_index =21;
+    $mpu_dynamic_max = 13;
+    @dynamic_regions = (
+            [[0]                                                                                          ,["MCURO_HWRW", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                   ,MPU_ROEX,MPU_CCA_UCA,0x111],
+            [["MCURO_HWRW",LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                 ,["CACHED_EXTSRAM_MCURO_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                 ,MPU_RO  ,MPU_CCA_UCA,0x111,0],
+            [["EXTSRAM", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                   ,["L2CACHE_LOCK", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                              ,MPU_RW  ,MPU_CCA_UCA,0x111,0],
+            [["EXTSRAM_FS_ZI", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                             ,["EXTSRAM_FS_ZI", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                             ,MPU_RW  ,MPU_CCA_UCA,0x111],
+            [["MCURO_HWRW", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                ,["CACHED_EXTSRAM_MCURO_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                 ,MPU_RO  ,MPU_CCA_CWB,0x111,6],
+            [["EXTSRAM", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                   ,["CACHED_EXTSRAM_IOCU3_READ_ALLOC_MCURW_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image],MPU_RW  ,MPU_CCA_CWB,0x111,6],
+            [["DRDI", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                      ,["DRDI", LinkerSymPostfix::Limit,LinkerSymPrefix::Image]                                        ,MPU_RO  ,MPU_CCA_CWB,0x111,6],
+            [["DRDI", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                                      ,["DRDI", LinkerSymPostfix::Limit,LinkerSymPrefix::Image]                                        ,MPU_RO  ,MPU_CCA_CWB,0x111,0],
+            [["CACHED_EXTSRAM_L2CACHE_LOCK_DATA", LinkerSymPostfix::Base,LinkerSymPrefix::Image]          ,["DYNAMIC_SECTION_L2CACHE_LOCK_0", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]            ,MPU_RWEX,MPU_CCA_CWB,0x111,9],
+            [["DYNAMIC_SECTION_L2CACHE_LOCK_L_IDLE", LinkerSymPostfix::Base,LinkerSymPrefix::Image]       ,["DYNAMIC_SECTION_L2CACHE_LOCK_C_DO_DATALINK", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image],MPU_RWEX,MPU_CCA_CWB,0x111,9],
+            [["CACHED_EXTSRAM_IOCU2_MCURW_HWRW", LinkerSymPostfix::Base,LinkerSymPrefix::Image]           ,["CACHED_EXTSRAM_IOCU2_MCURW_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]           ,MPU_RW  ,MPU_CCA_CWB,0x111,2],
+            [["CACHED_EXTSRAM_IOCU3_READ_ALLOC_MCURW_HWRW", LinkerSymPostfix::Base,LinkerSymPrefix::Image],["CACHED_EXTSRAM_IOCU3_READ_ALLOC_MCURW_HWRW", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image],MPU_RW  ,MPU_CCA_CWB,0x111,3],
+            [["EXTSRAM_CORE0", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                             ,["CACHED_EXTSRAM_CORE0", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                      ,MPU_RW  ,MPU_CCA_WB ,0x001,6],
+            [["EXTSRAM_CORE0", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                             ,["CACHED_EXTSRAM_CORE0", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                      ,MPU_NA  ,MPU_CCA_UCA,0x110,0],
+            [["EXTSRAM_CORE1", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                             ,["CACHED_EXTSRAM_CORE1", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                      ,MPU_RW  ,MPU_CCA_WB ,0x010,6],
+            [["EXTSRAM_CORE1", LinkerSymPostfix::Base,LinkerSymPrefix::Image]                             ,["CACHED_EXTSRAM_CORE1", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]                      ,MPU_NA  ,MPU_CCA_UCA,0x101,0],
+            [[0x1f000000]                                                                                 ,[0x1f020000]                                                                                    ,MPU_RW  ,MPU_CCA_UC ,0x111],
+            [[0x1fC00000]                                                                                 ,[0x1fC20000]                                                                                    ,MPU_RW  ,MPU_CCA_UC ,0x111]);
+  }
+
+
+
+my @fixed_core0 =     ([[0x9FB00000]                                                                       ,[0x9FB3FFFF]                                                     ,MPU_ROEX  ,MPU_CCA_CWB ,0x0001]);# bootslave
+
+my @fixed_core1   =   ([[0x9FB40000]                                                                       ,[0x9FB7FFFF]                                                     ,MPU_ROEX  ,MPU_CCA_CWB ,0x0010]);
+
+my @fixed_core2   =   ([[0x9FB80000]                                                                       ,[0x9FBBFFFF]                                                     ,MPU_ROEX  ,MPU_CCA_CWB ,0x0100]);
+
+my @fixed_core3   =   ([[0x9FBC0000]                                                                       ,[0x9FBFFFFF]                                                     ,MPU_ROEX  ,MPU_CCA_CWB ,0x1000]);
+
+my @null_prot =  (     [[0]                                                                                ,["ROM", LinkerSymPostfix::ZILimit,LinkerSymPrefix::Image]        ,MPU_NA  ,MPU_CCA_UC ,0x1111,0]);#21
+#****************************************************************************
+# >>>  Main Flow
+#****************************************************************************
+# Parse regions table and create MPU region tables
+print "\nCalculate dynamic MPU entries:\n";
+Parse_regions(\@dynamic_regions,MPU_DYNAMIC);
+if(($#MPU_table_core0 >= $mpu_dynamic_max) or ($#MPU_table_core1 >= $mpu_dynamic_max) or ($#MPU_table_core2 >= $mpu_dynamic_max) or ($#MPU_table_core3 >= $mpu_dynamic_max)) {
+  print "\nERROR: Dynamic mpu entry count exceeded max count ".$mpu_dynamic_max."\n";
+  print "\nCORE 0 MPU table:\n";
+  PrintMPUTable(\@MPU_table_core0);
+  print "\nCORE 1 MPU table:\n";
+  PrintMPUTable(\@MPU_table_core1);
+  print "\nCORE 2 MPU table:\n";
+  PrintMPUTable(\@MPU_table_core2);
+  print "\nCORE 3 MPU table:\n";
+  PrintMPUTable(\@MPU_table_core3);
+  exit 1;
+}
+if ($g_MakeFile_ref->{MTK_MODEM_ARCH} =~ /MT6297/) {
+    FillTable(\@MPU_table_core0,19);
+    FillTable(\@MPU_table_core1,19);
+    FillTable(\@MPU_table_core2,19);
+    FillTable(\@MPU_table_core3,19);
+
+    print "\nCalculate CORE0 MPU entries:\n";
+    Parse_regions(\@fixed_core0,MPU_FIXED);
+    print "\nCalculate CORE1 MPU entries:\n";
+    Parse_regions(\@fixed_core1,MPU_FIXED);
+    print "\nCalculate CORE2 MPU entries:\n";
+    Parse_regions(\@fixed_core2,MPU_FIXED);
+    print "\nCalculate CORE3 MPU entries:\n";
+    Parse_regions(\@fixed_core3,MPU_FIXED);
+}
+FillTable(\@MPU_table_core0,$mpu_null_index);
+FillTable(\@MPU_table_core1,$mpu_null_index);
+FillTable(\@MPU_table_core2,$mpu_null_index);
+FillTable(\@MPU_table_core3,$mpu_null_index);
+
+Parse_regions(\@null_prot,MPU_NULL);
+FillTable(\@MPU_table_core0,32);
+FillTable(\@MPU_table_core1,32);
+FillTable(\@MPU_table_core2,32);
+FillTable(\@MPU_table_core3,32);
+
+print "\nCORE 0 MPU table:\n";
+PrintMPUTable(\@MPU_table_core0);
+print "\nCORE 1 MPU table:\n";
+PrintMPUTable(\@MPU_table_core1);
+print "\nCORE 2 MPU table:\n";
+PrintMPUTable(\@MPU_table_core2);
+print "\nCORE 3 MPU table:\n";
+PrintMPUTable(\@MPU_table_core3);
+print "\nUpdate ELF file: $elf_file\n";
+print "\nUpdate Core 0 MPU info to ELF file: $elf_file\n";
+UpdateMPUtoELF($elf_file,\@MPU_table_core0,GetSymbolAddressFromElf("mpu_region_config_core0"));
+print "\nUpdate Core 1 MPU info to ELF file: $elf_file\n";
+UpdateMPUtoELF($elf_file,\@MPU_table_core1,GetSymbolAddressFromElf("mpu_region_config_core1"));
+print "\nUpdate Core 2 MPU info to ELF file: $elf_file\n";
+UpdateMPUtoELF($elf_file,\@MPU_table_core2,GetSymbolAddressFromElf("mpu_region_config_core2"));
+print "\nUpdate Core 3 MPU info to ELF file: $elf_file\n";
+UpdateMPUtoELF($elf_file,\@MPU_table_core3,GetSymbolAddressFromElf("mpu_region_config_core3"));
+print "End\n";
+exit 0;
+
+#****************************************************************************
+# Subroutines
+#****************************************************************************
+sub Parse_regions
+{
+    my ($table_ref,$mode) = @_;
+    foreach my $region_ref (@{$table_ref}) {
+        my $area_begin = 0;
+        my $area_end = 0;
+        my $area_length = 0;
+        if(($region_ref->[0][0]^$region_ref->[0][0])) {
+        $area_begin = hex(LinkerOutputParser::GetLinkerSymbolAddress($region_ref->[0][0],$region_ref->[0][1],$region_ref->[0][2]));
+        } else {
+        $area_begin = $region_ref->[0][0];
+        }
+        if(($region_ref->[1][0]^$region_ref->[1][0])) {
+        $area_end = hex(LinkerOutputParser::GetLinkerSymbolAddress($region_ref->[1][0],$region_ref->[1][1],$region_ref->[1][2]));
+        } else {
+        $area_end = $region_ref->[1][0];
+        }
+        if (defined $region_ref->[5]) {
+        $area_begin = get_physical_address($area_begin)| $region_ref->[5]<<28;
+        $area_end = get_physical_address($area_end) | $region_ref->[5]<<28;
+        }
+        $area_length = $area_end - $area_begin;
+
+        print "Start: " .&CommonUtil::Dec2Hex($area_begin)." End: " .&CommonUtil::Dec2Hex($area_end)." Length: " .&CommonUtil::Dec2Hex($area_length). " ". get_mpu($region_ref->[2]|$region_ref->[3]) . "\n";
+        if ($area_length > 0) {
+          my @mpu_info = @{GetMPUinfo($area_begin,$area_length,$mode)};
+          foreach my $mpu (@mpu_info) {
+            my $control_reg = (0<<15)|($mpu->[1]<<10)|(($mpu->[2]-1)<<6)|$region_ref->[2]|$region_ref->[3];
+            InsertMPURegion($mpu->[0],$control_reg,$region_ref->[4]);
+          } 
+        } elsif (($mode == MPU_FIXED) || ($mode == MPU_NULL)) {
+          InsertMPURegion(0,0,$region_ref->[4]);
+        }
+    }
+}
+
+sub FillTable
+{
+    my ($table_ref, $elements) = @_;
+    my $index = $#{$table_ref};
+    for ($index+=1;$index<$elements;$index+=1) {
+      push @{$table_ref}, [0,0];
+    }
+}
+
+sub UpdateMPUtoELF
+{
+    my ($elf,$table_ref,$offset) = @_;
+    if ($offset == 0) {
+        print "MPU table address invalid. $elf not updated\n";
+        return;
+    }
+    open (my $BIN_FILE, "+<$elf") or die "Open $elf file failed\n";
+    binmode $BIN_FILE;
+    seek $BIN_FILE, $offset,0;
+    foreach my $region (@$table_ref) {
+        print $BIN_FILE pack('L<[2]',@{$region});
+    }
+    close $BIN_FILE;
+    print "$elf file updated successfully\n";
+}
+
+sub InsertMPURegion
+{
+    my ($base,$control,$core) = @_;
+    push @MPU_table_core0, [$base,$control] if ($core & 0x0001);
+    push @MPU_table_core1, [$base,$control] if ($core & 0x0010);
+    push @MPU_table_core2, [$base,$control] if ($core & 0x0100);
+    push @MPU_table_core3, [$base,$control] if ($core & 0x1000);
+}
+
+sub msb
+{
+    my ($n, $base) = (shift, 0);
+    $base++ while $n >>= 1;
+    return $base;
+}
+
+sub lsb
+{
+    my $n = shift;
+    return msb($n & -$n);
+}
+
+sub get_mpu
+{
+    my ($mpu) = @_;
+    my $rval ="";
+    switch ($mpu & 0x38) {
+      case MPU_NA    { $rval .= "MPU_NA  "; }
+      case MPU_RO    { $rval .= "MPU_RO  "; }
+      case MPU_ROEX  { $rval .= "MPU_ROEX"; }
+      case MPU_WO    { $rval .= "MPU_WO  "; }
+      case MPU_RW    { $rval .= "MPU_RW  "; }
+      case MPU_RWEX  { $rval .= "MPU_RWEX"; }
+    }
+    switch ($mpu & 0x7) {
+     case MPU_CCA_UC   { $rval .= " MPU_CCA_UC  "; }
+     case MPU_CCA_WB   { $rval .= " MPU_CCA_WB  "; }
+     case MPU_CCA_CWBE { $rval .= " MPU_CCA_CWBE"; }
+     case MPU_CCA_CWB  { $rval .= " MPU_CCA_CWB "; }
+     case MPU_CCA_UCA  { $rval .= " MPU_CCA_UCA ";}
+    }
+        return $rval;
+}
+
+sub GetPageSize
+{
+    my ($addr) = @_;
+    my $pagesize = 1<<$addr;
+    return sprintf("%4.dB ",$pagesize) if($pagesize <= 1024);
+    $pagesize /= 1024;
+    if ($pagesize <= 1024) {
+        return sprintf("%4.dKB",$pagesize);
+    } else {
+        return sprintf("%4.dMB",$pagesize/1024);
+    }
+}
+
+sub GetGran
+{
+    my ($val) = @_;
+    return 28 if ($val == 0);
+    return lsb($val);
+}
+
+sub GetMPUinfo
+{
+    my ($start, $length,$type) = @_;
+    my $addr_gran = GetGran($start);
+    my @mpu_pages;
+    if ($type == MPU_NULL) {
+        my $page_size = msb($length)-3;
+        $page_size = 5 if($page_size < 5);
+        if ($addr_gran >=  $page_size) {
+            my $page_count = ($length>>$page_size);
+            $page_size +=  lsb($page_count);
+            $page_count >>= lsb($page_count);
+            push @mpu_pages,[$start, $page_size, $page_count];
+        }
+    } else {
+        if ($length != 0) {
+            #set MPU area total resrvation size to 0
+            my $reserved_size = 0;
+            #current length MPU area to be allocated
+            my $current_length = $length;
+            #initial allocated page count
+            my $page_count = 0;
+            #initial page size is determined from length
+            my $page_size = msb($current_length)-3;
+            #check that if we still need to make MPU allocation
+            while ($reserved_size < $length) {
+                #Page size cannot be less than 32 bytes
+                $page_size = 5 if($page_size < 5);
+                #Check if we are using address or length granularity to determine page size.
+                if ($addr_gran <  $page_size) {
+                    $page_size = $addr_gran;
+                }
+                $page_count = ($current_length>>$page_size);
+                #check do we need add one more page if we have tailing bytes in current allocation
+                $page_count += 1 if (((1<<$page_size)-1) & $current_length);
+                if (($page_count+(($start>>$page_size) &0xf)) > 16) {
+                    #if we are allocating more than 16 pages we increase page_size but not exceed address granularity
+                    if ($page_size<$addr_gran) {
+                        $page_size +=1;
+                        next;
+                    }
+                    #if we cannot increase page size we allocate as many pages as possible.
+                    $page_count = 16-(($start>>$page_size) &0xf);
+                }
+                #check if we can use larger page granularity for allocation. Without exceeding address granularity
+                my $i = lsb($page_count);
+                if ($i!=0) {
+                    if ($addr_gran < ($page_size+$i)) {
+                        $i = $addr_gran-$page_size;
+                    }
+                    $page_count >>=$i;
+                    $page_size +=$i;
+                }
+                push @mpu_pages,[$start, $page_size, $page_count];      
+                #calculate total reservation size
+                $reserved_size += $page_count<<$page_size;
+                #calculate remaining reservation start address
+                $start += $page_count<<$page_size;
+                #calculate new address page granularity
+                $addr_gran =  GetGran($start);
+                #remaining area to be allocated
+                $current_length -= $page_count<<$page_size;
+                #new initial page size
+                $page_size = msb($current_length)-3;
+            }
+        }
+    }
+    if (($type == MPU_FIXED)|| ($type == MPU_NULL)) {
+        push @mpu_pages, [0,0,0] if (@mpu_pages == undef);
+    }
+    return \@mpu_pages;
+}
+
+sub PrintMPUTable
+{
+    my ($table_ref) = @_;
+    #Print table
+    my $index = 0;
+    print "Index  Base        Control     Attr         CCA     Size  Count\n";
+    foreach my $region (@$table_ref) {
+        if ($region->[1]) {
+            print "    $index " .&CommonUtil::Dec2Hex($region->[0]) . " " .&CommonUtil::Dec2Hex($region->[1]). " ".&get_mpu($region->[1]);
+            my $page_size = GetPageSize(($region->[1]>>10)&0x1f);
+            my $page_count= (($region->[1]>>6)&0xf)+1;
+            print " $page_size       $page_count\n";
+        } else {
+            print "    $index " .&CommonUtil::Dec2Hex($region->[0]) . " " .&CommonUtil::Dec2Hex($region->[1])."\n";
+        }
+        $index +=1;
+    }
+}
+
+sub GetSymbolAddressFromElf
+{
+    my ($symName) = @_;
+    my $refSymbols = LinkerOutputParser::GetSymbol();
+    my $syminfo =  $refSymbols->{$symName};
+    my $nSectionOffset = hex(LinkerOutputParser::GetExeRegionInfo($syminfo->[Symbol::Region], Region::Offsets));
+    my $nSectionStart =  hex(LinkerOutputParser::GetExeRegionInfo($syminfo->[Symbol::Region], Region::VMA)) & 0x0fffffff;
+    return ($nSectionOffset - $nSectionStart) + (hex($syminfo->[Symbol::Addr]) & 0x0fffffff);
+}
+
+sub get_physical_address
+{
+    my ($address) = @_;
+    my $addr_mask = 0x0fffffff;
+    my $bank = $address>>28;
+    if (($bank == 1) || ($bank == 7)) {
+        $addr_mask = 0x1fffffff;
+    }
+    return ($address & $addr_mask);
+}