diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c b/drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c index 0f95e4dc65..de0d68fad5 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c @@ -616,11 +616,20 @@ static int __ipa_add_hdr(struct ipa_hdr_add *hdr, bool user, mem_size = IPA_MEM_PART(apps_hdr_size_ddr); entry->is_lcl = false; } else { - /* if the entry is intended to be in DDR, - and there is no space -> error */ - IPAERR("No space in DDR header buffer! Requested: %d Left: %d\n", - ipa_hdr_bin_sz[bin], mem_size - htbl->end); - goto bad_hdr_len; + /* check if DDR free list */ + if (list_empty(&htbl->head_free_offset_list[bin])) { + IPAERR("No space in DDR header buffer! Requested: %d Left: %d name %s, end %d\n", + ipa_hdr_bin_sz[bin], mem_size - htbl->end, entry->name, htbl->end); + goto bad_hdr_len; + } else { + /* get the first free slot */ + offset = list_first_entry(&htbl->head_free_offset_list[bin], + struct ipa_hdr_offset_entry, link); + list_move(&offset->link, &htbl->head_offset_list[bin]); + entry->offset_entry = offset; + offset->ipacm_installed = user; + goto free_list; + } } } offset = kmem_cache_zalloc(ipa3_ctx->hdr_offset_cache, @@ -650,6 +659,8 @@ static int __ipa_add_hdr(struct ipa_hdr_add *hdr, bool user, offset->ipacm_installed = user; } +free_list: + list_add(&entry->link, &htbl->head_hdr_entry_list); htbl->hdr_cnt++; IPADBG("add hdr of sz=%d hdr_cnt=%d ofst=%d to %s table\n",