xref: /aosp_15_r20/external/libhevc/encoder/ihevce_dep_mngr.c (revision c83a76b084498d55f252f48b2e3786804cdf24b7)
1*c83a76b0SSuyog Pawar /******************************************************************************
2*c83a76b0SSuyog Pawar  *
3*c83a76b0SSuyog Pawar  * Copyright (C) 2018 The Android Open Source Project
4*c83a76b0SSuyog Pawar  *
5*c83a76b0SSuyog Pawar  * Licensed under the Apache License, Version 2.0 (the "License");
6*c83a76b0SSuyog Pawar  * you may not use this file except in compliance with the License.
7*c83a76b0SSuyog Pawar  * You may obtain a copy of the License at:
8*c83a76b0SSuyog Pawar  *
9*c83a76b0SSuyog Pawar  * http://www.apache.org/licenses/LICENSE-2.0
10*c83a76b0SSuyog Pawar  *
11*c83a76b0SSuyog Pawar  * Unless required by applicable law or agreed to in writing, software
12*c83a76b0SSuyog Pawar  * distributed under the License is distributed on an "AS IS" BASIS,
13*c83a76b0SSuyog Pawar  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*c83a76b0SSuyog Pawar  * See the License for the specific language governing permissions and
15*c83a76b0SSuyog Pawar  * limitations under the License.
16*c83a76b0SSuyog Pawar  *
17*c83a76b0SSuyog Pawar  *****************************************************************************
18*c83a76b0SSuyog Pawar  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*c83a76b0SSuyog Pawar */
20*c83a76b0SSuyog Pawar /*!
21*c83a76b0SSuyog Pawar ******************************************************************************
22*c83a76b0SSuyog Pawar * \file ihevce_dep_mngr.c
23*c83a76b0SSuyog Pawar *
24*c83a76b0SSuyog Pawar * \brief
25*c83a76b0SSuyog Pawar *    This file contains all the functions related to Sync manager
26*c83a76b0SSuyog Pawar *
27*c83a76b0SSuyog Pawar * \date
28*c83a76b0SSuyog Pawar *    12/12/2013
29*c83a76b0SSuyog Pawar *
30*c83a76b0SSuyog Pawar * \author
31*c83a76b0SSuyog Pawar *    Ittiam
32*c83a76b0SSuyog Pawar *
33*c83a76b0SSuyog Pawar * List of Functions
34*c83a76b0SSuyog Pawar *   <TODO: TO BE ADDED>
35*c83a76b0SSuyog Pawar *
36*c83a76b0SSuyog Pawar ******************************************************************************
37*c83a76b0SSuyog Pawar */
38*c83a76b0SSuyog Pawar 
39*c83a76b0SSuyog Pawar /*****************************************************************************/
40*c83a76b0SSuyog Pawar /* File Includes                                                             */
41*c83a76b0SSuyog Pawar /*****************************************************************************/
42*c83a76b0SSuyog Pawar /* System include files */
43*c83a76b0SSuyog Pawar #include <stdio.h>
44*c83a76b0SSuyog Pawar #include <string.h>
45*c83a76b0SSuyog Pawar #include <stdlib.h>
46*c83a76b0SSuyog Pawar #include <assert.h>
47*c83a76b0SSuyog Pawar #include <stdarg.h>
48*c83a76b0SSuyog Pawar #include <math.h>
49*c83a76b0SSuyog Pawar 
50*c83a76b0SSuyog Pawar /* User include files */
51*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
52*c83a76b0SSuyog Pawar #include "itt_video_api.h"
53*c83a76b0SSuyog Pawar #include "ihevc_debug.h"
54*c83a76b0SSuyog Pawar #include "ihevc_macros.h"
55*c83a76b0SSuyog Pawar #include "ihevc_platform_macros.h"
56*c83a76b0SSuyog Pawar 
57*c83a76b0SSuyog Pawar #include "ihevce_api.h"
58*c83a76b0SSuyog Pawar #include "ihevce_dep_mngr_interface.h"
59*c83a76b0SSuyog Pawar #include "ihevce_dep_mngr_private.h"
60*c83a76b0SSuyog Pawar 
61*c83a76b0SSuyog Pawar #include "cast_types.h"
62*c83a76b0SSuyog Pawar #include "osal.h"
63*c83a76b0SSuyog Pawar #include "osal_defaults.h"
64*c83a76b0SSuyog Pawar 
65*c83a76b0SSuyog Pawar /*****************************************************************************/
66*c83a76b0SSuyog Pawar /* Function Definitions                                                      */
67*c83a76b0SSuyog Pawar /*****************************************************************************/
68*c83a76b0SSuyog Pawar 
69*c83a76b0SSuyog Pawar /*!
70*c83a76b0SSuyog Pawar ******************************************************************************
71*c83a76b0SSuyog Pawar * \if Function name : ihevce_dmgr_get_num_mem_recs \endif
72*c83a76b0SSuyog Pawar *
73*c83a76b0SSuyog Pawar * \brief
74*c83a76b0SSuyog Pawar *    Number of memory records are returned for Dependency manager.
75*c83a76b0SSuyog Pawar *
76*c83a76b0SSuyog Pawar * \return
77*c83a76b0SSuyog Pawar *    None
78*c83a76b0SSuyog Pawar *
79*c83a76b0SSuyog Pawar * \author
80*c83a76b0SSuyog Pawar *  Ittiam
81*c83a76b0SSuyog Pawar *
82*c83a76b0SSuyog Pawar *****************************************************************************
83*c83a76b0SSuyog Pawar */
ihevce_dmgr_get_num_mem_recs()84*c83a76b0SSuyog Pawar WORD32 ihevce_dmgr_get_num_mem_recs()
85*c83a76b0SSuyog Pawar {
86*c83a76b0SSuyog Pawar     return (NUM_DEP_MNGR_MEM_RECS);
87*c83a76b0SSuyog Pawar }
88*c83a76b0SSuyog Pawar 
89*c83a76b0SSuyog Pawar /*!
90*c83a76b0SSuyog Pawar ******************************************************************************
91*c83a76b0SSuyog Pawar * \if Function name : ihevce_dmgr_get_mem_recs \endif
92*c83a76b0SSuyog Pawar *
93*c83a76b0SSuyog Pawar * \brief
94*c83a76b0SSuyog Pawar *    Memory requirements are returned for Dependency manager.
95*c83a76b0SSuyog Pawar *
96*c83a76b0SSuyog Pawar * \param[in,out]  ps_mem_tab : pointer to memory descriptors table
97*c83a76b0SSuyog Pawar * \param[in] dep_mngr_mode : Mode of operation of dependency manager
98*c83a76b0SSuyog Pawar * \param[in] max_num_vert_units : Maximum nunber of units to be processed
99*c83a76b0SSuyog Pawar * \param[in] num_tile_cols : Number of column tiles for which encoder is working
100*c83a76b0SSuyog Pawar * \param[in] num_threads : Number of threads among which sync will be established
101*c83a76b0SSuyog Pawar * \param[in] i4_mem_space : memspace in which memory request should be done
102*c83a76b0SSuyog Pawar *
103*c83a76b0SSuyog Pawar * \return
104*c83a76b0SSuyog Pawar *    None
105*c83a76b0SSuyog Pawar *
106*c83a76b0SSuyog Pawar * \author
107*c83a76b0SSuyog Pawar *  Ittiam
108*c83a76b0SSuyog Pawar *
109*c83a76b0SSuyog Pawar *****************************************************************************
110*c83a76b0SSuyog Pawar */
ihevce_dmgr_get_mem_recs(iv_mem_rec_t * ps_mem_tab,WORD32 dep_mngr_mode,WORD32 max_num_vert_units,WORD32 num_tile_cols,WORD32 num_threads,WORD32 i4_mem_space)111*c83a76b0SSuyog Pawar WORD32 ihevce_dmgr_get_mem_recs(
112*c83a76b0SSuyog Pawar     iv_mem_rec_t *ps_mem_tab,
113*c83a76b0SSuyog Pawar     WORD32 dep_mngr_mode,
114*c83a76b0SSuyog Pawar     WORD32 max_num_vert_units,
115*c83a76b0SSuyog Pawar     WORD32 num_tile_cols,
116*c83a76b0SSuyog Pawar     WORD32 num_threads,
117*c83a76b0SSuyog Pawar     WORD32 i4_mem_space)
118*c83a76b0SSuyog Pawar {
119*c83a76b0SSuyog Pawar     WORD32 num_vert_units;
120*c83a76b0SSuyog Pawar     WORD32 num_wait_thrd_ids;
121*c83a76b0SSuyog Pawar 
122*c83a76b0SSuyog Pawar     /* Dependency manager state structure */
123*c83a76b0SSuyog Pawar     ps_mem_tab[DEP_MNGR_CTXT].i4_mem_size = sizeof(dep_mngr_state_t);
124*c83a76b0SSuyog Pawar     ps_mem_tab[DEP_MNGR_CTXT].e_mem_type = (IV_MEM_TYPE_T)i4_mem_space;
125*c83a76b0SSuyog Pawar     ps_mem_tab[DEP_MNGR_CTXT].i4_mem_alignment = 8;
126*c83a76b0SSuyog Pawar 
127*c83a76b0SSuyog Pawar     /* SANITY CHECK */
128*c83a76b0SSuyog Pawar     ASSERT(
129*c83a76b0SSuyog Pawar         (DEP_MNGR_FRM_FRM_SYNC == dep_mngr_mode) || (DEP_MNGR_ROW_FRM_SYNC == dep_mngr_mode) ||
130*c83a76b0SSuyog Pawar         (DEP_MNGR_ROW_ROW_SYNC == dep_mngr_mode));
131*c83a76b0SSuyog Pawar 
132*c83a76b0SSuyog Pawar     /* Default value */
133*c83a76b0SSuyog Pawar     if(num_tile_cols < 1)
134*c83a76b0SSuyog Pawar     {
135*c83a76b0SSuyog Pawar         num_tile_cols = 1;
136*c83a76b0SSuyog Pawar     }
137*c83a76b0SSuyog Pawar 
138*c83a76b0SSuyog Pawar     /**************** Get Processed status Memory Requirements *********************/
139*c83a76b0SSuyog Pawar     if(DEP_MNGR_FRM_FRM_SYNC == dep_mngr_mode)
140*c83a76b0SSuyog Pawar     {
141*c83a76b0SSuyog Pawar         /* for frame to frame sync
142*c83a76b0SSuyog Pawar            2 words are used for holding num units processed prev
143*c83a76b0SSuyog Pawar            2 words are used for holding num units processed curr
144*c83a76b0SSuyog Pawar            */
145*c83a76b0SSuyog Pawar         num_vert_units = (2 + 2) * num_threads;
146*c83a76b0SSuyog Pawar     }
147*c83a76b0SSuyog Pawar     else
148*c83a76b0SSuyog Pawar     {
149*c83a76b0SSuyog Pawar         /* for both frm-row and row-row num vertical units in frame is allocated */
150*c83a76b0SSuyog Pawar         /* (* num_tile_cols) as each column tile can separately update and check */
151*c83a76b0SSuyog Pawar         num_vert_units = max_num_vert_units * num_tile_cols;
152*c83a76b0SSuyog Pawar     }
153*c83a76b0SSuyog Pawar 
154*c83a76b0SSuyog Pawar     ps_mem_tab[DEP_MNGR_UNITS_PRCSD_MEM].i4_mem_size = (sizeof(WORD32) * num_vert_units);
155*c83a76b0SSuyog Pawar     ps_mem_tab[DEP_MNGR_UNITS_PRCSD_MEM].e_mem_type = (IV_MEM_TYPE_T)i4_mem_space;
156*c83a76b0SSuyog Pawar     ps_mem_tab[DEP_MNGR_UNITS_PRCSD_MEM].i4_mem_alignment = 8;
157*c83a76b0SSuyog Pawar 
158*c83a76b0SSuyog Pawar     /**************** Get Wait thread ids Memory Requirements *********************/
159*c83a76b0SSuyog Pawar     if(DEP_MNGR_FRM_FRM_SYNC == dep_mngr_mode)
160*c83a76b0SSuyog Pawar     {
161*c83a76b0SSuyog Pawar         /* for frame to frame sync number of threads worth memory is allocated */
162*c83a76b0SSuyog Pawar         num_wait_thrd_ids = num_threads;
163*c83a76b0SSuyog Pawar     }
164*c83a76b0SSuyog Pawar     else if(DEP_MNGR_ROW_ROW_SYNC == dep_mngr_mode)
165*c83a76b0SSuyog Pawar     {
166*c83a76b0SSuyog Pawar         /* for row to row sync number of vertical rows worth memory is allocated */
167*c83a76b0SSuyog Pawar         num_wait_thrd_ids = max_num_vert_units;
168*c83a76b0SSuyog Pawar     }
169*c83a76b0SSuyog Pawar     else
170*c83a76b0SSuyog Pawar     {
171*c83a76b0SSuyog Pawar         /* for row to frame sync number of threads * number of vertical rows worth memory is allocated */
172*c83a76b0SSuyog Pawar         num_wait_thrd_ids = max_num_vert_units * num_threads;
173*c83a76b0SSuyog Pawar     }
174*c83a76b0SSuyog Pawar 
175*c83a76b0SSuyog Pawar     ps_mem_tab[DEP_MNGR_WAIT_THRD_ID_MEM].i4_mem_size = (sizeof(WORD32) * num_wait_thrd_ids);
176*c83a76b0SSuyog Pawar     ps_mem_tab[DEP_MNGR_WAIT_THRD_ID_MEM].e_mem_type = (IV_MEM_TYPE_T)i4_mem_space;
177*c83a76b0SSuyog Pawar     ps_mem_tab[DEP_MNGR_WAIT_THRD_ID_MEM].i4_mem_alignment = 8;
178*c83a76b0SSuyog Pawar 
179*c83a76b0SSuyog Pawar     /**************** Get Semaphore Requirements *********************/
180*c83a76b0SSuyog Pawar     ps_mem_tab[DEP_MNGR_SEM_HANDLE_MEM].i4_mem_size = (sizeof(void *) * num_threads);
181*c83a76b0SSuyog Pawar     ps_mem_tab[DEP_MNGR_SEM_HANDLE_MEM].e_mem_type = (IV_MEM_TYPE_T)i4_mem_space;
182*c83a76b0SSuyog Pawar     ps_mem_tab[DEP_MNGR_SEM_HANDLE_MEM].i4_mem_alignment = 8;
183*c83a76b0SSuyog Pawar 
184*c83a76b0SSuyog Pawar     return (NUM_DEP_MNGR_MEM_RECS);
185*c83a76b0SSuyog Pawar }
186*c83a76b0SSuyog Pawar 
187*c83a76b0SSuyog Pawar /*!
188*c83a76b0SSuyog Pawar ******************************************************************************
189*c83a76b0SSuyog Pawar * \if Function name : ihevce_dmgr_map_get_mem_recs \endif
190*c83a76b0SSuyog Pawar *
191*c83a76b0SSuyog Pawar * \brief
192*c83a76b0SSuyog Pawar *    Memory requirements are returned for Dependency manager.
193*c83a76b0SSuyog Pawar *
194*c83a76b0SSuyog Pawar * \param[in,out]  ps_mem_tab : pointer to memory descriptors table
195*c83a76b0SSuyog Pawar * \param[in] num_units : Number of units in the map
196*c83a76b0SSuyog Pawar * \param[in] num_threads : Number of threads among which sync will be established
197*c83a76b0SSuyog Pawar * \param[in] i4_mem_space : memspace in which memory request should be done
198*c83a76b0SSuyog Pawar *
199*c83a76b0SSuyog Pawar * \return
200*c83a76b0SSuyog Pawar *    None
201*c83a76b0SSuyog Pawar *
202*c83a76b0SSuyog Pawar * \author
203*c83a76b0SSuyog Pawar *  Ittiam
204*c83a76b0SSuyog Pawar *
205*c83a76b0SSuyog Pawar *****************************************************************************
206*c83a76b0SSuyog Pawar */
ihevce_dmgr_map_get_mem_recs(iv_mem_rec_t * ps_mem_tab,WORD32 num_units,WORD32 num_threads,WORD32 i4_mem_space)207*c83a76b0SSuyog Pawar WORD32 ihevce_dmgr_map_get_mem_recs(
208*c83a76b0SSuyog Pawar     iv_mem_rec_t *ps_mem_tab, WORD32 num_units, WORD32 num_threads, WORD32 i4_mem_space)
209*c83a76b0SSuyog Pawar {
210*c83a76b0SSuyog Pawar     /* Dependency manager state structure */
211*c83a76b0SSuyog Pawar     ps_mem_tab[DEP_MNGR_CTXT].i4_mem_size = sizeof(dep_mngr_state_t);
212*c83a76b0SSuyog Pawar     ps_mem_tab[DEP_MNGR_CTXT].e_mem_type = (IV_MEM_TYPE_T)i4_mem_space;
213*c83a76b0SSuyog Pawar     ps_mem_tab[DEP_MNGR_CTXT].i4_mem_alignment = 8;
214*c83a76b0SSuyog Pawar 
215*c83a76b0SSuyog Pawar     /**************** Get Processed status Memory Requirements *********************/
216*c83a76b0SSuyog Pawar     ps_mem_tab[DEP_MNGR_UNITS_PRCSD_MEM].i4_mem_size = (sizeof(WORD8) * num_units);
217*c83a76b0SSuyog Pawar     ps_mem_tab[DEP_MNGR_UNITS_PRCSD_MEM].e_mem_type = (IV_MEM_TYPE_T)i4_mem_space;
218*c83a76b0SSuyog Pawar     ps_mem_tab[DEP_MNGR_UNITS_PRCSD_MEM].i4_mem_alignment = 8;
219*c83a76b0SSuyog Pawar 
220*c83a76b0SSuyog Pawar     /**************** Get Wait thread ids Memory Requirements *********************/
221*c83a76b0SSuyog Pawar     /* Map-mode: semaphore post is unconditionally done on all threads */
222*c83a76b0SSuyog Pawar     ps_mem_tab[DEP_MNGR_WAIT_THRD_ID_MEM].i4_mem_size = (sizeof(WORD32) * num_threads);
223*c83a76b0SSuyog Pawar     ps_mem_tab[DEP_MNGR_WAIT_THRD_ID_MEM].e_mem_type = (IV_MEM_TYPE_T)i4_mem_space;
224*c83a76b0SSuyog Pawar     ps_mem_tab[DEP_MNGR_WAIT_THRD_ID_MEM].i4_mem_alignment = 8;
225*c83a76b0SSuyog Pawar 
226*c83a76b0SSuyog Pawar     /**************** Get Semaphore Requirements *********************/
227*c83a76b0SSuyog Pawar     ps_mem_tab[DEP_MNGR_SEM_HANDLE_MEM].i4_mem_size = (sizeof(void *) * num_threads);
228*c83a76b0SSuyog Pawar     ps_mem_tab[DEP_MNGR_SEM_HANDLE_MEM].e_mem_type = (IV_MEM_TYPE_T)i4_mem_space;
229*c83a76b0SSuyog Pawar     ps_mem_tab[DEP_MNGR_SEM_HANDLE_MEM].i4_mem_alignment = 8;
230*c83a76b0SSuyog Pawar 
231*c83a76b0SSuyog Pawar     return (NUM_DEP_MNGR_MEM_RECS);
232*c83a76b0SSuyog Pawar }
233*c83a76b0SSuyog Pawar 
234*c83a76b0SSuyog Pawar /*!
235*c83a76b0SSuyog Pawar ******************************************************************************
236*c83a76b0SSuyog Pawar * \if Function name : ihevce_dmgr_rst_frm_frm_sync \endif
237*c83a76b0SSuyog Pawar *
238*c83a76b0SSuyog Pawar * \brief
239*c83a76b0SSuyog Pawar *    Resets the values stored to init value
240*c83a76b0SSuyog Pawar *
241*c83a76b0SSuyog Pawar * \param[in,out]  pv_dep_mngr_state  : Pointer to Sync Manager handle.
242*c83a76b0SSuyog Pawar *
243*c83a76b0SSuyog Pawar * \return
244*c83a76b0SSuyog Pawar *    None
245*c83a76b0SSuyog Pawar *
246*c83a76b0SSuyog Pawar * \author
247*c83a76b0SSuyog Pawar *  Ittiam
248*c83a76b0SSuyog Pawar *
249*c83a76b0SSuyog Pawar *****************************************************************************
250*c83a76b0SSuyog Pawar */
ihevce_dmgr_rst_frm_frm_sync(void * pv_dep_mngr_state)251*c83a76b0SSuyog Pawar void ihevce_dmgr_rst_frm_frm_sync(void *pv_dep_mngr_state)
252*c83a76b0SSuyog Pawar {
253*c83a76b0SSuyog Pawar     dep_mngr_state_t *ps_dep_mngr_state;
254*c83a76b0SSuyog Pawar     WORD32 thrds;
255*c83a76b0SSuyog Pawar     ULWORD64 *pu8_num_units_proc_prev;
256*c83a76b0SSuyog Pawar     ULWORD64 *pu8_num_units_proc_curr;
257*c83a76b0SSuyog Pawar 
258*c83a76b0SSuyog Pawar     /* dep manager state structure */
259*c83a76b0SSuyog Pawar     ps_dep_mngr_state = (dep_mngr_state_t *)pv_dep_mngr_state;
260*c83a76b0SSuyog Pawar 
261*c83a76b0SSuyog Pawar     /* Reset the num units processed by each thread */
262*c83a76b0SSuyog Pawar     pu8_num_units_proc_curr = (ULWORD64 *)ps_dep_mngr_state->pv_units_prcsd_in_row;
263*c83a76b0SSuyog Pawar     pu8_num_units_proc_prev = pu8_num_units_proc_curr + ps_dep_mngr_state->i4_num_thrds;
264*c83a76b0SSuyog Pawar 
265*c83a76b0SSuyog Pawar     /* Reset the values thread ids waiting */
266*c83a76b0SSuyog Pawar     for(thrds = 0; thrds < ps_dep_mngr_state->i4_num_thrds; thrds++)
267*c83a76b0SSuyog Pawar     {
268*c83a76b0SSuyog Pawar         pu8_num_units_proc_prev[thrds] = 0;
269*c83a76b0SSuyog Pawar         pu8_num_units_proc_curr[thrds] = 0;
270*c83a76b0SSuyog Pawar         ps_dep_mngr_state->pi4_wait_thrd_id[thrds] = -1;
271*c83a76b0SSuyog Pawar     }
272*c83a76b0SSuyog Pawar 
273*c83a76b0SSuyog Pawar     return;
274*c83a76b0SSuyog Pawar }
275*c83a76b0SSuyog Pawar 
276*c83a76b0SSuyog Pawar /*!
277*c83a76b0SSuyog Pawar ******************************************************************************
278*c83a76b0SSuyog Pawar * \if Function name : ihevce_dmgr_rst_row_frm_sync \endif
279*c83a76b0SSuyog Pawar *
280*c83a76b0SSuyog Pawar * \brief
281*c83a76b0SSuyog Pawar *    Resets the values stored to init value
282*c83a76b0SSuyog Pawar *
283*c83a76b0SSuyog Pawar * \param[in,out]  pv_dep_mngr_state  : Pointer to Sync Manager handle.
284*c83a76b0SSuyog Pawar *
285*c83a76b0SSuyog Pawar * \return
286*c83a76b0SSuyog Pawar *    None
287*c83a76b0SSuyog Pawar *
288*c83a76b0SSuyog Pawar * \author
289*c83a76b0SSuyog Pawar *  Ittiam
290*c83a76b0SSuyog Pawar *
291*c83a76b0SSuyog Pawar *****************************************************************************
292*c83a76b0SSuyog Pawar */
ihevce_dmgr_rst_row_frm_sync(void * pv_dep_mngr_state)293*c83a76b0SSuyog Pawar void ihevce_dmgr_rst_row_frm_sync(void *pv_dep_mngr_state)
294*c83a76b0SSuyog Pawar {
295*c83a76b0SSuyog Pawar     dep_mngr_state_t *ps_dep_mngr_state;
296*c83a76b0SSuyog Pawar     WORD32 ctr, thrds;
297*c83a76b0SSuyog Pawar 
298*c83a76b0SSuyog Pawar     /* dep manager state structure */
299*c83a76b0SSuyog Pawar     ps_dep_mngr_state = (dep_mngr_state_t *)pv_dep_mngr_state;
300*c83a76b0SSuyog Pawar 
301*c83a76b0SSuyog Pawar     /* Reset the values of number of units processed in a row */
302*c83a76b0SSuyog Pawar     for(ctr = 0; ctr < ps_dep_mngr_state->i4_num_vert_units; ctr++)
303*c83a76b0SSuyog Pawar     {
304*c83a76b0SSuyog Pawar         ((WORD32 *)ps_dep_mngr_state->pv_units_prcsd_in_row)[ctr] = 0;
305*c83a76b0SSuyog Pawar     }
306*c83a76b0SSuyog Pawar 
307*c83a76b0SSuyog Pawar     /* Reset the values thread ids waiting on each row  */
308*c83a76b0SSuyog Pawar     for(ctr = 0; ctr < ps_dep_mngr_state->i4_num_vert_units; ctr++)
309*c83a76b0SSuyog Pawar     {
310*c83a76b0SSuyog Pawar         for(thrds = 0; thrds < ps_dep_mngr_state->i4_num_thrds; thrds++)
311*c83a76b0SSuyog Pawar         {
312*c83a76b0SSuyog Pawar             ps_dep_mngr_state->pi4_wait_thrd_id[thrds + (ps_dep_mngr_state->i4_num_thrds * ctr)] =
313*c83a76b0SSuyog Pawar                 -1;
314*c83a76b0SSuyog Pawar         }
315*c83a76b0SSuyog Pawar     }
316*c83a76b0SSuyog Pawar 
317*c83a76b0SSuyog Pawar     return;
318*c83a76b0SSuyog Pawar }
319*c83a76b0SSuyog Pawar 
320*c83a76b0SSuyog Pawar /*!
321*c83a76b0SSuyog Pawar ******************************************************************************
322*c83a76b0SSuyog Pawar * \if Function name : ihevce_dmgr_map_rst_sync \endif
323*c83a76b0SSuyog Pawar *
324*c83a76b0SSuyog Pawar * \brief
325*c83a76b0SSuyog Pawar *    Resets the values stored to init value
326*c83a76b0SSuyog Pawar *
327*c83a76b0SSuyog Pawar * \param[in,out]  pv_dep_mngr_state  : Pointer to Sync Manager handle.
328*c83a76b0SSuyog Pawar *
329*c83a76b0SSuyog Pawar * \return
330*c83a76b0SSuyog Pawar *    None
331*c83a76b0SSuyog Pawar *
332*c83a76b0SSuyog Pawar * \author
333*c83a76b0SSuyog Pawar *  Ittiam
334*c83a76b0SSuyog Pawar *
335*c83a76b0SSuyog Pawar *****************************************************************************
336*c83a76b0SSuyog Pawar */
ihevce_dmgr_map_rst_sync(void * pv_dep_mngr_state)337*c83a76b0SSuyog Pawar void ihevce_dmgr_map_rst_sync(void *pv_dep_mngr_state)
338*c83a76b0SSuyog Pawar {
339*c83a76b0SSuyog Pawar     dep_mngr_state_t *ps_dep_mngr_state;
340*c83a76b0SSuyog Pawar     WORD8 *pi1_ptr;
341*c83a76b0SSuyog Pawar 
342*c83a76b0SSuyog Pawar     /* dep manager state structure */
343*c83a76b0SSuyog Pawar     ps_dep_mngr_state = (dep_mngr_state_t *)pv_dep_mngr_state;
344*c83a76b0SSuyog Pawar 
345*c83a76b0SSuyog Pawar     pi1_ptr = (WORD8 *)ps_dep_mngr_state->pv_units_prcsd_in_row -
346*c83a76b0SSuyog Pawar               ps_dep_mngr_state->ai4_tile_xtra_ctb[0] * ps_dep_mngr_state->i4_num_horz_units -
347*c83a76b0SSuyog Pawar               ps_dep_mngr_state->ai4_tile_xtra_ctb[1];
348*c83a76b0SSuyog Pawar 
349*c83a76b0SSuyog Pawar     memset(
350*c83a76b0SSuyog Pawar         pi1_ptr,
351*c83a76b0SSuyog Pawar         MAP_CTB_INIT,
352*c83a76b0SSuyog Pawar         ps_dep_mngr_state->i4_num_vert_units * ps_dep_mngr_state->i4_num_horz_units *
353*c83a76b0SSuyog Pawar             sizeof(WORD8));
354*c83a76b0SSuyog Pawar 
355*c83a76b0SSuyog Pawar     //ps_dep_mngr_state->i4_frame_map_complete = 0;
356*c83a76b0SSuyog Pawar 
357*c83a76b0SSuyog Pawar     return;
358*c83a76b0SSuyog Pawar }
359*c83a76b0SSuyog Pawar 
360*c83a76b0SSuyog Pawar /*!
361*c83a76b0SSuyog Pawar ******************************************************************************
362*c83a76b0SSuyog Pawar * \if Function name : ihevce_dmgr_rst_row_row_sync \endif
363*c83a76b0SSuyog Pawar *
364*c83a76b0SSuyog Pawar * \brief
365*c83a76b0SSuyog Pawar *    Resets the values stored to init value
366*c83a76b0SSuyog Pawar *
367*c83a76b0SSuyog Pawar * \param[in,out]  pv_dep_mngr_state  : Pointer to Sync Manager handle.
368*c83a76b0SSuyog Pawar *
369*c83a76b0SSuyog Pawar * \return
370*c83a76b0SSuyog Pawar *    None
371*c83a76b0SSuyog Pawar *
372*c83a76b0SSuyog Pawar * \author
373*c83a76b0SSuyog Pawar *  Ittiam
374*c83a76b0SSuyog Pawar *
375*c83a76b0SSuyog Pawar *****************************************************************************
376*c83a76b0SSuyog Pawar */
ihevce_dmgr_rst_row_row_sync(void * pv_dep_mngr_state)377*c83a76b0SSuyog Pawar void ihevce_dmgr_rst_row_row_sync(void *pv_dep_mngr_state)
378*c83a76b0SSuyog Pawar {
379*c83a76b0SSuyog Pawar     dep_mngr_state_t *ps_dep_mngr_state;
380*c83a76b0SSuyog Pawar     WORD32 ctr;
381*c83a76b0SSuyog Pawar 
382*c83a76b0SSuyog Pawar     /* dep manager state structure */
383*c83a76b0SSuyog Pawar     ps_dep_mngr_state = (dep_mngr_state_t *)pv_dep_mngr_state;
384*c83a76b0SSuyog Pawar 
385*c83a76b0SSuyog Pawar     /* Reset the values of number of units processed in a row */
386*c83a76b0SSuyog Pawar     for(ctr = 0; ctr < (ps_dep_mngr_state->i4_num_vert_units * ps_dep_mngr_state->i4_num_tile_cols);
387*c83a76b0SSuyog Pawar         ctr++)
388*c83a76b0SSuyog Pawar     {
389*c83a76b0SSuyog Pawar         ((WORD32 *)ps_dep_mngr_state->pv_units_prcsd_in_row)[ctr] = 0;
390*c83a76b0SSuyog Pawar     }
391*c83a76b0SSuyog Pawar 
392*c83a76b0SSuyog Pawar     /* Reset the values thread ids waiting on each row  */
393*c83a76b0SSuyog Pawar     for(ctr = 0; ctr < ps_dep_mngr_state->i4_num_vert_units; ctr++)
394*c83a76b0SSuyog Pawar     {
395*c83a76b0SSuyog Pawar         ps_dep_mngr_state->pi4_wait_thrd_id[ctr] = -1;
396*c83a76b0SSuyog Pawar     }
397*c83a76b0SSuyog Pawar 
398*c83a76b0SSuyog Pawar     return;
399*c83a76b0SSuyog Pawar }
400*c83a76b0SSuyog Pawar 
401*c83a76b0SSuyog Pawar /*!
402*c83a76b0SSuyog Pawar ******************************************************************************
403*c83a76b0SSuyog Pawar * \if Function name : ihevce_dmgr_init \endif
404*c83a76b0SSuyog Pawar *
405*c83a76b0SSuyog Pawar * \brief
406*c83a76b0SSuyog Pawar *    Intialization for Dependency manager state structure .
407*c83a76b0SSuyog Pawar *
408*c83a76b0SSuyog Pawar * \param[in] ps_mem_tab : pointer to memory descriptors table
409*c83a76b0SSuyog Pawar * \param[in] pv_osal_handle : osal handle
410*c83a76b0SSuyog Pawar * \param[in] dep_mngr_mode : Mode of operation of dependency manager
411*c83a76b0SSuyog Pawar * \param[in] max_num_vert_units : Maximum nunber of units to be processed (Frame Data)
412*c83a76b0SSuyog Pawar * \param[in] max_num_horz_units : Maximun Number of Horizontal units to be processed (Frame Data)
413*c83a76b0SSuyog Pawar * \param[in] num_tile_cols : Number of column tiles for which encoder is working
414*c83a76b0SSuyog Pawar * \param[in] sem_enable : Whether you want to enable semaphore or not
415*c83a76b0SSuyog Pawar              1 : Sem. Enabled, 0 : Spin lock enabled (do-while)
416*c83a76b0SSuyog Pawar * \param[in] num_threads : Number of threads among which sync will be established
417*c83a76b0SSuyog Pawar * \param[in] i4_mem_space : memspace in which memory request should be do
418*c83a76b0SSuyog Pawar *
419*c83a76b0SSuyog Pawar * \return
420*c83a76b0SSuyog Pawar *    Handle to context
421*c83a76b0SSuyog Pawar *
422*c83a76b0SSuyog Pawar * \author
423*c83a76b0SSuyog Pawar *  Ittiam
424*c83a76b0SSuyog Pawar *
425*c83a76b0SSuyog Pawar *****************************************************************************
426*c83a76b0SSuyog Pawar */
ihevce_dmgr_init(iv_mem_rec_t * ps_mem_tab,void * pv_osal_handle,WORD32 dep_mngr_mode,WORD32 max_num_vert_units,WORD32 max_num_horz_units,WORD32 num_tile_cols,WORD32 num_threads,WORD32 sem_enable)427*c83a76b0SSuyog Pawar void *ihevce_dmgr_init(
428*c83a76b0SSuyog Pawar     iv_mem_rec_t *ps_mem_tab,
429*c83a76b0SSuyog Pawar     void *pv_osal_handle,
430*c83a76b0SSuyog Pawar     WORD32 dep_mngr_mode,
431*c83a76b0SSuyog Pawar     WORD32 max_num_vert_units,
432*c83a76b0SSuyog Pawar     WORD32 max_num_horz_units,
433*c83a76b0SSuyog Pawar     WORD32 num_tile_cols,
434*c83a76b0SSuyog Pawar     WORD32 num_threads,
435*c83a76b0SSuyog Pawar     WORD32 sem_enable)
436*c83a76b0SSuyog Pawar {
437*c83a76b0SSuyog Pawar     dep_mngr_state_t *ps_dep_mngr_state;
438*c83a76b0SSuyog Pawar 
439*c83a76b0SSuyog Pawar     (void)pv_osal_handle;
440*c83a76b0SSuyog Pawar     /* dep manager state structure */
441*c83a76b0SSuyog Pawar     ps_dep_mngr_state = (dep_mngr_state_t *)ps_mem_tab[DEP_MNGR_CTXT].pv_base;
442*c83a76b0SSuyog Pawar 
443*c83a76b0SSuyog Pawar     /* dep manager memory init */
444*c83a76b0SSuyog Pawar     ps_dep_mngr_state->ppv_thrd_sem_handles = (void **)ps_mem_tab[DEP_MNGR_SEM_HANDLE_MEM].pv_base;
445*c83a76b0SSuyog Pawar     ps_dep_mngr_state->pi4_wait_thrd_id = (WORD32 *)ps_mem_tab[DEP_MNGR_WAIT_THRD_ID_MEM].pv_base;
446*c83a76b0SSuyog Pawar     ps_dep_mngr_state->pv_units_prcsd_in_row = ps_mem_tab[DEP_MNGR_UNITS_PRCSD_MEM].pv_base;
447*c83a76b0SSuyog Pawar 
448*c83a76b0SSuyog Pawar     /* SANITY CHECK */
449*c83a76b0SSuyog Pawar     ASSERT(NULL != pv_osal_handle);
450*c83a76b0SSuyog Pawar     ASSERT(
451*c83a76b0SSuyog Pawar         (DEP_MNGR_FRM_FRM_SYNC == dep_mngr_mode) || (DEP_MNGR_ROW_FRM_SYNC == dep_mngr_mode) ||
452*c83a76b0SSuyog Pawar         (DEP_MNGR_ROW_ROW_SYNC == dep_mngr_mode));
453*c83a76b0SSuyog Pawar 
454*c83a76b0SSuyog Pawar     /* Default value */
455*c83a76b0SSuyog Pawar     if(num_tile_cols < 1)
456*c83a76b0SSuyog Pawar     {
457*c83a76b0SSuyog Pawar         num_tile_cols = 1;
458*c83a76b0SSuyog Pawar     }
459*c83a76b0SSuyog Pawar 
460*c83a76b0SSuyog Pawar     /* reset the state structure variables */
461*c83a76b0SSuyog Pawar     ps_dep_mngr_state->i4_num_horz_units = max_num_horz_units;
462*c83a76b0SSuyog Pawar     ps_dep_mngr_state->i4_num_vert_units = max_num_vert_units;
463*c83a76b0SSuyog Pawar     ps_dep_mngr_state->i1_sem_enable = sem_enable;
464*c83a76b0SSuyog Pawar     ps_dep_mngr_state->i4_dep_mngr_mode = dep_mngr_mode;
465*c83a76b0SSuyog Pawar     ps_dep_mngr_state->i4_num_thrds = num_threads;
466*c83a76b0SSuyog Pawar     ps_dep_mngr_state->i4_num_tile_cols = num_tile_cols;
467*c83a76b0SSuyog Pawar 
468*c83a76b0SSuyog Pawar     /* call the reset function baed on mode */
469*c83a76b0SSuyog Pawar     if(DEP_MNGR_FRM_FRM_SYNC == dep_mngr_mode)
470*c83a76b0SSuyog Pawar     {
471*c83a76b0SSuyog Pawar         ihevce_dmgr_rst_frm_frm_sync((void *)ps_dep_mngr_state);
472*c83a76b0SSuyog Pawar     }
473*c83a76b0SSuyog Pawar     else if(DEP_MNGR_ROW_ROW_SYNC == dep_mngr_mode)
474*c83a76b0SSuyog Pawar     {
475*c83a76b0SSuyog Pawar         ihevce_dmgr_rst_row_row_sync((void *)ps_dep_mngr_state);
476*c83a76b0SSuyog Pawar     }
477*c83a76b0SSuyog Pawar     else
478*c83a76b0SSuyog Pawar     {
479*c83a76b0SSuyog Pawar         ihevce_dmgr_rst_row_frm_sync((void *)ps_dep_mngr_state);
480*c83a76b0SSuyog Pawar     }
481*c83a76b0SSuyog Pawar 
482*c83a76b0SSuyog Pawar     return ((void *)ps_dep_mngr_state);
483*c83a76b0SSuyog Pawar }
484*c83a76b0SSuyog Pawar 
485*c83a76b0SSuyog Pawar /*!
486*c83a76b0SSuyog Pawar ******************************************************************************
487*c83a76b0SSuyog Pawar * \if Function name : ihevce_dmgr_map_init \endif
488*c83a76b0SSuyog Pawar *
489*c83a76b0SSuyog Pawar * \brief
490*c83a76b0SSuyog Pawar *    Intialization for Dependency manager state structure .
491*c83a76b0SSuyog Pawar *
492*c83a76b0SSuyog Pawar * \param[in] ps_mem_tab : pointer to memory descriptors table
493*c83a76b0SSuyog Pawar * \param[in] max_num_vert_units : Maximum nunber of units to be processed
494*c83a76b0SSuyog Pawar * \param[in] max_num_horz_units : Maximun Number of Horizontal units to be processed
495*c83a76b0SSuyog Pawar * \param[in] sem_enable : Whether you want to enable semaphore or not
496*c83a76b0SSuyog Pawar              1 : Sem. Enabled, 0 : Spin lock enabled (do-while)
497*c83a76b0SSuyog Pawar * \param[in] num_threads : Number of threads among which sync will be established
498*c83a76b0SSuyog Pawar * \param[in] ai4_tile_xtra_ctb : Array containing the number of CTBs which are
499*c83a76b0SSuyog Pawar *            are present in the Search Range outside the tile in dist-client mode.
500*c83a76b0SSuyog Pawar *            In standalone mode this array should be zero.
501*c83a76b0SSuyog Pawar *
502*c83a76b0SSuyog Pawar * \return
503*c83a76b0SSuyog Pawar *    Handle to context
504*c83a76b0SSuyog Pawar *
505*c83a76b0SSuyog Pawar * \author
506*c83a76b0SSuyog Pawar *  Ittiam
507*c83a76b0SSuyog Pawar *
508*c83a76b0SSuyog Pawar *****************************************************************************
509*c83a76b0SSuyog Pawar */
ihevce_dmgr_map_init(iv_mem_rec_t * ps_mem_tab,WORD32 max_num_vert_units,WORD32 max_num_horz_units,WORD32 sem_enable,WORD32 num_threads,WORD32 ai4_tile_xtra_ctb[4])510*c83a76b0SSuyog Pawar void *ihevce_dmgr_map_init(
511*c83a76b0SSuyog Pawar     iv_mem_rec_t *ps_mem_tab,
512*c83a76b0SSuyog Pawar     WORD32 max_num_vert_units,
513*c83a76b0SSuyog Pawar     WORD32 max_num_horz_units,
514*c83a76b0SSuyog Pawar     WORD32 sem_enable,
515*c83a76b0SSuyog Pawar     WORD32 num_threads,
516*c83a76b0SSuyog Pawar     WORD32 ai4_tile_xtra_ctb[4])
517*c83a76b0SSuyog Pawar {
518*c83a76b0SSuyog Pawar     WORD32 ctr;
519*c83a76b0SSuyog Pawar     dep_mngr_state_t *ps_dep_mngr_state;
520*c83a76b0SSuyog Pawar 
521*c83a76b0SSuyog Pawar     /* dep manager state structure */
522*c83a76b0SSuyog Pawar     ps_dep_mngr_state = (dep_mngr_state_t *)ps_mem_tab[DEP_MNGR_CTXT].pv_base;
523*c83a76b0SSuyog Pawar 
524*c83a76b0SSuyog Pawar     ps_dep_mngr_state->ai4_tile_xtra_ctb[0] = ai4_tile_xtra_ctb[0];
525*c83a76b0SSuyog Pawar     ps_dep_mngr_state->ai4_tile_xtra_ctb[1] = ai4_tile_xtra_ctb[1];
526*c83a76b0SSuyog Pawar     ps_dep_mngr_state->ai4_tile_xtra_ctb[2] = ai4_tile_xtra_ctb[2];
527*c83a76b0SSuyog Pawar     ps_dep_mngr_state->ai4_tile_xtra_ctb[3] = ai4_tile_xtra_ctb[3];
528*c83a76b0SSuyog Pawar 
529*c83a76b0SSuyog Pawar     /* dep manager memory init */
530*c83a76b0SSuyog Pawar     ps_dep_mngr_state->pv_units_prcsd_in_row = ps_mem_tab[DEP_MNGR_UNITS_PRCSD_MEM].pv_base;
531*c83a76b0SSuyog Pawar     ps_dep_mngr_state->pi4_wait_thrd_id = (WORD32 *)ps_mem_tab[DEP_MNGR_WAIT_THRD_ID_MEM].pv_base;
532*c83a76b0SSuyog Pawar     ps_dep_mngr_state->ppv_thrd_sem_handles = (void **)ps_mem_tab[DEP_MNGR_SEM_HANDLE_MEM].pv_base;
533*c83a76b0SSuyog Pawar 
534*c83a76b0SSuyog Pawar     /* Pointing to first CTB of tile */
535*c83a76b0SSuyog Pawar     ps_dep_mngr_state->pv_units_prcsd_in_row =
536*c83a76b0SSuyog Pawar         (void*)((WORD8*)ps_dep_mngr_state->pv_units_prcsd_in_row +
537*c83a76b0SSuyog Pawar         ps_dep_mngr_state->ai4_tile_xtra_ctb[1] +
538*c83a76b0SSuyog Pawar         max_num_horz_units * ps_dep_mngr_state->ai4_tile_xtra_ctb[0]);
539*c83a76b0SSuyog Pawar 
540*c83a76b0SSuyog Pawar     /* Map-mode: semaphore post is unconditionally done on all threads. Hence
541*c83a76b0SSuyog Pawar     store these one time IDs. The use of pi4_wait_thrd_id itself can be removed
542*c83a76b0SSuyog Pawar     altogether for map-mode, but keeping it for the sake of laziness  */
543*c83a76b0SSuyog Pawar     for(ctr = 0; ctr < num_threads; ctr++)
544*c83a76b0SSuyog Pawar     {
545*c83a76b0SSuyog Pawar         ps_dep_mngr_state->pi4_wait_thrd_id[ctr] = ctr;
546*c83a76b0SSuyog Pawar     }
547*c83a76b0SSuyog Pawar 
548*c83a76b0SSuyog Pawar     /* reset the state structure variables */
549*c83a76b0SSuyog Pawar     ps_dep_mngr_state->i4_num_horz_units = max_num_horz_units;
550*c83a76b0SSuyog Pawar     ps_dep_mngr_state->i4_num_vert_units = max_num_vert_units;
551*c83a76b0SSuyog Pawar     ps_dep_mngr_state->i1_sem_enable = sem_enable;
552*c83a76b0SSuyog Pawar     ps_dep_mngr_state->i4_dep_mngr_mode = DEP_MNGR_MAP_SYNC;
553*c83a76b0SSuyog Pawar     ps_dep_mngr_state->i4_num_thrds = num_threads;
554*c83a76b0SSuyog Pawar 
555*c83a76b0SSuyog Pawar     /* call the reset function baed on mode */
556*c83a76b0SSuyog Pawar     ihevce_dmgr_map_rst_sync((void *)ps_dep_mngr_state);
557*c83a76b0SSuyog Pawar 
558*c83a76b0SSuyog Pawar     return ((void *)ps_dep_mngr_state);
559*c83a76b0SSuyog Pawar }
560*c83a76b0SSuyog Pawar 
561*c83a76b0SSuyog Pawar /*!
562*c83a76b0SSuyog Pawar ******************************************************************************
563*c83a76b0SSuyog Pawar * \if Function name : ihevce_dmgr_del \endif
564*c83a76b0SSuyog Pawar *
565*c83a76b0SSuyog Pawar * \brief
566*c83a76b0SSuyog Pawar *    Delete the Dependency manager state structure.
567*c83a76b0SSuyog Pawar * Note : Destroys the mutex only. System has to free the allocated memory
568*c83a76b0SSuyog Pawar *
569*c83a76b0SSuyog Pawar * \param[in,out]  pv_dep_mngr_state  : Pointer to Sync Manager handle.
570*c83a76b0SSuyog Pawar *
571*c83a76b0SSuyog Pawar * \return
572*c83a76b0SSuyog Pawar *    None
573*c83a76b0SSuyog Pawar *
574*c83a76b0SSuyog Pawar * \author
575*c83a76b0SSuyog Pawar *  Ittiam
576*c83a76b0SSuyog Pawar *
577*c83a76b0SSuyog Pawar *****************************************************************************
578*c83a76b0SSuyog Pawar */
ihevce_dmgr_del(void * pv_dep_mngr_state)579*c83a76b0SSuyog Pawar void ihevce_dmgr_del(void *pv_dep_mngr_state)
580*c83a76b0SSuyog Pawar {
581*c83a76b0SSuyog Pawar     dep_mngr_state_t *ps_dep_mngr_state;
582*c83a76b0SSuyog Pawar 
583*c83a76b0SSuyog Pawar     /* dep manager state structure */
584*c83a76b0SSuyog Pawar     (void)ps_dep_mngr_state;
585*c83a76b0SSuyog Pawar     ps_dep_mngr_state = (dep_mngr_state_t *)pv_dep_mngr_state;
586*c83a76b0SSuyog Pawar }
587*c83a76b0SSuyog Pawar 
588*c83a76b0SSuyog Pawar /*!
589*c83a76b0SSuyog Pawar ******************************************************************************
590*c83a76b0SSuyog Pawar * \if Function name : ihevce_dmgr_register_sem_hdls \endif
591*c83a76b0SSuyog Pawar *
592*c83a76b0SSuyog Pawar * \brief
593*c83a76b0SSuyog Pawar *    Register sem handles of threads wihci are part of dependency group
594*c83a76b0SSuyog Pawar *
595*c83a76b0SSuyog Pawar * \param[in,out]  pv_dep_mngr_state  : Pointer to Sync Manager handle.
596*c83a76b0SSuyog Pawar * \param[in] ppv_thread_sem_hdl : arry of pointer to all the sem handles
597*c83a76b0SSuyog Pawar * \param[in] num_threads : Number of threads part of this dependency group
598*c83a76b0SSuyog Pawar *
599*c83a76b0SSuyog Pawar * \return
600*c83a76b0SSuyog Pawar *    None
601*c83a76b0SSuyog Pawar *
602*c83a76b0SSuyog Pawar * \author
603*c83a76b0SSuyog Pawar *  Ittiam
604*c83a76b0SSuyog Pawar *
605*c83a76b0SSuyog Pawar *****************************************************************************
606*c83a76b0SSuyog Pawar */
ihevce_dmgr_reg_sem_hdls(void * pv_dep_mngr_state,void ** ppv_thread_sem_hdl,WORD32 num_threads)607*c83a76b0SSuyog Pawar void ihevce_dmgr_reg_sem_hdls(void *pv_dep_mngr_state, void **ppv_thread_sem_hdl, WORD32 num_threads)
608*c83a76b0SSuyog Pawar {
609*c83a76b0SSuyog Pawar     dep_mngr_state_t *ps_dep_mngr_state;
610*c83a76b0SSuyog Pawar     WORD32 ctr;
611*c83a76b0SSuyog Pawar 
612*c83a76b0SSuyog Pawar     /* dep manager state structure */
613*c83a76b0SSuyog Pawar     ps_dep_mngr_state = (dep_mngr_state_t *)pv_dep_mngr_state;
614*c83a76b0SSuyog Pawar 
615*c83a76b0SSuyog Pawar     ASSERT(num_threads <= ps_dep_mngr_state->i4_num_thrds);
616*c83a76b0SSuyog Pawar 
617*c83a76b0SSuyog Pawar     for(ctr = 0; ctr < num_threads; ctr++)
618*c83a76b0SSuyog Pawar     {
619*c83a76b0SSuyog Pawar         ps_dep_mngr_state->ppv_thrd_sem_handles[ctr] = ppv_thread_sem_hdl[ctr];
620*c83a76b0SSuyog Pawar     }
621*c83a76b0SSuyog Pawar 
622*c83a76b0SSuyog Pawar     return;
623*c83a76b0SSuyog Pawar }
624*c83a76b0SSuyog Pawar 
625*c83a76b0SSuyog Pawar /*!
626*c83a76b0SSuyog Pawar ******************************************************************************
627*c83a76b0SSuyog Pawar * \if Function name : ihevce_dmgr_set_prev_done_frm_frm_sync \endif
628*c83a76b0SSuyog Pawar *
629*c83a76b0SSuyog Pawar * \brief
630*c83a76b0SSuyog Pawar *    Set the values to dependency not resolved state
631*c83a76b0SSuyog Pawar *
632*c83a76b0SSuyog Pawar * \param[in,out]  pv_dep_mngr_state  : Pointer to Sync Manager handle.
633*c83a76b0SSuyog Pawar *
634*c83a76b0SSuyog Pawar * \return
635*c83a76b0SSuyog Pawar *    None
636*c83a76b0SSuyog Pawar *
637*c83a76b0SSuyog Pawar * \author
638*c83a76b0SSuyog Pawar *  Ittiam
639*c83a76b0SSuyog Pawar *
640*c83a76b0SSuyog Pawar *****************************************************************************
641*c83a76b0SSuyog Pawar */
ihevce_dmgr_set_prev_done_frm_frm_sync(void * pv_dep_mngr_state)642*c83a76b0SSuyog Pawar void ihevce_dmgr_set_prev_done_frm_frm_sync(void *pv_dep_mngr_state)
643*c83a76b0SSuyog Pawar {
644*c83a76b0SSuyog Pawar     dep_mngr_state_t *ps_dep_mngr_state;
645*c83a76b0SSuyog Pawar     WORD32 thrds;
646*c83a76b0SSuyog Pawar     ULWORD64 *pu8_num_units_proc_curr;
647*c83a76b0SSuyog Pawar     ULWORD64 *pu8_num_units_proc_prev;
648*c83a76b0SSuyog Pawar 
649*c83a76b0SSuyog Pawar     /* dep manager state structure */
650*c83a76b0SSuyog Pawar     ps_dep_mngr_state = (dep_mngr_state_t *)pv_dep_mngr_state;
651*c83a76b0SSuyog Pawar 
652*c83a76b0SSuyog Pawar     /* Reset the values num threads entering processing state  */
653*c83a76b0SSuyog Pawar     pu8_num_units_proc_curr = (ULWORD64 *)ps_dep_mngr_state->pv_units_prcsd_in_row;
654*c83a76b0SSuyog Pawar     pu8_num_units_proc_prev =
655*c83a76b0SSuyog Pawar         (ULWORD64 *)(pu8_num_units_proc_curr + ps_dep_mngr_state->i4_num_thrds);
656*c83a76b0SSuyog Pawar 
657*c83a76b0SSuyog Pawar     /* Reset the values thread ids waiting */
658*c83a76b0SSuyog Pawar     for(thrds = 0; thrds < ps_dep_mngr_state->i4_num_thrds; thrds++)
659*c83a76b0SSuyog Pawar     {
660*c83a76b0SSuyog Pawar         pu8_num_units_proc_prev[thrds] = 1;
661*c83a76b0SSuyog Pawar         ps_dep_mngr_state->pi4_wait_thrd_id[thrds] = -1;
662*c83a76b0SSuyog Pawar     }
663*c83a76b0SSuyog Pawar 
664*c83a76b0SSuyog Pawar     return;
665*c83a76b0SSuyog Pawar }
666*c83a76b0SSuyog Pawar 
667*c83a76b0SSuyog Pawar /*!
668*c83a76b0SSuyog Pawar ******************************************************************************
669*c83a76b0SSuyog Pawar * \if Function name : ihevce_dmgr_set_done_frm_frm_sync \endif
670*c83a76b0SSuyog Pawar *
671*c83a76b0SSuyog Pawar * \brief
672*c83a76b0SSuyog Pawar *    Set the values to dependency met state
673*c83a76b0SSuyog Pawar *
674*c83a76b0SSuyog Pawar * \param[in,out]  pv_dep_mngr_state  : Pointer to Sync Manager handle.
675*c83a76b0SSuyog Pawar *
676*c83a76b0SSuyog Pawar * \return
677*c83a76b0SSuyog Pawar *    None
678*c83a76b0SSuyog Pawar *
679*c83a76b0SSuyog Pawar * \author
680*c83a76b0SSuyog Pawar *  Ittiam
681*c83a76b0SSuyog Pawar *
682*c83a76b0SSuyog Pawar *****************************************************************************
683*c83a76b0SSuyog Pawar */
ihevce_dmgr_set_done_frm_frm_sync(void * pv_dep_mngr_state)684*c83a76b0SSuyog Pawar void ihevce_dmgr_set_done_frm_frm_sync(void *pv_dep_mngr_state)
685*c83a76b0SSuyog Pawar {
686*c83a76b0SSuyog Pawar     dep_mngr_state_t *ps_dep_mngr_state;
687*c83a76b0SSuyog Pawar     WORD32 thrds;
688*c83a76b0SSuyog Pawar     ULWORD64 *pu8_num_units_proc_curr;
689*c83a76b0SSuyog Pawar 
690*c83a76b0SSuyog Pawar     /* dep manager state structure */
691*c83a76b0SSuyog Pawar     ps_dep_mngr_state = (dep_mngr_state_t *)pv_dep_mngr_state;
692*c83a76b0SSuyog Pawar 
693*c83a76b0SSuyog Pawar     /* Reset the values num threads entering processing state  */
694*c83a76b0SSuyog Pawar     pu8_num_units_proc_curr = (ULWORD64 *)ps_dep_mngr_state->pv_units_prcsd_in_row;
695*c83a76b0SSuyog Pawar 
696*c83a76b0SSuyog Pawar     /* Reset the values thread ids waiting */
697*c83a76b0SSuyog Pawar     for(thrds = 0; thrds < ps_dep_mngr_state->i4_num_thrds; thrds++)
698*c83a76b0SSuyog Pawar     {
699*c83a76b0SSuyog Pawar         pu8_num_units_proc_curr[thrds] = 1;
700*c83a76b0SSuyog Pawar         ps_dep_mngr_state->pi4_wait_thrd_id[thrds] = -1;
701*c83a76b0SSuyog Pawar     }
702*c83a76b0SSuyog Pawar 
703*c83a76b0SSuyog Pawar     return;
704*c83a76b0SSuyog Pawar }
705*c83a76b0SSuyog Pawar 
706*c83a76b0SSuyog Pawar /*!
707*c83a76b0SSuyog Pawar **************************************************************************
708*c83a76b0SSuyog Pawar * \if Function name : ihevce_dmgr_chk_row_row_sync \endif
709*c83a76b0SSuyog Pawar *
710*c83a76b0SSuyog Pawar * \brief
711*c83a76b0SSuyog Pawar *    This function checks whether the dependency is met to proceed with
712*c83a76b0SSuyog Pawar *    processing. If condition is not met, it should go to a sem_wait state,
713*c83a76b0SSuyog Pawar *    else start processing.
714*c83a76b0SSuyog Pawar *
715*c83a76b0SSuyog Pawar * \param[in]  pv_dep_mngr_state  : Pointer to Sync Manager handle.
716*c83a76b0SSuyog Pawar * \param[in]  cur_offset    : Current offset of the dep. variable
717*c83a76b0SSuyog Pawar * \param[in]  dep_offset    : Offset from the current value to meet the dep.
718*c83a76b0SSuyog Pawar * \param[in]  dep_row       : The position of the Ref.
719*c83a76b0SSuyog Pawar * \param[in]  cur_tile_col  : The current column tile number (not tile id)
720*c83a76b0SSuyog Pawar *   Assuming the dependency is within the tile only (Acroos tiles won't work now)
721*c83a76b0SSuyog Pawar * \param[in]  thrd_id       : Thread id of the current thread checking for dependency
722*c83a76b0SSuyog Pawar *
723*c83a76b0SSuyog Pawar * \return
724*c83a76b0SSuyog Pawar *    0 on Success and -1 on error
725*c83a76b0SSuyog Pawar *
726*c83a76b0SSuyog Pawar * \author
727*c83a76b0SSuyog Pawar *  Ittiam
728*c83a76b0SSuyog Pawar *
729*c83a76b0SSuyog Pawar **************************************************************************
730*c83a76b0SSuyog Pawar */
ihevce_dmgr_chk_row_row_sync(void * pv_dep_mngr_state,WORD32 cur_offset,WORD32 dep_offset,WORD32 dep_row,WORD32 cur_tile_col,WORD32 thrd_id)731*c83a76b0SSuyog Pawar WORD32 ihevce_dmgr_chk_row_row_sync(
732*c83a76b0SSuyog Pawar     void *pv_dep_mngr_state,
733*c83a76b0SSuyog Pawar     WORD32 cur_offset,
734*c83a76b0SSuyog Pawar     WORD32 dep_offset,
735*c83a76b0SSuyog Pawar     WORD32 dep_row,
736*c83a76b0SSuyog Pawar     WORD32 cur_tile_col,
737*c83a76b0SSuyog Pawar     WORD32 thrd_id)
738*c83a76b0SSuyog Pawar {
739*c83a76b0SSuyog Pawar     dep_mngr_state_t *ps_dep_mngr_state;
740*c83a76b0SSuyog Pawar     volatile WORD32 *pi4_ref_value;
741*c83a76b0SSuyog Pawar     WORD32 ref_value;
742*c83a76b0SSuyog Pawar 
743*c83a76b0SSuyog Pawar     ps_dep_mngr_state = (dep_mngr_state_t *)pv_dep_mngr_state;
744*c83a76b0SSuyog Pawar 
745*c83a76b0SSuyog Pawar     /* Sanity Check */
746*c83a76b0SSuyog Pawar     ASSERT(dep_row >= 0);
747*c83a76b0SSuyog Pawar     ASSERT(dep_row < ps_dep_mngr_state->i4_num_vert_units);
748*c83a76b0SSuyog Pawar     ASSERT(cur_tile_col >= 0);
749*c83a76b0SSuyog Pawar     ASSERT(cur_tile_col < ps_dep_mngr_state->i4_num_tile_cols);
750*c83a76b0SSuyog Pawar 
751*c83a76b0SSuyog Pawar     pi4_ref_value = ((volatile WORD32 *)(ps_dep_mngr_state->pv_units_prcsd_in_row)) +
752*c83a76b0SSuyog Pawar                     (cur_tile_col * ps_dep_mngr_state->i4_num_vert_units) + dep_row;
753*c83a76b0SSuyog Pawar 
754*c83a76b0SSuyog Pawar     /* Sanity Check */
755*c83a76b0SSuyog Pawar     ASSERT((cur_offset + dep_offset) <= ps_dep_mngr_state->i4_num_horz_units);
756*c83a76b0SSuyog Pawar 
757*c83a76b0SSuyog Pawar     /* Check whether Dep. is met */
758*c83a76b0SSuyog Pawar     while(1)
759*c83a76b0SSuyog Pawar     {
760*c83a76b0SSuyog Pawar         ref_value = *pi4_ref_value;
761*c83a76b0SSuyog Pawar 
762*c83a76b0SSuyog Pawar         if(ref_value >= (cur_offset + dep_offset))
763*c83a76b0SSuyog Pawar             break;
764*c83a76b0SSuyog Pawar 
765*c83a76b0SSuyog Pawar         if(1 == ps_dep_mngr_state->i1_sem_enable)
766*c83a76b0SSuyog Pawar         {
767*c83a76b0SSuyog Pawar             void *pv_sem_handle;
768*c83a76b0SSuyog Pawar             WORD32 ret_val;
769*c83a76b0SSuyog Pawar 
770*c83a76b0SSuyog Pawar             (void)ret_val;
771*c83a76b0SSuyog Pawar             pv_sem_handle = ps_dep_mngr_state->ppv_thrd_sem_handles[thrd_id];
772*c83a76b0SSuyog Pawar 
773*c83a76b0SSuyog Pawar             /* register the thread id before going to pend state */
774*c83a76b0SSuyog Pawar             ps_dep_mngr_state->pi4_wait_thrd_id[dep_row] = thrd_id;
775*c83a76b0SSuyog Pawar 
776*c83a76b0SSuyog Pawar             /* go to the pend state */
777*c83a76b0SSuyog Pawar             ret_val = osal_sem_wait(pv_sem_handle);
778*c83a76b0SSuyog Pawar             //ASSERT(0 == ret_val);
779*c83a76b0SSuyog Pawar         }
780*c83a76b0SSuyog Pawar     }
781*c83a76b0SSuyog Pawar 
782*c83a76b0SSuyog Pawar     return 0;
783*c83a76b0SSuyog Pawar }
784*c83a76b0SSuyog Pawar 
785*c83a76b0SSuyog Pawar /*!
786*c83a76b0SSuyog Pawar **************************************************************************
787*c83a76b0SSuyog Pawar * \if Function name : ihevce_dmgr_set_row_row_sync \endif
788*c83a76b0SSuyog Pawar *
789*c83a76b0SSuyog Pawar * \brief
790*c83a76b0SSuyog Pawar *    This function sets the dependency and wakes up the proper semaphores
791*c83a76b0SSuyog Pawar *    to start processing.
792*c83a76b0SSuyog Pawar *
793*c83a76b0SSuyog Pawar * \param[in]  pv_dep_mngr_state  : Pointer to Sync Manager handle.
794*c83a76b0SSuyog Pawar * \param[in]  cur_offset     : Current offset processed
795*c83a76b0SSuyog Pawar * \param[in]  cur_row       : The cur. vertical position
796*c83a76b0SSuyog Pawar * \param[in]  cur_tile_col  : The current column tile number (not tile id)
797*c83a76b0SSuyog Pawar *   Assuming the dependency is within the tile only (Acroos tiles won't work now)
798*c83a76b0SSuyog Pawar *
799*c83a76b0SSuyog Pawar * \return
800*c83a76b0SSuyog Pawar *    0 on Success and -1 on error
801*c83a76b0SSuyog Pawar *
802*c83a76b0SSuyog Pawar * \author
803*c83a76b0SSuyog Pawar *  Ittiam
804*c83a76b0SSuyog Pawar *
805*c83a76b0SSuyog Pawar **************************************************************************
806*c83a76b0SSuyog Pawar */
ihevce_dmgr_set_row_row_sync(void * pv_dep_mngr_state,WORD32 cur_offset,WORD32 cur_row,WORD32 cur_tile_col)807*c83a76b0SSuyog Pawar WORD32 ihevce_dmgr_set_row_row_sync(
808*c83a76b0SSuyog Pawar     void *pv_dep_mngr_state, WORD32 cur_offset, WORD32 cur_row, WORD32 cur_tile_col)
809*c83a76b0SSuyog Pawar {
810*c83a76b0SSuyog Pawar     dep_mngr_state_t *ps_dep_mngr_state;
811*c83a76b0SSuyog Pawar     WORD32 *pi4_units_prcsd;
812*c83a76b0SSuyog Pawar     void *pv_sem_handle;
813*c83a76b0SSuyog Pawar     WORD32 ret_val;
814*c83a76b0SSuyog Pawar 
815*c83a76b0SSuyog Pawar     (void)ret_val;
816*c83a76b0SSuyog Pawar     ps_dep_mngr_state = (dep_mngr_state_t *)pv_dep_mngr_state;
817*c83a76b0SSuyog Pawar 
818*c83a76b0SSuyog Pawar     /* Sanity Check */
819*c83a76b0SSuyog Pawar     ASSERT(cur_offset >= 0);
820*c83a76b0SSuyog Pawar     ASSERT(cur_offset <= ps_dep_mngr_state->i4_num_horz_units);
821*c83a76b0SSuyog Pawar     ASSERT(cur_row <= ps_dep_mngr_state->i4_num_vert_units);
822*c83a76b0SSuyog Pawar     ASSERT(cur_tile_col >= 0);
823*c83a76b0SSuyog Pawar     ASSERT(cur_tile_col < ps_dep_mngr_state->i4_num_tile_cols);
824*c83a76b0SSuyog Pawar 
825*c83a76b0SSuyog Pawar     DATA_SYNC();
826*c83a76b0SSuyog Pawar 
827*c83a76b0SSuyog Pawar     pi4_units_prcsd = ((WORD32 *)(ps_dep_mngr_state->pv_units_prcsd_in_row)) +
828*c83a76b0SSuyog Pawar                       (cur_tile_col * ps_dep_mngr_state->i4_num_vert_units) + cur_row;
829*c83a76b0SSuyog Pawar 
830*c83a76b0SSuyog Pawar     /* Update the number of units processed */
831*c83a76b0SSuyog Pawar     *pi4_units_prcsd = cur_offset;
832*c83a76b0SSuyog Pawar 
833*c83a76b0SSuyog Pawar     if(1 == ps_dep_mngr_state->i1_sem_enable)
834*c83a76b0SSuyog Pawar     {
835*c83a76b0SSuyog Pawar         WORD32 wait_thrd_id;
836*c83a76b0SSuyog Pawar 
837*c83a76b0SSuyog Pawar         wait_thrd_id = ps_dep_mngr_state->pi4_wait_thrd_id[cur_row];
838*c83a76b0SSuyog Pawar 
839*c83a76b0SSuyog Pawar         /* Post on threads waiting on the current row */
840*c83a76b0SSuyog Pawar         if(-1 != wait_thrd_id)
841*c83a76b0SSuyog Pawar         {
842*c83a76b0SSuyog Pawar             pv_sem_handle = ps_dep_mngr_state->ppv_thrd_sem_handles[wait_thrd_id];
843*c83a76b0SSuyog Pawar             /* Post on the semaphore */
844*c83a76b0SSuyog Pawar             ret_val = osal_sem_post(pv_sem_handle);
845*c83a76b0SSuyog Pawar             //ASSERT(0 == ret_val);
846*c83a76b0SSuyog Pawar 
847*c83a76b0SSuyog Pawar             ps_dep_mngr_state->pi4_wait_thrd_id[cur_row] = -1;
848*c83a76b0SSuyog Pawar         }
849*c83a76b0SSuyog Pawar 
850*c83a76b0SSuyog Pawar         /* towards end of row all threads are posted (to avoid any corner cases) */
851*c83a76b0SSuyog Pawar         if(cur_offset == ps_dep_mngr_state->i4_num_horz_units)
852*c83a76b0SSuyog Pawar         {
853*c83a76b0SSuyog Pawar             WORD32 ctr;
854*c83a76b0SSuyog Pawar 
855*c83a76b0SSuyog Pawar             for(ctr = 0; ctr < ps_dep_mngr_state->i4_num_thrds; ctr++)
856*c83a76b0SSuyog Pawar             {
857*c83a76b0SSuyog Pawar                 ret_val = osal_sem_post(ps_dep_mngr_state->ppv_thrd_sem_handles[ctr]);
858*c83a76b0SSuyog Pawar                 //ASSERT(0 == ret_val);
859*c83a76b0SSuyog Pawar             }
860*c83a76b0SSuyog Pawar         }
861*c83a76b0SSuyog Pawar     }
862*c83a76b0SSuyog Pawar 
863*c83a76b0SSuyog Pawar     return 0;
864*c83a76b0SSuyog Pawar }
865*c83a76b0SSuyog Pawar 
866*c83a76b0SSuyog Pawar /*!
867*c83a76b0SSuyog Pawar **************************************************************************
868*c83a76b0SSuyog Pawar * \if Function name : ihevce_dmgr_chk_frm_frm_sync \endif
869*c83a76b0SSuyog Pawar *
870*c83a76b0SSuyog Pawar * \brief
871*c83a76b0SSuyog Pawar *    This function checks whether the dependency is met to proceed with
872*c83a76b0SSuyog Pawar *    processing. If condition is not met, it should go to a sem_wait state,
873*c83a76b0SSuyog Pawar *    else start processing.
874*c83a76b0SSuyog Pawar *    For Barrier case, the thread will wait till all threads have completed
875*c83a76b0SSuyog Pawar *    the processing on the previosu instance of same stage
876*c83a76b0SSuyog Pawar * \param[in]  pv_dep_mngr_state  : Pointer to Sync Manager handle.
877*c83a76b0SSuyog Pawar * \param[in]  thrd_id       : Thread id checking for dependency
878*c83a76b0SSuyog Pawar *
879*c83a76b0SSuyog Pawar * \return
880*c83a76b0SSuyog Pawar *    0 on Success and -1 on error
881*c83a76b0SSuyog Pawar *
882*c83a76b0SSuyog Pawar * \author
883*c83a76b0SSuyog Pawar *  Ittiam
884*c83a76b0SSuyog Pawar *
885*c83a76b0SSuyog Pawar **************************************************************************
886*c83a76b0SSuyog Pawar */
ihevce_dmgr_chk_frm_frm_sync(void * pv_dep_mngr_state,WORD32 thrd_id)887*c83a76b0SSuyog Pawar WORD32 ihevce_dmgr_chk_frm_frm_sync(void *pv_dep_mngr_state, WORD32 thrd_id)
888*c83a76b0SSuyog Pawar {
889*c83a76b0SSuyog Pawar     dep_mngr_state_t *ps_dep_mngr_state;
890*c83a76b0SSuyog Pawar     void *pv_sem_handle;
891*c83a76b0SSuyog Pawar     volatile ULWORD64 *pu8_num_units_proc_prev;
892*c83a76b0SSuyog Pawar     volatile ULWORD64 *pu8_num_units_proc_curr;
893*c83a76b0SSuyog Pawar     ULWORD64 prev_value;
894*c83a76b0SSuyog Pawar     ULWORD64 curr_value;
895*c83a76b0SSuyog Pawar 
896*c83a76b0SSuyog Pawar     ps_dep_mngr_state = (dep_mngr_state_t *)pv_dep_mngr_state;
897*c83a76b0SSuyog Pawar     pv_sem_handle = ps_dep_mngr_state->ppv_thrd_sem_handles[thrd_id];
898*c83a76b0SSuyog Pawar 
899*c83a76b0SSuyog Pawar     pu8_num_units_proc_curr = (volatile ULWORD64 *)ps_dep_mngr_state->pv_units_prcsd_in_row;
900*c83a76b0SSuyog Pawar     pu8_num_units_proc_prev =
901*c83a76b0SSuyog Pawar         (volatile ULWORD64 *)(pu8_num_units_proc_curr + ps_dep_mngr_state->i4_num_thrds);
902*c83a76b0SSuyog Pawar 
903*c83a76b0SSuyog Pawar     /* Check whether Dep. is met */
904*c83a76b0SSuyog Pawar     while(1)
905*c83a76b0SSuyog Pawar     {
906*c83a76b0SSuyog Pawar         WORD32 ret_val;
907*c83a76b0SSuyog Pawar 
908*c83a76b0SSuyog Pawar         (void)ret_val;
909*c83a76b0SSuyog Pawar         curr_value = pu8_num_units_proc_curr[thrd_id];
910*c83a76b0SSuyog Pawar         prev_value = pu8_num_units_proc_prev[thrd_id];
911*c83a76b0SSuyog Pawar 
912*c83a76b0SSuyog Pawar         if(curr_value == (prev_value + 1))
913*c83a76b0SSuyog Pawar         {
914*c83a76b0SSuyog Pawar             break;
915*c83a76b0SSuyog Pawar         }
916*c83a76b0SSuyog Pawar         else
917*c83a76b0SSuyog Pawar         {
918*c83a76b0SSuyog Pawar             /* register the thread id before going to pend state */
919*c83a76b0SSuyog Pawar             ps_dep_mngr_state->pi4_wait_thrd_id[thrd_id] = thrd_id;
920*c83a76b0SSuyog Pawar 
921*c83a76b0SSuyog Pawar             /* go to the pend state */
922*c83a76b0SSuyog Pawar             ret_val = osal_sem_wait(pv_sem_handle);
923*c83a76b0SSuyog Pawar             //ASSERT(0 == ret_val);
924*c83a76b0SSuyog Pawar         }
925*c83a76b0SSuyog Pawar     }
926*c83a76b0SSuyog Pawar 
927*c83a76b0SSuyog Pawar     /* store curr value to prev for next iteration */
928*c83a76b0SSuyog Pawar     pu8_num_units_proc_prev[thrd_id] = pu8_num_units_proc_curr[thrd_id];
929*c83a76b0SSuyog Pawar 
930*c83a76b0SSuyog Pawar     return 0;
931*c83a76b0SSuyog Pawar }
932*c83a76b0SSuyog Pawar 
933*c83a76b0SSuyog Pawar /*!
934*c83a76b0SSuyog Pawar **************************************************************************
935*c83a76b0SSuyog Pawar * \if Function name : ihevce_dmgr_update_frm_frm_sync \endif
936*c83a76b0SSuyog Pawar *
937*c83a76b0SSuyog Pawar * \brief
938*c83a76b0SSuyog Pawar *    This function sets the dependency and wakes up the proper semaphores
939*c83a76b0SSuyog Pawar *    to start processing.
940*c83a76b0SSuyog Pawar *    For barrier case, if the dep. is met, all waiting threads should be waked up
941*c83a76b0SSuyog Pawar *
942*c83a76b0SSuyog Pawar * \param[in]  pv_dep_mngr_state  : Pointer to Sync Manager handle.
943*c83a76b0SSuyog Pawar *
944*c83a76b0SSuyog Pawar * \return
945*c83a76b0SSuyog Pawar *    0 on Success and -1 on error
946*c83a76b0SSuyog Pawar *
947*c83a76b0SSuyog Pawar * \author
948*c83a76b0SSuyog Pawar *  Ittiam
949*c83a76b0SSuyog Pawar *
950*c83a76b0SSuyog Pawar **************************************************************************
951*c83a76b0SSuyog Pawar */
ihevce_dmgr_update_frm_frm_sync(void * pv_dep_mngr_state)952*c83a76b0SSuyog Pawar WORD32 ihevce_dmgr_update_frm_frm_sync(void *pv_dep_mngr_state)
953*c83a76b0SSuyog Pawar {
954*c83a76b0SSuyog Pawar     dep_mngr_state_t *ps_dep_mngr_state;
955*c83a76b0SSuyog Pawar     void *pv_sem_handle;
956*c83a76b0SSuyog Pawar     volatile ULWORD64 *pu8_num_units_proc_curr;
957*c83a76b0SSuyog Pawar     WORD32 ctr;
958*c83a76b0SSuyog Pawar 
959*c83a76b0SSuyog Pawar     ps_dep_mngr_state = (dep_mngr_state_t *)pv_dep_mngr_state;
960*c83a76b0SSuyog Pawar 
961*c83a76b0SSuyog Pawar     pu8_num_units_proc_curr = (volatile ULWORD64 *)ps_dep_mngr_state->pv_units_prcsd_in_row;
962*c83a76b0SSuyog Pawar 
963*c83a76b0SSuyog Pawar     /* Post on All vertical waiting threads semaphores & update the cur unit proc */
964*c83a76b0SSuyog Pawar     for(ctr = 0; ctr < ps_dep_mngr_state->i4_num_thrds; ctr++)
965*c83a76b0SSuyog Pawar     {
966*c83a76b0SSuyog Pawar         WORD32 ret_val;
967*c83a76b0SSuyog Pawar         WORD32 wait_thrd_id;
968*c83a76b0SSuyog Pawar 
969*c83a76b0SSuyog Pawar         (void)ret_val;
970*c83a76b0SSuyog Pawar         /* increment the curr unit counter for all threads */
971*c83a76b0SSuyog Pawar         pu8_num_units_proc_curr[ctr] = pu8_num_units_proc_curr[ctr] + 1;
972*c83a76b0SSuyog Pawar 
973*c83a76b0SSuyog Pawar         wait_thrd_id = ctr;
974*c83a76b0SSuyog Pawar         //wait_thrd_id    = ps_dep_mngr_state->pi4_wait_thrd_id[ctr];
975*c83a76b0SSuyog Pawar 
976*c83a76b0SSuyog Pawar         if(-1 != wait_thrd_id)
977*c83a76b0SSuyog Pawar         {
978*c83a76b0SSuyog Pawar             pv_sem_handle = ps_dep_mngr_state->ppv_thrd_sem_handles[wait_thrd_id];
979*c83a76b0SSuyog Pawar             /* Post on the semaphore */
980*c83a76b0SSuyog Pawar             ret_val = osal_sem_post(pv_sem_handle);
981*c83a76b0SSuyog Pawar             //ASSERT(0 == ret_val);
982*c83a76b0SSuyog Pawar 
983*c83a76b0SSuyog Pawar             ps_dep_mngr_state->pi4_wait_thrd_id[ctr] = -1;
984*c83a76b0SSuyog Pawar         }
985*c83a76b0SSuyog Pawar     }
986*c83a76b0SSuyog Pawar 
987*c83a76b0SSuyog Pawar     return 0;
988*c83a76b0SSuyog Pawar }
989*c83a76b0SSuyog Pawar 
990*c83a76b0SSuyog Pawar /*!
991*c83a76b0SSuyog Pawar **************************************************************************
992*c83a76b0SSuyog Pawar * \if Function name : ihevce_dmgr_map_chk \endif
993*c83a76b0SSuyog Pawar *
994*c83a76b0SSuyog Pawar * \brief
995*c83a76b0SSuyog Pawar *   This function checks whether all entries in the dependency map are set
996*c83a76b0SSuyog Pawar *
997*c83a76b0SSuyog Pawar * \param[in]  pu1_start    : Pointer to the start of the search area
998*c83a76b0SSuyog Pawar * \param[in]  i4_num_ctb_x : Size   of search area
999*c83a76b0SSuyog Pawar * \param[in]  i4_num_ctb_y : Size   of search area
1000*c83a76b0SSuyog Pawar * \param[in]  i4_stride    : Stride of search area
1001*c83a76b0SSuyog Pawar *
1002*c83a76b0SSuyog Pawar * \return
1003*c83a76b0SSuyog Pawar *    1 on Success otherwise 0
1004*c83a76b0SSuyog Pawar *
1005*c83a76b0SSuyog Pawar * \author
1006*c83a76b0SSuyog Pawar *  Ittiam
1007*c83a76b0SSuyog Pawar *
1008*c83a76b0SSuyog Pawar **************************************************************************
1009*c83a76b0SSuyog Pawar */
1010*c83a76b0SSuyog Pawar WORD32
ihevce_dmgr_map_chk(WORD8 * pu1_start,WORD32 i4_num_ctb_x,WORD32 i4_num_ctb_y,WORD32 i4_stride)1011*c83a76b0SSuyog Pawar     ihevce_dmgr_map_chk(WORD8 *pu1_start, WORD32 i4_num_ctb_x, WORD32 i4_num_ctb_y, WORD32 i4_stride)
1012*c83a76b0SSuyog Pawar {
1013*c83a76b0SSuyog Pawar     WORD8 *pi1_ctb = pu1_start;
1014*c83a76b0SSuyog Pawar     WORD32 row, col;
1015*c83a76b0SSuyog Pawar     WORD32 map_ready_flag = MAP_CTB_COMPLETE;
1016*c83a76b0SSuyog Pawar 
1017*c83a76b0SSuyog Pawar     for(row = 0; row < i4_num_ctb_y; row++)
1018*c83a76b0SSuyog Pawar     {
1019*c83a76b0SSuyog Pawar         for(col = 0; col < i4_num_ctb_x; col++)
1020*c83a76b0SSuyog Pawar         {
1021*c83a76b0SSuyog Pawar             map_ready_flag &= pi1_ctb[col];
1022*c83a76b0SSuyog Pawar         }
1023*c83a76b0SSuyog Pawar         pi1_ctb += i4_stride;
1024*c83a76b0SSuyog Pawar     }
1025*c83a76b0SSuyog Pawar 
1026*c83a76b0SSuyog Pawar     /* NOTE: early exit in the above loop can taken if map_ready_flag
1027*c83a76b0SSuyog Pawar     is found to be zero somewhere at the start itself */
1028*c83a76b0SSuyog Pawar     return (map_ready_flag == MAP_CTB_COMPLETE);
1029*c83a76b0SSuyog Pawar }
1030*c83a76b0SSuyog Pawar 
1031*c83a76b0SSuyog Pawar /*!
1032*c83a76b0SSuyog Pawar **************************************************************************
1033*c83a76b0SSuyog Pawar * \if Function name : ihevce_dmgr_map_chk_sync \endif
1034*c83a76b0SSuyog Pawar *
1035*c83a76b0SSuyog Pawar * \brief
1036*c83a76b0SSuyog Pawar *   This function checks whether the dependency is met by searching in a
1037*c83a76b0SSuyog Pawar *   rectangular area. If condition is not met, it should go to a sem_wait state,
1038*c83a76b0SSuyog Pawar *    else start processing.
1039*c83a76b0SSuyog Pawar *
1040*c83a76b0SSuyog Pawar * \param[in]  pv_dep_mngr_state  : Pointer to Sync Manager handle.
1041*c83a76b0SSuyog Pawar * \param[in]  thrd_id     : Thread id of the current thread checking for dependency
1042*c83a76b0SSuyog Pawar * \param[in]  offset_x    : Offset of current CTB in Tile in ctb-unit
1043*c83a76b0SSuyog Pawar * \param[in]  offset_y    : Offset of current CTB in Tile in ctb-unit
1044*c83a76b0SSuyog Pawar * \param[in]  i4_sr_ctb_x : Search Range in ctb-unit
1045*c83a76b0SSuyog Pawar * \param[in]  i4_sr_ctb_y : Search Range in ctb-unit
1046*c83a76b0SSuyog Pawar *
1047*c83a76b0SSuyog Pawar * \return
1048*c83a76b0SSuyog Pawar *    0 on Success and -1 on error
1049*c83a76b0SSuyog Pawar *
1050*c83a76b0SSuyog Pawar * \author
1051*c83a76b0SSuyog Pawar *  Ittiam
1052*c83a76b0SSuyog Pawar *
1053*c83a76b0SSuyog Pawar **************************************************************************
1054*c83a76b0SSuyog Pawar */
ihevce_dmgr_map_chk_sync(void * pv_dep_mngr_state,WORD32 thrd_id,WORD32 offset_x,WORD32 offset_y,WORD32 i4_sr_ctb_x,WORD32 i4_sr_ctb_y)1055*c83a76b0SSuyog Pawar WORD32 ihevce_dmgr_map_chk_sync(
1056*c83a76b0SSuyog Pawar     void *pv_dep_mngr_state,
1057*c83a76b0SSuyog Pawar     WORD32 thrd_id,
1058*c83a76b0SSuyog Pawar     WORD32 offset_x,
1059*c83a76b0SSuyog Pawar     WORD32 offset_y,
1060*c83a76b0SSuyog Pawar     WORD32 i4_sr_ctb_x,
1061*c83a76b0SSuyog Pawar     WORD32 i4_sr_ctb_y)
1062*c83a76b0SSuyog Pawar {
1063*c83a76b0SSuyog Pawar     dep_mngr_state_t *ps_dep_mngr_state;
1064*c83a76b0SSuyog Pawar     volatile WORD8 *pi1_ctb;
1065*c83a76b0SSuyog Pawar     WORD8 *pi1_tile_start;
1066*c83a76b0SSuyog Pawar     WORD32 i4_avail_left, i4_avail_right, i4_avail_top, i4_avail_bot;
1067*c83a76b0SSuyog Pawar     WORD32 i4_num_ctb_x, i4_num_ctb_y;
1068*c83a76b0SSuyog Pawar     WORD32 i4_stride;
1069*c83a76b0SSuyog Pawar     WORD32 i4_tile_wd, i4_tile_ht;  //in ctb units
1070*c83a76b0SSuyog Pawar 
1071*c83a76b0SSuyog Pawar     ps_dep_mngr_state = (dep_mngr_state_t *)pv_dep_mngr_state;
1072*c83a76b0SSuyog Pawar 
1073*c83a76b0SSuyog Pawar     i4_tile_wd = ps_dep_mngr_state->i4_num_horz_units - ps_dep_mngr_state->ai4_tile_xtra_ctb[1] -
1074*c83a76b0SSuyog Pawar                  ps_dep_mngr_state->ai4_tile_xtra_ctb[2];
1075*c83a76b0SSuyog Pawar 
1076*c83a76b0SSuyog Pawar     i4_tile_ht = ps_dep_mngr_state->i4_num_vert_units - ps_dep_mngr_state->ai4_tile_xtra_ctb[0] -
1077*c83a76b0SSuyog Pawar                  ps_dep_mngr_state->ai4_tile_xtra_ctb[3];
1078*c83a76b0SSuyog Pawar 
1079*c83a76b0SSuyog Pawar     i4_stride = ps_dep_mngr_state->i4_num_horz_units;
1080*c83a76b0SSuyog Pawar 
1081*c83a76b0SSuyog Pawar     /* Sanity Checks, confirm if ctb offsets are within tiles */
1082*c83a76b0SSuyog Pawar     ASSERT(offset_x >= 0);
1083*c83a76b0SSuyog Pawar     ASSERT(offset_y >= 0);
1084*c83a76b0SSuyog Pawar     ASSERT(offset_x < i4_tile_wd);
1085*c83a76b0SSuyog Pawar     ASSERT(offset_y < i4_tile_ht);
1086*c83a76b0SSuyog Pawar 
1087*c83a76b0SSuyog Pawar     pi1_tile_start = (WORD8 *)ps_dep_mngr_state->pv_units_prcsd_in_row;
1088*c83a76b0SSuyog Pawar     pi1_ctb = (volatile WORD8 *)pi1_tile_start;
1089*c83a76b0SSuyog Pawar 
1090*c83a76b0SSuyog Pawar     if(ps_dep_mngr_state->ai4_tile_xtra_ctb[0])
1091*c83a76b0SSuyog Pawar     {
1092*c83a76b0SSuyog Pawar         i4_avail_top = i4_sr_ctb_y;
1093*c83a76b0SSuyog Pawar     }
1094*c83a76b0SSuyog Pawar     else
1095*c83a76b0SSuyog Pawar     {
1096*c83a76b0SSuyog Pawar         i4_avail_top = MIN(i4_sr_ctb_y, offset_y);
1097*c83a76b0SSuyog Pawar     }
1098*c83a76b0SSuyog Pawar 
1099*c83a76b0SSuyog Pawar     if(ps_dep_mngr_state->ai4_tile_xtra_ctb[1])
1100*c83a76b0SSuyog Pawar     {
1101*c83a76b0SSuyog Pawar         i4_avail_left = i4_sr_ctb_x;
1102*c83a76b0SSuyog Pawar     }
1103*c83a76b0SSuyog Pawar     else
1104*c83a76b0SSuyog Pawar     {
1105*c83a76b0SSuyog Pawar         i4_avail_left = MIN(i4_sr_ctb_x, offset_x);
1106*c83a76b0SSuyog Pawar     }
1107*c83a76b0SSuyog Pawar 
1108*c83a76b0SSuyog Pawar     if(ps_dep_mngr_state->ai4_tile_xtra_ctb[2])
1109*c83a76b0SSuyog Pawar     {
1110*c83a76b0SSuyog Pawar         i4_avail_right = i4_sr_ctb_x;
1111*c83a76b0SSuyog Pawar     }
1112*c83a76b0SSuyog Pawar     else
1113*c83a76b0SSuyog Pawar     {
1114*c83a76b0SSuyog Pawar         i4_avail_right = MIN(i4_sr_ctb_x, (i4_tile_wd - offset_x - 1));
1115*c83a76b0SSuyog Pawar     }
1116*c83a76b0SSuyog Pawar 
1117*c83a76b0SSuyog Pawar     if(ps_dep_mngr_state->ai4_tile_xtra_ctb[3])
1118*c83a76b0SSuyog Pawar     {
1119*c83a76b0SSuyog Pawar         i4_avail_bot = i4_sr_ctb_y;
1120*c83a76b0SSuyog Pawar     }
1121*c83a76b0SSuyog Pawar     else
1122*c83a76b0SSuyog Pawar     {
1123*c83a76b0SSuyog Pawar         i4_avail_bot = MIN(i4_sr_ctb_y, (i4_tile_ht - offset_y - 1));
1124*c83a76b0SSuyog Pawar     }
1125*c83a76b0SSuyog Pawar 
1126*c83a76b0SSuyog Pawar     i4_num_ctb_x = (i4_avail_left + 1 + i4_avail_right);
1127*c83a76b0SSuyog Pawar     i4_num_ctb_y = (i4_avail_top + 1 + i4_avail_bot);
1128*c83a76b0SSuyog Pawar 
1129*c83a76b0SSuyog Pawar     /* Point to the start of the search-area */
1130*c83a76b0SSuyog Pawar     pi1_ctb += ((offset_y - i4_avail_top) * i4_stride + (offset_x - i4_avail_left));
1131*c83a76b0SSuyog Pawar 
1132*c83a76b0SSuyog Pawar     /* Check whether Dep. is met */
1133*c83a76b0SSuyog Pawar     while(1)
1134*c83a76b0SSuyog Pawar     {
1135*c83a76b0SSuyog Pawar         if(1 == ihevce_dmgr_map_chk((WORD8 *)pi1_ctb, i4_num_ctb_x, i4_num_ctb_y, i4_stride))
1136*c83a76b0SSuyog Pawar         {
1137*c83a76b0SSuyog Pawar             break;
1138*c83a76b0SSuyog Pawar         }
1139*c83a76b0SSuyog Pawar         else
1140*c83a76b0SSuyog Pawar         {
1141*c83a76b0SSuyog Pawar             if(1 == ps_dep_mngr_state->i1_sem_enable)
1142*c83a76b0SSuyog Pawar             {
1143*c83a76b0SSuyog Pawar                 osal_sem_wait(ps_dep_mngr_state->ppv_thrd_sem_handles[thrd_id]);
1144*c83a76b0SSuyog Pawar             }
1145*c83a76b0SSuyog Pawar         }
1146*c83a76b0SSuyog Pawar     }
1147*c83a76b0SSuyog Pawar 
1148*c83a76b0SSuyog Pawar     return 0;
1149*c83a76b0SSuyog Pawar }
1150*c83a76b0SSuyog Pawar 
1151*c83a76b0SSuyog Pawar /*!
1152*c83a76b0SSuyog Pawar **************************************************************************
1153*c83a76b0SSuyog Pawar * \if Function name : ihevce_dmgr_map_set_sync \endif
1154*c83a76b0SSuyog Pawar *
1155*c83a76b0SSuyog Pawar * \brief
1156*c83a76b0SSuyog Pawar *    This function sets the dependency and wakes up the proper semaphores
1157*c83a76b0SSuyog Pawar *    to start processing.
1158*c83a76b0SSuyog Pawar *
1159*c83a76b0SSuyog Pawar * \param[in]  pv_dep_mngr_state  : Pointer to Sync Manager handle.
1160*c83a76b0SSuyog Pawar * \param[in]  offset_x           : Offset of current CTB in Tile(ctb unit)
1161*c83a76b0SSuyog Pawar * \param[in]  offset_y           : Offset of current CTB in Tile(ctb unit)
1162*c83a76b0SSuyog Pawar *
1163*c83a76b0SSuyog Pawar * \return
1164*c83a76b0SSuyog Pawar *    0 on Success and -1 on error
1165*c83a76b0SSuyog Pawar *
1166*c83a76b0SSuyog Pawar * \author
1167*c83a76b0SSuyog Pawar *  Ittiam
1168*c83a76b0SSuyog Pawar *
1169*c83a76b0SSuyog Pawar **************************************************************************
1170*c83a76b0SSuyog Pawar */
ihevce_dmgr_map_set_sync(void * pv_dep_mngr_state,WORD32 offset_x,WORD32 offset_y,WORD32 i4_map_value)1171*c83a76b0SSuyog Pawar WORD32 ihevce_dmgr_map_set_sync(
1172*c83a76b0SSuyog Pawar     void *pv_dep_mngr_state, WORD32 offset_x, WORD32 offset_y, WORD32 i4_map_value)
1173*c83a76b0SSuyog Pawar {
1174*c83a76b0SSuyog Pawar     dep_mngr_state_t *ps_dep_mngr_state;
1175*c83a76b0SSuyog Pawar     WORD8 *pi1_tile_start;
1176*c83a76b0SSuyog Pawar     WORD32 map_stride;
1177*c83a76b0SSuyog Pawar 
1178*c83a76b0SSuyog Pawar     ps_dep_mngr_state = (dep_mngr_state_t *)pv_dep_mngr_state;
1179*c83a76b0SSuyog Pawar 
1180*c83a76b0SSuyog Pawar     /* Sanity Checks */
1181*c83a76b0SSuyog Pawar     ASSERT(offset_x >= (-ps_dep_mngr_state->ai4_tile_xtra_ctb[1]));
1182*c83a76b0SSuyog Pawar     ASSERT(offset_y >= (-ps_dep_mngr_state->ai4_tile_xtra_ctb[0]));
1183*c83a76b0SSuyog Pawar 
1184*c83a76b0SSuyog Pawar     ASSERT(
1185*c83a76b0SSuyog Pawar         offset_x <
1186*c83a76b0SSuyog Pawar         (ps_dep_mngr_state->i4_num_horz_units - ps_dep_mngr_state->ai4_tile_xtra_ctb[1]));
1187*c83a76b0SSuyog Pawar 
1188*c83a76b0SSuyog Pawar     ASSERT(
1189*c83a76b0SSuyog Pawar         offset_y <
1190*c83a76b0SSuyog Pawar         (ps_dep_mngr_state->i4_num_vert_units - ps_dep_mngr_state->ai4_tile_xtra_ctb[0]));
1191*c83a76b0SSuyog Pawar 
1192*c83a76b0SSuyog Pawar     DATA_SYNC();
1193*c83a76b0SSuyog Pawar 
1194*c83a76b0SSuyog Pawar     map_stride = ps_dep_mngr_state->i4_num_horz_units;
1195*c83a76b0SSuyog Pawar 
1196*c83a76b0SSuyog Pawar     pi1_tile_start = (WORD8 *)ps_dep_mngr_state->pv_units_prcsd_in_row;
1197*c83a76b0SSuyog Pawar 
1198*c83a76b0SSuyog Pawar     /* Set the flag to indicate that this CTB has been processed */
1199*c83a76b0SSuyog Pawar     *(pi1_tile_start + offset_y * map_stride + offset_x) = (WORD8)i4_map_value;
1200*c83a76b0SSuyog Pawar 
1201*c83a76b0SSuyog Pawar     if(1 == ps_dep_mngr_state->i1_sem_enable)
1202*c83a76b0SSuyog Pawar     {
1203*c83a76b0SSuyog Pawar         WORD32 wait_thrd_id;
1204*c83a76b0SSuyog Pawar 
1205*c83a76b0SSuyog Pawar         /* Post on threads waiting on the current row */
1206*c83a76b0SSuyog Pawar         for(wait_thrd_id = 0; wait_thrd_id < ps_dep_mngr_state->i4_num_thrds; wait_thrd_id++)
1207*c83a76b0SSuyog Pawar         {
1208*c83a76b0SSuyog Pawar             /* Post on the semaphore */
1209*c83a76b0SSuyog Pawar             /* Map-mode: semaphore post is unconditionally done on all threads */
1210*c83a76b0SSuyog Pawar             osal_sem_post(ps_dep_mngr_state->ppv_thrd_sem_handles[wait_thrd_id]);
1211*c83a76b0SSuyog Pawar         }
1212*c83a76b0SSuyog Pawar     }
1213*c83a76b0SSuyog Pawar 
1214*c83a76b0SSuyog Pawar     return 0;
1215*c83a76b0SSuyog Pawar }
1216