/********************************************************************************************************* ** 函数名称: armCacheV5DataUpdate ** 功能描述: 回写 D CACHE (仅回写 CPU 独享级 CACHE) ** 输 入 : pvAdrs 虚拟地址 ** stBytes 长度 ** bInv 是否为回写无效 ** 输 出 : ERROR or OK ** 全局变量: ** 调用模块: ** 注 意 : L2 cache 为统一 CACHE 所以 data update 不需要操作 L2 cache. *********************************************************************************************************/ static INT armCacheV5DataUpdate (PVOID pvAdrs, size_t stBytes, BOOL bInv) { addr_t ulEnd; if (bInv == LW_FALSE) { if (stBytes >= ARMv5_CACHE_LOOP_OP_MAX_SIZE) { armDCacheV5FlushAll(); /* 全部回写 */ } else { ARM_CACHE_GET_END(pvAdrs, stBytes, ulEnd, ARMv5_CACHE_LINE_SIZE); armDCacheFlush(pvAdrs, (PVOID)ulEnd, ARMv5_CACHE_LINE_SIZE);/* 部分回写 */ } } else { if (stBytes >= ARMv5_CACHE_LOOP_OP_MAX_SIZE) { armDCacheV5ClearAll(); /* 全部回写 */ } else { ARM_CACHE_GET_END(pvAdrs, stBytes, ulEnd, ARMv5_CACHE_LINE_SIZE); armDCacheClear(pvAdrs, (PVOID)ulEnd, ARMv5_CACHE_LINE_SIZE);/* 部分回写 */ } } return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: armCacheV5ClearPage ** 功能描述: 指定类型的 CACHE 使部分或全部清空(回写内存)并无效(访问不命中) ** 输 入 : cachetype CACHE 类型 ** pvAdrs 虚拟地址 ** pvPdrs 物理地址 ** stBytes 长度 ** 输 出 : ERROR or OK ** 全局变量: ** 调用模块: *********************************************************************************************************/ static INT armCacheV5ClearPage (LW_CACHE_TYPE cachetype, PVOID pvAdrs, PVOID pvPdrs, size_t stBytes) { addr_t ulEnd; if (cachetype == INSTRUCTION_CACHE) { if (stBytes >= ARMv5_CACHE_LOOP_OP_MAX_SIZE) { armICacheInvalidateAll(); /* ICACHE 全部无效 */ } else { ARM_CACHE_GET_END(pvAdrs, stBytes, ulEnd, ARMv5_CACHE_LINE_SIZE); armICacheInvalidate(pvAdrs, (PVOID)ulEnd, ARMv5_CACHE_LINE_SIZE); } } else { if (stBytes >= ARMv5_CACHE_LOOP_OP_MAX_SIZE) { armDCacheV5ClearAll(); /* 全部回写并无效 */ } else { ARM_CACHE_GET_END(pvAdrs, stBytes, ulEnd, ARMv5_CACHE_LINE_SIZE); armDCacheClear(pvAdrs, (PVOID)ulEnd, ARMv5_CACHE_LINE_SIZE);/* 部分回写并无效 */ } } return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: armCacheV5Flush ** 功能描述: CACHE 脏数据回写 ** 输 入 : cachetype CACHE 类型 ** pvAdrs 虚拟地址 ** stBytes 长度 ** 输 出 : ERROR or OK ** 全局变量: ** 调用模块: *********************************************************************************************************/ static INT armCacheV5Flush (LW_CACHE_TYPE cachetype, PVOID pvAdrs, size_t stBytes) { addr_t ulEnd; if (cachetype == DATA_CACHE) { if (stBytes >= ARMv5_CACHE_LOOP_OP_MAX_SIZE) { armDCacheV5FlushAll(); } else { ARM_CACHE_GET_END(pvAdrs, stBytes, ulEnd, ARMv5_CACHE_LINE_SIZE); armDCacheFlush(pvAdrs, (PVOID)ulEnd, ARMv5_CACHE_LINE_SIZE);/* 部分回写 */ } } return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: armCacheV5TextUpdate ** 功能描述: 清空(回写内存) D CACHE 无效(访问不命中) I CACHE ** 输 入 : pvAdrs 虚拟地址 ** stBytes 长度 ** 输 出 : ERROR or OK ** 全局变量: ** 调用模块: ** 注 意 : L2 cache 为统一 CACHE 所以 text update 不需要操作 L2 cache. *********************************************************************************************************/ static INT armCacheV5TextUpdate (PVOID pvAdrs, size_t stBytes) { addr_t ulEnd; if (stBytes >= ARMv5_CACHE_LOOP_OP_MAX_SIZE) { armDCacheV5FlushAll(); /* DCACHE 全部回写 */ armICacheInvalidateAll(); /* ICACHE 全部无效 */ } else { ARM_CACHE_GET_END(pvAdrs, stBytes, ulEnd, ARMv5_CACHE_LINE_SIZE); armDCacheFlush(pvAdrs, (PVOID)ulEnd, ARMv5_CACHE_LINE_SIZE); /* 部分回写 */ armICacheInvalidate(pvAdrs, (PVOID)ulEnd, ARMv5_CACHE_LINE_SIZE); } return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: armPl310ClearAll ** 功能描述: L2 CACHE 控制器回写并无效部分数据 ** 输 入 : pl2cdrv 驱动结构 ** pvPhyAddr 物理地址 ** stBytes 长度 ** 输 出 : NONE ** 全局变量: ** 调用模块: *********************************************************************************************************/ static VOID armL2x0Clear (L2C_DRVIER *pl2cdrv, PVOID pvPhyAddr, size_t stBytes) { addr_t ulPhyStart = (addr_t)pvPhyAddr; addr_t ulPhyEnd; if (stBytes >= pl2cdrv->L2CD_stSize) { armL2x0ClearAll(pl2cdrv); return; } ARM_CACHE_GET_END(pvPhyAddr, stBytes, ulPhyEnd, L2C_CACHE_LINE_SIZE); while (ulPhyStart < ulPhyEnd) { armL2x0ClearLine(pl2cdrv, ulPhyStart); ulPhyStart += L2C_CACHE_LINE_SIZE; } armL2x0Sync(pl2cdrv); }
/********************************************************************************************************* ** 函数名称: armCacheV5InvalidatePage ** 功能描述: 指定类型的 CACHE 使部分无效(访问不命中) ** 输 入 : cachetype CACHE 类型 ** pvAdrs 虚拟地址 ** pvPdrs 物理地址 ** stBytes 长度 ** 输 出 : ERROR or OK ** 全局变量: ** 调用模块: *********************************************************************************************************/ static INT armCacheV5InvalidatePage (LW_CACHE_TYPE cachetype, PVOID pvAdrs, PVOID pvPdrs, size_t stBytes) { addr_t ulEnd; if (cachetype == INSTRUCTION_CACHE) { if (stBytes >= ARMv5_CACHE_LOOP_OP_MAX_SIZE) { armICacheInvalidateAll(); /* ICACHE 全部无效 */ } else { ARM_CACHE_GET_END(pvAdrs, stBytes, ulEnd, ARMv5_CACHE_LINE_SIZE); armICacheInvalidate(pvAdrs, (PVOID)ulEnd, ARMv5_CACHE_LINE_SIZE); } } else { if (stBytes > 0) { /* 必须 > 0 */ addr_t ulStart = (addr_t)pvAdrs; ulEnd = ulStart + stBytes; if (ulStart & (ARMv5_CACHE_LINE_SIZE - 1)) { /* 起始地址非 cache line 对齐 */ ulStart &= ~(ARMv5_CACHE_LINE_SIZE - 1); armDCacheClear((PVOID)ulStart, (PVOID)ulStart, ARMv5_CACHE_LINE_SIZE); ulStart += ARMv5_CACHE_LINE_SIZE; } if (ulEnd & (ARMv5_CACHE_LINE_SIZE - 1)) { /* 结束地址非 cache line 对齐 */ ulEnd &= ~(ARMv5_CACHE_LINE_SIZE - 1); armDCacheClear((PVOID)ulEnd, (PVOID)ulEnd, ARMv5_CACHE_LINE_SIZE); } /* 仅无效对齐部分 */ armDCacheInvalidate((PVOID)ulStart, (PVOID)ulEnd, ARMv5_CACHE_LINE_SIZE); } else { _DebugHandle(__ERRORMESSAGE_LEVEL, "stBytes == 0.\r\n"); } } return (ERROR_NONE); }