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