Lines Matching defs:ipa

17 #include "ipa.h"
148 ipa_table_mem(struct ipa *ipa, bool filter, bool hashed, bool ipv6)
161 return ipa_mem_find(ipa, mem_id);
164 bool ipa_filtered_valid(struct ipa *ipa, u64 filtered)
166 struct device *dev = ipa->dev;
176 if (count > ipa->filter_count) {
178 count, ipa->filter_count);
187 static dma_addr_t ipa_table_addr(struct ipa *ipa, bool filter_mask, u16 count)
194 WARN_ON(count > max_t(u32, ipa->filter_count, ipa->route_count));
199 return ipa->table_addr + skip * sizeof(*ipa->table_virt);
205 struct ipa *ipa = container_of(trans->gsi, struct ipa, gsi);
212 mem = ipa_table_mem(ipa, filter, hashed, ipv6);
221 addr = ipa_table_addr(ipa, false, count);
231 ipa_filter_reset_table(struct ipa *ipa, bool hashed, bool ipv6, bool modem)
233 u64 ep_mask = ipa->filtered;
237 trans = ipa_cmd_trans_alloc(ipa, hweight64(ep_mask));
239 dev_err(ipa->dev, "no transaction for %s filter reset\n",
251 endpoint = &ipa->endpoint[endpoint_id];
267 static int ipa_filter_reset(struct ipa *ipa, bool modem)
271 ret = ipa_filter_reset_table(ipa, false, false, modem);
275 ret = ipa_filter_reset_table(ipa, false, true, modem);
276 if (ret || !ipa_table_hash_support(ipa))
279 ret = ipa_filter_reset_table(ipa, true, false, modem);
283 return ipa_filter_reset_table(ipa, true, true, modem);
290 static int ipa_route_reset(struct ipa *ipa, bool modem)
292 bool hash_support = ipa_table_hash_support(ipa);
293 u32 modem_route_count = ipa->modem_route_count;
298 trans = ipa_cmd_trans_alloc(ipa, hash_support ? 4 : 2);
300 dev_err(ipa->dev, "no transaction for %s route reset\n",
310 count = ipa->route_count - modem_route_count;
326 void ipa_table_reset(struct ipa *ipa, bool modem)
328 struct device *dev = ipa->dev;
335 ret = ipa_filter_reset(ipa, modem);
340 ret = ipa_route_reset(ipa, modem);
346 int ipa_table_hash_flush(struct ipa *ipa)
352 if (!ipa_table_hash_support(ipa))
355 trans = ipa_cmd_trans_alloc(ipa, 1);
357 dev_err(ipa->dev, "no transaction for hash flush\n");
361 if (ipa->version < IPA_VERSION_5_0) {
362 reg = ipa_reg(ipa, FILT_ROUT_HASH_FLUSH);
369 reg = ipa_reg(ipa, FILT_ROUT_CACHE_FLUSH);
385 struct ipa *ipa = container_of(trans->gsi, struct ipa, gsi);
405 mem = ipa_table_mem(ipa, filter, false, ipv6);
406 hash_mem = ipa_table_mem(ipa, filter, true, ipv6);
416 count = 1 + hweight64(ipa->filtered);
428 addr = ipa_table_addr(ipa, filter, count);
429 hash_addr = ipa_table_addr(ipa, filter, hash_count);
440 ipa->zero_addr, true);
448 ipa->zero_addr, true);
451 int ipa_table_setup(struct ipa *ipa)
468 trans = ipa_cmd_trans_alloc(ipa, 8);
470 dev_err(ipa->dev, "no transaction for table setup\n");
494 struct ipa *ipa = endpoint->ipa;
499 if (ipa->version < IPA_VERSION_5_0) {
500 reg = ipa_reg(ipa, ENDP_FILTER_ROUTER_HSH_CFG);
503 val = ioread32(endpoint->ipa->reg_virt + offset);
509 reg = ipa_reg(ipa, ENDP_FILTER_CACHE_CFG);
516 iowrite32(val, endpoint->ipa->reg_virt + offset);
520 static void ipa_filter_config(struct ipa *ipa, bool modem)
523 u64 ep_mask = ipa->filtered;
525 if (!ipa_table_hash_support(ipa))
534 endpoint = &ipa->endpoint[endpoint_id];
540 static bool ipa_route_id_modem(struct ipa *ipa, u32 route_id)
542 return route_id < ipa->modem_route_count;
547 * @ipa: IPA pointer
552 static void ipa_route_tuple_zero(struct ipa *ipa, u32 route_id)
558 if (ipa->version < IPA_VERSION_5_0) {
559 reg = ipa_reg(ipa, ENDP_FILTER_ROUTER_HSH_CFG);
562 val = ioread32(ipa->reg_virt + offset);
568 reg = ipa_reg(ipa, ENDP_ROUTER_CACHE_CFG);
575 iowrite32(val, ipa->reg_virt + offset);
579 static void ipa_route_config(struct ipa *ipa, bool modem)
583 if (!ipa_table_hash_support(ipa))
586 for (route_id = 0; route_id < ipa->route_count; route_id++)
587 if (ipa_route_id_modem(ipa, route_id) == modem)
588 ipa_route_tuple_zero(ipa, route_id);
592 void ipa_table_config(struct ipa *ipa)
594 ipa_filter_config(ipa, false);
595 ipa_filter_config(ipa, true);
596 ipa_route_config(ipa, false);
597 ipa_route_config(ipa, true);
603 bool ipa_table_mem_valid(struct ipa *ipa, bool filter)
605 bool hash_support = ipa_table_hash_support(ipa);
615 mem_ipv4 = ipa_table_mem(ipa, filter, false, false);
619 mem_ipv6 = ipa_table_mem(ipa, filter, false, true);
631 ipa->filter_count = count - 1; /* Filter map in first entry */
633 ipa->route_count = count;
636 if (!ipa_cmd_table_init_valid(ipa, mem_ipv4, !filter))
644 if (count < 1 + hweight64(ipa->filtered))
650 if (count < ipa->modem_route_count + 1)
659 mem_hashed = ipa_table_mem(ipa, filter, true, false);
669 mem_hashed = ipa_table_mem(ipa, filter, true, true);
712 int ipa_table_init(struct ipa *ipa)
714 struct device *dev = ipa->dev;
723 count = max_t(u32, ipa->filter_count, ipa->route_count);
736 ipa->table_virt = virt;
737 ipa->table_addr = addr;
748 if (ipa->version < IPA_VERSION_5_0)
749 *virt++ = cpu_to_le64(ipa->filtered << 1);
751 *virt++ = cpu_to_le64(ipa->filtered);
761 void ipa_table_exit(struct ipa *ipa)
763 u32 count = max_t(u32, 1 + ipa->filter_count, ipa->route_count);
764 struct device *dev = ipa->dev;
769 dma_free_coherent(dev, size, ipa->table_virt, ipa->table_addr);
770 ipa->table_addr = 0;
771 ipa->table_virt = NULL;