kal_bool gfxExtMemSwitchCachableRegion(void **mem_ptr, kal_uint32 size, kal_bool b_cacheable) { kal_bool ret_switch = KAL_FALSE; #ifdef __MTK_TARGET__ kal_uint32 buffer_size = size; #if defined(__DYNAMIC_SWITCH_CACHEABILITY__) if (0 != (buffer_size % CPU_CACHE_LINE_SIZE)) { buffer_size = ((buffer_size + CPU_CACHE_LINE_SIZE - 1) / CPU_CACHE_LINE_SIZE) * CPU_CACHE_LINE_SIZE; } if ((IS_CACHE_LINE_SIZE_ALIGNED((kal_uint32)(*mem_ptr))) && (IS_CACHE_LINE_SIZE_ALIGNED(buffer_size)) && (is_predef_dyna_c_region((kal_uint32)(*mem_ptr), size))) { if (KAL_TRUE == b_cacheable) { if(KAL_TRUE == INT_QueryIsNonCachedRAM((kal_uint32 *)*mem_ptr, buffer_size)) { dynamic_switch_cacheable_region(mem_ptr, buffer_size, PAGE_CACHEABLE); ret_switch = KAL_TRUE; } } else { if(KAL_TRUE == INT_QueryIsCachedRAM((kal_uint32 *)*mem_ptr, buffer_size)) { dynamic_switch_cacheable_region(mem_ptr, buffer_size, PAGE_NO_CACHE); ret_switch = KAL_TRUE; } } } #elif defined(__MTK_L1CACHEABLE__) kal_bool is_wt_cache = (kal_bool)(INT_QueryIsWriteThroughCachedRAM(*mem_ptr, buffer_size)); if (KAL_TRUE == is_wt_cache) { if(KAL_TRUE == b_cacheable) { invalidate_wt_cache((kal_uint32)*mem_ptr, buffer_size); } } else { if(KAL_TRUE == b_cacheable) { invalidate_l1cache((kal_uint32)*mem_ptr, buffer_size); } } #endif #endif /* __MTK_TARGET__ */ return ret_switch; }
void do_it ( unsigned int base ) { unsigned int ra; unsigned int beg,end; unsigned int rb; unsigned int min,max; unsigned int rc; stop_l1cache(); //just in case invalidate_l1cache(); hexstrings(base); hexstrings(base); hexstrings(base); hexstring(base); hexstring(GET_CONTROL()); CLR_CONTROL(1<<11); hexstring(GET_CONTROL()); max=0; min=0; min--; for(ra=base+0x6000;ra<base+0x6100;ra+=4) { unsigned int flag; PUT32(ra+0x00,0xe2500001); PUT32(ra+0x04,0x1afffffd); PUT32(ra+0x08,0xe12fff1e); GET32(ra+0x08); PrefetchFlush(); for(rc=0;rc<4;rc++) { beg=GET32(ARM_TIMER_CNT); HOP(0x20000,ra); end=GET32(ARM_TIMER_CNT); rb=end-beg; flag=0; if(rb>gmax) gmax=rb; if(rb<gmin) gmin=rb; if(rb>max) { flag++; max=rb; } if(rb<min) { flag++; min=rb; } if(flag) { hexstrings(ra); hexstrings(rb); hexstrings(min); hexstrings(max); hexstring(max-min); } } } hexstring(GET_CONTROL()); SET_CONTROL(1<<11); hexstring(GET_CONTROL()); if(1) { max=0; min=0; min--; for(ra=base+0x6000;ra<base+0x6100;ra+=4) { unsigned int flag; PUT32(ra+0x00,0xe2500001); PUT32(ra+0x04,0x1afffffd); PUT32(ra+0x08,0xe12fff1e); GET32(ra+0x08); PrefetchFlush(); for(rc=0;rc<4;rc++) { beg=GET32(ARM_TIMER_CNT); HOP(0x20000,ra); end=GET32(ARM_TIMER_CNT); rb=end-beg; flag=0; if(rb>gmax) gmax=rb; if(rb<gmin) gmin=rb; if(rb>max) { flag++; max=rb; } if(rb<min) { flag++; min=rb; } if(flag) { hexstrings(ra); hexstrings(rb); hexstrings(min); hexstrings(max); hexstring(max-min); } } } } hexstring(GET_CONTROL()); CLR_CONTROL(1<<11); hexstring(GET_CONTROL()); ra=GET32(ARM_TIMER_CNT); start_l1cache(); max=0; min=0; min--; for(ra=base+0x6000;ra<base+0x6100;ra+=4) { unsigned int flag; PUT32(ra+0x00,0xe2500001); PUT32(ra+0x04,0x1afffffd); PUT32(ra+0x08,0xe12fff1e); GET32(ra+0x08); PrefetchFlush(); invalidate_l1cache(); for(rc=0;rc<4;rc++) { beg=GET32(ARM_TIMER_CNT); HOP(0x20000,ra); end=GET32(ARM_TIMER_CNT); rb=end-beg; flag=0; if(rb>gmax) gmax=rb; if(rb<gmin) gmin=rb; if(rb>max) { flag++; max=rb; } if(rb<min) { flag++; min=rb; } if(flag) { hexstrings(ra); hexstrings(rb); hexstrings(min); hexstrings(max); hexstring(max-min); } } } hexstring(GET_CONTROL()); SET_CONTROL(1<<11); hexstring(GET_CONTROL()); max=0; min=0; min--; for(ra=base+0x6000;ra<base+0x6100;ra+=4) { unsigned int flag; PUT32(ra+0x00,0xe2500001); PUT32(ra+0x04,0x1afffffd); PUT32(ra+0x08,0xe12fff1e); GET32(ra+0x08); PrefetchFlush(); invalidate_l1cache(); for(rc=0;rc<4;rc++) { beg=GET32(ARM_TIMER_CNT); HOP(0x20000,ra); end=GET32(ARM_TIMER_CNT); rb=end-beg; flag=0; if(rb>gmax) gmax=rb; if(rb<gmin) gmin=rb; if(rb>max) { flag++; max=rb; } if(rb<min) { flag++; min=rb; } if(flag) { hexstrings(ra); hexstrings(rb); hexstrings(min); hexstrings(max); hexstring(max-min); } } } hexstring(GET_CONTROL()); CLR_CONTROL(1<<11); hexstring(GET_CONTROL()); stop_l1cache(); }
//------------------------------------------------------------------------- int notmain ( void ) { //unsigned int ra,rb; unsigned int ra; unsigned int beg,end; //uart_init(); hexstrings(0x12345678); hexstrings(0x12345678); hexstrings(0x12345678); hexstrings(0x12345678); hexstring(0x12345678); gmax=0; gmin=0; gmin--; PUT32(ARM_TIMER_CTL,0x00000000); PUT32(ARM_TIMER_CTL,0x00000200); beg=GET32(ARM_TIMER_CNT); ASMDELAY(100000); end=GET32(ARM_TIMER_CNT); hexstring(end-beg); for(ra=0;ra<4;ra++) { beg=GET32(ARM_TIMER_CNT); ASMDELAY(100000); end=GET32(ARM_TIMER_CNT); hexstring(end-beg); } start_l1cache(); for(ra=0;ra<4;ra++) { beg=GET32(ARM_TIMER_CNT); ASMDELAY(100000); end=GET32(ARM_TIMER_CNT); hexstring(end-beg); } invalidate_l1cache(); for(ra=0;ra<4;ra++) { beg=GET32(ARM_TIMER_CNT); ASMDELAY(10); end=GET32(ARM_TIMER_CNT); hexstring(end-beg); } invalidate_l1cache(); for(ra=0;ra<4;ra++) { beg=GET32(ARM_TIMER_CNT); ASMDELAY(10); end=GET32(ARM_TIMER_CNT); hexstring(end-beg); } stop_l1cache(); do_it(0xC0000000); do_it(0x80000000); do_it(0x40000000); hexstrings(gmin); hexstrings(gmax); hexstring(gmax-gmin); hexstring(0x12345678); return(0); }