Commit | Line | Data |
---|---|---|
6fa3eb70 S |
1 | /* |
2 | * This confidential and proprietary software may be used only as | |
3 | * authorised by a licensing agreement from ARM Limited | |
db9a41fa | 4 | * (C) COPYRIGHT 2013-2015 ARM Limited |
6fa3eb70 S |
5 | * ALL RIGHTS RESERVED |
6 | * The entire notice above must be reproduced on all authorised | |
7 | * copies and copies may only be made to the extent permitted | |
8 | * by a licensing agreement from ARM Limited. | |
9 | */ | |
10 | ||
11 | #ifndef __MALI_SOFT_JOB_H__ | |
12 | #define __MALI_SOFT_JOB_H__ | |
13 | ||
14 | #include "mali_osk.h" | |
15 | ||
16 | #include "mali_timeline.h" | |
17 | ||
18 | struct mali_timeline_fence; | |
19 | struct mali_session_data; | |
20 | struct mali_soft_job; | |
21 | struct mali_soft_job_system; | |
22 | ||
23 | /** | |
24 | * Soft job types. | |
25 | * | |
26 | * Soft jobs of type MALI_SOFT_JOB_TYPE_USER_SIGNALED will only complete after activation if either | |
27 | * they are signaled by user-space (@ref mali_soft_job_system_signaled_job) or if they are timed out | |
28 | * by the Timeline system. | |
db9a41fa S |
29 | * Soft jobs of type MALI_SOFT_JOB_TYPE_SELF_SIGNALED will release job resource automatically |
30 | * in kernel when the job is activated. | |
6fa3eb70 S |
31 | */ |
32 | typedef enum mali_soft_job_type { | |
db9a41fa | 33 | MALI_SOFT_JOB_TYPE_SELF_SIGNALED, |
6fa3eb70 S |
34 | MALI_SOFT_JOB_TYPE_USER_SIGNALED, |
35 | } mali_soft_job_type; | |
36 | ||
37 | /** | |
38 | * Soft job state. | |
39 | * | |
db9a41fa | 40 | * mali_soft_job_system_start_job a job will first be allocated.The job's state set to MALI_SOFT_JOB_STATE_ALLOCATED. |
6fa3eb70 S |
41 | * Once the job is added to the timeline system, the state changes to MALI_SOFT_JOB_STATE_STARTED. |
42 | * | |
43 | * For soft jobs of type MALI_SOFT_JOB_TYPE_USER_SIGNALED the state is changed to | |
44 | * MALI_SOFT_JOB_STATE_SIGNALED when @ref mali_soft_job_system_signal_job is called and the soft | |
45 | * job's state is MALI_SOFT_JOB_STATE_STARTED or MALI_SOFT_JOB_STATE_TIMED_OUT. | |
46 | * | |
47 | * If a soft job of type MALI_SOFT_JOB_TYPE_USER_SIGNALED is timed out before being signaled, the | |
48 | * state is changed to MALI_SOFT_JOB_STATE_TIMED_OUT. This can only happen to soft jobs in state | |
49 | * MALI_SOFT_JOB_STATE_STARTED. | |
50 | * | |
6fa3eb70 S |
51 | */ |
52 | typedef enum mali_soft_job_state { | |
6fa3eb70 S |
53 | MALI_SOFT_JOB_STATE_ALLOCATED, |
54 | MALI_SOFT_JOB_STATE_STARTED, | |
55 | MALI_SOFT_JOB_STATE_SIGNALED, | |
56 | MALI_SOFT_JOB_STATE_TIMED_OUT, | |
57 | } mali_soft_job_state; | |
58 | ||
59 | #define MALI_SOFT_JOB_INVALID_ID ((u32) -1) | |
60 | ||
6fa3eb70 S |
61 | /** |
62 | * Soft job struct. | |
63 | * | |
64 | * Soft job can be used to represent any kind of CPU work done in kernel-space. | |
65 | */ | |
66 | typedef struct mali_soft_job { | |
67 | mali_soft_job_type type; /**< Soft job type. Must be one of MALI_SOFT_JOB_TYPE_*. */ | |
db9a41fa | 68 | u64 user_job; /**< Identifier for soft job in user space. */ |
6fa3eb70 S |
69 | _mali_osk_atomic_t refcount; /**< Soft jobs are reference counted to prevent premature deletion. */ |
70 | struct mali_timeline_tracker tracker; /**< Timeline tracker for soft job. */ | |
71 | mali_bool activated; /**< MALI_TRUE if the job has been activated, MALI_FALSE if not. */ | |
72 | _mali_osk_notification_t *activated_notification; /**< Pre-allocated notification object for ACTIVATED_NOTIFICATION. */ | |
73 | ||
74 | /* Protected by soft job system lock. */ | |
75 | u32 id; /**< Used by user-space to find corresponding soft job in kernel-space. */ | |
76 | mali_soft_job_state state; /**< State of soft job, must be one of MALI_SOFT_JOB_STATE_*. */ | |
77 | struct mali_soft_job_system *system; /**< The soft job system this job is in. */ | |
78 | _mali_osk_list_t system_list; /**< List element used by soft job system. */ | |
79 | } mali_soft_job; | |
80 | ||
81 | /** | |
82 | * Per-session soft job system. | |
83 | * | |
84 | * The soft job system is used to manage all soft jobs that belongs to a session. | |
85 | */ | |
86 | typedef struct mali_soft_job_system { | |
87 | struct mali_session_data *session; /**< The session this soft job system belongs to. */ | |
6fa3eb70 S |
88 | _MALI_OSK_LIST_HEAD(jobs_used); /**< List of all allocated soft jobs. */ |
89 | ||
90 | _mali_osk_spinlock_irq_t *lock; /**< Lock used to protect soft job system and its soft jobs. */ | |
91 | u32 lock_owner; /**< Contains tid of thread that locked the system or 0, if not locked. */ | |
db9a41fa | 92 | u32 last_job_id; /**< Recored the last job id protected by lock. */ |
6fa3eb70 S |
93 | } mali_soft_job_system; |
94 | ||
95 | /** | |
96 | * Create a soft job system. | |
97 | * | |
98 | * @param session The session this soft job system will belong to. | |
99 | * @return The new soft job system, or NULL if unsuccessful. | |
100 | */ | |
101 | struct mali_soft_job_system *mali_soft_job_system_create(struct mali_session_data *session); | |
102 | ||
103 | /** | |
104 | * Destroy a soft job system. | |
105 | * | |
106 | * @note The soft job must not have any started or activated jobs. Call @ref | |
107 | * mali_soft_job_system_abort first. | |
108 | * | |
109 | * @param system The soft job system we are destroying. | |
110 | */ | |
111 | void mali_soft_job_system_destroy(struct mali_soft_job_system *system); | |
112 | ||
113 | /** | |
114 | * Create a soft job. | |
115 | * | |
116 | * @param system Soft job system to create soft job from. | |
117 | * @param type Type of the soft job. | |
118 | * @param user_job Identifier for soft job in user space. | |
119 | * @return New soft job if successful, NULL if not. | |
120 | */ | |
db9a41fa | 121 | struct mali_soft_job *mali_soft_job_create(struct mali_soft_job_system *system, mali_soft_job_type type, u64 user_job); |
6fa3eb70 S |
122 | |
123 | /** | |
124 | * Destroy soft job. | |
125 | * | |
126 | * @param job Soft job to destroy. | |
127 | */ | |
128 | void mali_soft_job_destroy(struct mali_soft_job *job); | |
129 | ||
130 | /** | |
131 | * Start a soft job. | |
132 | * | |
133 | * The soft job will be added to the Timeline system which will then activate it after all | |
134 | * dependencies have been resolved. | |
135 | * | |
136 | * Create soft jobs with @ref mali_soft_job_create before starting them. | |
137 | * | |
138 | * @param job Soft job to start. | |
139 | * @param fence Fence representing dependencies for this soft job. | |
140 | * @return Point on soft job timeline. | |
141 | */ | |
142 | mali_timeline_point mali_soft_job_start(struct mali_soft_job *job, struct mali_timeline_fence *fence); | |
143 | ||
144 | /** | |
145 | * Use by user-space to signal that a soft job has completed. | |
146 | * | |
147 | * @note Only valid for soft jobs with type MALI_SOFT_JOB_TYPE_USER_SIGNALED. | |
148 | * | |
149 | * @note The soft job must be in state MALI_SOFT_JOB_STATE_STARTED for the signal to be successful. | |
150 | * | |
151 | * @note If the soft job was signaled successfully, or it received a time out, the soft job will be | |
152 | * destroyed after this call and should no longer be used. | |
153 | * | |
154 | * @note This function will block until the soft job has been activated. | |
155 | * | |
156 | * @param system The soft job system the job was started in. | |
157 | * @param job_id ID of soft job we are signaling. | |
158 | * | |
159 | * @return _MALI_OSK_ERR_ITEM_NOT_FOUND if the soft job ID was invalid, _MALI_OSK_ERR_TIMEOUT if the | |
160 | * soft job was timed out or _MALI_OSK_ERR_OK if we successfully signaled the soft job. | |
161 | */ | |
162 | _mali_osk_errcode_t mali_soft_job_system_signal_job(struct mali_soft_job_system *system, u32 job_id); | |
163 | ||
164 | /** | |
165 | * Used by the Timeline system to activate a soft job. | |
166 | * | |
167 | * @param job The soft job that is being activated. | |
db9a41fa | 168 | * @return A scheduling bitmask. |
6fa3eb70 | 169 | */ |
db9a41fa | 170 | mali_scheduler_mask mali_soft_job_system_activate_job(struct mali_soft_job *job); |
6fa3eb70 S |
171 | |
172 | /** | |
173 | * Used by the Timeline system to timeout a soft job. | |
174 | * | |
175 | * A soft job is timed out if it completes or is signaled later than MALI_TIMELINE_TIMEOUT_HZ after | |
176 | * activation. | |
177 | * | |
178 | * @param job The soft job that is being timed out. | |
179 | * @return A scheduling bitmask. | |
180 | */ | |
181 | mali_scheduler_mask mali_soft_job_system_timeout_job(struct mali_soft_job *job); | |
182 | ||
183 | /** | |
184 | * Used to cleanup activated soft jobs in the soft job system on session abort. | |
185 | * | |
186 | * @param system The soft job system that is being aborted. | |
187 | */ | |
188 | void mali_soft_job_system_abort(struct mali_soft_job_system *system); | |
189 | ||
190 | #endif /* __MALI_SOFT_JOB_H__ */ |