aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYuji Mano <yuji.mano@am.sony.com>2009-01-20 16:29:47 -0800
committerYuji Mano <yuji.mano@am.sony.com>2009-01-23 11:01:32 -0800
commit1324135dd1e77d4599e761f5223f18ed04f96cbc (patch)
tree79dfc0fa4467ee9a3c821fd5dddfe35f42afc580
parent5f27595017a73911ebd77026ceb45f4b3380fdb0 (diff)
downloadmars-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.c63
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();