Lines Matching refs:ppe
25 static void ppe_w32(struct mtk_ppe *ppe, u32 reg, u32 val) in ppe_w32() argument
27 writel(val, ppe->base + reg); in ppe_w32()
30 static u32 ppe_r32(struct mtk_ppe *ppe, u32 reg) in ppe_r32() argument
32 return readl(ppe->base + reg); in ppe_r32()
35 static u32 ppe_m32(struct mtk_ppe *ppe, u32 reg, u32 mask, u32 set) in ppe_m32() argument
39 val = ppe_r32(ppe, reg); in ppe_m32()
42 ppe_w32(ppe, reg, val); in ppe_m32()
47 static u32 ppe_set(struct mtk_ppe *ppe, u32 reg, u32 val) in ppe_set() argument
49 return ppe_m32(ppe, reg, 0, val); in ppe_set()
52 static u32 ppe_clear(struct mtk_ppe *ppe, u32 reg, u32 val) in ppe_clear() argument
54 return ppe_m32(ppe, reg, val, 0); in ppe_clear()
62 static int mtk_ppe_wait_busy(struct mtk_ppe *ppe) in mtk_ppe_wait_busy() argument
67 ret = readl_poll_timeout(ppe->base + MTK_PPE_GLO_CFG, val, in mtk_ppe_wait_busy()
72 dev_err(ppe->dev, "PPE table busy"); in mtk_ppe_wait_busy()
77 static void mtk_ppe_cache_clear(struct mtk_ppe *ppe) in mtk_ppe_cache_clear() argument
79 ppe_set(ppe, MTK_PPE_CACHE_CTL, MTK_PPE_CACHE_CTL_CLEAR); in mtk_ppe_cache_clear()
80 ppe_clear(ppe, MTK_PPE_CACHE_CTL, MTK_PPE_CACHE_CTL_CLEAR); in mtk_ppe_cache_clear()
83 static void mtk_ppe_cache_enable(struct mtk_ppe *ppe, bool enable) in mtk_ppe_cache_enable() argument
85 mtk_ppe_cache_clear(ppe); in mtk_ppe_cache_enable()
87 ppe_m32(ppe, MTK_PPE_CACHE_CTL, MTK_PPE_CACHE_CTL_EN, in mtk_ppe_cache_enable()
439 __mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) in __mtk_foe_entry_clear() argument
445 rhashtable_remove_fast(&ppe->l2_flows, &entry->l2_node, in __mtk_foe_entry_clear()
450 __mtk_foe_entry_clear(ppe, entry); in __mtk_foe_entry_clear()
456 struct mtk_foe_entry *hwe = mtk_foe_get_entry(ppe, entry->hash); in __mtk_foe_entry_clear()
471 static int __mtk_foe_entry_idle_time(struct mtk_ppe *ppe, u32 ib1) in __mtk_foe_entry_idle_time() argument
473 u32 ib1_ts_mask = mtk_get_ib1_ts_mask(ppe->eth); in __mtk_foe_entry_idle_time()
474 u16 now = mtk_eth_timestamp(ppe->eth); in __mtk_foe_entry_idle_time()
484 mtk_flow_entry_update_l2(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) in mtk_flow_entry_update_l2() argument
486 u32 ib1_ts_mask = mtk_get_ib1_ts_mask(ppe->eth); in mtk_flow_entry_update_l2()
492 idle = __mtk_foe_entry_idle_time(ppe, entry->data.ib1); in mtk_flow_entry_update_l2()
497 hwe = mtk_foe_get_entry(ppe, cur->hash); in mtk_flow_entry_update_l2()
502 __mtk_foe_entry_clear(ppe, cur); in mtk_flow_entry_update_l2()
506 cur_idle = __mtk_foe_entry_idle_time(ppe, ib1); in mtk_flow_entry_update_l2()
517 mtk_flow_entry_update(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) in mtk_flow_entry_update() argument
525 mtk_flow_entry_update_l2(ppe, entry); in mtk_flow_entry_update()
532 hwe = mtk_foe_get_entry(ppe, entry->hash); in mtk_flow_entry_update()
533 memcpy(&foe, hwe, ppe->eth->soc->foe_entry_size); in mtk_flow_entry_update()
534 if (!mtk_flow_entry_match(ppe->eth, entry, &foe)) { in mtk_flow_entry_update()
546 __mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_foe_entry *entry, in __mtk_foe_entry_commit() argument
549 struct mtk_eth *eth = ppe->eth; in __mtk_foe_entry_commit()
563 hwe = mtk_foe_get_entry(ppe, hash); in __mtk_foe_entry_commit()
570 mtk_ppe_cache_clear(ppe); in __mtk_foe_entry_commit()
573 void mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) in mtk_foe_entry_clear() argument
576 __mtk_foe_entry_clear(ppe, entry); in mtk_foe_entry_clear()
581 mtk_foe_entry_commit_l2(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) in mtk_foe_entry_commit_l2() argument
585 return rhashtable_insert_fast(&ppe->l2_flows, &entry->l2_node, in mtk_foe_entry_commit_l2()
589 int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) in mtk_foe_entry_commit() argument
591 const struct mtk_soc_data *soc = ppe->eth->soc; in mtk_foe_entry_commit()
592 int type = mtk_get_ib1_pkt_type(ppe->eth, entry->data.ib1); in mtk_foe_entry_commit()
596 return mtk_foe_entry_commit_l2(ppe, entry); in mtk_foe_entry_commit()
598 hash = mtk_ppe_hash_entry(ppe->eth, &entry->data); in mtk_foe_entry_commit()
601 hlist_add_head(&entry->list, &ppe->foe_flow[hash / soc->hash_offset]); in mtk_foe_entry_commit()
608 mtk_foe_entry_commit_subflow(struct mtk_ppe *ppe, struct mtk_flow_entry *entry, in mtk_foe_entry_commit_subflow() argument
611 const struct mtk_soc_data *soc = ppe->eth->soc; in mtk_foe_entry_commit_subflow()
615 u32 ib1_mask = mtk_get_ib1_pkt_type_mask(ppe->eth) | MTK_FOE_IB1_UDP; in mtk_foe_entry_commit_subflow()
626 &ppe->foe_flow[hash / soc->hash_offset]); in mtk_foe_entry_commit_subflow()
629 hwe = mtk_foe_get_entry(ppe, hash); in mtk_foe_entry_commit_subflow()
634 l2 = mtk_foe_entry_l2(ppe->eth, &foe); in mtk_foe_entry_commit_subflow()
637 type = mtk_get_ib1_pkt_type(ppe->eth, foe.ib1); in mtk_foe_entry_commit_subflow()
643 *mtk_foe_entry_ib2(ppe->eth, &foe) = entry->data.bridge.ib2; in mtk_foe_entry_commit_subflow()
645 __mtk_foe_entry_commit(ppe, &foe, hash); in mtk_foe_entry_commit_subflow()
648 void __mtk_ppe_check_skb(struct mtk_ppe *ppe, struct sk_buff *skb, u16 hash) in __mtk_ppe_check_skb() argument
650 const struct mtk_soc_data *soc = ppe->eth->soc; in __mtk_ppe_check_skb()
651 struct hlist_head *head = &ppe->foe_flow[hash / soc->hash_offset]; in __mtk_ppe_check_skb()
652 struct mtk_foe_entry *hwe = mtk_foe_get_entry(ppe, hash); in __mtk_ppe_check_skb()
672 __mtk_foe_entry_clear(ppe, entry); in __mtk_ppe_check_skb()
676 if (found || !mtk_flow_entry_match(ppe->eth, entry, hwe)) { in __mtk_ppe_check_skb()
683 __mtk_foe_entry_commit(ppe, &entry->data, hash); in __mtk_ppe_check_skb()
715 entry = rhashtable_lookup_fast(&ppe->l2_flows, &key, mtk_flow_l2_ht_params); in __mtk_ppe_check_skb()
719 mtk_foe_entry_commit_subflow(ppe, entry, hash); in __mtk_ppe_check_skb()
725 int mtk_foe_entry_idle_time(struct mtk_ppe *ppe, struct mtk_flow_entry *entry) in mtk_foe_entry_idle_time() argument
727 mtk_flow_entry_update(ppe, entry); in mtk_foe_entry_idle_time()
729 return __mtk_foe_entry_idle_time(ppe, entry->data.ib1); in mtk_foe_entry_idle_time()
732 int mtk_ppe_prepare_reset(struct mtk_ppe *ppe) in mtk_ppe_prepare_reset() argument
734 if (!ppe) in mtk_ppe_prepare_reset()
738 ppe_clear(ppe, MTK_PPE_TB_CFG, MTK_PPE_TB_CFG_KEEPALIVE); in mtk_ppe_prepare_reset()
739 ppe_clear(ppe, MTK_PPE_BIND_LMT1, MTK_PPE_NTU_KEEPALIVE); in mtk_ppe_prepare_reset()
740 ppe_w32(ppe, MTK_PPE_KEEPALIVE, 0); in mtk_ppe_prepare_reset()
744 ppe_set(ppe, MTK_PPE_BIND_LMT1, MTK_PPE_NTU_KEEPALIVE); in mtk_ppe_prepare_reset()
745 ppe_w32(ppe, MTK_PPE_KEEPALIVE, 0xffffffff); in mtk_ppe_prepare_reset()
748 ppe_set(ppe, MTK_PPE_TB_CFG, MTK_PPE_TB_TICK_SEL); in mtk_ppe_prepare_reset()
749 ppe_set(ppe, MTK_PPE_TB_CFG, MTK_PPE_TB_CFG_KEEPALIVE); in mtk_ppe_prepare_reset()
753 ppe_clear(ppe, MTK_PPE_TB_CFG, MTK_PPE_TB_CFG_SCAN_MODE); in mtk_ppe_prepare_reset()
756 return mtk_ppe_wait_busy(ppe); in mtk_ppe_prepare_reset()
764 struct mtk_ppe *ppe; in mtk_ppe_init() local
768 ppe = devm_kzalloc(dev, sizeof(*ppe), GFP_KERNEL); in mtk_ppe_init()
769 if (!ppe) in mtk_ppe_init()
772 rhashtable_init(&ppe->l2_flows, &mtk_flow_l2_ht_params); in mtk_ppe_init()
777 ppe->base = base; in mtk_ppe_init()
778 ppe->eth = eth; in mtk_ppe_init()
779 ppe->dev = dev; in mtk_ppe_init()
780 ppe->version = version; in mtk_ppe_init()
782 foe = dmam_alloc_coherent(ppe->dev, in mtk_ppe_init()
784 &ppe->foe_phys, GFP_KERNEL); in mtk_ppe_init()
788 ppe->foe_table = foe; in mtk_ppe_init()
791 sizeof(*ppe->foe_flow); in mtk_ppe_init()
792 ppe->foe_flow = devm_kzalloc(dev, foe_flow_size, GFP_KERNEL); in mtk_ppe_init()
793 if (!ppe->foe_flow) in mtk_ppe_init()
796 mtk_ppe_debugfs_init(ppe, index); in mtk_ppe_init()
798 return ppe; in mtk_ppe_init()
801 rhashtable_destroy(&ppe->l2_flows); in mtk_ppe_init()
809 for (i = 0; i < ARRAY_SIZE(eth->ppe); i++) { in mtk_ppe_deinit()
810 if (!eth->ppe[i]) in mtk_ppe_deinit()
812 rhashtable_destroy(ð->ppe[i]->l2_flows); in mtk_ppe_deinit()
816 static void mtk_ppe_init_foe_table(struct mtk_ppe *ppe) in mtk_ppe_init_foe_table() argument
821 memset(ppe->foe_table, 0, in mtk_ppe_init_foe_table()
822 MTK_PPE_ENTRIES * ppe->eth->soc->foe_entry_size); in mtk_ppe_init_foe_table()
832 hwe = mtk_foe_get_entry(ppe, i + skip[k]); in mtk_ppe_init_foe_table()
838 void mtk_ppe_start(struct mtk_ppe *ppe) in mtk_ppe_start() argument
842 if (!ppe) in mtk_ppe_start()
845 mtk_ppe_init_foe_table(ppe); in mtk_ppe_start()
846 ppe_w32(ppe, MTK_PPE_TB_BASE, ppe->foe_phys); in mtk_ppe_start()
863 if (MTK_HAS_CAPS(ppe->eth->soc->caps, MTK_NETSYS_V2)) in mtk_ppe_start()
865 ppe_w32(ppe, MTK_PPE_TB_CFG, val); in mtk_ppe_start()
867 ppe_w32(ppe, MTK_PPE_IP_PROTO_CHK, in mtk_ppe_start()
870 mtk_ppe_cache_enable(ppe, true); in mtk_ppe_start()
879 if (MTK_HAS_CAPS(ppe->eth->soc->caps, MTK_NETSYS_V2)) in mtk_ppe_start()
887 ppe_w32(ppe, MTK_PPE_FLOW_CFG, val); in mtk_ppe_start()
891 ppe_w32(ppe, MTK_PPE_UNBIND_AGE, val); in mtk_ppe_start()
895 ppe_w32(ppe, MTK_PPE_BIND_AGE0, val); in mtk_ppe_start()
899 ppe_w32(ppe, MTK_PPE_BIND_AGE1, val); in mtk_ppe_start()
902 ppe_w32(ppe, MTK_PPE_BIND_LIMIT0, val); in mtk_ppe_start()
906 ppe_w32(ppe, MTK_PPE_BIND_LIMIT1, val); in mtk_ppe_start()
910 ppe_w32(ppe, MTK_PPE_BIND_RATE, val); in mtk_ppe_start()
917 ppe_w32(ppe, MTK_PPE_GLO_CFG, val); in mtk_ppe_start()
919 ppe_w32(ppe, MTK_PPE_DEFAULT_CPU_PORT, 0); in mtk_ppe_start()
921 if (MTK_HAS_CAPS(ppe->eth->soc->caps, MTK_NETSYS_V2)) { in mtk_ppe_start()
922 ppe_w32(ppe, MTK_PPE_DEFAULT_CPU_PORT1, 0xcb777); in mtk_ppe_start()
923 ppe_w32(ppe, MTK_PPE_SBW_CTRL, 0x7f); in mtk_ppe_start()
927 int mtk_ppe_stop(struct mtk_ppe *ppe) in mtk_ppe_stop() argument
932 if (!ppe) in mtk_ppe_stop()
936 struct mtk_foe_entry *hwe = mtk_foe_get_entry(ppe, i); in mtk_ppe_stop()
942 mtk_ppe_cache_enable(ppe, false); in mtk_ppe_stop()
945 ppe_clear(ppe, MTK_PPE_GLO_CFG, MTK_PPE_GLO_CFG_EN); in mtk_ppe_stop()
946 ppe_w32(ppe, MTK_PPE_FLOW_CFG, 0); in mtk_ppe_stop()
954 ppe_clear(ppe, MTK_PPE_TB_CFG, val); in mtk_ppe_stop()
956 return mtk_ppe_wait_busy(ppe); in mtk_ppe_stop()