Lines Matching refs:ipa

16 #include "ipa.h"
30 const struct ipa_mem *ipa_mem_find(struct ipa *ipa, enum ipa_mem_id mem_id)
34 for (i = 0; i < ipa->mem_count; i++) {
35 const struct ipa_mem *mem = &ipa->mem[i];
48 struct ipa *ipa = container_of(trans->gsi, struct ipa, gsi);
49 const struct ipa_mem *mem = ipa_mem_find(ipa, mem_id);
50 dma_addr_t addr = ipa->zero_addr;
60 * @ipa: IPA pointer
76 int ipa_mem_setup(struct ipa *ipa)
78 dma_addr_t addr = ipa->zero_addr;
89 trans = ipa_cmd_trans_alloc(ipa, 4);
91 dev_err(ipa->dev, "no transaction for memory setup\n");
99 mem = ipa_mem_find(ipa, IPA_MEM_MODEM_HEADER);
102 mem = ipa_mem_find(ipa, IPA_MEM_AP_HEADER);
115 mem = ipa_mem_find(ipa, IPA_MEM_MODEM_PROC_CTX);
116 offset = ipa->mem_offset + mem->offset;
118 reg = ipa_reg(ipa, LOCAL_PKT_PROC_CNTXT);
120 iowrite32(val, ipa->reg_virt + reg_offset(reg));
126 static bool ipa_mem_id_valid(struct ipa *ipa, enum ipa_mem_id mem_id)
128 enum ipa_version version = ipa->version;
187 static bool ipa_mem_id_required(struct ipa *ipa, enum ipa_mem_id mem_id)
208 return ipa->version >= IPA_VERSION_4_0;
211 return ipa->version >= IPA_VERSION_4_0 &&
212 ipa->version != IPA_VERSION_5_0;
219 static bool ipa_mem_valid_one(struct ipa *ipa, const struct ipa_mem *mem)
222 struct device *dev = ipa->dev;
226 if (!ipa_mem_id_valid(ipa, mem_id)) {
255 static bool ipa_mem_valid(struct ipa *ipa, const struct ipa_mem_data *mem_data)
258 struct device *dev = ipa->dev;
277 if (!ipa_mem_valid_one(ipa, mem))
283 if (ipa_mem_id_required(ipa, mem_id))
292 static bool ipa_mem_size_valid(struct ipa *ipa)
294 struct device *dev = ipa->dev;
295 u32 limit = ipa->mem_size;
298 for (i = 0; i < ipa->mem_count; i++) {
299 const struct ipa_mem *mem = &ipa->mem[i];
315 * @ipa: IPA pointer
319 int ipa_mem_config(struct ipa *ipa)
321 struct device *dev = ipa->dev;
331 reg = ipa_reg(ipa, SHARED_MEM_SIZE);
332 val = ioread32(ipa->reg_virt + reg_offset(reg));
335 ipa->mem_offset = 8 * reg_decode(reg, MEM_BADDR, val);
341 if (ipa->mem_offset + mem_size < ipa->mem_size) {
344 ipa->mem_size = mem_size;
345 } else if (ipa->mem_offset + mem_size > ipa->mem_size) {
351 if (!ipa_mem_size_valid(ipa))
358 ipa->zero_addr = addr;
359 ipa->zero_virt = virt;
360 ipa->zero_size = IPA_MEM_MAX;
365 for (i = 0; i < ipa->mem_count; i++) {
366 u16 canary_count = ipa->mem[i].canary_count;
373 canary = ipa->mem_virt + ipa->mem_offset + ipa->mem[i].offset;
380 mem = ipa_mem_find(ipa, IPA_MEM_UC_EVENT_RING);
389 dma_free_coherent(dev, IPA_MEM_MAX, ipa->zero_virt, ipa->zero_addr);
395 void ipa_mem_deconfig(struct ipa *ipa)
397 struct device *dev = ipa->dev;
399 dma_free_coherent(dev, ipa->zero_size, ipa->zero_virt, ipa->zero_addr);
400 ipa->zero_size = 0;
401 ipa->zero_virt = NULL;
402 ipa->zero_addr = 0;
407 * @ipa: IPA pointer
415 int ipa_mem_zero_modem(struct ipa *ipa)
422 trans = ipa_cmd_trans_alloc(ipa, 3);
424 dev_err(ipa->dev, "no transaction to zero modem memory\n");
439 * @ipa: IPA pointer
453 static int ipa_imem_init(struct ipa *ipa, unsigned long addr, size_t size)
455 struct device *dev = ipa->dev;
480 ipa->imem_iova = iova;
481 ipa->imem_size = size;
486 static void ipa_imem_exit(struct ipa *ipa)
488 struct device *dev = ipa->dev;
491 if (!ipa->imem_size)
498 size = iommu_unmap(domain, ipa->imem_iova, ipa->imem_size);
499 if (size != ipa->imem_size)
501 size, ipa->imem_size);
506 ipa->imem_size = 0;
507 ipa->imem_iova = 0;
512 * @ipa: IPA pointer
527 static int ipa_smem_init(struct ipa *ipa, u32 item, size_t size)
529 struct device *dev = ipa->dev;
588 ipa->smem_iova = iova;
589 ipa->smem_size = size;
594 static void ipa_smem_exit(struct ipa *ipa)
596 struct device *dev = ipa->dev;
603 size = iommu_unmap(domain, ipa->smem_iova, ipa->smem_size);
604 if (size != ipa->smem_size)
606 size, ipa->smem_size);
612 ipa->smem_size = 0;
613 ipa->smem_iova = 0;
617 int ipa_mem_init(struct ipa *ipa, struct platform_device *pdev,
625 if (!ipa_mem_valid(ipa, mem_data))
628 ipa->mem_count = mem_data->local_count;
629 ipa->mem = mem_data->local;
632 if (!ipa_table_mem_valid(ipa, false))
634 if (!ipa_table_mem_valid(ipa, true))
643 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ipa-shared");
646 "DT error getting \"ipa-shared\" memory property\n");
650 ipa->mem_virt = memremap(res->start, resource_size(res), MEMREMAP_WC);
651 if (!ipa->mem_virt) {
652 dev_err(dev, "unable to remap \"ipa-shared\" memory\n");
656 ipa->mem_addr = res->start;
657 ipa->mem_size = resource_size(res);
659 ret = ipa_imem_init(ipa, mem_data->imem_addr, mem_data->imem_size);
663 ret = ipa_smem_init(ipa, mem_data->smem_id, mem_data->smem_size);
670 ipa_imem_exit(ipa);
672 memunmap(ipa->mem_virt);
678 void ipa_mem_exit(struct ipa *ipa)
680 ipa_smem_exit(ipa);
681 ipa_imem_exit(ipa);
682 memunmap(ipa->mem_virt);