• Home
  • Raw
  • Download

Lines Matching full:ipa

17 #include "ipa.h"
28 * DOC: IPA Filter and Route Tables
30 * The IPA has tables defined in its local (IPA-resident) memory that define
38 * by all IPA hardware (IPA v4.2 doesn't support hashed tables).
41 * an object (such as a route or filter table) in IPA-resident memory must
59 * for endpoint 2, and so on. Space is set aside in IPA local memory to
66 * IPA filtering functionality.
68 * IPA Filter Table
87 * though the AP currently does not use the IPA routing functionality.
89 * IPA Route Table
151 ipa_table_valid_one(struct ipa *ipa, bool route, bool ipv6, bool hashed) in ipa_table_valid_one() argument
153 struct device *dev = &ipa->pdev->dev; in ipa_table_valid_one()
159 mem = hashed ? &ipa->mem[IPA_MEM_V6_ROUTE_HASHED] in ipa_table_valid_one()
160 : &ipa->mem[IPA_MEM_V6_ROUTE]; in ipa_table_valid_one()
162 mem = hashed ? &ipa->mem[IPA_MEM_V4_ROUTE_HASHED] in ipa_table_valid_one()
163 : &ipa->mem[IPA_MEM_V4_ROUTE]; in ipa_table_valid_one()
167 mem = hashed ? &ipa->mem[IPA_MEM_V6_FILTER_HASHED] in ipa_table_valid_one()
168 : &ipa->mem[IPA_MEM_V6_FILTER]; in ipa_table_valid_one()
170 mem = hashed ? &ipa->mem[IPA_MEM_V4_FILTER_HASHED] in ipa_table_valid_one()
171 : &ipa->mem[IPA_MEM_V4_FILTER]; in ipa_table_valid_one()
175 if (!ipa_cmd_table_valid(ipa, mem, route, ipv6, hashed)) in ipa_table_valid_one()
194 bool ipa_table_valid(struct ipa *ipa) in ipa_table_valid() argument
198 valid = valid && ipa_table_valid_one(ipa, false, false, false); in ipa_table_valid()
199 valid = valid && ipa_table_valid_one(ipa, false, false, true); in ipa_table_valid()
200 valid = valid && ipa_table_valid_one(ipa, false, true, false); in ipa_table_valid()
201 valid = valid && ipa_table_valid_one(ipa, false, true, true); in ipa_table_valid()
202 valid = valid && ipa_table_valid_one(ipa, true, false, false); in ipa_table_valid()
203 valid = valid && ipa_table_valid_one(ipa, true, false, true); in ipa_table_valid()
204 valid = valid && ipa_table_valid_one(ipa, true, true, false); in ipa_table_valid()
205 valid = valid && ipa_table_valid_one(ipa, true, true, true); in ipa_table_valid()
210 bool ipa_filter_map_valid(struct ipa *ipa, u32 filter_map) in ipa_filter_map_valid() argument
212 struct device *dev = &ipa->pdev->dev; in ipa_filter_map_valid()
241 static dma_addr_t ipa_table_addr(struct ipa *ipa, bool filter_mask, u16 count) in ipa_table_addr() argument
253 return ipa->table_addr + skip * sizeof(*ipa->table_virt); in ipa_table_addr()
259 struct ipa *ipa = container_of(trans->gsi, struct ipa, gsi); in ipa_table_reset_add() local
273 addr = ipa_table_addr(ipa, false, count); in ipa_table_reset_add()
283 ipa_filter_reset_table(struct ipa *ipa, const struct ipa_mem *mem, bool modem) in ipa_filter_reset_table() argument
285 u32 ep_mask = ipa->filter_map; in ipa_filter_reset_table()
293 trans = ipa_cmd_trans_alloc(ipa, count); in ipa_filter_reset_table()
295 dev_err(&ipa->pdev->dev, in ipa_filter_reset_table()
308 endpoint = &ipa->endpoint[endpoint_id]; in ipa_filter_reset_table()
324 static int ipa_filter_reset(struct ipa *ipa, bool modem) in ipa_filter_reset() argument
328 ret = ipa_filter_reset_table(ipa, &ipa->mem[IPA_MEM_V4_FILTER], modem); in ipa_filter_reset()
332 ret = ipa_filter_reset_table(ipa, &ipa->mem[IPA_MEM_V4_FILTER_HASHED], in ipa_filter_reset()
337 ret = ipa_filter_reset_table(ipa, &ipa->mem[IPA_MEM_V6_FILTER], modem); in ipa_filter_reset()
340 ret = ipa_filter_reset_table(ipa, &ipa->mem[IPA_MEM_V6_FILTER_HASHED], in ipa_filter_reset()
350 static int ipa_route_reset(struct ipa *ipa, bool modem) in ipa_route_reset() argument
356 trans = ipa_cmd_trans_alloc(ipa, 4); in ipa_route_reset()
358 dev_err(&ipa->pdev->dev, in ipa_route_reset()
373 &ipa->mem[IPA_MEM_V4_ROUTE]); in ipa_route_reset()
375 &ipa->mem[IPA_MEM_V4_ROUTE_HASHED]); in ipa_route_reset()
378 &ipa->mem[IPA_MEM_V6_ROUTE]); in ipa_route_reset()
380 &ipa->mem[IPA_MEM_V6_ROUTE_HASHED]); in ipa_route_reset()
387 void ipa_table_reset(struct ipa *ipa, bool modem) in ipa_table_reset() argument
389 struct device *dev = &ipa->pdev->dev; in ipa_table_reset()
396 ret = ipa_filter_reset(ipa, modem); in ipa_table_reset()
401 ret = ipa_route_reset(ipa, modem); in ipa_table_reset()
407 int ipa_table_hash_flush(struct ipa *ipa) in ipa_table_hash_flush() argument
409 u32 offset = ipa_reg_filt_rout_hash_flush_offset(ipa->version); in ipa_table_hash_flush()
413 /* IPA version 4.2 does not support hashed tables */ in ipa_table_hash_flush()
414 if (ipa->version == IPA_VERSION_4_2) in ipa_table_hash_flush()
417 trans = ipa_cmd_trans_alloc(ipa, 1); in ipa_table_hash_flush()
419 dev_err(&ipa->pdev->dev, "no transaction for hash flush\n"); in ipa_table_hash_flush()
438 struct ipa *ipa = container_of(trans->gsi, struct ipa, gsi); in ipa_table_init_add() local
453 count = 1 + hweight32(ipa->filter_map); in ipa_table_init_add()
462 addr = ipa_table_addr(ipa, filter, count); in ipa_table_init_add()
463 hash_addr = ipa_table_addr(ipa, filter, hash_count); in ipa_table_init_add()
469 int ipa_table_setup(struct ipa *ipa) in ipa_table_setup() argument
473 trans = ipa_cmd_trans_alloc(ipa, 4); in ipa_table_setup()
475 dev_err(&ipa->pdev->dev, "no transaction for table setup\n"); in ipa_table_setup()
480 &ipa->mem[IPA_MEM_V4_ROUTE], in ipa_table_setup()
481 &ipa->mem[IPA_MEM_V4_ROUTE_HASHED]); in ipa_table_setup()
484 &ipa->mem[IPA_MEM_V6_ROUTE], in ipa_table_setup()
485 &ipa->mem[IPA_MEM_V6_ROUTE_HASHED]); in ipa_table_setup()
488 &ipa->mem[IPA_MEM_V4_FILTER], in ipa_table_setup()
489 &ipa->mem[IPA_MEM_V4_FILTER_HASHED]); in ipa_table_setup()
492 &ipa->mem[IPA_MEM_V6_FILTER], in ipa_table_setup()
493 &ipa->mem[IPA_MEM_V6_FILTER_HASHED]); in ipa_table_setup()
500 void ipa_table_teardown(struct ipa *ipa) in ipa_table_teardown() argument
520 val = ioread32(endpoint->ipa->reg_virt + offset); in ipa_filter_tuple_zero()
525 iowrite32(val, endpoint->ipa->reg_virt + offset); in ipa_filter_tuple_zero()
528 static void ipa_filter_config(struct ipa *ipa, bool modem) in ipa_filter_config() argument
531 u32 ep_mask = ipa->filter_map; in ipa_filter_config()
533 /* IPA version 4.2 has no hashed route tables */ in ipa_filter_config()
534 if (ipa->version == IPA_VERSION_4_2) in ipa_filter_config()
543 endpoint = &ipa->endpoint[endpoint_id]; in ipa_filter_config()
549 static void ipa_filter_deconfig(struct ipa *ipa, bool modem) in ipa_filter_deconfig() argument
562 * @ipa: IPA pointer
567 static void ipa_route_tuple_zero(struct ipa *ipa, u32 route_id) in ipa_route_tuple_zero() argument
572 val = ioread32(ipa->reg_virt + offset); in ipa_route_tuple_zero()
577 iowrite32(val, ipa->reg_virt + offset); in ipa_route_tuple_zero()
580 static void ipa_route_config(struct ipa *ipa, bool modem) in ipa_route_config() argument
584 /* IPA version 4.2 has no hashed route tables */ in ipa_route_config()
585 if (ipa->version == IPA_VERSION_4_2) in ipa_route_config()
590 ipa_route_tuple_zero(ipa, route_id); in ipa_route_config()
593 static void ipa_route_deconfig(struct ipa *ipa, bool modem) in ipa_route_deconfig() argument
598 void ipa_table_config(struct ipa *ipa) in ipa_table_config() argument
600 ipa_filter_config(ipa, false); in ipa_table_config()
601 ipa_filter_config(ipa, true); in ipa_table_config()
602 ipa_route_config(ipa, false); in ipa_table_config()
603 ipa_route_config(ipa, true); in ipa_table_config()
606 void ipa_table_deconfig(struct ipa *ipa) in ipa_table_deconfig() argument
608 ipa_route_deconfig(ipa, true); in ipa_table_deconfig()
609 ipa_route_deconfig(ipa, false); in ipa_table_deconfig()
610 ipa_filter_deconfig(ipa, true); in ipa_table_deconfig()
611 ipa_filter_deconfig(ipa, false); in ipa_table_deconfig()
616 * route table data. This is used when initializing or resetting the IPA
632 * Note that the IPA hardware requires a filter or route rule address to be
652 int ipa_table_init(struct ipa *ipa) in ipa_table_init() argument
655 struct device *dev = &ipa->pdev->dev; in ipa_table_init()
663 /* The IPA hardware requires route and filter table rules to be in ipa_table_init()
674 ipa->table_virt = virt; in ipa_table_init()
675 ipa->table_addr = addr; in ipa_table_init()
685 *virt++ = cpu_to_le64((u64)ipa->filter_map << 1); in ipa_table_init()
695 void ipa_table_exit(struct ipa *ipa) in ipa_table_exit() argument
698 struct device *dev = &ipa->pdev->dev; in ipa_table_exit()
703 dma_free_coherent(dev, size, ipa->table_virt, ipa->table_addr); in ipa_table_exit()
704 ipa->table_addr = 0; in ipa_table_exit()
705 ipa->table_virt = NULL; in ipa_table_exit()