📄 hw_cache.c
字号:
/*********************************************************************************
* Copyright (C),2004-2005, Fuzhou Rockchip Co.,Ltd.
* All Rights Reserved
* V1.00
* FileName : cache.c
* Author : lzy
* Description:
* History :
* <author> <time> <version> <desc>
* lzy 07/7/29 1.0 ORG
$Log: hw_cache.c,v $
Revision 1.5 2008/06/19 04:43:29 Administrator
代码整理!
Revision 1.4 2008/05/28 12:39:20 HSL
增加CACHE性能打印接口.
Revision 1.3 2008/05/20 07:43:47 HSL
修改 CACHE SRAM 的 BUG.
Revision 1.2 2008/05/15 07:56:15 HXY
去掉LDK/Porsche宏
Revision 1.1.1.1 2008/05/07 04:15:08 Administrator
no message
Revision 1.1.1.1 2008/03/06 13:29:04 Lingzhaojun
no message
Revision 1.7 2007/11/17 06:10:52 Linzhengyuan
修改cache_poweroninit,避免jtag 死机
Revision 1.6 2007/10/23 08:21:13 Huangxinyu
调试后修改bug
Revision 1.5 2007/10/16 04:18:03 Huangxinyu
修改cache的bug
Revision 1.4 2007/10/15 09:03:06 Huangxinyu
根据RK27提交修改driver
Revision 1.3 2007/10/08 02:38:39 Lingzhaojun
添加版本自动注释脚本
*********************************************************************************/
#include "hw_include.h"
#include "hw_cache.h"
#define pCacheReg ((pCache_Reg_t)ARM7CacheCtrl_BASE)
/**************************************************************************
* 函数名称: Cache_FlushWay
* 函数描述: 清除一组cache
* 入口参数: Cache_way_t : way0 cache or way1 cache
* 出口参数: 无
* 返回值: 无
* 注释:
***************************************************************************/
void Cache_FlushWay(Cache_way_t cacheway)
{
UINT32 i;
WriteReg32(&pCacheReg->CacheOp, (cacheway << 31) | CACHEOP_FLUSHWAY);
for (i = 100; i = 0; i--)
{
if (ReadReg32(&pCacheReg->CacheOp)& ~CACHEOP_ADDR_MASK)
delay_nops(20);
else
break;
}
}
/**************************************************************************
* 函数名称: Cache_SetUnCacheMem
* 函数描述: 设置不cache的内存
* 入口参数: 四个不cache的内存地址
* 出口参数: 无
* 返回值: 无
* 注释: the frist parameter must no equal to NULL, it must to to uncachable memory
***************************************************************************/
static void Cache_SetUnCacheMem(UINT32 address0, UINT32 address1, UINT32 address2, UINT32 address3)
{
UINT32 UnCacheaddr;
UnCacheaddr = address0 & CACHEOP_UNCACHE_MASK;
WriteReg32(&pCacheReg->MemMapA, UnCacheaddr | CACHEOP_UNCACHE_32M);
if (address1)
{
UnCacheaddr = address1 & CACHEOP_UNCACHE_MASK;
WriteReg32(&pCacheReg->MemMapB, UnCacheaddr | CACHEOP_UNCACHE_32M);
}
else
WriteReg32(&pCacheReg->MemMapB, 0x00);
if (address2)
{
UnCacheaddr = address2 & CACHEOP_UNCACHE_MASK;
WriteReg32(&pCacheReg->MemMapC, UnCacheaddr | CACHEOP_UNCACHE_32M);
}
else
WriteReg32(&pCacheReg->MemMapC, 0x00);
if (address3)
{
UnCacheaddr = address3 & CACHEOP_UNCACHE_MASK;
WriteReg32(&pCacheReg->MemMapD, UnCacheaddr | CACHEOP_UNCACHE_32M);
}
else
WriteReg32(&pCacheReg->MemMapD, 0x00);
}
/**************************************************************************
* 函数名称: Cache_Enable
* 函数描述: 打开cache
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
* 注释:
***************************************************************************/
static void Cache_Enable(void)
{
SetRegBits32(&pCacheReg->DevId, CACHE_EN);
}
/**************************************************************************
* 函数名称: Cache_PowerOnInit
* 函数描述: 开机时cache 初始化
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
* 注释: 目前设定四个不cache 的地址为
外设地址: 0x18000000
DSP_DMEM : 0x30000000
ARM7CacheCtrl_BASE:
AHB_SRAM:
***************************************************************************/
void Cache_PowerOnInit(void)
{
Cache_Disable();
//Cache_SetUnCacheMem(AHB_SRAM, BUS0IP_BASE, DSP_DMEM, ARM7CacheCtrl_BASE);
// 080520,huangsl,改 NULL 为 BUS0IP_BASE,因为 NULL == 0 == AHB_SRAM .
Cache_SetUnCacheMem(BUS0IP_BASE, DSP_DMEM, ARM7CacheCtrl_BASE, BUS0IP_BASE); //hj 2008.2.29 cache destroyed bug
Cache_FlushWay(Cache_way0);
Cache_FlushWay(Cache_way1);
// 由于sram 地址为0,需要固定在第一个参数
Cache_Enable();
}
/**************************************************************************
* 函数名称: Cache_Disable
* 函数描述: 关闭cache
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void Cache_Disable(void)
{
ClrRegBits16(&pCacheReg->DevId, CACHE_EN);
}
/**************************************************************************
* 函数名称: Cache_FlushDataLine
* 函数描述: 根据地址清除cache 中的数据
* 入口参数: address : 变量地址
numofbyte: 变量长度,byte 单位
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void Cache_FlushDataLine(UINT32 address, UINT32 numofbyte)
{
int count;
count = (int)(numofbyte + (address & 0x1f));
address = address & 0xffffffe0 | CACHEOP_FLUSHLINE; //屏蔽低位地址,与cache line 32byte 对齐
while (count > 0)
{
UINT32 i;
WriteReg32(&pCacheReg->CacheOp, address);
for (i = 100; i = 0; i--)
{
if (ReadReg32(&pCacheReg->CacheOp)& ~CACHEOP_ADDR_MASK)
delay_nops(10);
else
break;
}
count -= 32;
address += 32;
}
}
void Cache_MeasureStart(INT32U measureType)
{
// PFCNTRA_CTRL:TOTAL,PFCNTRB_CTRL: HIT
INT32U totalRegValue;
INT32U hitRegValue;
if (measureType == CACHE_MEASURE_DATA)
{
totalRegValue = CHACHEPF_COUNT_CACHEDATA;
hitRegValue = CHACHEPF_COUNT_HITDATA;
}
else
{
totalRegValue = CHACHEPF_COUNT_CACHEINST;
hitRegValue = CHACHEPF_COUNT_HITINST;
}
//RESET COUNT =0.
WriteReg32(&pCacheReg->PFCNTRA, 0);
WriteReg32(&pCacheReg->PFCNTRB, 0);
//START COUNTER
WriteReg32(&pCacheReg->PFCNTRA_CTRL, totalRegValue | CHACHEPF_COUNT_ENABLE);
WriteReg32(&pCacheReg->PFCNTRB_CTRL, hitRegValue | CHACHEPF_COUNT_ENABLE);
}
void Cache_MeasureStop(INT32U *totalAccessCount , INT32U *hitCount)
{
*totalAccessCount = ReadReg32(&pCacheReg->PFCNTRA);
*hitCount = ReadReg32(&pCacheReg->PFCNTRB);
//STOP COUNTER
WriteReg32(&pCacheReg->PFCNTRA_CTRL, CHACHEPF_COUNT_DISABLE);
WriteReg32(&pCacheReg->PFCNTRB_CTRL, CHACHEPF_COUNT_DISABLE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -