Mercurial > hg > Game > Cerium
view TaskManager/Cell/spe/CellDmaManager.cc @ 109:028ffc9c0375 draft
Cerium cvs version
author | gongo@gendarme.local |
---|---|
date | Wed, 12 Nov 2008 17:39:33 +0900 |
parents | 504899860e66 |
children | e3b7776b1420 |
line wrap: on
line source
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include "CellDmaManager.h" void CellDmaManager::dma_load(void *buf, uint32 addr, uint32 size, uint32 mask) { if (size == 0) return ; spu_mfcdma32(buf, addr, size, mask, MFC_GET_CMD); } void CellDmaManager::dma_store(void *buf, uint32 addr, uint32 size, uint32 mask) { if (size == 0) return ; spu_mfcdma32(buf, addr, size, mask, MFC_PUT_CMD); //spu_mfcdma32(buf, addr, ROUND_UP_ALIGN(size, DEFAULT_ALIGNMENT), } /** * mask で設定した DMA 転送の完了を待つ */ void CellDmaManager::dma_wait(uint32 mask) { spu_writech(MFC_WrTagMask, 1 << mask); spu_mfcstat(MFC_TAG_UPDATE_ALL); } void CellDmaManager::mail_write(uint32 data) { spu_writech(SPU_WrOutMbox, data); } unsigned int CellDmaManager::mail_read(void) { unsigned int mail = spu_readch(SPU_RdInMbox); return mail; } void CellDmaManager::dma_loadList(ListDataPtr list, void *buff, uint32 mask) { mfc_getl(buff, 0, list->element, sizeof(mfc_list_element_t)*list->length, mask, 0, 0); } void CellDmaManager::dma_storeList(ListDataPtr list, void *buff, uint32 mask) { mfc_putl(buff, 0, list->element, sizeof(mfc_list_element_t)*list->length, mask, 0, 0); } #if 0 /** * dma_loadList の前ばーじょn */ void** CellDmaManager::dmaList_load(uint32 mask) { int index = buff_index[buff_flag]; DmaListPtr queue = dmaQueue[buff_flag]; mfc_list_element_t *mfc_list = mfcList[buff_flag]; void **buffList; void *buff; int bound; int total_size = 0; mfc_list = (mfc_list_element_t *)malloc(sizeof(mfc_list_element_t)*index); for (int i = 0; i < index; i++) { mfc_list[i].notify = 0; mfc_list[i].reserved = 0; mfc_list[i].size = queue[i].size; mfc_list[i].eal = queue[i].addr; total_size += queue[i].size; } //---------------------------------------------------------------- // list element が n 個ある場合の buff, buffList の構造 // // +---------------+---------------+--------+-----------------+ // buff | queue[0].size | queue[1].size | ...... | queue[n-1].size | // +---------------+---------------+--------+-----------------+ // ^ ^ ^ ^ // | | | | // buffList[0] buffList[1] buffList[2] buffList[n-1] //---------------------------------------------------------------- buff = memalign(DEFAULT_ALIGNMENT, total_size); buffList = (void**)malloc(index); bound = (int)buff; buffList[0] = (void*)bound; for (int i = 1; i < index; i++) { bound += queue[i-1].size; buffList[i] = (void*)bound; } mfc_getl(buff, 0, mfc_list, sizeof(mfc_list_element_t), mask, 0, 0); dma_wait(mask); _buffList[buff_flag] = buffList; _buff[buff_flag] = buff; return buffList; } #endif