diff options
author | Yuji Mano <yuji.mano@am.sony.com> | 2009-01-20 16:29:47 -0800 |
---|---|---|
committer | Yuji Mano <yuji.mano@am.sony.com> | 2009-01-23 11:01:32 -0800 |
commit | 1324135dd1e77d4599e761f5223f18ed04f96cbc (patch) | |
tree | 79dfc0fa4467ee9a3c821fd5dddfe35f42afc580 | |
parent | 5f27595017a73911ebd77026ceb45f4b3380fdb0 (diff) | |
download | mars-src-1324135dd1e77d4599e761f5223f18ed04f96cbc.tar.gz |
task: Module remove base library dma dependency
Remove dependency on dma functions in libmars_base.a to reduce task module code
size.
Signed-off-by: Yuji Mano <yuji.mano@am.sony.com>
Acked-by: Kazunori Asayama <asayama@sm.sony.co.jp>
-rw-r--r-- | task/src/mpu/module/task_module.c | 63 |
1 files changed, 44 insertions, 19 deletions
diff --git a/task/src/mpu/module/task_module.c b/task/src/mpu/module/task_module.c index 00dc7a7..f9c940e 100644 --- a/task/src/mpu/module/task_module.c +++ b/task/src/mpu/module/task_module.c @@ -48,6 +48,9 @@ #include "task_module.h" +#define MARS_TASK_MODULE_DMA_TAG 31 +#define MARS_TASK_MODULE_DMA_SIZE_MAX 16384 + /* stack pointer storage */ void *_module_stack; void *_task_stack; @@ -60,6 +63,34 @@ static struct mars_task_context_save_unit list[MARS_TASK_CONTEXT_SAVE_UNIT_MAX]; typedef void (*mars_task_entry)(struct mars_task_args *args, struct mars_task_module_syscalls *task_module_syscalls); +static void dma_large(void *ls, uint64_t ea, uint32_t size, int put) +{ + while (size) { + unsigned int block_size; + + block_size = (size < MARS_TASK_MODULE_DMA_SIZE_MAX) ? + size : MARS_TASK_MODULE_DMA_SIZE_MAX; + + if (put) + mfc_put((volatile void *)ls, ea, block_size, + MARS_TASK_MODULE_DMA_TAG, 0, 0); + else + mfc_get((volatile void *)ls, ea, block_size, + MARS_TASK_MODULE_DMA_TAG, 0, 0); + + ls += block_size; + ea += block_size; + size -= block_size; + } +} + +static void dma_wait(void) +{ + mfc_write_tag_mask(1 << MARS_TASK_MODULE_DMA_TAG); + mfc_write_tag_update_all(); + mfc_read_tag_status(); +} + static uint32_t get_ticks(void) { return mars_module_get_ticks(); @@ -199,10 +230,11 @@ static void process_context_save_list(int save) { int i, offset = 0; - mars_dma_get_and_wait(list, task->context_save_unit_ea, - MARS_TASK_CONTEXT_SAVE_UNIT_SIZE * - MARS_TASK_CONTEXT_SAVE_UNIT_MAX, - MARS_DMA_TAG); + mfc_get(list, task->context_save_unit_ea, + MARS_TASK_CONTEXT_SAVE_UNIT_SIZE * + MARS_TASK_CONTEXT_SAVE_UNIT_MAX, + MARS_TASK_MODULE_DMA_TAG, 0, 0); + dma_wait(); /* loop through save unit list */ for (i = 0; i < MARS_TASK_CONTEXT_SAVE_UNIT_MAX; i++) { @@ -211,23 +243,15 @@ static void process_context_save_list(int save) break; /* save or restore context save unit specified */ - if (save) { - mars_dma_put( - (void *)(MARS_TASK_BASE_ADDR + list[i].addr), - task->context_save_area_ea + offset, - list[i].size, MARS_DMA_TAG); - } else { - mars_dma_get( - (void *)(MARS_TASK_BASE_ADDR + list[i].addr), - task->context_save_area_ea + offset, - list[i].size, MARS_DMA_TAG); - } + dma_large((void *)(MARS_TASK_BASE_ADDR + list[i].addr), + task->context_save_area_ea + offset, + list[i].size, save); offset += list[i].size; } /* wait for all dmas to complete */ - mars_dma_wait(MARS_DMA_TAG); + dma_wait(); } static void __attribute__((noinline)) context_save(void) @@ -428,12 +452,13 @@ void mars_module_main(void) /* if stack pointer is uninitialized run fresh, otherwise resume */ if (!task->stack) { /* dma the exec code into mpu storage from host storage */ - mars_dma_get_and_wait((void *)MARS_TASK_BASE_ADDR, - task->exec_ea, task->exec_size, MARS_DMA_TAG); + dma_large((void *)MARS_TASK_BASE_ADDR, + task->exec_ea, task->exec_size, 0); + dma_wait(); /* 0 the bss section */ memset((void *)MARS_TASK_BASE_ADDR + task->exec_size, 0, - task->bss_size); + task->bss_size); /* sync before executing loaded code */ spu_sync(); |