1 /****************************************************************************
3 * Copyright (c) 2014 - 2016 Samsung Electronics Co., Ltd. All rights reserved
5 ****************************************************************************/
8 #include <linux/kernel.h>
9 #include <linux/printk.h>
10 #include <linux/slab.h>
11 #include <linux/mutex.h>
12 #include <scsc/scsc_logring.h>
13 #include "scsc_mif_abs.h"
16 #include "mifmboxman.h"
18 int mifmboxman_init(struct mifmboxman
*mbox
)
23 mutex_init(&mbox
->lock
);
24 mbox
->mbox_free
= MIFMBOX_NUM
;
26 bitmap_zero(mbox
->bitmap
, MIFMBOX_NUM
);
31 bool mifmboxman_alloc_mboxes(struct mifmboxman
*mbox
, int n
, int *first_mbox_index
)
33 unsigned int index
= 0;
34 unsigned int available
;
37 mutex_lock(&mbox
->lock
);
39 if ((n
> MIFMBOX_NUM
) || (n
== 0) || !mbox
->in_use
)
42 while (index
<= (MIFMBOX_NUM
- n
)) {
45 /* Search consecutive blocks */
46 for (i
= 0; i
< n
; i
++) {
47 if (test_bit((i
+ index
), mbox
->bitmap
))
53 *first_mbox_index
= index
;
55 for (i
= 0; i
< n
; i
++)
56 set_bit(index
++, mbox
->bitmap
);
61 index
= index
+ available
+ 1;
64 SCSC_TAG_ERR(MIF
, "Error allocating mbox\n");
65 mutex_unlock(&mbox
->lock
);
68 mutex_unlock(&mbox
->lock
);
73 void mifmboxman_free_mboxes(struct mifmboxman
*mbox
, int first_mbox_index
, int n
)
78 mutex_lock(&mbox
->lock
);
79 if ((n
> MIFMBOX_NUM
) ||
80 ((n
+ first_mbox_index
) > MIFMBOX_NUM
) ||
85 for (index
= first_mbox_index
; index
< (first_mbox_index
+ n
); index
++)
86 if (test_bit(index
, mbox
->bitmap
)) {
87 clear_bit(index
, mbox
->bitmap
);
91 mbox
->mbox_free
+= total_free
;
92 mutex_unlock(&mbox
->lock
);
95 SCSC_TAG_ERR(MIF
, "Error freeing mbox\n");
96 mutex_unlock(&mbox
->lock
);
99 u32
*mifmboxman_get_mbox_ptr(struct mifmboxman
*mbox
, struct scsc_mif_abs
*mif_abs
, int mbox_index
)
101 /* Avoid unused parameter error */
104 return mif_abs
->get_mbox_ptr(mif_abs
, mbox_index
);
108 int mifmboxman_deinit(struct mifmboxman
*mbox
)
110 mutex_lock(&mbox
->lock
);
113 mbox
->in_use
= false;
114 mutex_unlock(&mbox
->lock
);