1 /*---------------------------------------------------------------------------* 2 Project: MP library 3 File: MPTasks.h 4 5 Copyright (C) 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