linux/drivers/net/ethernet/mediatek/mtk_ppe.h
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/* Copyright (C) 2020 Felix Fietkau <nbd@nbd.name> */
   3
   4#ifndef __MTK_PPE_H
   5#define __MTK_PPE_H
   6
   7#include <linux/kernel.h>
   8#include <linux/bitfield.h>
   9
  10#define MTK_ETH_PPE_BASE                0xc00
  11
  12#define MTK_PPE_ENTRIES_SHIFT           3
  13#define MTK_PPE_ENTRIES                 (1024 << MTK_PPE_ENTRIES_SHIFT)
  14#define MTK_PPE_HASH_MASK               (MTK_PPE_ENTRIES - 1)
  15#define MTK_PPE_WAIT_TIMEOUT_US         1000000
  16
  17#define MTK_FOE_IB1_UNBIND_TIMESTAMP    GENMASK(7, 0)
  18#define MTK_FOE_IB1_UNBIND_PACKETS      GENMASK(23, 8)
  19#define MTK_FOE_IB1_UNBIND_PREBIND      BIT(24)
  20
  21#define MTK_FOE_IB1_BIND_TIMESTAMP      GENMASK(14, 0)
  22#define MTK_FOE_IB1_BIND_KEEPALIVE      BIT(15)
  23#define MTK_FOE_IB1_BIND_VLAN_LAYER     GENMASK(18, 16)
  24#define MTK_FOE_IB1_BIND_PPPOE          BIT(19)
  25#define MTK_FOE_IB1_BIND_VLAN_TAG       BIT(20)
  26#define MTK_FOE_IB1_BIND_PKT_SAMPLE     BIT(21)
  27#define MTK_FOE_IB1_BIND_CACHE          BIT(22)
  28#define MTK_FOE_IB1_BIND_TUNNEL_DECAP   BIT(23)
  29#define MTK_FOE_IB1_BIND_TTL            BIT(24)
  30
  31#define MTK_FOE_IB1_PACKET_TYPE         GENMASK(27, 25)
  32#define MTK_FOE_IB1_STATE               GENMASK(29, 28)
  33#define MTK_FOE_IB1_UDP                 BIT(30)
  34#define MTK_FOE_IB1_STATIC              BIT(31)
  35
  36enum {
  37        MTK_PPE_PKT_TYPE_IPV4_HNAPT = 0,
  38        MTK_PPE_PKT_TYPE_IPV4_ROUTE = 1,
  39        MTK_PPE_PKT_TYPE_BRIDGE = 2,
  40        MTK_PPE_PKT_TYPE_IPV4_DSLITE = 3,
  41        MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T = 4,
  42        MTK_PPE_PKT_TYPE_IPV6_ROUTE_5T = 5,
  43        MTK_PPE_PKT_TYPE_IPV6_6RD = 7,
  44};
  45
  46#define MTK_FOE_IB2_QID                 GENMASK(3, 0)
  47#define MTK_FOE_IB2_PSE_QOS             BIT(4)
  48#define MTK_FOE_IB2_DEST_PORT           GENMASK(7, 5)
  49#define MTK_FOE_IB2_MULTICAST           BIT(8)
  50
  51#define MTK_FOE_IB2_WHNAT_QID2          GENMASK(13, 12)
  52#define MTK_FOE_IB2_WHNAT_DEVIDX        BIT(16)
  53#define MTK_FOE_IB2_WHNAT_NAT           BIT(17)
  54
  55#define MTK_FOE_IB2_PORT_MG             GENMASK(17, 12)
  56
  57#define MTK_FOE_IB2_PORT_AG             GENMASK(23, 18)
  58
  59#define MTK_FOE_IB2_DSCP                GENMASK(31, 24)
  60
  61#define MTK_FOE_VLAN2_WHNAT_BSS         GEMMASK(5, 0)
  62#define MTK_FOE_VLAN2_WHNAT_WCID        GENMASK(13, 6)
  63#define MTK_FOE_VLAN2_WHNAT_RING        GENMASK(15, 14)
  64
  65enum {
  66        MTK_FOE_STATE_INVALID,
  67        MTK_FOE_STATE_UNBIND,
  68        MTK_FOE_STATE_BIND,
  69        MTK_FOE_STATE_FIN
  70};
  71
  72struct mtk_foe_mac_info {
  73        u16 vlan1;
  74        u16 etype;
  75
  76        u32 dest_mac_hi;
  77
  78        u16 vlan2;
  79        u16 dest_mac_lo;
  80
  81        u32 src_mac_hi;
  82
  83        u16 pppoe_id;
  84        u16 src_mac_lo;
  85};
  86
  87struct mtk_foe_bridge {
  88        u32 dest_mac_hi;
  89
  90        u16 src_mac_lo;
  91        u16 dest_mac_lo;
  92
  93        u32 src_mac_hi;
  94
  95        u32 ib2;
  96
  97        u32 _rsv[5];
  98
  99        u32 udf_tsid;
 100        struct mtk_foe_mac_info l2;
 101};
 102
 103struct mtk_ipv4_tuple {
 104        u32 src_ip;
 105        u32 dest_ip;
 106        union {
 107                struct {
 108                        u16 dest_port;
 109                        u16 src_port;
 110                };
 111                struct {
 112                        u8 protocol;
 113                        u8 _pad[3]; /* fill with 0xa5a5a5 */
 114                };
 115                u32 ports;
 116        };
 117};
 118
 119struct mtk_foe_ipv4 {
 120        struct mtk_ipv4_tuple orig;
 121
 122        u32 ib2;
 123
 124        struct mtk_ipv4_tuple new;
 125
 126        u16 timestamp;
 127        u16 _rsv0[3];
 128
 129        u32 udf_tsid;
 130
 131        struct mtk_foe_mac_info l2;
 132};
 133
 134struct mtk_foe_ipv4_dslite {
 135        struct mtk_ipv4_tuple ip4;
 136
 137        u32 tunnel_src_ip[4];
 138        u32 tunnel_dest_ip[4];
 139
 140        u8 flow_label[3];
 141        u8 priority;
 142
 143        u32 udf_tsid;
 144
 145        u32 ib2;
 146
 147        struct mtk_foe_mac_info l2;
 148};
 149
 150struct mtk_foe_ipv6 {
 151        u32 src_ip[4];
 152        u32 dest_ip[4];
 153
 154        union {
 155                struct {
 156                        u8 protocol;
 157                        u8 _pad[3]; /* fill with 0xa5a5a5 */
 158                }; /* 3-tuple */
 159                struct {
 160                        u16 dest_port;
 161                        u16 src_port;
 162                }; /* 5-tuple */
 163                u32 ports;
 164        };
 165
 166        u32 _rsv[3];
 167
 168        u32 udf;
 169
 170        u32 ib2;
 171        struct mtk_foe_mac_info l2;
 172};
 173
 174struct mtk_foe_ipv6_6rd {
 175        u32 src_ip[4];
 176        u32 dest_ip[4];
 177        u16 dest_port;
 178        u16 src_port;
 179
 180        u32 tunnel_src_ip;
 181        u32 tunnel_dest_ip;
 182
 183        u16 hdr_csum;
 184        u8 dscp;
 185        u8 ttl;
 186
 187        u8 flag;
 188        u8 pad;
 189        u8 per_flow_6rd_id;
 190        u8 pad2;
 191
 192        u32 ib2;
 193        struct mtk_foe_mac_info l2;
 194};
 195
 196struct mtk_foe_entry {
 197        u32 ib1;
 198
 199        union {
 200                struct mtk_foe_bridge bridge;
 201                struct mtk_foe_ipv4 ipv4;
 202                struct mtk_foe_ipv4_dslite dslite;
 203                struct mtk_foe_ipv6 ipv6;
 204                struct mtk_foe_ipv6_6rd ipv6_6rd;
 205                u32 data[19];
 206        };
 207};
 208
 209enum {
 210        MTK_PPE_CPU_REASON_TTL_EXCEEDED                 = 0x02,
 211        MTK_PPE_CPU_REASON_OPTION_HEADER                = 0x03,
 212        MTK_PPE_CPU_REASON_NO_FLOW                      = 0x07,
 213        MTK_PPE_CPU_REASON_IPV4_FRAG                    = 0x08,
 214        MTK_PPE_CPU_REASON_IPV4_DSLITE_FRAG             = 0x09,
 215        MTK_PPE_CPU_REASON_IPV4_DSLITE_NO_TCP_UDP       = 0x0a,
 216        MTK_PPE_CPU_REASON_IPV6_6RD_NO_TCP_UDP          = 0x0b,
 217        MTK_PPE_CPU_REASON_TCP_FIN_SYN_RST              = 0x0c,
 218        MTK_PPE_CPU_REASON_UN_HIT                       = 0x0d,
 219        MTK_PPE_CPU_REASON_HIT_UNBIND                   = 0x0e,
 220        MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED      = 0x0f,
 221        MTK_PPE_CPU_REASON_HIT_BIND_TCP_FIN             = 0x10,
 222        MTK_PPE_CPU_REASON_HIT_TTL_1                    = 0x11,
 223        MTK_PPE_CPU_REASON_HIT_BIND_VLAN_VIOLATION      = 0x12,
 224        MTK_PPE_CPU_REASON_KEEPALIVE_UC_OLD_HDR         = 0x13,
 225        MTK_PPE_CPU_REASON_KEEPALIVE_MC_NEW_HDR         = 0x14,
 226        MTK_PPE_CPU_REASON_KEEPALIVE_DUP_OLD_HDR        = 0x15,
 227        MTK_PPE_CPU_REASON_HIT_BIND_FORCE_CPU           = 0x16,
 228        MTK_PPE_CPU_REASON_TUNNEL_OPTION_HEADER         = 0x17,
 229        MTK_PPE_CPU_REASON_MULTICAST_TO_CPU             = 0x18,
 230        MTK_PPE_CPU_REASON_MULTICAST_TO_GMAC1_CPU       = 0x19,
 231        MTK_PPE_CPU_REASON_HIT_PRE_BIND                 = 0x1a,
 232        MTK_PPE_CPU_REASON_PACKET_SAMPLING              = 0x1b,
 233        MTK_PPE_CPU_REASON_EXCEED_MTU                   = 0x1c,
 234        MTK_PPE_CPU_REASON_PPE_BYPASS                   = 0x1e,
 235        MTK_PPE_CPU_REASON_INVALID                      = 0x1f,
 236};
 237
 238struct mtk_ppe {
 239        struct device *dev;
 240        void __iomem *base;
 241        int version;
 242
 243        struct mtk_foe_entry *foe_table;
 244        dma_addr_t foe_phys;
 245
 246        void *acct_table;
 247};
 248
 249int mtk_ppe_init(struct mtk_ppe *ppe, struct device *dev, void __iomem *base,
 250                 int version);
 251int mtk_ppe_start(struct mtk_ppe *ppe);
 252int mtk_ppe_stop(struct mtk_ppe *ppe);
 253
 254static inline void
 255mtk_foe_entry_clear(struct mtk_ppe *ppe, u16 hash)
 256{
 257        ppe->foe_table[hash].ib1 = 0;
 258        dma_wmb();
 259}
 260
 261static inline int
 262mtk_foe_entry_timestamp(struct mtk_ppe *ppe, u16 hash)
 263{
 264        u32 ib1 = READ_ONCE(ppe->foe_table[hash].ib1);
 265
 266        if (FIELD_GET(MTK_FOE_IB1_STATE, ib1) != MTK_FOE_STATE_BIND)
 267                return -1;
 268
 269        return FIELD_GET(MTK_FOE_IB1_BIND_TIMESTAMP, ib1);
 270}
 271
 272int mtk_foe_entry_prepare(struct mtk_foe_entry *entry, int type, int l4proto,
 273                          u8 pse_port, u8 *src_mac, u8 *dest_mac);
 274int mtk_foe_entry_set_pse_port(struct mtk_foe_entry *entry, u8 port);
 275int mtk_foe_entry_set_ipv4_tuple(struct mtk_foe_entry *entry, bool orig,
 276                                 __be32 src_addr, __be16 src_port,
 277                                 __be32 dest_addr, __be16 dest_port);
 278int mtk_foe_entry_set_ipv6_tuple(struct mtk_foe_entry *entry,
 279                                 __be32 *src_addr, __be16 src_port,
 280                                 __be32 *dest_addr, __be16 dest_port);
 281int mtk_foe_entry_set_dsa(struct mtk_foe_entry *entry, int port);
 282int mtk_foe_entry_set_vlan(struct mtk_foe_entry *entry, int vid);
 283int mtk_foe_entry_set_pppoe(struct mtk_foe_entry *entry, int sid);
 284int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_foe_entry *entry,
 285                         u16 timestamp);
 286int mtk_ppe_debugfs_init(struct mtk_ppe *ppe);
 287
 288#endif
 289