diff TaskManager/Fifo/FifoDmaManager.cc @ 263:001583879ac3 akira

merge 12 & 122
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 03 Jun 2009 23:55:07 +0900
parents 2356238ebea7 5c194c71eca8
children 58fd16298954
line wrap: on
line diff
--- a/TaskManager/Fifo/FifoDmaManager.cc	Thu Feb 07 19:17:06 2008 +0900
+++ b/TaskManager/Fifo/FifoDmaManager.cc	Wed Jun 03 23:55:07 2009 +0900
@@ -1,16 +1,19 @@
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include "FifoDmaManager.h"
 
 void
-FifoDmaManager::dma_load(void *buf, unsigned int addr, int size, int mask)
+FifoDmaManager::dma_load(void *buf, uint32 addr, uint32 size, uint32 mask)
 {
+    if (size == 0) return;
     memcpy(buf, (void*)addr, size);
 }
 
 void
-FifoDmaManager::dma_store(void *buf, unsigned int addr, int size, int mask)
+FifoDmaManager::dma_store(void *buf, uint32 addr, uint32 size, uint32 mask)
 {
+    if (size == 0) return;
     memcpy((void*)addr, buf, size);
 }
 
@@ -18,26 +21,25 @@
  * mask で設定した DMA 転送の完了を待つ
  */
 void
-FifoDmaManager::dma_wait(int mask)
+FifoDmaManager::dma_wait(uint32 mask)
 {
     //spu_writech(MFC_WrTagMask, 1 << mask);
     //spu_mfcstat(MFC_TAG_UPDATE_ALL);
 }
 
 void
-FifoDmaManager::mail_write(unsigned int data)
+FifoDmaManager::mail_write(uint32 data)
 {
-    //spu_writech(SPU_WrOutMbox, data);
-
-    mail_sendQueue = append_mailQueue(mail_sendQueue,
-				      mailManager->create_mail(data));
+    mail_sendQueue
+	= MailManager::append_mailQueue(mail_sendQueue,
+					mailManager->create(data));
 }
 
 unsigned int
 FifoDmaManager::mail_read(void)
 {
     MailQueuePtr q;
-    unsigned int ret;
+    uint32 ret;
 
     q = mail_recvQueue;
 
@@ -48,7 +50,63 @@
     mail_recvQueue = mail_recvQueue->next;
 
     ret = q->data;
-    mailManager->free_mailQueue(q);
+    mailManager->free(q);
 
     return ret;
 }
+
+void
+FifoDmaManager::dma_loadList(ListDataPtr list, void *buff, uint32 mask)
+{
+    int list_size = list->length;
+    int bound;
+
+    bound = (int)(buff);
+
+    for (int i = 0; i < list_size; i++) {
+	ListElementPtr elm = &list->element[i];
+	memcpy((void*)bound, (void*)elm->addr, elm->size);
+	bound += elm->size;
+    }
+}
+
+#if 0
+void*
+FifoDmaManager::dma_loadList(ListDataPtr list, void *buff, uint32 mask)
+{
+    void **buffList;
+    int bound;
+
+    dma_wait(mask);
+
+    if (list->length == 1) {
+	return buff;
+    }
+
+    bound = (int)buff;
+    buffList = (void**)malloc(list->length);
+    buffList[0] = (void*)bound;
+
+    for (int i = 1; i < list->length; i++) {
+	bound += list->element[i-1].size;
+	buffList[i] = (void*)(bound);
+    }
+
+    return (void*)buffList;
+}
+#endif
+
+void
+FifoDmaManager::dma_storeList(ListDataPtr list, void *buff, uint32 mask)
+{
+    int list_size = list->length;
+    int bound;
+
+    bound = (int)(buff);
+
+    for (int i = 0; i < list_size; i++) {
+	ListElementPtr elm = &list->element[i];
+	memcpy((void*)elm->addr, (void*)bound, elm->size);
+	bound += elm->size;
+    }    
+}