static int thread_func(void *data) { thread_running = 1; cacheperf(); thread_running = 0; return 0; }
static int perfmain(void) { phys_addr_t dmasrc, dmadst; void *srcbuf[MT_MAX]; void *dstbuf[MT_MAX]; u32 xfer_size; srcbuf[MT_WBWA] = kmalloc(END_SIZE, GFP_KERNEL); dstbuf[MT_WBWA] = kmalloc(END_SIZE, GFP_KERNEL); srcbuf[MT_NC] = dma_alloc_writecombine( NULL, mcpy_size, &dmasrc, GFP_KERNEL); dstbuf[MT_NC] = dma_alloc_writecombine( NULL, mcpy_size, &dmadst, GFP_KERNEL); if (!srcbuf[MT_WBWA] && !srcbuf[MT_NC] && !dstbuf[MT_WBWA] && !dstbuf[MT_NC]) { printk(KERN_ERR "Memory allocation error!\n"); dma_free_coherent(NULL, mcpy_size, srcbuf[MT_NC], dmasrc); dma_free_coherent(NULL, mcpy_size, dstbuf[MT_NC], dmadst); kfree(srcbuf[MT_WBWA]); kfree(dstbuf[MT_WBWA]); return 0; } if (mcpy) { printk(KERN_INFO "## Memcpy perf (ns, unit tr size: %dKB)\n", mcpy_size/SZ_1K); if (mcpy >= MT_SO) { printk(KERN_INFO "1. SO type\n"); srcbuf[MT_SO] = remap_vm(dmasrc, mcpy_size, pgprot_noncached(PAGE_KERNEL)); dstbuf[MT_SO] = remap_vm(dmadst, mcpy_size, pgprot_noncached(PAGE_KERNEL)); xfer_size = START_SIZE; while (xfer_size <= END_SIZE) { memcpyperf(srcbuf[MT_SO], dstbuf[MT_SO], xfer_size, 10); xfer_size *= 2; } vunmap(srcbuf[MT_SO]); vunmap(dstbuf[MT_SO]); } if (mcpy >= MT_NC) { printk(KERN_INFO "2. Normal NCNB type\n"); xfer_size = START_SIZE; while (xfer_size <= END_SIZE) { memcpyperf(srcbuf[MT_NC], dstbuf[MT_NC], xfer_size, 10); xfer_size *= 2; } } printk(KERN_INFO "3. Cache memcpy\n"); printk(KERN_INFO "scramble size:"); memcpyperf(srcbuf[MT_WBWA], dstbuf[MT_WBWA], SCRAMBLE_SIZE, try_cnt); memset(dstbuf[MT_WBWA], 0x0, SCRAMBLE_SIZE); printk(KERN_INFO "small size:"); memcpyperf(srcbuf[MT_WBWA], dstbuf[MT_WBWA], SMALL_SIZE, try_cnt); memset(dstbuf[MT_WBWA], 0x0, SMALL_SIZE); printk(KERN_INFO "size (%d ~ %d)\n ", START_SIZE, END_SIZE); xfer_size = START_SIZE; while (xfer_size <= END_SIZE) { memcpyperf(srcbuf[MT_WBWA], dstbuf[MT_WBWA], xfer_size, try_cnt); xfer_size *= 2; } } if (cm) { printk(KERN_INFO "## Memcpy perf (ns)\n"); printk(KERN_INFO "1. Clean perf\n"); cacheperf(srcbuf[MT_WBWA], CM_CLEAN); printk(KERN_INFO "2. Invalidate perf\n"); cacheperf(srcbuf[MT_WBWA], CM_INV); printk(KERN_INFO "3. Flush perf\n"); cacheperf(srcbuf[MT_WBWA], CM_FLUSH); printk(KERN_INFO "4. Flush all perf\n"); cacheperf(srcbuf[MT_WBWA], CM_FLUSHALL); } dma_free_coherent(NULL, mcpy_size, srcbuf[MT_NC], dmasrc); dma_free_coherent(NULL, mcpy_size, dstbuf[MT_NC], dmadst); kfree(srcbuf[MT_WBWA]); kfree(dstbuf[MT_WBWA]); return 0; }