00001 #include <string.h>
00002 #include <stdlib.h>
00003
00004 #include <moc.h>
00005 #include <ppu/moc_dma_ppu.h>
00006 #include <internal/imoc_macros.h>
00007 #include <internal/ppu/imoc_dma_ppu.h>
00008 #include <internal/ppu/imoc_core_ppu.h>
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 int IMOC_iput_data(void* source, uint64_t target, uint32_t size, uint32_t dest,
00020 imoc_dma_request* request)
00021 {
00022 uint32_t remainder_16b;
00023 uint32_t remainder_16kb;
00024 uint32_t offset;
00025 int err;
00026 int tag_id;
00027
00028 if ((tag_id = moc_tag_reserve(dest - moc_ppu_thread_count)) < 0)
00029 {
00030 return MOC_ERR_INTERN;
00031 }
00032
00033
00034 remainder_16b = size % 16;
00035
00036 request->remainder = 0;
00037 request->dest = dest;
00038 request->size = size;
00039 request->target = target;
00040 request->tag_id = tag_id;
00041
00042
00043 size -= remainder_16b;
00044 offset = 0;
00045
00046
00047 if (size <= MAX_DMA_CALL_SIZE)
00048 {
00049 err = spe_mfcio_get(
00050 moc_spu_thread_list[dest - moc_ppu_thread_count].speid, target,
00051 source, size, tag_id, 0, 0);
00052
00053 if (err)
00054 return MOC_ERR_INTERN;
00055 }
00056
00057
00058 else
00059 {
00060 remainder_16kb = size % MAX_DMA_CALL_SIZE;
00061 while (offset + MAX_DMA_CALL_SIZE <= size)
00062 {
00063 err = spe_mfcio_get(
00064 moc_spu_thread_list[dest - moc_ppu_thread_count].speid,
00065 target + offset, source + offset, MAX_DMA_CALL_SIZE,
00066 tag_id, 0, 0);
00067
00068 if (err)
00069 return MOC_ERR_INTERN;
00070
00071 offset += MAX_DMA_CALL_SIZE;
00072 }
00073
00074 if (remainder_16kb > 0)
00075 {
00076 err = spe_mfcio_get(
00077 moc_spu_thread_list[dest - moc_ppu_thread_count].speid,
00078 target + offset, source + offset, remainder_16kb, tag_id,
00079 0, 0);
00080
00081 if (err)
00082 return MOC_ERR_INTERN;
00083 }
00084 }
00085
00086
00087 if (remainder_16b > 0)
00088 {
00089
00090 err = spe_mfcio_get(
00091 moc_spu_thread_list[dest - moc_ppu_thread_count].speid, target
00092 + size, source + size, 16, tag_id, 0, 0);
00093
00094 if (err)
00095 return MOC_ERR_INTERN;
00096 }
00097
00098 return MOC_SUCCESS;
00099
00100 }