Hint poly_crc (void * list_ptr, Huint size) { Hint result = SUCCESS; // Use Accelerator? Hbool use_accelerator = poly_init(CRC, size); // Start transferring data to BRAM if(transfer_dma( (void *) list_ptr, (void *) ACC_BRAMC, size *4)) return FAILURE; if (use_accelerator) { int e = 0; putfslx( size, 0, FSL_DEFAULT);//send end address putfslx( 0, 0, FSL_DEFAULT); //send start address getfslx(e, 0, FSL_DEFAULT); if (e != 1) return FAILURE; } else { Huint vhwti_base = 0; // Get VHWTI from PVRs getpvr(1,vhwti_base); hthread_time_t start = hthread_time_get(); // Run crc in software result = (sw_crc((void *) ACC_BRAMC, size)); hthread_time_t stop = hthread_time_get(); hthread_time_t diff; hthread_time_diff(diff, stop,start); volatile hthread_time_t * ptr = (hthread_time_t *) (vhwti_base + 0x100); *ptr += diff; } // Start transferring data from BRAM if(transfer_dma( (void *) ACC_BRAMC, (void *) list_ptr, size *4)) return FAILURE; return result; }
Hint sw_crc(void * list_ptr, Huint size) { // Set up DMA structure dma_t local_dma; dma_config_t local_dma_config; local_dma_config.base = ACCELERATOR_DMA_BASEADDR; dma_create(&local_dma, &local_dma_config); // Transfer List A to local BRAM A using local dma if(transfer_dma(&local_dma, (void *) list_ptr, (void *) ACC_BRAM_A, size*4)) return FAILURE; Hint *array = (Hint *) ACC_BRAM_A; for (array = (Hint *) ACC_BRAM_A; array < (Hint *) ACC_BRAM_A + size; array++) { *array = gen_crc(*array); } // Transfer results back if(transfer_dma(&local_dma, (void *) ACC_BRAM_A, (void *) list_ptr, size*4)) return FAILURE; else return SUCCESS; }