⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 syscon_cpu.c

📁 This product may be controlled for export purposes. You may not export, or transfer for the purpos
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************************************************************ * *  syscon_cpu.c * *  CPU specific parts of SYSCON module * * ###################################################################### * * mips_start_of_legal_notice *  * Copyright (c) 2002 MIPS Technologies, Inc. All rights reserved. * * * Unpublished rights (if any) reserved under the copyright laws of the * United States of America and other countries. * * This code is proprietary to MIPS Technologies, Inc. ("MIPS * Technologies"). Any copying, reproducing, modifying or use of this code * (in whole or in part) that is not expressly permitted in writing by MIPS * Technologies or an authorized third party is strictly prohibited. At a * minimum, this code is protected under unfair competition and copyright * laws. Violations thereof may result in criminal penalties and fines. * * MIPS Technologies reserves the right to change this code to improve * function, design or otherwise. MIPS Technologies does not assume any * liability arising out of the application or use of this code, or of any * error or omission in such code. Any warranties, whether express, * statutory, implied or otherwise, including but not limited to the implied * warranties of merchantability or fitness for a particular purpose, are * excluded. Except as expressly provided in any written license agreement * from MIPS Technologies or an authorized third party, the furnishing of * this code does not give recipient any license to any intellectual * property rights, including any patent rights, that cover this code. * * This code shall not be exported or transferred for the purpose of * reexporting in violation of any U.S. or non-U.S. regulation, treaty, * Executive Order, law, statute, amendment or supplement thereto. * * This code constitutes one or more of the following: commercial computer * software, commercial computer software documentation or other commercial * items. If the user of this code, or any related documentation of any * kind, including related technical data or manuals, is an agency, * department, or other entity of the United States government * ("Government"), the use, duplication, reproduction, release, * modification, disclosure, or transfer of this code, or any related * documentation of any kind, is restricted in accordance with Federal * Acquisition Regulation 12.212 for civilian agencies and Defense Federal * Acquisition Regulation Supplement 227.7202 for military agencies. The use * of this code by the Government is further restricted in accordance with * the terms of the license agreement(s) and/or applicable contract terms * and conditions covering this code from MIPS Technologies or an authorized * third party. * *  * mips_end_of_legal_notice *  * ************************************************************************//************************************************************************ *  Include files ************************************************************************/#include <sysdefs.h>#include <sys_api.h>#include <syscon_api.h>#include <syscon.h>#include <mips.h>#include <qed.h>/************************************************************************ *  Definitions ************************************************************************//* Structures for CP0 registers */typedef struct {    UINT32 id;    UINT8  number;    UINT8  sel;    bool   valid;    UINT8  regsize;}t_syscon_cp0_reg;/************************************************************************ *  Public variables ************************************************************************//************************************************************************ *  Static variables ************************************************************************//* Reset value of CONFIG1 register */static UINT32 config1_init;/* Cache/MMU configurability, availability */static bool   cache_configurable;static bool   mmu_configurable;static bool   tlb;static UINT8  tlb_reset;/* Number of clock cycles per COUNT register increment */static UINT32 cycle_per_count;/* Pointer to array of SYSCON objects */static t_syscon_obj       *syscon_objects;/* CP0 registers */#define SYSCON_INDEX		    0#define SYSCON_RANDOM		    1#define SYSCON_ENTRYLO0		    2#define SYSCON_ENTRYLO1		    3#define SYSCON_CONTEXT		    4#define SYSCON_PAGEMASK		    5#define SYSCON_PAGEGRAIN	    6#define SYSCON_WIRED		    7#define SYSCON_HWRENA		    8#define SYSCON_BADVADDR		    9#define SYSCON_COUNT		    10#define SYSCON_ENTRYHI		    11#define SYSCON_COMPARE		    12#define SYSCON_STATUS		    13#define SYSCON_INTCTL		    14#define SYSCON_SRSCTL		    15#define SYSCON_SRSMAP		    16#define SYSCON_CAUSE		    17#define SYSCON_EPC		    18#define SYSCON_PRID		    19#define SYSCON_EBASE		    20#define SYSCON_CONFIG		    21#define SYSCON_CONFIG1		    22#define SYSCON_CONFIG2		    23#define SYSCON_CONFIG3		    24#define SYSCON_LLADDR		    25#define SYSCON_WATCHLO		    26#define SYSCON_WATCHHI		    27#define SYSCON_XCONTEXT		    28#define SYSCON_DEBUG		    29#define SYSCON_TRACECONTROL	    30#define SYSCON_TRACECONTROL2	    31#define SYSCON_USERTRACEDATA	    32#define SYSCON_TRACEBPC		    33#define SYSCON_DEPC		    34#define SYSCON_PERFCOUNT	    35      /* CTRL0 */#define SYSCON_PERFCOUNT_COUNT0	    36#define SYSCON_PERFCOUNT_CTRL1	    37#define SYSCON_PERFCOUNT_COUNT1	    38#define SYSCON_PERFCOUNT_CTRL2	    39#define SYSCON_PERFCOUNT_COUNT2	    40#define SYSCON_ERRCTL		    41#define SYSCON_DERRCTL		    42#define SYSCON_IERRCTL		    43#define SYSCON_CACHEERR		    44#define SYSCON_TAGLO		    45#define SYSCON_ITAGLO		    46#define SYSCON_DATALO		    47#define SYSCON_IDATALO		    48#define SYSCON_DTAGLO		    49#define SYSCON_DDATALO		    50#define SYSCON_TAGHI		    51#define SYSCON_ITAGHI		    52#define SYSCON_DATAHI		    53#define SYSCON_IDATAHI		    54#define SYSCON_DTAGHI		    55#define SYSCON_DDATAHI		    56#define SYSCON_ERROREPC		    57#define SYSCON_DESAVE		    58#define SYSCON_CP0_REG_COUNT	    (SYSCON_DESAVE+1)static t_syscon_cp0_reg cp0_reg[SYSCON_CP0_REG_COUNT] ={    { SYSCON_CPU_CP0_INDEX_ID,	          R_C0_Index,	      R_C0_SelIndex,         FALSE, 4 },    { SYSCON_CPU_CP0_RANDOM_ID,		  R_C0_Random,	      R_C0_SelRandom,	     FALSE, 4 },    { SYSCON_CPU_CP0_ENTRYLO0_ID,	  R_C0_EntryLo0,      R_C0_SelEntryLo0,	     FALSE, 4 },    { SYSCON_CPU_CP0_ENTRYLO1_ID,	  R_C0_EntryLo1,      R_C0_SelEntryLo1,	     FALSE, 4 },    { SYSCON_CPU_CP0_CONTEXT_ID,          R_C0_Context,	      R_C0_SelContext,	     FALSE, 4 },    { SYSCON_CPU_CP0_PAGEMASK_ID,         R_C0_PageMask,      R_C0_SelPageMask,	     FALSE, 4 },    { SYSCON_CPU_CP0_PAGEGRAIN_ID,        R_C0_PageGrain,     R_C0_SelPageGrain,     FALSE, 4 },    { SYSCON_CPU_CP0_WIRED_ID,	          R_C0_Wired,	      R_C0_SelWired,	     FALSE, 4 },    { SYSCON_CPU_CP0_HWRENA_ID,           R_C0_HWREna,	      R_C0_SelHWREna,	     FALSE, 4 },    { SYSCON_CPU_CP0_BADVADDR_ID,         R_C0_BadVAddr,      R_C0_SelBadVAddr,	     FALSE, 4 },    { SYSCON_CPU_CP0_COUNT_ID,	          R_C0_Count,	      R_C0_SelCount,	     FALSE, 4 },    { SYSCON_CPU_CP0_ENTRYHI_ID,          R_C0_EntryHi,	      R_C0_SelEntryHi,	     FALSE, 4 },    { SYSCON_CPU_CP0_COMPARE_ID,          R_C0_Compare,	      R_C0_SelCompare,	     FALSE, 4 },    { SYSCON_CPU_CP0_STATUS_ID,	          R_C0_Status,	      R_C0_SelStatus,	     FALSE, 4 },    { SYSCON_CPU_CP0_INTCTL_ID,		  R_C0_IntCtl,	      R_C0_SelIntCtl,	     FALSE, 4 },    { SYSCON_CPU_CP0_SRSCTL_ID,		  R_C0_SRSCtl,	      R_C0_SelSRSCtl,	     FALSE, 4 },    { SYSCON_CPU_CP0_SRSMAP_ID,		  R_C0_SRSMap,	      R_C0_SelSRSMap,	     FALSE, 4 },    { SYSCON_CPU_CP0_CAUSE_ID,	          R_C0_Cause,	      R_C0_SelCause,	     FALSE, 4 },    { SYSCON_CPU_CP0_EPC_ID,	          R_C0_EPC,	      R_C0_SelEPC,	     FALSE, 4 },    { SYSCON_CPU_CP0_PRID_ID,	          R_C0_PRId,	      R_C0_SelPRId,	     FALSE, 4 },    { SYSCON_CPU_CP0_EBASE_ID,            R_C0_EBase,	      R_C0_SelEBase,	     FALSE, 4 },    { SYSCON_CPU_CP0_CONFIG_ID,	          R_C0_Config,	      R_C0_SelConfig,	     FALSE, 4 },    { SYSCON_CPU_CP0_CONFIG1_ID,	  R_C0_Config1,	      R_C0_SelConfig1,	     FALSE, 4 },    { SYSCON_CPU_CP0_CONFIG2_ID,	  R_C0_Config2,	      R_C0_SelConfig2,	     FALSE, 4 },    { SYSCON_CPU_CP0_CONFIG3_ID,	  R_C0_Config3,	      R_C0_SelConfig3,	     FALSE, 4 },    { SYSCON_CPU_CP0_LLADDR_ID,	          R_C0_LLAddr,	      R_C0_SelLLAddr,	     FALSE, 4 },    { SYSCON_CPU_CP0_WATCHLO_ID,          R_C0_WatchLo,	      R_C0_SelWatchLo,	     FALSE, 4 },    { SYSCON_CPU_CP0_WATCHHI_ID,          R_C0_WatchHi,	      R_C0_SelWatchHi,	     FALSE, 4 },    { SYSCON_CPU_CP0_XCONTEXT_ID,         R_C0_XContext,      R_C0_SelXContext,	     FALSE, 4 },    { SYSCON_CPU_CP0_DEBUG_ID,	          R_C0_Debug,	      R_C0_SelDebug,	     FALSE, 4 },    { SYSCON_CPU_CP0_TRACECONTROL_ID,     R_C0_TraceControl,  R_C0_SelTraceControl,  FALSE, 4 },    { SYSCON_CPU_CP0_TRACECONTROL2_ID,    R_C0_TraceControl2, R_C0_SelTraceControl2, FALSE, 4 },    { SYSCON_CPU_CP0_USERTRACEDATA_ID,    R_C0_UserTraceData, R_C0_SelUserTraceData, FALSE, 4 },    { SYSCON_CPU_CP0_TRACEBPC_ID,         R_C0_TraceBPC,      R_C0_SelTraceBPC,	     FALSE, 4 },    { SYSCON_CPU_CP0_DEPC_ID,	          R_C0_DEPC,	      R_C0_SelDEPC,	     FALSE, 4 },    { SYSCON_CPU_CP0_PERFCOUNT_ID,        R_C0_PerfCnt,	      0 /* CTRL0 */,	     FALSE, 4 },    { SYSCON_CPU_CP0_PERFCOUNT_COUNT0_ID, R_C0_PerfCnt,	      1 /* CNT0	 */,	     FALSE, 4 },    { SYSCON_CPU_CP0_PERFCOUNT_CTRL1_ID , R_C0_PerfCnt,	      2 /* CTRL1 */,	     FALSE, 4 },    { SYSCON_CPU_CP0_PERFCOUNT_COUNT1_ID, R_C0_PerfCnt,	      3 /* CNT1	 */,	     FALSE, 4 },    { SYSCON_CPU_CP0_PERFCOUNT_CTRL2_ID,  R_C0_PerfCnt,	      4 /* CTRL2 */,	     FALSE, 4 },    { SYSCON_CPU_CP0_PERFCOUNT_COUNT2_ID, R_C0_PerfCnt,	      5 /* CNT2  */,	     FALSE, 4 },    { SYSCON_CPU_CP0_ERRCTL_ID,		  R_C0_ErrCtl,	      R_C0_SelErrCtl,	     FALSE, 4 },    { SYSCON_CPU_CP0_DERRCTL_ID,	  R_C0_DErrCtl,	      R_C0_SelDErrCtl,	     FALSE, 4 },    { SYSCON_CPU_CP0_IERRCTL_ID,	  R_C0_IErrCtl,	      R_C0_SelIErrCtl,	     FALSE, 4 },    { SYSCON_CPU_CP0_CACHEERR_ID,         R_C0_CacheErr,      R_C0_SelCacheErr,	     FALSE, 4 },    { SYSCON_CPU_CP0_TAGLO_ID,	          R_C0_TagLo,	      R_C0_SelTagLo,	     FALSE, 4 },    { SYSCON_CPU_CP0_ITAGLO_ID,	          R_C0_ITagLo,	      R_C0_SelITagLo,	     FALSE, 4 },    { SYSCON_CPU_CP0_DATALO_ID,	          R_C0_DataLo,	      R_C0_SelDataLo,	     FALSE, 4 },    { SYSCON_CPU_CP0_IDATALO_ID,          R_C0_IDataLo,	      R_C0_SelIDataLo,	     FALSE, 4 },    { SYSCON_CPU_CP0_DTAGLO_ID,           R_C0_DTagLo,	      R_C0_SelDTagLo,	     FALSE, 4 },    { SYSCON_CPU_CP0_DDATALO_ID,          R_C0_DDataLo,	      R_C0_SelDDataLo,	     FALSE, 4 },    { SYSCON_CPU_CP0_TAGHI_ID,	          R_C0_TagHi,	      R_C0_SelTagHi,	     FALSE, 4 },    { SYSCON_CPU_CP0_ITAGHI_ID,           R_C0_ITagHi,	      R_C0_SelITagHi,	     FALSE, 4 },    { SYSCON_CPU_CP0_DATAHI_ID,	          R_C0_DataHi,	      R_C0_SelDataHi,	     FALSE, 4 },    { SYSCON_CPU_CP0_IDATAHI_ID,          R_C0_IDataHi,	      R_C0_SelIDataHi,	     FALSE, 4 },    { SYSCON_CPU_CP0_DTAGHI_ID,           R_C0_DTagHi,	      R_C0_SelDTagHi,	     FALSE, 4 },    { SYSCON_CPU_CP0_DDATAHI_ID,          R_C0_DDataHi,	      R_C0_SelDDataHi,	     FALSE, 4 },    { SYSCON_CPU_CP0_ERROREPC_ID,         R_C0_ErrorEPC,      R_C0_SelErrorEPC,	     FALSE, 4 },    { SYSCON_CPU_CP0_DESAVE_ID,	          R_C0_DESAVE,	      R_C0_SelDESAVE,	     FALSE, 4 }};/************************************************************************ *  Static function prototypes ************************************************************************//************************************************************************ *  Implementation : Static functions registered for handling particular  *  SYSCON objects for particular CPU(s) ************************************************************************//************************************************************************ *  cpu_read_cp0 *  OBS: The size argument is buffer size - NOT register width ************************************************************************/static UINT32cpu_read_cp0(    void   *param,    void   *data,    UINT32 size ){    t_syscon_cp0_reg *def = (t_syscon_cp0_reg *)data;      if(!def->valid)        return ERROR_SYSCON_UNKNOWN_PARAM;    if( size == sizeof(UINT32) )    {	*(UINT32 *)param = sys_cp0_read32( def->number, def->sel );	return OK;    }    else if( size == sizeof(UINT64) )    {        if( def->regsize == sizeof(UINT32) )	    *(INT64 *)param = (INT64)sys_cp0_read32( def->number, def->sel );	else	    *(INT64 *)param =        sys_cp0_read64( def->number, def->sel );	return OK;    }    else	return ERROR_SYSCON_SIZE_MISMATCH;}/************************************************************************ *  cpu_write_cp0 *  OBS: The size argument is buffer size - NOT register width ************************************************************************/static UINT32cpu_write_cp0(    void   *param,    void   *data,    UINT32 size ){    t_syscon_cp0_reg *def = (t_syscon_cp0_reg *)data;      if(!def->valid)        return ERROR_SYSCON_UNKNOWN_PARAM;    if( size == sizeof(UINT32) )    {        if( def->regsize == sizeof(UINT32) )            sys_cp0_write32( def->number, def->sel,               *(UINT32 *)param );	else            sys_cp0_write64( def->number, def->sel, (UINT64)(INT64)*(INT32 *)param );	return OK;    }    else if( size == sizeof(UINT64) )    {        if( def->regsize == sizeof(UINT32) )            sys_cp0_write32( def->number, def->sel, (UINT32)*(UINT64 *)param );	else            sys_cp0_write64( def->number, def->sel,         *(UINT64 *)param );	return OK;    }    else	return ERROR_SYSCON_SIZE_MISMATCH;}/************************************************************************ *  cpu_cp0_config1_reset_mips32_read ************************************************************************/static UINT32cpu_cp0_config1_reset_mips32_read(    void   *param,    void   *data,    UINT32 size ){    *(UINT32 *)param = config1_init;    return OK;}/************************************************************************ *  cpu_tlb_count_mips32_read ************************************************************************/static UINT32cpu_tlb_count_mips32_read(    void   *param,    void   *data,    UINT32 size ){    UINT32 config1;      SYSCON_read(        SYSCON_CPU_CP0_CONFIG1_ID,        (void *)&config1,	sizeof(UINT32) );	    *(UINT8 *)param =         (( config1 & M_Config1MMUSize ) >> S_Config1MMUSize) + 1;    return OK;}/************************************************************************ *  cpu_tlb_count_rm5261_read ************************************************************************/static UINT32cpu_tlb_count_rm5261_read(    void   *param,    void   *data,    UINT32 size ){    *(UINT8 *)param =         (sys_processor == QED_RM52XX) ?	    QED_RM52XX_TLB_ENTRIES :	    QED_RM70XX_TLB_ENTRIES;    return OK;}/************************************************************************ *  Implementation : Public functions ************************************************************************//************************************************************************ * *                          syscon_arch_cpu_init *  Description : *  ------------- * *  Initialize cpu specific part of SYSCON * *  Return values : *  --------------- * *  None * ************************************************************************/void syscon_arch_cpu_init( 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -