00001 #include <spu_mfcio.h>
00002 #include <string.h>
00003 #include <stdlib.h>
00004
00005 #include <moc.h>
00006 #include <spu/moc_dma_spu.h>
00007 #include <internal/imoc_macros.h>
00008 #include <internal/spu/imoc_dma_spu.h>
00009
00010 int IMOC_iput_data(void* source, uint64_t target, uint32_t size,
00011 imoc_dma_request* request)
00012 {
00013 uint32_t remainder_16b;
00014 uint32_t remainder_16kb;
00015 uint32_t offset;
00016 uint32_t tag_id;
00017
00018 if ((tag_id = mfc_tag_reserve()) == MFC_TAG_INVALID)
00019 {
00020 return MOC_ERR_INTERN;
00021 }
00022
00023
00024 remainder_16b = size % 16;
00025
00026 request->remainder = 0;
00027 request->tag_id = tag_id;
00028
00029
00030 size -= remainder_16b;
00031 offset = 0;
00032
00033
00034 if (size <= MAX_DMA_CALL_SIZE)
00035 {
00036 mfc_put(source, target, size, tag_id, 0, 0);
00037 }
00038
00039 else
00040 {
00041 remainder_16kb = size % MAX_DMA_CALL_SIZE;
00042 while (offset + MAX_DMA_CALL_SIZE <= size)
00043 {
00044 mfc_put(source + offset, target + offset, MAX_DMA_CALL_SIZE,
00045 tag_id, 0, 0);
00046 offset += MAX_DMA_CALL_SIZE;
00047 }
00048 if (remainder_16kb > 0)
00049 {
00050 mfc_put(source + offset, target + offset, remainder_16kb, tag_id,
00051 0, 0);
00052 }
00053 }
00054
00055 if (remainder_16b > 0)
00056 {
00057
00058 mfc_put(source + size, target + size, 16, tag_id, 0, 0);
00059 }
00060
00061 return MOC_SUCCESS;
00062 }
00063