view TaskManager/Cell/spe/CellDmaManager.cc @ 109:5c194c71eca8

Cerium cvs version
author gongo@gendarme.local
date Wed, 12 Nov 2008 17:39:33 +0900
parents 504899860e66
children 5cde66c926b4
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