diff TaskManager/Cell/spe/CellDmaManager.cc @ 1213:a49c02dffe6f draft

DMA connector reogranization
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 22 Jul 2011 13:25:30 +0900
parents 801d57ae1e29
children 2a4ba6366394
line wrap: on
line diff
--- a/TaskManager/Cell/spe/CellDmaManager.cc	Fri Jul 22 08:50:04 2011 +0900
+++ b/TaskManager/Cell/spe/CellDmaManager.cc	Fri Jul 22 13:25:30 2011 +0900
@@ -14,7 +14,7 @@
  * @param[in] size Size of Load Data
  * @param[in] mask DMA tag
 */
-void CellDmaManager::dma_load(void *buf, memaddr addr, uint32 size, uint32 mask)
+void *CellDmaManager::dma_load(Scheduler *s, void *buf, memaddr addr, uint32 size, uint32 mask)
 {
   
     if ((unsigned long)addr&0xf) {
@@ -24,8 +24,17 @@
     }
   
     if (size == 0) return ;
+    if (s) buf = s->allocate(size);
+
     mfc_get((volatile void *)buf, addr, size, mask, 0, 0);
+    return buf;
+}
 
+void *
+CellDmaManager::get_writebuf(Scheduler *s,memaddr addr, uint32 size)
+{
+    void *b = s->allocaet(size);
+    return b;
 }
 
 /**
@@ -186,10 +195,13 @@
 
 
 
-void CellDmaManager::dma_loadList(ListDataPtr list, void *buff, uint32 mask)
+void *CellDmaManager::dma_loadList(Scheduler *s, ListDataPtr list, void *buff, uint32 mask)
 {
+    buff = s->allocate(list->size);
+
     mfc_getl(buff, 0, list->element, sizeof(mfc_list_element_t)*list->length,
 	     mask, 0, 0);
+    return buff;
 }
 
 void CellDmaManager::dma_storeList(ListDataPtr list, void *buff, uint32 mask)
@@ -198,6 +210,14 @@
 	     mask, 0, 0);
 }
 
+void *
+CellDmaManager::get_writebuf(Scheduler *s,ListDataPtr addr, uint32 size)
+{
+    void *b = s->allocate(addr->size);
+    return b;
+}
+
+
 
 CellDmaManager::CellDmaManager() 
 {
@@ -334,5 +354,29 @@
     alloc_flag = 0;
 }
 
+uint32
+CellDmaManager::get_tag()
+{
+    static int tag = 16;
+    tag ++;
+    tag &= 0x0f;
+    return tag+16;
+}
+
+/**
+ *  DMA buffer offset in rbuf
+ */
+void
+CellDmaManager::bound(ListData *list)
+{
+    ListElement *elm = list->element;
+    int *bound = list->bound;
+    int offset=0;
+    for(int i=0;i<list->length;i++) {
+        bound[i] = offset;
+        offset += elm[i].size;
+    }
+}
+
 
 /* end */