blob: 8b15d6b640c6e2be111906f8760615503a06c3ca [file] [log] [blame]
/*****************************************************************************
* 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
}