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