[Feature]Upload Modem source code

Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/driver/devdrv/asm/src/drv_asm.c b/mcu/driver/devdrv/asm/src/drv_asm.c
new file mode 100644
index 0000000..8b15d6b
--- /dev/null
+++ b/mcu/driver/devdrv/asm/src/drv_asm.c
@@ -0,0 +1,2239 @@
+/*****************************************************************************
+*  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) 2005
+*
+*  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:
+ * ---------
+ * drv_asm.c
+ *
+ * Project:
+ * --------
+ *   UMOLY_Software
+ *
+ * Description:
+ * ------------
+ *   This file implements ASM drivers
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *==============================================================================
+ *             HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ 
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#include "asm_reg.h"
+#include "drv_asm.h"
+#include "intrCtrl.h"
+#include "kal_iram_section_defs.h"
+#include "us_timer.h"
+#include "ex_public.h"
+
+ASM_STRUCT Asm_Infor[ASM_NUM];
+
+kal_uint32 Asm_Infor_gen_config[ASM_NUM];
+kal_uint32 Asm_Infor_context_id[ASM_NUM][ASM_TC_NUM];
+kal_uint32 Asm_Infor_trigger_cnt[ASM_NUM];
+
+
+kal_uint32 ASM_Dummy_Read;
+//kal_uint32 PC_Val[ASM_NUM];
+
+
+EX_BBREG_DUMP Asm_Dump;
+
+kal_uint32 Asm_Dump_Regions[ASM_NUM][3];
+
+//#define ASM_DORMANT_BUFFER_LENGTH (256)  //1KB
+//#define ASM_DORMANT_BUFFER_SIZE (ASM_DORMANT_BUFFER_LENGTH*4/1024)  //1KB
+
+
+//__attribute__((section("NONCACHEDZI"))) __attribute__ ((aligned ( 32 ))) kal_uint32 g_ASM_DORMAT_BUFFER[ASM_DORMANT_BUFFER_LENGTH];
+
+
+
+/*****************************************************************************
+ * Internal Function                                                         *
+ *****************************************************************************/
+void ASM_AckAllIntStatus(kal_uint32 core);
+void ASM_SetSPMAndWaitSMPGrant(kal_uint32 core);
+
+
+/*****************************************************************************
+ * Public Function                                                           *
+ *****************************************************************************/
+#define CP0_TraceControl_read(val)\
+    do { \
+        __asm__ __volatile__ ( \
+            "mfc0 %0, $23, 1\n\t" \
+            "nop\n\t" \
+            "nop\n\t" \
+            "nop\n\t" \
+            : "=r"(val)\
+            : "0"(val)\
+        ); \
+    } while(0)
+
+
+#define CP0_TraceControl_write(val) \
+    do { \
+        __asm__ __volatile__ ( \
+            "mtc0 %0, $23, 1\n\t" \
+            "nop\n\t" \
+            "nop\n\t" \
+            "nop\n\t" \
+            : \
+            : "r"(val)\
+        ); \
+    } while(0)
+
+/*************************************************************************
+* FUNCTION
+*  Asm_PowerOffPDTrace
+*
+* DESCRIPTION
+*  Power off PDTrace
+*
+* PARAMETERS
+*
+* RETURNS
+*
+*************************************************************************/
+void Asm_PowerOffPDTrace(void)
+{
+//    kal_uint32 val;
+    
+//    CP0_TraceControl_read(val);
+    CP0_TraceControl_write(0x80000000);
+
+}
+/*************************************************************************
+* FUNCTION
+*  Asm_InitInforAllCore
+*
+* DESCRIPTION
+*  Init Asm Infor
+*
+* PARAMETERS
+*
+* RETURNS
+*
+*************************************************************************/
+void Asm_InitInforAllCore(void)
+{
+
+    memset((kal_uint8*)Asm_Infor, 0x00, sizeof(Asm_Infor));
+
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_EnableMcuELM
+*
+* DESCRIPTION
+*  Enable Mcu ELM feature
+*
+* PARAMETERS
+*
+* core: core number
+*
+* RETURNS
+*
+*************************************************************************/
+void ASM_EnableMcuELM(kal_uint32 core)
+{
+    Asm_Infor_gen_config[core] |= ASM_MCU_ELM_EN_MASK;
+   
+    ASM_SET_GEN_CONFIG(core,Asm_Infor_gen_config[core]);
+	
+
+}
+
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_DisableMcuELM
+*
+* DESCRIPTION
+*  Disable Mcu ELM feature
+*
+* PARAMETERS
+*
+* core: core number
+*
+* RETURNS
+*
+*************************************************************************/
+void ASM_DisableMcuELM(kal_uint32 core)
+{
+	
+	Asm_Infor_gen_config[core] &= (~ASM_MCU_ELM_EN_MASK);
+
+    ASM_SET_GEN_CONFIG(core,Asm_Infor_gen_config[core]);
+
+}
+
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_SetAddon
+*
+* DESCRIPTION
+*  Set ASM addon information 
+*
+* PARAMETERS
+*  kal_uint32 core         : core number
+*  kal_uint32 tc           : tc number
+*  kal_uint32* addon_infor : addon information(max is 8 words)
+*  kal_uint32* size        : addon information size
+*  kal_uint32 start_index  : addon start index
+*
+* RETURNS
+*
+* ASM_ERROR_CODE
+*
+*************************************************************************/
+
+ASM_ERROR_CODE ASM_SetAddon(kal_uint32 core,kal_uint32 tc,kal_uint32* addon_infor,kal_uint32 size,kal_uint32 start_index )
+{
+	kal_uint32 i;
+	volatile kal_uint32 *extra_addon_info_base_addr;
+
+#if defined(MT6763) || defined(MT6739)
+//For ASM GCR is overlapped with CIRQ
+	if((ASM_CORE0 == core) && (tc == 3))
+	{
+		return ASM_ERROR_CODE_NO_ERROR;
+	}	
+#endif //#if defined(MT6763)
+
+//Remove read status check to speed up write addon
+//	if(Asm_Infor[core].mode_config&APB_WR_GCR_BIT_EN)
+//        extra_addon_info_base_addr = (kal_uint32 *)ASM_PROFILE_ADDON_INFO_(core,tc);
+//    else
+        extra_addon_info_base_addr = (kal_uint32 *)ASM_GCR_PROFILE_ADDON_INFO_(core,tc);
+
+	if(start_index < ASM_PROFILE_END && start_index >= ASM_ADDON_INFO0_EN)
+	{
+		start_index -= ASM_ADDON_INFO0_EN;
+		if( (start_index + size) > ASM_ADDON_NUM)
+		{
+            //ASSERT(0);   
+            return ASM_ERROR_CODE_OVER_ADDON_INDEX;
+        }
+	}
+	else
+	{
+         //ASSERT(0);   
+         return ASM_ERROR_CODE_OVER_ADDON_SIZE;
+	}
+
+ 	for( i = 0 ; i < size ; ++i )
+	{
+		Asm_Infor[core].addon[tc][start_index+i]= addon_infor[i];
+	    *(extra_addon_info_base_addr+start_index+i) = addon_infor[i];
+	}
+	
+	return ASM_ERROR_CODE_NO_ERROR;
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_GetProfilingOption
+*
+* DESCRIPTION
+*  Get profile options and addon setting 
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*
+* kal_uint32 : profile option
+*
+*************************************************************************/
+kal_uint32 ASM_GetProfilingOption(kal_uint32 core)
+{
+    return Asm_Infor[core].profile_en;
+    
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_EnablePDI
+*
+* DESCRIPTION
+*  Enable PDI options to ASM 
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*
+*************************************************************************/
+void ASM_EnablePDI(kal_uint32 core)
+{
+    Asm_Infor_gen_config[core] |= ASM_PDI_MASK;
+    
+    ASM_SET_GEN_CONFIG(core, Asm_Infor_gen_config[core]);
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_DisablePDI
+*
+* DESCRIPTION
+*  Disable PDI options to ASM 
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*
+*************************************************************************/
+void ASM_DisablePDI(kal_uint32 core)
+{
+    Asm_Infor_gen_config[core] &= (~ASM_PDI_MASK);
+    
+    ASM_SET_GEN_CONFIG(core, Asm_Infor_gen_config[core]);
+
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_EnableApbWrite
+*
+* DESCRIPTION
+*  Enable APB write options to ASM 
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*
+*************************************************************************/
+void ASM_EnableApbWrite(kal_uint32 core)
+{
+    Asm_Infor[core].mode_config |= APB_WR_GCR_BIT_EN;
+
+    ASM_SET_MODE_CONFIG(core, Asm_Infor[core].mode_config);
+
+}
+/*************************************************************************
+* FUNCTION
+*  ASM_DisableApbWrite
+*
+* DESCRIPTION
+*  Disable APB write options to ASM 
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*
+*************************************************************************/
+void ASM_DisableApbWrite(kal_uint32 core)
+{
+    Asm_Infor[core].mode_config &= (~APB_WR_GCR_BIT_EN);
+
+    ASM_SET_MODE_CONFIG(core, Asm_Infor[core].mode_config);
+
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_GetMode
+*
+* DESCRIPTION
+*  Get ASM setting Mode 
+*
+* PARAMETERS
+*  kal_uint32 mode : ASM Mode
+*
+* RETURNS
+*
+* kal_uint32 : ASM Mode
+*
+*************************************************************************/
+kal_uint32 ASM_GetMode(kal_uint32 core)
+{
+    return Asm_Infor[core].asm_mode;
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_SetMode
+*
+* DESCRIPTION
+*  Set ASM Mode config 
+*
+* PARAMETERS
+*  kal_uint32 core : core number
+*  kal_uint32 mode : ASM Mode
+*
+* RETURNS
+*
+* ASM_ERROR_CODE
+*
+*************************************************************************/
+ASM_ERROR_CODE ASM_SetMode(kal_uint32 core,kal_uint32 mode)
+{
+	kal_uint32 mode_config[ASM_MODE_END] = {0,
+                                          0,
+	                                         ASM_HW_SWLA_STRAM_MODE_CONFIG_VAL,
+	                                         ASM_HW_SWLA_WRAP_MODE_CONFIG_VAL,
+	                                         ASM_HW_SWTR_STRAM_MODE_CONFIG_VAL,
+	                                         ASM_HW_SWTR_WRAP_MODE_CONFIG_VAL
+	                                         };
+	if(mode < ASM_MODE_END)
+	{
+	    Asm_Infor[core].asm_mode = mode;
+	    Asm_Infor[core].mode_config = mode_config[mode];
+        
+        ASM_SET_MODE_CONFIG(core,Asm_Infor[core].mode_config);
+	}
+	else
+	{
+//		MSG(MSG_ERR,"Set Mode error. Mode: %d\r\n",mode );
+//		ASSERT(0);
+        return ASM_ERROR_CODE_WRONG_MODE;
+	}
+	return ASM_ERROR_CODE_NO_ERROR;
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_WaitIdle
+*
+* DESCRIPTION
+*  Wait for ASM idle
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*
+* ASM_ERROR_CODE
+*
+*************************************************************************/
+ASM_ERROR_CODE ASM_WaitIdle(kal_uint32 core)
+{
+	kal_uint32 idle_state;
+	kal_uint32 wait_cnt = 0;
+	kal_uint32 wait_limit = 10000;
+
+    do
+    {
+        ASM_GET_IDLE(core,idle_state);
+        wait_cnt++;
+    }while((idle_state == 0) && (wait_cnt < wait_limit));
+    //MSG(MSG_INFO,"Wait for idle cnt %d!\r\n",wait_cnt);
+	
+	if(wait_cnt == wait_limit)
+	{
+//	    MSG(MSG_ERR,"Wait for idle fail!\r\n");
+//	    ASSERT(0);
+	    return ASM_ERROR_CODE_WAIT_IDLE_FAIL;
+	}
+	
+	return ASM_ERROR_CODE_NO_ERROR;
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_Start
+*
+* DESCRIPTION
+*  Start ASM
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*
+* ASM_ERROR_CODE
+*
+*************************************************************************/
+ASM_ERROR_CODE ASM_Start(kal_uint32 core)
+{
+//    Asm_PowerOffPDTrace();
+	Asm_Infor_gen_config[core] |= ASM_ENABLE_MASK;
+
+    ASM_SET_GEN_CONFIG(core,Asm_Infor_gen_config[core]);
+    return ASM_ERROR_CODE_NO_ERROR;
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_Stop
+*
+* DESCRIPTION
+*  Stop ASM
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*
+* ASM_ERROR_CODE
+*
+*************************************************************************/
+ASM_ERROR_CODE ASM_Stop(kal_uint32 core)
+{
+	ASM_ERROR_CODE error_code = ASM_ERROR_CODE_NO_ERROR;
+
+    Asm_Infor[core].stop_time = ust_get_current_time();
+    
+	if(Asm_Infor_gen_config[core]&ASM_ENABLE_MASK)
+	{
+    	Asm_Infor_gen_config[core] &= (~ASM_ENABLE_MASK);
+    	
+        ASM_SET_GEN_CONFIG(core,Asm_Infor_gen_config[core]);
+            
+	    error_code = ASM_WaitIdle(core);
+
+        // read ASM config before dump for debug
+		ASM_GET_BUF_RD_PTR(core,Asm_Infor[core].buf_read_ptr);
+	    ASM_GET_BUF_WR_PTR(core,Asm_Infor[core].buf_write_ptr);
+	    ASM_GET_REM_LOG_BUF_SIZE(core,Asm_Infor[core].buf_remain_size);
+		ASM_GET_WRAP_CNT(core,Asm_Infor[core].wrap_cnt);
+		ASM_GET_SRAM_MAX_WATER(core,Asm_Infor[core].water_level);
+
+		
+    }
+    return error_code;
+
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_Stop
+*
+* DESCRIPTION
+*  Disable ASM then write to disable register without wait for idle
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*
+*************************************************************************/
+void ASM_StopWithoutWaitIdle(kal_uint32 core)
+{
+	if(Asm_Infor_gen_config[core]&ASM_ENABLE_MASK)
+	{
+    	Asm_Infor_gen_config[core] &= (~ASM_ENABLE_MASK);
+    	
+        ASM_SET_GEN_CONFIG(core,Asm_Infor_gen_config[core]);
+    }
+
+}
+/*************************************************************************
+* FUNCTION
+*  ASM_Reset
+*
+* DESCRIPTION
+*  Reset ASM
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*
+*************************************************************************/
+void ASM_Reset(kal_uint32 core)
+{
+	Asm_Infor_gen_config[core] &= (~ASM_ENABLE_MASK);
+	
+        ASM_SET_GEN_CONFIG(core,Asm_Infor_gen_config[core] | ASM_RESET_MASK);
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_SPM_Reset
+*
+* DESCRIPTION
+*  Reset ASM without update Asm_Infor enable setting for SPM
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*
+*************************************************************************/
+void ASM_SPM_Reset(kal_uint32 core)
+{
+
+    ASM_SET_GEN_CONFIG(core,Asm_Infor_gen_config[core] | ASM_RESET_MASK);
+}
+
+
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_CheckBufferSize
+*
+* DESCRIPTION
+*  Get buffer size after aligned
+*
+* PARAMETERS
+*
+*  kal_uint32 core   : core number
+*
+* RETURNS
+*  
+*   kal_uint32: buffer size
+*   
+*************************************************************************/
+
+kal_uint32 ASM_CheckBufferSize(kal_uint32 buffer_size)
+{
+
+	//64bytes aligned
+    return (buffer_size&0xFFFFFFE0);
+
+
+}
+/*************************************************************************
+* FUNCTION
+*  ASM_InitBuffer
+*
+* DESCRIPTION
+*  Set ASM EMI buffer to ASM
+*
+* PARAMETERS
+*  kal_uint32 core : core number
+*  kal_uint32 addr : ASM EMI buffer
+*  kal_uint32 size : ASM EMI buffer size
+*
+* RETURNS
+*
+* ASM_ERROR_CODE
+*
+*************************************************************************/
+ASM_ERROR_CODE ASM_InitBuffer(kal_uint32 core,kal_uint32 addr,kal_uint32 size)
+{
+	kal_uint32 size_64bytes_aligned;
+	
+	
+	size_64bytes_aligned = ASM_CheckBufferSize(size);
+    
+	if(size_64bytes_aligned == 0)
+	{
+	   return ASM_ERROR_CODE_BUFFER_TOO_SMALL;
+	}
+	
+	//Set logging buffer
+    Asm_Infor[core].buf_base_address = addr; 
+    Asm_Infor[core].thresh_value = size_64bytes_aligned / ASM_BUF_ALT_TH_VAL; 
+    
+    //uint:Byte
+    Asm_Infor[core].buf_size = size_64bytes_aligned;
+    Asm_Infor[core].buf_read_ptr = addr; 
+    Asm_Infor[core].buf_write_ptr = addr; 
+    
+	ASM_SET_LOG_BUF_BASEADDR(core, Asm_Infor[core].buf_base_address);
+	ASM_SET_LOG_BUF_SIZE(core, Asm_Infor[core].buf_size);
+	ASM_SET_BUF_ALT_THRESH(core,Asm_Infor[core].thresh_value);
+    ASM_SET_BUF_RD_PTR(core,Asm_Infor[core].buf_read_ptr);
+    ASM_SET_BUF_WR_PTR(core,Asm_Infor[core].buf_write_ptr);
+	
+	
+	return ASM_ERROR_CODE_NO_ERROR;
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_GetBufferSettingSize
+*
+* DESCRIPTION
+*  Get ASM EMI buffer setting size
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*
+* kal_uint32 : buffer setting size
+*
+*************************************************************************/
+kal_uint32 ASM_GetBufferSettingSize(kal_uint32 core)
+{
+	return (Asm_Infor[core].buf_size);
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_GetBufferWrapCnt
+*
+* DESCRIPTION
+*  Get ASM EMI buffer wrap count
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*
+* kal_uint32 : ASM wrap count
+*
+*************************************************************************/
+kal_uint32 ASM_GetBufferWrapCnt(kal_uint32 core)
+{
+    ASM_GET_WRAP_CNT(core,Asm_Infor[core].wrap_cnt);
+
+	return (Asm_Infor[core].wrap_cnt);
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_GetSRAMWaterLevel
+*
+* DESCRIPTION
+*  Get ASM SRAM water level
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*
+* kal_uint32 : ASM water level
+*
+*************************************************************************/
+kal_uint32 ASM_GetSRAMWaterLevel(kal_uint32 core)
+{
+    ASM_GET_SRAM_MAX_WATER(core,Asm_Infor[core].water_level);
+
+	return (Asm_Infor[core].water_level);
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_ClearBufferData
+*
+* DESCRIPTION
+*  Set EMI buffer initial value 0xFFFFFFFF
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*
+*************************************************************************/
+void ASM_ClearBufferData(kal_uint32 core)
+{
+	
+	kal_uint8* ptr;
+	ptr = (kal_uint8*)Asm_Infor[core].buf_base_address;
+	memset(ptr,0xFF,Asm_Infor[core].buf_size);
+    
+	
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_GetBufBaseAddr
+*
+* DESCRIPTION
+*  Get EMI buffer base address
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*  Buffer Base address
+*   
+*************************************************************************/
+kal_uint32 ASM_GetBufBaseAddr(kal_uint32 core)
+{
+	return Asm_Infor[core].buf_base_address;
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_Address2Offset
+*
+* DESCRIPTION
+*  Tramsfer reasd/write Address to Offset
+*
+* PARAMETERS
+*
+* RETURNS
+*
+*************************************************************************/
+void ASM_Address2Offset(kal_uint32 core,kal_uint32* addr_ptr)
+{
+	kal_uint32 base_addr;
+	base_addr = ASM_GetBufBaseAddr(core);
+
+	*addr_ptr = (*addr_ptr - base_addr)/4;
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_Offset2Address
+*
+* DESCRIPTION
+*  Tramsfer reasd/write Offset to Address 
+*
+* PARAMETERS
+*
+* RETURNS
+*
+*************************************************************************/
+void ASM_Offset2Address(kal_uint32 core,kal_uint32* addr_ptr)
+{
+	kal_uint32 base_addr;
+	base_addr = ASM_GetBufBaseAddr(core);
+
+	*addr_ptr = base_addr+((*addr_ptr)*4);
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_GetBufReadWritePtr
+*
+* DESCRIPTION
+*  Get EMI buffer read/write pointer
+*
+* PARAMETERS
+*
+*  kal_uint32    core : core number
+*  kal_uint32* rd_ptr : buffer read pointer
+*  kal_uint32* wr_ptr : buffer write pointer
+*
+* RETURNS
+* 
+*
+*************************************************************************/
+void ASM_GetBufReadWritePtr(kal_uint32 core,kal_uint32* rd_ptr, kal_uint32* wr_ptr)
+{
+	ASM_GET_BUF_RD_PTR(core,Asm_Infor[core].buf_read_ptr);
+	ASM_GET_BUF_WR_PTR(core,Asm_Infor[core].buf_write_ptr);
+	
+	*rd_ptr = Asm_Infor[core].buf_read_ptr;
+	*wr_ptr = Asm_Infor[core].buf_write_ptr;
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_GetBufReadWriteAddress
+*
+* DESCRIPTION
+*  Get EMI buffer read/write pointer
+*
+* PARAMETERS
+*
+*  kal_uint32    core      : core number
+*  kal_uint32* rd_ptr      : buffer read address (unit: byte)
+*  kal_uint32* wr_ptr      : buffer write pointer (unit:byte)
+*  kal_uint32* remain_size : buffer remain_size (unit:byte)
+*
+* RETURNS
+* 
+*
+*************************************************************************/
+ASM_ERROR_CODE ASM_GetBufReadWriteAddress(kal_uint32 core,kal_uint32* rd_addr, kal_uint32* wr_addr,kal_uint32* remain_size)
+{
+	kal_uint32 rd_ptr;
+	kal_uint32 wr_ptr;
+	kal_uint32 remain_ptr;
+	
+	
+	
+	ASM_GET_BUF_RD_PTR(core,rd_ptr);
+	ASM_GET_BUF_WR_PTR(core,wr_ptr);
+	ASM_GET_REM_LOG_BUF_SIZE(core,remain_ptr);
+
+	
+  if((Asm_Infor[core].buf_base_address <= rd_ptr) && (rd_ptr != 0))
+  {
+	  *rd_addr = (rd_ptr - Asm_Infor[core].buf_base_address);
+	  Asm_Infor[core].buf_read_ptr = rd_ptr;
+  }
+	else
+	{
+    *rd_addr = 0;
+    return ASM_ERROR_CODE_INVALID_RW_POINTER;
+	}
+
+	if((Asm_Infor[core].buf_base_address <= wr_ptr) && (wr_ptr != 0))
+	{
+	  *wr_addr = (wr_ptr - Asm_Infor[core].buf_base_address);
+	  Asm_Infor[core].buf_write_ptr = wr_ptr;
+	  
+		*remain_size = (remain_ptr*4);
+		Asm_Infor[core].buf_remain_size = remain_ptr;
+  }
+	else
+	{
+    *wr_addr = 0;
+    *remain_size = 0;
+    return ASM_ERROR_CODE_INVALID_RW_POINTER;
+  }
+  
+  return ASM_ERROR_CODE_NO_ERROR;
+
+}
+/*************************************************************************
+* FUNCTION
+*  ASM_GetOutputDataSize
+*
+* DESCRIPTION
+*  Get EMI buffer read/write pointer then return data size
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*  kal_uint32 : data size(words)
+*
+*************************************************************************/
+kal_uint32 ASM_GetOutputDataSize(kal_uint32 core)
+{
+	ASM_GET_BUF_RD_PTR(core,Asm_Infor[core].buf_read_ptr);
+	ASM_GET_BUF_WR_PTR(core,Asm_Infor[core].buf_write_ptr);
+	
+	if(Asm_Infor[core].buf_read_ptr > Asm_Infor[core].buf_write_ptr)
+	{
+		return(Asm_Infor[core].buf_size -(Asm_Infor[core].buf_read_ptr- Asm_Infor[core].buf_write_ptr));
+	}
+	else
+	{
+		return(Asm_Infor[core].buf_write_ptr - Asm_Infor[core].buf_read_ptr);
+	}
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_GetBufReadPtr
+*
+* DESCRIPTION
+*  Get EMI buffer read pointer
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*  read pointer
+*   
+*************************************************************************/
+kal_uint32 ASM_GetBufReadPtr(kal_uint32 core)
+{
+    ASM_GET_BUF_RD_PTR(core,Asm_Infor[core].buf_read_ptr);
+    kal_uint32 addr = Asm_Infor[core].buf_read_ptr;
+ 	ASM_Address2Offset(core,&addr);
+ 	return addr;
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_GetBufWritePtr
+*
+* DESCRIPTION
+*  Get EMI buffer write pointer
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*  write pointer
+*   
+*************************************************************************/
+kal_uint32 ASM_GetBufWritePtr(kal_uint32 core)
+{
+    ASM_GET_BUF_WR_PTR(core,Asm_Infor[core].buf_write_ptr);
+    kal_uint32 addr = Asm_Infor[core].buf_write_ptr;
+ 	ASM_Address2Offset(core,&addr);
+ 	
+	return addr;
+}
+
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_GetPDICnt
+*
+* DESCRIPTION
+*  Get PDI count
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*   
+* kal_uint32 : PDI count
+*   
+*************************************************************************/
+kal_uint32 ASM_GetPDICnt(kal_uint32 core)
+{
+    ASM_GET_PDI_CNT(core,Asm_Infor[core].pdi_cnt);
+	return Asm_Infor[core].pdi_cnt;
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_UpdateBufReadPtr
+*
+* DESCRIPTION
+*  Update EMI buffer read pointer
+*
+* PARAMETERS
+*
+*  kal_uint32 core   : core number
+*  kal_uint32 rd_ptr : read pointer to update(unit: word)
+*
+* RETURNS
+*
+*************************************************************************/
+void ASM_UpdateBufReadPtr(kal_uint32 core,kal_uint32 rd_ptr)
+{
+	ASM_Offset2Address(core,&rd_ptr);
+	
+	Asm_Infor[core].buf_read_ptr = rd_ptr;
+	
+    ASM_SET_BUF_RD_PTR(core,Asm_Infor[core].buf_read_ptr);
+        
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_UpdateBufReadAddress
+*
+* DESCRIPTION
+*  Update EMI buffer read address
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*  kal_uint32 addr : read address to update(unit:byte)
+*
+* RETURNS
+*
+*************************************************************************/
+void ASM_UpdateBufReadAddress(kal_uint32 core,kal_uint32 addr)
+{
+	addr += Asm_Infor[core].buf_base_address;
+	
+	Asm_Infor[core].buf_read_ptr = addr;
+	
+    ASM_SET_BUF_RD_PTR(core,Asm_Infor[core].buf_read_ptr);
+        
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_GetBufferInfor
+*
+* DESCRIPTION
+*  Update EMI buffer read pointer
+*
+* PARAMETERS
+*
+*  kal_uint32 core       : core number
+*  kal_uint32 addr       : ASM EMI base address  (unit:byte)
+*  kal_uint32 size       : ASM EMI buffer size(unit:byte)
+*  kal_uint32 read_addr  : read address (unit:byte)
+*  kal_uint32 write_addr : write address (unit:byte)
+*
+* RETURNS
+*
+*************************************************************************/
+void ASM_GetBufferInfor(kal_uint32 core,kal_uint32* addr, kal_uint32* size, kal_uint32* read_addr, kal_uint32* write_addr)
+{
+    kal_uint32 remain_size;
+    ASM_GetBufReadWriteAddress(core,read_addr,write_addr,&remain_size);
+    *size = Asm_Infor[core].buf_size;
+    *addr = Asm_Infor[core].buf_base_address;
+    
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_RestoreBufferSetting
+*
+* DESCRIPTION
+*  Restore ASM EMI buffer setting to ASM register
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*
+*************************************************************************/
+void ASM_RestoreBufferSetting(kal_uint32 core)
+{
+	ASM_SET_BUF_ALT_THRESH(core,Asm_Infor[core].thresh_value);
+	ASM_SET_LOG_BUF_BASEADDR(core,Asm_Infor[core].buf_base_address);
+	ASM_SET_LOG_BUF_SIZE(core,Asm_Infor[core].buf_size);
+	ASM_SET_BUF_RD_PTR(core,Asm_Infor[core].buf_read_ptr);
+	ASM_SET_BUF_WR_PTR(core,Asm_Infor[core].buf_write_ptr);
+	
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_SaveBufferSetting
+*
+* DESCRIPTION
+*  Get then save buffer setting 
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*
+*************************************************************************/
+void ASM_SaveBufferSetting(kal_uint32 core)
+{
+//only need to get latest read/write pointer
+    ASM_GetBufReadPtr(core);
+    ASM_GetBufWritePtr(core);
+	ASM_GET_REM_LOG_BUF_SIZE(core,Asm_Infor[core].buf_remain_size);
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_SaveSramSetting
+*
+* DESCRIPTION
+*  Get and save sram setting
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+* 
+*   
+*************************************************************************/
+void ASM_SaveSramSetting(kal_uint32 core)
+{
+     ASM_GET_SRAM_STATUS(core,Asm_Infor[core].sram_status);
+	 ASM_GET_SRAM_MAX_BUF_SIZE(core,Asm_Infor[core].sram_max_buf_size);
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_RestoreSramSetting
+*
+* DESCRIPTION
+*  Set ASM sram read pointer
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+* 
+*   
+*************************************************************************/
+void ASM_RestoreSramSetting(kal_uint32 core)
+{
+    ASM_SET_SRAM_STATUS(core,Asm_Infor[core].sram_status);
+    ASM_SET_SRAM_MAX_BUF_SIZE(core,Asm_Infor[core].sram_max_buf_size);
+
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_RestoreAddon
+*
+* DESCRIPTION
+*  Restore Addon setting to ASM
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+* 
+*   
+*************************************************************************/
+void ASM_RestoreAddon(kal_uint32 core)
+{
+	kal_uint32 index,tc, tc_num;
+	volatile kal_uint32 *extra_addon_info_base_addr;
+
+    tc_num = ASM_TC_NUM;
+#if defined(MT6763) || defined(MT6739)
+	//For ASM GCR is overlapped with CIRQ
+	if(ASM_CORE0 == core)
+	{
+		tc_num = 3;		
+	}	
+#endif //#if defined(MT6763)
+ 	    
+ 	for( tc = 0 ; tc < tc_num ; tc++ )
+ 	{
+        extra_addon_info_base_addr = (kal_uint32 *)ASM_GCR_PROFILE_ADDON_INFO_(core,tc);
+        
+ 	    for( index = 0 ; index < ASM_ADDON_NUM ; index++ )
+	    {
+		    if(Asm_Infor[core].profile_en&(1 << (index+ASM_ADDON_INFO0_EN)))
+		        *(extra_addon_info_base_addr+index) = Asm_Infor[core].addon[tc][index];
+	    }
+	}        
+
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_SaveContextID
+*
+* DESCRIPTION
+*  Save TC context ID
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+* 
+*   
+*************************************************************************/
+void ASM_SaveContextID(kal_uint32 core)
+{
+	kal_uint32 tc_index;
+
+ 	for( tc_index = 0 ; tc_index < ASM_TC_NUM ; tc_index++ )
+ 	{
+        ASM_GET_TC_CONTEXT_ID(core,tc_index,Asm_Infor_context_id[core][tc_index]);
+	}        
+
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_RestoreContextID
+*
+* DESCRIPTION
+*  Restore TC context ID to ASM
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+* 
+*   
+*************************************************************************/
+void ASM_RestoreContextID(kal_uint32 core)
+{
+	kal_uint32 tc;
+
+
+ 	for( tc = 0 ; tc < ASM_TC_NUM ; tc++ )
+ 	{
+            ASM_SET_GCR_TC_CONTEXT_ID(core,tc,Asm_Infor_context_id[core][tc]);
+	}        
+
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_SetBufferThresholdValue
+*
+* DESCRIPTION
+*  Set ASM buffer threshold value
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*  kal_uint32 val  : threhold value
+*
+* RETURNS
+*  
+*   
+*************************************************************************/
+void ASM_SetBufferThresholdValue(kal_uint32 core,kal_uint32 val)
+{
+	Asm_Infor[core].thresh_value = val;
+
+    ASM_SET_BUF_ALT_THRESH(core,Asm_Infor[core].thresh_value);
+    
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_GetBufferThresholdValue
+*
+* DESCRIPTION
+*  Get ASM buffer threshold value
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*  
+*  kal_uint32 val  : threhold value
+*   
+*************************************************************************/
+kal_uint32 ASM_GetBufferThresholdValue(kal_uint32 core)
+{
+    ASM_GET_BUF_ALT_THRESH(core,Asm_Infor[core].thresh_value);
+	return Asm_Infor[core].thresh_value;
+}
+
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_SaveConfigForSPM
+*
+* DESCRIPTION
+*  Save register for SPM
+*
+* PARAMETERS
+*
+*  kal_uint32 core   : core number
+*
+* RETURNS
+*   
+*************************************************************************/
+void ASM_SaveConfigForSPM(kal_uint32 core)
+{
+    Asm_Infor[core].spm_set++;
+    
+    if(Asm_Infor_gen_config[core]&ASM_ENABLE_MASK)
+    {
+    	Asm_Infor[core].asm_is_enabled = 1;
+    	
+    	ASM_SetSPMAndWaitSMPGrant(core);
+    	
+    	ASM_SaveBufferSetting(core);
+    	ASM_SaveSramSetting(core);
+    	//ASM_SaveContextID(core);
+        
+   	    ASM_GET_WRAP_CNT(core,Asm_Infor[core].wrap_cnt);
+   	    ASM_GET_PDI_CNT(core,Asm_Infor[core].pdi_cnt);
+
+	    //to avoid ASM is not power down, that will cause ASM be lock
+	    ASM_SPM_Reset(core);
+
+    	
+    }
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_SaveCoreConfigForSPM
+*
+* DESCRIPTION
+*  Save register for SPM
+*
+* PARAMETERS
+*
+*  kal_uint32 core   : core number
+*
+* RETURNS
+*   
+*************************************************************************/
+void ASM_SaveCoreConfigForSPM(void)
+{
+
+    kal_uint32 core = kal_get_current_core_id();
+    
+    ASM_SaveConfigForSPM(core);
+    
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_SaveConfigForSPM_AllCore
+*
+* DESCRIPTION
+*  Save all ASM for SPM
+*
+* PARAMETERS
+*
+*
+* RETURNS
+*   
+*************************************************************************/
+void ASM_SaveConfigForSPM_AllCore(void)
+{
+    kal_uint32 core;
+    
+    for(core = 0; core < ASM_NUM; core++)
+        ASM_SaveConfigForSPM(core);
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_WaitSMPGrant
+*
+* DESCRIPTION
+*  Wait ASM SPM Grant
+*
+* PARAMETERS
+*
+*  kal_uint32 core   : core number
+*
+* RETURNS
+*  read address
+*   
+*************************************************************************/
+void ASM_SetSPMAndWaitSMPGrant(kal_uint32 core)
+{
+	kal_uint32 grant = 0;
+	kal_uint32 wait_cnt = 0;
+
+    ASM_SET_SPM_REQ(core,1);
+    
+    do
+    {
+        ASM_GET_SPM_GRANT(core,grant);
+        wait_cnt++;
+    }while((grant == 0) &&(wait_cnt < 10));
+    
+//	if(wait_cnt > 1)
+//	     MSG(MSG_ERR,"[core %d]Wait for Grant fail count %d\r\n",core,wait_cnt);
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_RestoreConfigforSPM
+*
+* DESCRIPTION
+*  Restore ASM after SPM
+*
+* PARAMETERS
+*
+*  kal_uint32 core   : core number
+*
+* RETURNS
+*  read address
+*   
+*************************************************************************/
+void ASM_RestoreConfigforSPM(kal_uint32 core)
+{
+	if(Asm_Infor_gen_config[core]&ASM_ENABLE_MASK)
+	{
+		ASM_SET_PROFILE_EN(core,Asm_Infor[core].profile_en);
+    	
+		ASM_RestoreBufferSetting(core);
+		ASM_RestoreSramSetting(core);
+		
+    	if(Asm_Infor[core].asm_mode > ASM_HW_SWLA_WRAP_MODE)
+    	{
+    	    ASM_SET_TRACER_SAMPLE_RATE(core,Asm_Infor[core].sample_rate);
+//    	    if(Asm_Infor[core].swtr_header != ASM_HW_SWTR_HEADER_VAL)
+//    	    {
+//    	        ASM_SET_TR_HEAD(core,Asm_Infor[core].swtr_header);
+//    	    }
+    	}
+    	
+    	if(Asm_Infor[core].pdi_cnt)
+    	{
+    	    ASM_SET_PDI_CNT(core,Asm_Infor[core].pdi_cnt);    
+    	}
+    	
+    	if(Asm_Infor[core].wrap_cnt)
+    	{
+    	    ASM_SET_WRAP_CNT(core,Asm_Infor[core].wrap_cnt);    
+    	}
+    	
+    	if(Asm_Infor[core].axi_config != ASM_AXI_CONFIG_DEFAULT_VAL)
+    	{
+    	    ASM_SET_AXI_CONFIG(core,Asm_Infor[core].axi_config);    
+    	}
+    	
+    	ASM_SET_MODE_CONFIG(core,Asm_Infor[core].mode_config);
+    	ASM_SET_L2IMCR(core,Asm_Infor[core].int_en);
+		
+		ASM_RestoreAddon(core);
+		ASM_RestoreContextID(core);
+    	
+        //clear SPM REQ
+		ASM_SET_SPM_REQ(core,0);
+		
+    	ASM_SET_GEN_CONFIG(core,Asm_Infor_gen_config[core]);
+    	
+    	Asm_Infor[core].asm_is_enabled = 0;
+	
+	
+    }
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_RestoreCoreConfigforSPM
+*
+* DESCRIPTION
+*  Restore ASM after SPM
+*
+* PARAMETERS
+*
+*  kal_uint32 core   : core number
+*
+* RETURNS
+*  read address
+*   
+*************************************************************************/
+void ASM_RestoreCoreConfigforSPM(void)
+{
+
+    kal_uint32 core = kal_get_current_core_id();
+    
+	ASM_RestoreConfigforSPM(core);
+		
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_RestoreConfigforSPM_AllCore
+*
+* DESCRIPTION
+*  Save all ASM for SPM
+*
+* PARAMETERS
+*
+*
+* RETURNS
+*   
+*************************************************************************/
+void ASM_RestoreConfigforSPM_AllCore(void)
+{
+    kal_uint32 core;
+    
+    for(core = 0; core < ASM_NUM; core++)
+        ASM_RestoreConfigforSPM(core);
+}
+/*************************************************************************
+* FUNCTION
+*  ASM_SetProfileFilter
+*
+* DESCRIPTION
+*  Set profile option
+*
+* PARAMETERS
+*
+*  kal_uint32 core   : core number
+*  kal_uint32 option : enable profile option
+*
+* RETURNS
+*  
+*   
+*************************************************************************/
+
+void ASM_SetProfileFilter(kal_uint32 core,kal_uint32 option )
+{
+	Asm_Infor[core].profile_en = option;
+
+//ELM can not pause now, and this enable bit will keep ELM running
+//	if(option & ASM_MCU_ELM_OPTION_MASK)
+//	{
+//	    Asm_Infor[core].gen_config |= ASM_MCU_ELM_EN_MASK;
+//	}
+
+	
+    ASM_SET_PROFILE_EN(core,Asm_Infor[core].profile_en);	
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_SWTRSetSampleRate
+*
+* DESCRIPTION
+*  Set SWTR mode sampling rate
+*
+* PARAMETERS
+*
+*  kal_uint32 core          : core number
+*  kal_uint32 sample_rate   : sampling rate
+*
+* RETURNS
+*  
+* ASM_ERROR_CODE 
+*   
+*************************************************************************/
+
+ASM_ERROR_CODE ASM_SWTRSetSampleRate(kal_uint32 core,kal_uint32 sample_rate)
+{
+    if(sample_rate == 0)
+       return ASM_ERROR_CODE_INVALID_SAMPLE_RATE;
+    
+    Asm_Infor[core].sample_rate = sample_rate;
+    	
+    ASM_SET_TRACER_SAMPLE_RATE(core,sample_rate);
+		
+    return ASM_ERROR_CODE_NO_ERROR;
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_InitSetting
+*
+* DESCRIPTION
+*  Set ASM Mode Config
+*
+* PARAMETERS
+*
+*  kal_uint32 core           : core number
+*  kal_uint32 mode           : ASM mode
+*  kal_uint32* buffer        : Buffer pointer 
+*  kal_uint32 buffer_size    : Buffer size 
+*  kal_uint32 option_en      : option enabled
+*  kal_uint32 sampling_rate  : SWTR sample rate
+*
+* RETURNS
+*   
+* ASM_ERROR_CODE
+*   
+*************************************************************************/
+ASM_ERROR_CODE ASM_InitSetting(kal_uint32 core,kal_uint32 mode, kal_uint32 *buffer,kal_uint32 buffer_size,kal_uint32 option_en,kal_uint32 sampling_rate)
+{
+	ASM_ERROR_CODE error_code = ASM_ERROR_CODE_NO_ERROR;
+    
+    Asm_Infor[core].start_time = ust_get_current_time();
+
+	ASM_Reset(core);
+	
+	error_code = ASM_InitBuffer(core,(kal_uint32)buffer,buffer_size);
+	if(error_code != ASM_ERROR_CODE_NO_ERROR)
+	    return error_code;
+
+	error_code = ASM_SetMode(core,mode);
+	if(error_code != ASM_ERROR_CODE_NO_ERROR)
+	    return error_code;
+	
+	if(Asm_Infor[core].asm_mode > ASM_HW_SWLA_WRAP_MODE)
+	{
+		error_code = ASM_SWTRSetSampleRate(core,sampling_rate);
+	    if(error_code != ASM_ERROR_CODE_NO_ERROR)
+	        return error_code;
+		
+	}
+   
+	ASM_SetProfileFilter(core,option_en);
+	
+    ASM_EnablePDI(core);
+    
+    ASM_DisableApbWrite(core);    
+
+//    ASM_SET_GEN_CONFIG(core,Asm_Infor_gen_config[core]);
+    
+   Asm_Infor_trigger_cnt[core] = 0;
+    
+    ASM_AckAllIntStatus(core);
+    
+    if(ASM_WRAP_MODE_EN&Asm_Infor[core].mode_config)
+    {
+        ASM_McuCoreIntIRQMask(core);
+    }
+    else
+    {
+        ASM_McuCoreIntIRQUnMask(core);
+    }
+   	
+    Asm_Infor[core].axi_config = ASM_AXI_CONFIG_DEFAULT_VAL;
+
+   	return error_code;
+
+}
+
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_SetTCContextID
+*
+* DESCRIPTION
+*  ASM context ID by core and TC
+*
+* PARAMETERS
+*
+*  kal_uint32 core           : core number
+*  kal_uint32 tc             : tc number
+*  kal_uint32 id             : context id
+*
+* RETURNS
+*
+*************************************************************************/
+
+void ASM_SetTCContextID(kal_uint32 core, kal_uint32 tc,kal_uint32 id)
+{
+    Asm_Infor_context_id[core][tc] = id; 
+    ASM_SET_GCR_TC_CONTEXT_ID(core,tc,Asm_Infor_context_id[core][tc]);
+
+}
+
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_BufferIsWrap
+*
+* DESCRIPTION
+*  Check buffer Wrap
+*
+* PARAMETERS
+*
+*  kal_uint32 core           : core number
+*
+* RETURNS
+*
+*************************************************************************/
+
+kal_bool ASM_BufferIsWrap(kal_uint32 core)
+{
+   	ASM_GetBufferWrapCnt(core);
+
+    if(Asm_Infor[core].wrap_cnt)
+    {
+        return KAL_TRUE;
+    }
+    else
+    {
+        return KAL_FALSE;
+    }
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_SetIntEnable
+*
+* DESCRIPTION
+*  Set ASM Imterrupter enable 
+*
+* PARAMETERS
+*
+*  kal_uint32 core   : core number
+*  ASM_INT_TYPE      : asm interrupter id
+*
+* RETURNS
+*  
+*   
+*************************************************************************/
+void ASM_SetIntEnable(kal_uint32 core,ASM_INT_TYPE int_id)
+{
+	Asm_Infor[core].int_en |= (1 << int_id);
+	
+    ASM_SET_L2IMCR(core,(1 << int_id));
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_SetIntDisable
+*
+* DESCRIPTION
+*  Set ASM Imterrupter disable 
+*
+* PARAMETERS
+*
+*  kal_uint32 core   : core number
+*  ASM_INT_TYPE      : asm interrupter id
+*
+* RETURNS
+*  
+*   
+*************************************************************************/
+void ASM_SetIntDisable(kal_uint32 core,ASM_INT_TYPE int_id)
+{
+	Asm_Infor[core].int_en &= (~(1 << int_id));
+	
+    ASM_SET_L2IMSR(core,(1 << int_id));
+
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_McuCoreIQRMask
+*
+* DESCRIPTION
+*  Set ASM Mcu core interrupter Mask
+*
+* PARAMETERS
+*
+*  kal_uint32 core  : core number
+*  ASM_INT_TYPE irq : irq index 
+*
+* RETURNS
+*  
+*   
+*************************************************************************/
+void ASM_McuCoreIQRMask(kal_uint32 core,ASM_INT_TYPE irq)
+{
+    ASM_SetIntDisable(core,irq);
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_McuCoreIntIRQMask
+*
+* DESCRIPTION
+*  Set ASM Mcu core Int Mask
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*  
+*   
+*************************************************************************/
+void ASM_McuCoreIntIRQMask(kal_uint32 core)
+{
+    ASM_McuCoreIQRMask(core,ASM_THRESHOLD_INT);
+    
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_McuCoreIntUnMask
+*
+* DESCRIPTION
+*  Set ASM Mcu core interrupter UmMask
+*
+* PARAMETERS
+*
+*  kal_uint32 core  : core number
+*  ASM_INT_TYPE irq : irq index 
+*
+* RETURNS
+*  
+*   
+*************************************************************************/
+void ASM_McuCoreIRQUnMask(kal_uint32 core,ASM_INT_TYPE irq)
+{
+    ASM_SetIntEnable(core,irq);
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_McuCoreIntAck
+*
+* DESCRIPTION
+*  Set ASM Mcu core interrupter ack
+*
+* PARAMETERS
+*
+*  kal_uint32 core  : core number
+*  ASM_INT_TYPE irq : irq index 
+*
+* RETURNS
+*  
+*   
+*************************************************************************/
+void ASM_McuCoreIRQAck(kal_uint32 core,ASM_INT_TYPE irq)
+{
+    ASM_SET_L2ISAR(core,(1 << irq));
+}
+
+
+
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_McuCoreIntIRQUnMask
+*
+* DESCRIPTION
+*  Set ASM Mcu core Int UmMask
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*  
+*   
+*************************************************************************/
+void ASM_McuCoreIntIRQUnMask(kal_uint32 core)
+{
+    ASM_McuCoreIRQUnMask(core,ASM_THRESHOLD_INT);
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_McuCoreIntIRQAck
+*
+* DESCRIPTION
+*  Set ASM Mcu core Int ack
+*
+* PARAMETERS
+*
+*  kal_uint32 core : core number
+*
+* RETURNS
+*  
+*   
+*************************************************************************/
+void ASM_McuCoreIntIRQAck(kal_uint32 core)
+{
+    ASM_McuCoreIRQAck(core,ASM_THRESHOLD_INT);
+    
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_McuIntIRQMask
+*
+* DESCRIPTION
+*  Set ASM Mcu int IRQ Mask
+*
+* PARAMETERS
+*
+* RETURNS
+*  
+*   
+*************************************************************************/
+void ASM_McuIntIRQMask(void)
+{
+    IRQMask(MD_IRQID_ABM_INT);
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_McuIntIRQUnMask
+*
+* DESCRIPTION
+*  Set ASM Mcu int IRQUnMask
+*
+* PARAMETERS
+*
+* RETURNS
+*  
+*   
+*************************************************************************/
+void ASM_McuIntIRQUnMask(void)
+{
+    IRQUnmask(MD_IRQID_ABM_INT);
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_McuErrorIRQMask
+*
+* DESCRIPTION
+*  Set ASM Mcu error IRQ Mask
+*
+* PARAMETERS
+*
+* RETURNS
+*  
+*   
+*************************************************************************/
+void ASM_McuErrorIRQMask(void)
+{
+    IRQMask(MD_IRQID_ABM_ERROR_INT);
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_McuErrorUnMask
+*
+* DESCRIPTION
+*  Set ASM Mcu error IRQUnMask
+*
+* PARAMETERS
+*
+* RETURNS
+*  
+*   
+*************************************************************************/
+void ASM_McuErrorIRQUnMask(void)
+{
+    IRQUnmask(MD_IRQID_ABM_ERROR_INT);
+}
+
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_McuIntRegsterLISR
+*
+* DESCRIPTION
+*  reigster ASM mcu int IRQ LISR
+*
+* PARAMETERS
+*
+* void* reg_lisr : LISR callback
+*
+* RETURNS
+*  
+*   
+*************************************************************************/
+void ASM_McuIntRegsterLISR(void* reg_lisr)
+{
+    //IRQ_Register_LISR(MD_IRQID_ABM_INT, reg_lisr, "ASM MCU int lisr");
+    //IRQSensitivity(MD_IRQID_ABM_INT, KAL_FALSE);
+    IRQUnmask(MD_IRQID_ABM_INT);  
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_McuErrorRegsterLISR
+*
+* DESCRIPTION
+*  reigster ASM mcu error IRQ LISR
+*
+* PARAMETERS
+*
+* void* reg_lisr : LISR callback
+*
+* RETURNS
+*  
+*   
+*************************************************************************/
+void ASM_McuErrorRegsterLISR(void* reg_lisr)
+{
+    //IRQ_Register_LISR(MD_IRQID_ABM_ERROR_INT, reg_lisr, "ASM MCU error lisr");
+    //IRQSensitivity(MD_IRQID_ABM_ERROR_INT, KAL_FALSE);
+    IRQUnmask(MD_IRQID_ABM_ERROR_INT);  
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_GetIntStatus
+*
+* DESCRIPTION
+*  Get ASM int status
+*
+* PARAMETERS
+*
+*  kal_uint32 core  : core number
+*
+* RETURNS
+*  
+* kal_uint32 : interrupter status value  
+*   
+*************************************************************************/
+kal_uint32 ASM_GetIntStatus(kal_uint32 core)
+{
+    ASM_GET_L2ISAR(core,Asm_Infor[core].int_status);
+    
+    return Asm_Infor[core].int_status;
+}
+
+/*************************************************************************
+* FUNCTION
+*  ASM_AckAllIntStatus
+*
+* DESCRIPTION
+*  Ack ASM all interrupter 
+*
+* PARAMETERS
+*
+*  kal_uint32 core  : core number
+*
+* RETURNS
+*  
+*   
+*************************************************************************/
+void ASM_AckAllIntStatus(kal_uint32 core)
+{
+    ASM_SET_L2ISAR(core,0x1F);
+    ASM_GetIntStatus(core);
+  
+}
+
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_SendTrigger
+*
+* DESCRIPTION
+*  Send ASM trigger command
+*
+* PARAMETERS
+*
+*  kal_uint32 core  : core number
+*  kal_uint32 tc    : tc number
+*
+* RETURNS
+*  
+*   
+*************************************************************************/
+void ASM_SendTrigger(kal_uint32 core,kal_uint32 tc)
+{
+    if(Asm_Infor_gen_config[core]&ASM_ENABLE_MASK)
+    {
+       ASM_SET_GCR_SWLA_TRIG(core,tc);
+        
+       Asm_Infor_trigger_cnt[core]++;
+    }
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_GetMcuIntStatusAndMask
+*
+* DESCRIPTION
+*  Get Top mcu int and mask status
+*
+* PARAMETERS
+*
+*  kal_uint32* status: mcu interrupter status
+*  kal_uint32* mask: mcu interrupter mask status
+*
+* RETURNS
+*  
+*   
+*************************************************************************/
+void ASM_GetMcuIntStatusAndMask(kal_uint32* status,kal_uint32* mask)
+{
+    kal_uint32 val;
+    ASM_GET_TOP_STATUS(val);
+    
+    *status = (val&ASM_TOP_INT_STATUS_MASK) >> ASM_TOP_INT_STATUS_BIT;
+    *mask = (val&ASM_TOP_INT_MASK_STATUS_MASK) >> ASM_TOP_INT_MASK_STATUS_BIT;
+}
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_GetTcContextId
+*
+* DESCRIPTION
+*  Get tc context id
+*
+* PARAMETERS
+*
+*  kal_uint32 core: core id
+*  kal_uint32 tc: tc id
+*
+* RETURNS 
+*  
+*  kal_uint32 : context id
+*
+*************************************************************************/
+kal_uint32 ASM_GetTcContextId(kal_uint32 core,kal_uint32 tc)
+{
+    kal_uint32 val;
+    ASM_GET_TC_CONTEXT_ID(core,tc,val);
+    return val;
+}
+
+
+
+
+/*************************************************************************
+* FUNCTION
+*  ASM_SetDumpRegion
+*
+* DESCRIPTION
+*  Set ASM dump region
+*
+* PARAMETERS
+*
+*
+* RETURNS 
+*  
+*
+*************************************************************************/
+void ASM_SetDumpRegion(void)
+{
+    /* bbreg dump setting */
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif    
+}
+
+
+