00001 #include <string.h> 00002 #include <stdint.h> 00003 #include <free_align.h> 00004 00005 #include <moc.h> 00006 #include <internal/ppu/imoc_core_ppu.h> 00007 #include <internal/ppu/imoc_dma_ppu.h> 00008 00009 int IMOC_test_dma(imoc_dma_request* request, int *flag) 00010 { 00011 uint32_t dmastatus; 00012 int err; 00013 err = spe_mfcio_tag_status_read(moc_spu_thread_list[request->dest 00014 - moc_ppu_thread_count].speid, 0, SPE_TAG_IMMEDIATE, &dmastatus); 00015 if (err) 00016 return MOC_ERR_INTERN; 00017 00018 if (dmastatus == (1 << request->tag_id)) // dma transfer not finished 00019 *flag = 0; 00020 else // dma transfer finished 00021 { 00022 if (request->remainder != 0) // check if buffer was used and copy back data from there to target 00023 { 00024 memcpy(request->target + request->size, request->buffer, 00025 request->remainder); 00026 _free_align(request->buffer); 00027 } 00028 *flag = 1; 00029 moc_tag_release(request->dest - moc_ppu_thread_count, request->tag_id); 00030 } 00031 00032 return MOC_SUCCESS; 00033 }
1.5.6