1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Support for Intel Camera Imaging ISP subsystem.
4  * Copyright (c) 2010 - 2015, Intel Corporation.
5  */
6 
7 #include "system_global.h"
8 
9 
10 #include "assert_support.h"
11 #include "platform_support.h"
12 #include "ia_css_isys.h"
13 #include "bitop_support.h"
14 #include "isys_stream2mmio_rmgr.h"
15 
16 static isys_stream2mmio_rsrc_t	isys_stream2mmio_rsrc[N_STREAM2MMIO_ID];
17 
ia_css_isys_stream2mmio_sid_rmgr_init(void)18 void ia_css_isys_stream2mmio_sid_rmgr_init(void)
19 {
20 	memset(isys_stream2mmio_rsrc, 0, sizeof(isys_stream2mmio_rsrc));
21 }
22 
ia_css_isys_stream2mmio_sid_rmgr_uninit(void)23 void ia_css_isys_stream2mmio_sid_rmgr_uninit(void)
24 {
25 	memset(isys_stream2mmio_rsrc, 0, sizeof(isys_stream2mmio_rsrc));
26 }
27 
ia_css_isys_stream2mmio_sid_rmgr_acquire(stream2mmio_ID_t stream2mmio,stream2mmio_sid_ID_t * sid)28 bool ia_css_isys_stream2mmio_sid_rmgr_acquire(
29     stream2mmio_ID_t	stream2mmio,
30     stream2mmio_sid_ID_t	*sid)
31 {
32 	bool retval = false;
33 	stream2mmio_sid_ID_t max_sid;
34 	isys_stream2mmio_rsrc_t *cur_rsrc = NULL;
35 	stream2mmio_sid_ID_t	i;
36 
37 	assert(stream2mmio < N_STREAM2MMIO_ID);
38 	assert(sid);
39 
40 	if ((stream2mmio < N_STREAM2MMIO_ID) && (sid)) {
41 		max_sid = N_STREAM2MMIO_SID_PROCS[stream2mmio];
42 		cur_rsrc = &isys_stream2mmio_rsrc[stream2mmio];
43 
44 		if (cur_rsrc->num_active < max_sid) {
45 			for (i = STREAM2MMIO_SID0_ID; i < max_sid; i++) {
46 				if (bitop_getbit(cur_rsrc->active_table, i) == 0) {
47 					bitop_setbit(cur_rsrc->active_table, i);
48 					*sid = i;
49 					cur_rsrc->num_active++;
50 					retval = true;
51 					break;
52 				}
53 			}
54 		}
55 	}
56 	return retval;
57 }
58 
ia_css_isys_stream2mmio_sid_rmgr_release(stream2mmio_ID_t stream2mmio,stream2mmio_sid_ID_t * sid)59 void ia_css_isys_stream2mmio_sid_rmgr_release(
60     stream2mmio_ID_t	stream2mmio,
61     stream2mmio_sid_ID_t	*sid)
62 {
63 	stream2mmio_sid_ID_t max_sid;
64 	isys_stream2mmio_rsrc_t *cur_rsrc = NULL;
65 
66 	assert(stream2mmio < N_STREAM2MMIO_ID);
67 	assert(sid);
68 
69 	if ((stream2mmio < N_STREAM2MMIO_ID) && (sid)) {
70 		max_sid = N_STREAM2MMIO_SID_PROCS[stream2mmio];
71 		cur_rsrc = &isys_stream2mmio_rsrc[stream2mmio];
72 		if ((*sid < max_sid) && (cur_rsrc->num_active > 0)) {
73 			if (bitop_getbit(cur_rsrc->active_table, *sid) == 1) {
74 				bitop_clearbit(cur_rsrc->active_table, *sid);
75 				cur_rsrc->num_active--;
76 			}
77 		}
78 	}
79 }
80