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_iget_data(void* target, uint64_t source, 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->size = size;
00028 request->target = target;
00029 request->tag_id = tag_id;
00030
00031
00032 size -= remainder_16b;
00033 offset = 0;
00034
00035
00036 if (size <= MAX_DMA_CALL_SIZE)
00037 {
00038 mfc_get(target, source, size, tag_id, 0, 0);
00039 }
00040
00041 else
00042 {
00043 remainder_16kb = size % MAX_DMA_CALL_SIZE;
00044 while (offset + MAX_DMA_CALL_SIZE <= size)
00045 {
00046 mfc_get(target + offset, source + offset, MAX_DMA_CALL_SIZE,
00047 tag_id, 0, 0);
00048 offset += MAX_DMA_CALL_SIZE;
00049 }
00050 if (remainder_16kb > 0)
00051 {
00052 mfc_get(target + offset, source + offset, remainder_16kb, tag_id,
00053 0, 0);
00054 }
00055 }
00056
00057 if (remainder_16b > 0)
00058 {
00059 request->buffer = (char*) malloc(16 * sizeof(char));
00060
00061 mfc_get(request->buffer, source + size, 16, tag_id, 0, 0);
00062 request->remainder = remainder_16b;
00063 }
00064
00065 return MOC_SUCCESS;
00066 }
00067