1 /*---------------------------------------------------------------------------*
2   Project:     MP library
3   File:        MPTasks.h
4 
5   Copyright (C) 2010-2011 Nintendo.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12  *---------------------------------------------------------------------------*/
13 
14 #ifndef __MPTASKS_H__
15 #define __MPTASKS_H__
16 
17 #include <cafe/os/OSSync.h>
18 #include <cafe/os/OSTime.h>
19 
20 #ifdef __cplusplus
21 extern "C" {
22 #endif
23 
24 #define MP_TASKQ_INIT     (1 << 0)
25 #define MP_TASKQ_RUN      (1 << 1)
26 #define MP_TASKQ_STOPPING (1 << 2)
27 #define MP_TASKQ_STOP     (1 << 3)
28 #define MP_TASKQ_DONE     (1 << 4)
29 
30 #define MP_TASK_INIT      (1 << 0)
31 #define MP_TASK_READY     (1 << 1)
32 #define MP_TASK_RUN       (1 << 2)
33 #define MP_TASK_DONE      (1 << 3)
34 
35 #define MP_WAIT_TASKQ_RUN  MP_TASKQ_RUN
36 #define MP_WAIT_TASKQ_STOP MP_TASKQ_STOP
37 #define MP_WAIT_TASKQ_DONE MP_TASKQ_DONE
38 
39 typedef u32 MPTaskQID;
40 typedef u32 MPTaskID;
41 
42 typedef enum
43 {
44     MPTASKQ_BAD_ID = 0,
45     MPTASK_BAD_ID  = 0
46 } MPpad;
47 
48 typedef struct
49 {
50     u32     state;
51     u32     func_result;
52     u32     coreid;
53     OSTime  runtime;
54 } MPTaskInfo;
55 
56 typedef struct
57 {
58     u32   (*func_ptr)(void *data, u32 data_len);
59     void*   func_data;
60     u32     func_data_len;
61     u32     func_result;
62 } MPTaskFunc;
63 
64 typedef struct
65 {
66     MPTaskID   taskid;
67     void*      taskq;
68     u32        state;
69 
70     MPTaskFunc func;
71 
72     u32        coreid;
73     OSTime     runtime;
74 
75     void*      udata;
76 } MPTask;
77 
78 typedef MPTask* MPTaskPtr;
79 
80 typedef struct
81 {
82   volatile u32 state;
83   u32          num_task;
84   u32          num_task_ready;
85   u32          num_task_run;
86   u32          num_task_done;
87 } MPTaskQInfo;
88 
89 typedef struct
90 {
91   MPTaskQID    tqid;
92   volatile u32 state;
93 
94   u32          num_task;
95   u32          num_task_ready;
96   u32          num_task_run;
97   u32          num_task_done[MAX_SYSTEM_CORES];
98 
99   s32          next_index[MAX_SYSTEM_CORES];
100   s32          end_index[MAX_SYSTEM_CORES];
101 
102   MPTaskPtr*   queue;
103   u32          queue_len;
104   OSSpinLock   spinlock;
105 } MPTaskQ;
106 
107 typedef MPTaskQ* MPTaskQPtr;
108 
109 //
110 // Task Queues
111 //
112 
113 void        MPInitTaskQ(MPTaskQ* tq, MPTaskPtr* qlist, u32 q_len);
114 BOOL        MPTermTaskQ(MPTaskQ* taskq);
115 BOOL        MPGetTaskQInfo(MPTaskQ* taskq, MPTaskQInfo *tqinfo);
116 BOOL        MPStartTaskQ(MPTaskQ* taskq);
117 BOOL        MPRunTasksFromTaskQ(MPTaskQ* taskq, int deque_granularity);
118 BOOL        MPStopTaskQ(MPTaskQ* taskq);
119 BOOL        MPWaitTaskQ(MPTaskQ* taskq, u32 wmask);
120 BOOL        MPWaitTaskQWithTimeout(MPTaskQ* taskq, u32 wmask, OSTimeNanoseconds timeout);
121 BOOL        MPEnqueTask(MPTaskQ* taskq, MPTask* task);
122 MPTaskPtr   MPDequeTask(MPTaskQ* taskq);
123 u32         MPDequeTasks(MPTaskQ* taskq, MPTaskPtr* tasks, int max_tasks);
124 BOOL        MPResetTaskQ(MPTaskQ* taskq);
125 
126 BOOL        MPPrintTaskQStats(MPTaskQ *taskq, int size);
127 
128 //
129 // Tasks
130 //
131 
132 void        MPInitTask(MPTask* task, void* func, void* data, u32 data_len);
133 BOOL        MPTermTask(MPTask* task);
134 BOOL        MPGetTaskInfo(MPTask* task, MPTaskInfo* tinfo);
135 BOOL        MPRunTask(MPTask* task);
136 
137 void*       MPGetTaskUserData(MPTask* task);
138 void        MPSetTaskUserData(MPTask* task, void* udata);
139 
140 #ifdef __cplusplus
141 }
142 #endif
143 
144 #endif // __MPTASKS_H__
145 
146