airoha_eth.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (c) 2024 AIROHA Inc
  4. * Author: Lorenzo Bianconi <lorenzo@kernel.org>
  5. */
  6. #ifndef AIROHA_ETH_H
  7. #define AIROHA_ETH_H
  8. #include <linux/debugfs.h>
  9. #include <linux/etherdevice.h>
  10. #include <linux/iopoll.h>
  11. #include <linux/kernel.h>
  12. #include <linux/netdevice.h>
  13. #include <linux/reset.h>
  14. #include <linux/soc/airoha/airoha_offload.h>
  15. #include <net/dsa.h>
  16. #define AIROHA_MAX_NUM_GDM_PORTS 4
  17. #define AIROHA_MAX_NUM_QDMA 2
  18. #define AIROHA_MAX_NUM_IRQ_BANKS 4
  19. #define AIROHA_MAX_DSA_PORTS 7
  20. #define AIROHA_MAX_NUM_RSTS 3
  21. #define AIROHA_MAX_MTU 9220
  22. #define AIROHA_MAX_PACKET_SIZE 2048
  23. #define AIROHA_NUM_QOS_CHANNELS 4
  24. #define AIROHA_NUM_QOS_QUEUES 8
  25. #define AIROHA_NUM_TX_RING 32
  26. #define AIROHA_NUM_RX_RING 32
  27. #define AIROHA_NUM_NETDEV_TX_RINGS (AIROHA_NUM_TX_RING + \
  28. AIROHA_NUM_QOS_CHANNELS)
  29. #define AIROHA_FE_MC_MAX_VLAN_TABLE 64
  30. #define AIROHA_FE_MC_MAX_VLAN_PORT 16
  31. #define AIROHA_NUM_TX_IRQ 2
  32. #define HW_DSCP_NUM 2048
  33. #define IRQ_QUEUE_LEN(_n) ((_n) ? 1024 : 2048)
  34. #define TX_DSCP_NUM 1024
  35. #define RX_DSCP_NUM(_n) \
  36. ((_n) == 2 ? 128 : \
  37. (_n) == 11 ? 128 : \
  38. (_n) == 15 ? 128 : \
  39. (_n) == 0 ? 1024 : 16)
  40. #define PSE_RSV_PAGES 128
  41. #define PSE_QUEUE_RSV_PAGES 64
  42. #define QDMA_METER_IDX(_n) ((_n) & 0xff)
  43. #define QDMA_METER_GROUP(_n) (((_n) >> 8) & 0x3)
  44. #define PPE_SRAM_NUM_ENTRIES (8 * 1024)
  45. #define PPE_STATS_NUM_ENTRIES (4 * 1024)
  46. #define PPE_DRAM_NUM_ENTRIES (16 * 1024)
  47. #define PPE_ENTRY_SIZE 80
  48. #define PPE_RAM_NUM_ENTRIES_SHIFT(_n) (__ffs((_n) >> 10))
  49. #define MTK_HDR_LEN 4
  50. #define MTK_HDR_XMIT_TAGGED_TPID_8100 1
  51. #define MTK_HDR_XMIT_TAGGED_TPID_88A8 2
  52. enum {
  53. QDMA_INT_REG_IDX0,
  54. QDMA_INT_REG_IDX1,
  55. QDMA_INT_REG_IDX2,
  56. QDMA_INT_REG_IDX3,
  57. QDMA_INT_REG_IDX4,
  58. QDMA_INT_REG_MAX
  59. };
  60. enum {
  61. HSGMII_LAN_7581_PCIE0_SRCPORT = 0x16,
  62. HSGMII_LAN_7581_PCIE1_SRCPORT,
  63. HSGMII_LAN_7581_ETH_SRCPORT,
  64. HSGMII_LAN_7581_USB_SRCPORT,
  65. };
  66. enum {
  67. HSGMII_LAN_7583_ETH_SRCPORT = 0x16,
  68. HSGMII_LAN_7583_PCIE_SRCPORT = 0x18,
  69. HSGMII_LAN_7583_USB_SRCPORT,
  70. };
  71. enum {
  72. XSI_PCIE0_VIP_PORT_MASK = BIT(22),
  73. XSI_PCIE1_VIP_PORT_MASK = BIT(23),
  74. XSI_USB_VIP_PORT_MASK = BIT(25),
  75. XSI_ETH_VIP_PORT_MASK = BIT(24),
  76. };
  77. enum {
  78. DEV_STATE_INITIALIZED,
  79. DEV_STATE_REGISTERED,
  80. };
  81. enum {
  82. CDM_CRSN_QSEL_Q1 = 1,
  83. CDM_CRSN_QSEL_Q5 = 5,
  84. CDM_CRSN_QSEL_Q6 = 6,
  85. CDM_CRSN_QSEL_Q15 = 15,
  86. };
  87. enum {
  88. CRSN_08 = 0x8,
  89. CRSN_21 = 0x15, /* KA */
  90. CRSN_22 = 0x16, /* hit bind and force route to CPU */
  91. CRSN_24 = 0x18,
  92. CRSN_25 = 0x19,
  93. };
  94. enum airoha_gdm_index {
  95. AIROHA_GDM1_IDX = 1,
  96. AIROHA_GDM2_IDX = 2,
  97. AIROHA_GDM3_IDX = 3,
  98. AIROHA_GDM4_IDX = 4,
  99. };
  100. enum {
  101. FE_PSE_PORT_CDM1,
  102. FE_PSE_PORT_GDM1,
  103. FE_PSE_PORT_GDM2,
  104. FE_PSE_PORT_GDM3,
  105. FE_PSE_PORT_PPE1,
  106. FE_PSE_PORT_CDM2,
  107. FE_PSE_PORT_CDM3,
  108. FE_PSE_PORT_CDM4,
  109. FE_PSE_PORT_PPE2,
  110. FE_PSE_PORT_GDM4,
  111. FE_PSE_PORT_CDM5,
  112. FE_PSE_PORT_DROP = 0xf,
  113. };
  114. enum tx_sched_mode {
  115. TC_SCH_WRR8,
  116. TC_SCH_SP,
  117. TC_SCH_WRR7,
  118. TC_SCH_WRR6,
  119. TC_SCH_WRR5,
  120. TC_SCH_WRR4,
  121. TC_SCH_WRR3,
  122. TC_SCH_WRR2,
  123. };
  124. enum trtcm_unit_type {
  125. TRTCM_BYTE_UNIT,
  126. TRTCM_PACKET_UNIT,
  127. };
  128. enum trtcm_param_type {
  129. TRTCM_MISC_MODE, /* meter_en, pps_mode, tick_sel */
  130. TRTCM_TOKEN_RATE_MODE,
  131. TRTCM_BUCKETSIZE_SHIFT_MODE,
  132. TRTCM_BUCKET_COUNTER_MODE,
  133. };
  134. enum trtcm_mode_type {
  135. TRTCM_COMMIT_MODE,
  136. TRTCM_PEAK_MODE,
  137. };
  138. enum trtcm_param {
  139. TRTCM_TICK_SEL = BIT(0),
  140. TRTCM_PKT_MODE = BIT(1),
  141. TRTCM_METER_MODE = BIT(2),
  142. };
  143. #define MIN_TOKEN_SIZE 4096
  144. #define MAX_TOKEN_SIZE_OFFSET 17
  145. #define TRTCM_TOKEN_RATE_MASK GENMASK(23, 6)
  146. #define TRTCM_TOKEN_RATE_FRACTION_MASK GENMASK(5, 0)
  147. struct airoha_queue_entry {
  148. union {
  149. void *buf;
  150. struct {
  151. struct list_head list;
  152. struct sk_buff *skb;
  153. };
  154. };
  155. dma_addr_t dma_addr;
  156. u16 dma_len;
  157. };
  158. struct airoha_queue {
  159. struct airoha_qdma *qdma;
  160. /* protect concurrent queue accesses */
  161. spinlock_t lock;
  162. struct airoha_queue_entry *entry;
  163. struct airoha_qdma_desc *desc;
  164. u16 head;
  165. u16 tail;
  166. int queued;
  167. int ndesc;
  168. int free_thr;
  169. int buf_size;
  170. struct napi_struct napi;
  171. struct page_pool *page_pool;
  172. struct sk_buff *skb;
  173. struct list_head tx_list;
  174. };
  175. struct airoha_tx_irq_queue {
  176. struct airoha_qdma *qdma;
  177. struct napi_struct napi;
  178. int size;
  179. u32 *q;
  180. };
  181. struct airoha_hw_stats {
  182. /* protect concurrent hw_stats accesses */
  183. spinlock_t lock;
  184. struct u64_stats_sync syncp;
  185. /* get_stats64 */
  186. u64 rx_ok_pkts;
  187. u64 tx_ok_pkts;
  188. u64 rx_ok_bytes;
  189. u64 tx_ok_bytes;
  190. u64 rx_multicast;
  191. u64 rx_errors;
  192. u64 rx_drops;
  193. u64 tx_drops;
  194. u64 rx_crc_error;
  195. u64 rx_over_errors;
  196. /* ethtool stats */
  197. u64 tx_broadcast;
  198. u64 tx_multicast;
  199. u64 tx_len[7];
  200. u64 rx_broadcast;
  201. u64 rx_fragment;
  202. u64 rx_jabber;
  203. u64 rx_len[7];
  204. };
  205. enum {
  206. AIROHA_FOE_STATE_INVALID,
  207. AIROHA_FOE_STATE_UNBIND,
  208. AIROHA_FOE_STATE_BIND,
  209. AIROHA_FOE_STATE_FIN
  210. };
  211. enum {
  212. PPE_PKT_TYPE_IPV4_HNAPT = 0,
  213. PPE_PKT_TYPE_IPV4_ROUTE = 1,
  214. PPE_PKT_TYPE_BRIDGE = 2,
  215. PPE_PKT_TYPE_IPV4_DSLITE = 3,
  216. PPE_PKT_TYPE_IPV6_ROUTE_3T = 4,
  217. PPE_PKT_TYPE_IPV6_ROUTE_5T = 5,
  218. PPE_PKT_TYPE_IPV6_6RD = 7,
  219. };
  220. #define AIROHA_FOE_MAC_SMAC_ID GENMASK(20, 16)
  221. #define AIROHA_FOE_MAC_PPPOE_ID GENMASK(15, 0)
  222. #define AIROHA_FOE_MAC_WDMA_QOS GENMASK(15, 12)
  223. #define AIROHA_FOE_MAC_WDMA_BAND BIT(11)
  224. #define AIROHA_FOE_MAC_WDMA_WCID GENMASK(10, 0)
  225. struct airoha_foe_mac_info_common {
  226. u16 vlan1;
  227. u16 etype;
  228. u32 dest_mac_hi;
  229. u16 vlan2;
  230. u16 dest_mac_lo;
  231. u32 src_mac_hi;
  232. };
  233. struct airoha_foe_mac_info {
  234. struct airoha_foe_mac_info_common common;
  235. u16 pppoe_id;
  236. u16 src_mac_lo;
  237. u32 meter;
  238. };
  239. #define AIROHA_FOE_IB1_UNBIND_PREBIND BIT(24)
  240. #define AIROHA_FOE_IB1_UNBIND_PACKETS GENMASK(23, 8)
  241. #define AIROHA_FOE_IB1_UNBIND_TIMESTAMP GENMASK(7, 0)
  242. #define AIROHA_FOE_IB1_BIND_STATIC BIT(31)
  243. #define AIROHA_FOE_IB1_BIND_UDP BIT(30)
  244. #define AIROHA_FOE_IB1_BIND_STATE GENMASK(29, 28)
  245. #define AIROHA_FOE_IB1_BIND_PACKET_TYPE GENMASK(27, 25)
  246. #define AIROHA_FOE_IB1_BIND_TTL BIT(24)
  247. #define AIROHA_FOE_IB1_BIND_TUNNEL_DECAP BIT(23)
  248. #define AIROHA_FOE_IB1_BIND_PPPOE BIT(22)
  249. #define AIROHA_FOE_IB1_BIND_VPM GENMASK(21, 20)
  250. #define AIROHA_FOE_IB1_BIND_VLAN_LAYER GENMASK(19, 16)
  251. #define AIROHA_FOE_IB1_BIND_KEEPALIVE BIT(15)
  252. #define AIROHA_FOE_IB1_BIND_TIMESTAMP GENMASK(14, 0)
  253. #define AIROHA_FOE_IB2_DSCP GENMASK(31, 24)
  254. #define AIROHA_FOE_IB2_PORT_AG GENMASK(23, 13)
  255. #define AIROHA_FOE_IB2_PCP BIT(12)
  256. #define AIROHA_FOE_IB2_MULTICAST BIT(11)
  257. #define AIROHA_FOE_IB2_FAST_PATH BIT(10)
  258. #define AIROHA_FOE_IB2_PSE_QOS BIT(9)
  259. #define AIROHA_FOE_IB2_PSE_PORT GENMASK(8, 5)
  260. #define AIROHA_FOE_IB2_NBQ GENMASK(4, 0)
  261. #define AIROHA_FOE_ACTDP GENMASK(31, 24)
  262. #define AIROHA_FOE_SHAPER_ID GENMASK(23, 16)
  263. #define AIROHA_FOE_CHANNEL GENMASK(15, 11)
  264. #define AIROHA_FOE_QID GENMASK(10, 8)
  265. #define AIROHA_FOE_DPI BIT(7)
  266. #define AIROHA_FOE_TUNNEL BIT(6)
  267. #define AIROHA_FOE_TUNNEL_ID GENMASK(5, 0)
  268. #define AIROHA_FOE_TUNNEL_MTU GENMASK(31, 16)
  269. #define AIROHA_FOE_ACNT_GRP3 GENMASK(15, 9)
  270. #define AIROHA_FOE_METER_GRP3 GENMASK(8, 5)
  271. #define AIROHA_FOE_METER_GRP2 GENMASK(4, 0)
  272. struct airoha_foe_bridge {
  273. u32 dest_mac_hi;
  274. u16 src_mac_hi;
  275. u16 dest_mac_lo;
  276. u32 src_mac_lo;
  277. u32 ib2;
  278. u32 rsv[5];
  279. u32 data;
  280. struct airoha_foe_mac_info l2;
  281. };
  282. struct airoha_foe_ipv4_tuple {
  283. u32 src_ip;
  284. u32 dest_ip;
  285. union {
  286. struct {
  287. u16 dest_port;
  288. u16 src_port;
  289. };
  290. struct {
  291. u8 protocol;
  292. u8 _pad[3]; /* fill with 0xa5a5a5 */
  293. };
  294. u32 ports;
  295. };
  296. };
  297. struct airoha_foe_ipv4 {
  298. struct airoha_foe_ipv4_tuple orig_tuple;
  299. u32 ib2;
  300. struct airoha_foe_ipv4_tuple new_tuple;
  301. u32 rsv[2];
  302. u32 data;
  303. struct airoha_foe_mac_info l2;
  304. };
  305. struct airoha_foe_ipv4_dslite {
  306. struct airoha_foe_ipv4_tuple ip4;
  307. u32 ib2;
  308. u8 flow_label[3];
  309. u8 priority;
  310. u32 rsv[4];
  311. u32 data;
  312. struct airoha_foe_mac_info l2;
  313. };
  314. struct airoha_foe_ipv6 {
  315. u32 src_ip[4];
  316. u32 dest_ip[4];
  317. union {
  318. struct {
  319. u16 dest_port;
  320. u16 src_port;
  321. };
  322. struct {
  323. u8 protocol;
  324. u8 pad[3];
  325. };
  326. u32 ports;
  327. };
  328. u32 data;
  329. u32 ib2;
  330. struct airoha_foe_mac_info_common l2;
  331. u32 meter;
  332. };
  333. struct airoha_foe_entry {
  334. union {
  335. struct {
  336. u32 ib1;
  337. union {
  338. struct airoha_foe_bridge bridge;
  339. struct airoha_foe_ipv4 ipv4;
  340. struct airoha_foe_ipv4_dslite dslite;
  341. struct airoha_foe_ipv6 ipv6;
  342. DECLARE_FLEX_ARRAY(u32, d);
  343. };
  344. };
  345. u8 data[PPE_ENTRY_SIZE];
  346. };
  347. };
  348. struct airoha_foe_stats {
  349. u32 bytes;
  350. u32 packets;
  351. };
  352. struct airoha_foe_stats64 {
  353. u64 bytes;
  354. u64 packets;
  355. };
  356. struct airoha_flow_data {
  357. struct ethhdr eth;
  358. union {
  359. struct {
  360. __be32 src_addr;
  361. __be32 dst_addr;
  362. } v4;
  363. struct {
  364. struct in6_addr src_addr;
  365. struct in6_addr dst_addr;
  366. } v6;
  367. };
  368. __be16 src_port;
  369. __be16 dst_port;
  370. struct {
  371. struct {
  372. u16 id;
  373. __be16 proto;
  374. } hdr[2];
  375. u8 num;
  376. } vlan;
  377. struct {
  378. u16 sid;
  379. u8 num;
  380. } pppoe;
  381. };
  382. enum airoha_flow_entry_type {
  383. FLOW_TYPE_L4,
  384. FLOW_TYPE_L2,
  385. FLOW_TYPE_L2_SUBFLOW,
  386. };
  387. struct airoha_flow_table_entry {
  388. union {
  389. struct hlist_node list; /* PPE L3 flow entry */
  390. struct {
  391. struct rhash_head l2_node; /* L2 flow entry */
  392. struct hlist_head l2_flows; /* PPE L2 subflows list */
  393. };
  394. };
  395. struct hlist_node l2_subflow_node; /* PPE L2 subflow entry */
  396. u32 hash;
  397. struct airoha_foe_stats64 stats;
  398. enum airoha_flow_entry_type type;
  399. struct rhash_head node;
  400. unsigned long cookie;
  401. /* Must be last --ends in a flexible-array member. */
  402. struct airoha_foe_entry data;
  403. };
  404. struct airoha_wdma_info {
  405. u8 idx;
  406. u8 queue;
  407. u16 wcid;
  408. u8 bss;
  409. };
  410. /* RX queue to IRQ mapping: BIT(q) in IRQ(n) */
  411. #define RX_IRQ0_BANK_PIN_MASK 0x839f
  412. #define RX_IRQ1_BANK_PIN_MASK 0x7fe00000
  413. #define RX_IRQ2_BANK_PIN_MASK 0x20
  414. #define RX_IRQ3_BANK_PIN_MASK 0x40
  415. #define RX_IRQ_BANK_PIN_MASK(_n) \
  416. (((_n) == 3) ? RX_IRQ3_BANK_PIN_MASK : \
  417. ((_n) == 2) ? RX_IRQ2_BANK_PIN_MASK : \
  418. ((_n) == 1) ? RX_IRQ1_BANK_PIN_MASK : \
  419. RX_IRQ0_BANK_PIN_MASK)
  420. struct airoha_irq_bank {
  421. struct airoha_qdma *qdma;
  422. /* protect concurrent irqmask accesses */
  423. spinlock_t irq_lock;
  424. u32 irqmask[QDMA_INT_REG_MAX];
  425. int irq;
  426. };
  427. struct airoha_qdma {
  428. struct airoha_eth *eth;
  429. void __iomem *regs;
  430. atomic_t users;
  431. struct airoha_irq_bank irq_banks[AIROHA_MAX_NUM_IRQ_BANKS];
  432. struct airoha_tx_irq_queue q_tx_irq[AIROHA_NUM_TX_IRQ];
  433. struct airoha_queue q_tx[AIROHA_NUM_TX_RING];
  434. struct airoha_queue q_rx[AIROHA_NUM_RX_RING];
  435. };
  436. struct airoha_gdm_port {
  437. struct airoha_qdma *qdma;
  438. struct net_device *dev;
  439. int id;
  440. struct airoha_hw_stats stats;
  441. DECLARE_BITMAP(qos_sq_bmap, AIROHA_NUM_QOS_CHANNELS);
  442. /* qos stats counters */
  443. u64 cpu_tx_packets;
  444. u64 fwd_tx_packets;
  445. struct metadata_dst *dsa_meta[AIROHA_MAX_DSA_PORTS];
  446. };
  447. #define AIROHA_RXD4_PPE_CPU_REASON GENMASK(20, 16)
  448. #define AIROHA_RXD4_FOE_ENTRY GENMASK(15, 0)
  449. struct airoha_ppe {
  450. struct airoha_ppe_dev dev;
  451. struct airoha_eth *eth;
  452. void *foe;
  453. dma_addr_t foe_dma;
  454. struct rhashtable l2_flows;
  455. struct hlist_head *foe_flow;
  456. u16 *foe_check_time;
  457. struct airoha_foe_stats *foe_stats;
  458. dma_addr_t foe_stats_dma;
  459. struct dentry *debugfs_dir;
  460. };
  461. struct airoha_eth_soc_data {
  462. u16 version;
  463. const char * const *xsi_rsts_names;
  464. int num_xsi_rsts;
  465. int num_ppe;
  466. struct {
  467. int (*get_src_port_id)(struct airoha_gdm_port *port, int nbq);
  468. } ops;
  469. };
  470. struct airoha_eth {
  471. struct device *dev;
  472. const struct airoha_eth_soc_data *soc;
  473. unsigned long state;
  474. void __iomem *fe_regs;
  475. struct airoha_npu __rcu *npu;
  476. struct airoha_ppe *ppe;
  477. struct rhashtable flow_table;
  478. struct reset_control_bulk_data rsts[AIROHA_MAX_NUM_RSTS];
  479. struct reset_control_bulk_data *xsi_rsts;
  480. struct net_device *napi_dev;
  481. struct airoha_qdma qdma[AIROHA_MAX_NUM_QDMA];
  482. struct airoha_gdm_port *ports[AIROHA_MAX_NUM_GDM_PORTS];
  483. };
  484. u32 airoha_rr(void __iomem *base, u32 offset);
  485. void airoha_wr(void __iomem *base, u32 offset, u32 val);
  486. u32 airoha_rmw(void __iomem *base, u32 offset, u32 mask, u32 val);
  487. #define airoha_fe_rr(eth, offset) \
  488. airoha_rr((eth)->fe_regs, (offset))
  489. #define airoha_fe_wr(eth, offset, val) \
  490. airoha_wr((eth)->fe_regs, (offset), (val))
  491. #define airoha_fe_rmw(eth, offset, mask, val) \
  492. airoha_rmw((eth)->fe_regs, (offset), (mask), (val))
  493. #define airoha_fe_set(eth, offset, val) \
  494. airoha_rmw((eth)->fe_regs, (offset), 0, (val))
  495. #define airoha_fe_clear(eth, offset, val) \
  496. airoha_rmw((eth)->fe_regs, (offset), (val), 0)
  497. #define airoha_qdma_rr(qdma, offset) \
  498. airoha_rr((qdma)->regs, (offset))
  499. #define airoha_qdma_wr(qdma, offset, val) \
  500. airoha_wr((qdma)->regs, (offset), (val))
  501. #define airoha_qdma_rmw(qdma, offset, mask, val) \
  502. airoha_rmw((qdma)->regs, (offset), (mask), (val))
  503. #define airoha_qdma_set(qdma, offset, val) \
  504. airoha_rmw((qdma)->regs, (offset), 0, (val))
  505. #define airoha_qdma_clear(qdma, offset, val) \
  506. airoha_rmw((qdma)->regs, (offset), (val), 0)
  507. static inline bool airhoa_is_lan_gdm_port(struct airoha_gdm_port *port)
  508. {
  509. /* GDM1 port on EN7581 SoC is connected to the lan dsa switch.
  510. * GDM{2,3,4} can be used as wan port connected to an external
  511. * phy module.
  512. */
  513. return port->id == 1;
  514. }
  515. static inline bool airoha_is_7581(struct airoha_eth *eth)
  516. {
  517. return eth->soc->version == 0x7581;
  518. }
  519. static inline bool airoha_is_7583(struct airoha_eth *eth)
  520. {
  521. return eth->soc->version == 0x7583;
  522. }
  523. bool airoha_is_valid_gdm_port(struct airoha_eth *eth,
  524. struct airoha_gdm_port *port);
  525. bool airoha_ppe_is_enabled(struct airoha_eth *eth, int index);
  526. void airoha_ppe_check_skb(struct airoha_ppe_dev *dev, struct sk_buff *skb,
  527. u16 hash, bool rx_wlan);
  528. int airoha_ppe_setup_tc_block_cb(struct airoha_ppe_dev *dev, void *type_data);
  529. int airoha_ppe_init(struct airoha_eth *eth);
  530. void airoha_ppe_deinit(struct airoha_eth *eth);
  531. void airoha_ppe_init_upd_mem(struct airoha_gdm_port *port);
  532. u32 airoha_ppe_get_total_num_entries(struct airoha_ppe *ppe);
  533. struct airoha_foe_entry *airoha_ppe_foe_get_entry(struct airoha_ppe *ppe,
  534. u32 hash);
  535. void airoha_ppe_foe_entry_get_stats(struct airoha_ppe *ppe, u32 hash,
  536. struct airoha_foe_stats64 *stats);
  537. #ifdef CONFIG_DEBUG_FS
  538. int airoha_ppe_debugfs_init(struct airoha_ppe *ppe);
  539. #else
  540. static inline int airoha_ppe_debugfs_init(struct airoha_ppe *ppe)
  541. {
  542. return 0;
  543. }
  544. #endif
  545. #endif /* AIROHA_ETH_H */