예제 #1
0
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;
}
예제 #2
0
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();
}
예제 #3
0
//-------------------------------------------------------------------------
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);
}