32 #include <linux/types.h>
33 #include <linux/list.h>
49 #define NEXT_PA(pnode) (pnode->pa + pnode->size)
52 #define DSPPA2GPPPA(base, x, y) ((x)+(y))
53 #define GPPPA2DSPPA(base, x, y) ((x)-(y))
111 static struct cmm_attrs cmm_dfltalctattrs = {
135 static void add_to_free_list(
struct cmm_allocator *allocator,
145 static void un_register_gppsm_seg(
struct cmm_allocator *psma);
159 struct cmm_attrs *pattrs,
void **pp_buf_va)
171 pattrs = &cmm_dfltalctattrs;
173 if (pp_buf_va !=
NULL)
176 if (cmm_mgr_obj && (usize != 0)) {
181 get_allocator(cmm_mgr_obj, pattrs->
seg_id);
188 pnode = get_free_block(allocator, usize);
191 delta_size = (pnode->
size - usize);
196 get_node(cmm_mgr_obj, pnode->
pa + usize,
200 add_to_free_list(allocator, new_node);
213 buf_pa = (
void *)pnode->
pa;
215 pbyte = (
u8 *) pnode->
va;
216 for (cnt = 0; cnt < (
s32) usize; cnt++, pbyte++)
219 if (pp_buf_va !=
NULL) {
221 *pp_buf_va = (
void *)pnode->
va;
247 if (mgr_attrts ==
NULL)
248 mgr_attrts = &cmm_dfltmgrattrs;
257 *ph_cmm_mgr = cmm_obj;
295 un_register_gppsm_seg
329 if (ul_seg_id == 0) {
330 pattrs = &cmm_dfltalctattrs;
331 ul_seg_id = pattrs->
seg_id;
333 if (!hcmm_mgr || !(ul_seg_id > 0)) {
338 allocator = get_allocator(cmm_mgr_obj, ul_seg_id);
344 if (curr->
pa == (
u32) buf_pa) {
346 add_to_free_list(allocator, curr);
367 if (hprocessor !=
NULL)
405 altr = get_allocator(cmm_mgr_obj, ul_seg);
409 cmm_info_obj->
seg_info[ul_seg - 1].seg_base_pa =
411 cmm_info_obj->
seg_info[ul_seg - 1].total_seg_size =
413 cmm_info_obj->
seg_info[ul_seg - 1].gpp_base_pa =
415 cmm_info_obj->
seg_info[ul_seg - 1].gpp_size =
417 cmm_info_obj->
seg_info[ul_seg - 1].dsp_base_va =
419 cmm_info_obj->
seg_info[ul_seg - 1].dsp_size =
421 cmm_info_obj->
seg_info[ul_seg - 1].seg_base_va =
423 cmm_info_obj->
seg_info[ul_seg - 1].in_use_cnt = 0;
427 cmm_info_obj->
seg_info[ul_seg - 1].in_use_cnt++;
441 u32 dw_gpp_base_pa,
u32 ul_size,
442 u32 dsp_addr_offset,
s8 c_factor,
443 u32 dw_dsp_base,
u32 ul_dsp_size,
444 u32 *sgmt_id,
u32 gpp_base_va)
452 dev_dbg(
bridge,
"%s: dw_gpp_base_pa %x ul_size %x dsp_addr_offset %x "
453 "dw_dsp_base %x ul_dsp_size %x gpp_base_va %x\n",
454 __func__, dw_gpp_base_pa, ul_size, dsp_addr_offset,
455 dw_dsp_base, ul_dsp_size, gpp_base_va);
463 slot_seg = get_slot(cmm_mgr_obj);
470 if (ul_size < cmm_mgr_obj->min_block_size) {
495 *sgmt_id = (
u32) slot_seg + 1;
501 new_node = get_node(cmm_mgr_obj, dw_gpp_base_pa,
516 un_register_gppsm_seg(psma);
533 u32 ul_id = ul_seg_id;
553 un_register_gppsm_seg(psma);
576 static void un_register_gppsm_seg(
struct cmm_allocator *psma)
613 if (slot_seg == CMM_MAXGPPSEGS)
638 list_del_init(&pnode->
link);
643 pnode->
size = ul_size;
674 if (usize <= node->
size) {
688 static void add_to_free_list(
struct cmm_allocator *allocator,
694 pr_err(
"%s: failed - node is NULL\n", __func__);
701 delete_node(allocator->
cmm_mgr, node);
708 delete_node(allocator->
cmm_mgr, node);
752 if (xlator_attrs ==
NULL)
753 xlator_attrs = &cmm_dfltxlatorattrs;
756 if (xlator_object !=
NULL) {
757 xlator_object->
cmm_mgr = hcmm_mgr;
764 *xlator = (
struct cmm_xlatorobject *)xlator_object;
818 pr_err(
"%s, line %d: Assertion failed\n",
832 u32 ul_size,
u32 segm_id,
bool set_info)
857 u32 dw_addr_xlate = 0;
876 dw_offset = (
u8 *) paddr - (
u8 *) (allocator->
shm_base -
879 dw_addr_xlate = xlator_obj->
virt_base + dw_offset;
881 if ((dw_addr_xlate < xlator_obj->
virt_base) ||
896 dw_addr_xlate = (
u32) paddr;
915 return (
void *)dw_addr_xlate;