xref: /dpdk/drivers/bus/dpaa/include/fman.h (revision fd51012de5369679e807be1d6a81d63ef15015ce)
1d81734caSHemant Agrawal /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
25b22cf74SShreyansh Jain  *
35b22cf74SShreyansh Jain  * Copyright 2010-2012 Freescale Semiconductor, Inc.
45b22cf74SShreyansh Jain  * All rights reserved.
5a0edbb8aSRohit Raj  * Copyright 2019-2023 NXP
65b22cf74SShreyansh Jain  *
75b22cf74SShreyansh Jain  */
85b22cf74SShreyansh Jain 
95b22cf74SShreyansh Jain #ifndef __FMAN_H
105b22cf74SShreyansh Jain #define __FMAN_H
115b22cf74SShreyansh Jain 
125b22cf74SShreyansh Jain #include <stdbool.h>
135b22cf74SShreyansh Jain #include <net/if.h>
145b22cf74SShreyansh Jain 
15df96fd0dSBruce Richardson #include <ethdev_driver.h>
165b22cf74SShreyansh Jain #include <rte_ether.h>
175b22cf74SShreyansh Jain 
185b22cf74SShreyansh Jain #include <compat.h>
198c83f28cSHemant Agrawal #include <dpaa_list.h>
205b22cf74SShreyansh Jain 
215b22cf74SShreyansh Jain #ifndef FMAN_DEVICE_PATH
225b22cf74SShreyansh Jain #define FMAN_DEVICE_PATH "/dev/mem"
235b22cf74SShreyansh Jain #endif
245b22cf74SShreyansh Jain 
255b22cf74SShreyansh Jain #define MEMAC_NUM_OF_PADDRS 7 /* Num of additional exact match MAC adr regs */
265b22cf74SShreyansh Jain 
275b22cf74SShreyansh Jain /* Control and Configuration Register (COMMAND_CONFIG) for MEMAC */
285b22cf74SShreyansh Jain #define CMD_CFG_LOOPBACK_EN	0x00000400
295b22cf74SShreyansh Jain /**< 21 XGMII/GMII loopback enable */
305b22cf74SShreyansh Jain #define CMD_CFG_PROMIS_EN	0x00000010
315b22cf74SShreyansh Jain /**< 27 Promiscuous operation enable */
325b22cf74SShreyansh Jain #define CMD_CFG_PAUSE_IGNORE	0x00000100
335b22cf74SShreyansh Jain /**< 23 Ignore Pause frame quanta */
345b22cf74SShreyansh Jain 
355b22cf74SShreyansh Jain /* Statistics Configuration Register (STATN_CONFIG) */
365b22cf74SShreyansh Jain #define STATS_CFG_CLR           0x00000004
375b22cf74SShreyansh Jain /**< 29 Reset all counters */
385b22cf74SShreyansh Jain #define STATS_CFG_CLR_ON_RD     0x00000002
395b22cf74SShreyansh Jain /**< 30 Clear on read */
405b22cf74SShreyansh Jain #define STATS_CFG_SATURATE      0x00000001
415b22cf74SShreyansh Jain /**< 31 Saturate at the maximum val */
425b22cf74SShreyansh Jain 
435b22cf74SShreyansh Jain /**< Max receive frame length mask */
445b22cf74SShreyansh Jain #define MAXFRM_SIZE_MEMAC	0x00007fe0
455b22cf74SShreyansh Jain #define MAXFRM_RX_MASK		0x0000ffff
465b22cf74SShreyansh Jain 
475b22cf74SShreyansh Jain /**< Interface Mode Register Register for MEMAC */
485b22cf74SShreyansh Jain #define IF_MODE_RLP 0x00000820
495b22cf74SShreyansh Jain 
505b22cf74SShreyansh Jain /**< Pool Limits */
515b22cf74SShreyansh Jain #define FMAN_PORT_MAX_EXT_POOLS_NUM	8
525b22cf74SShreyansh Jain #define FMAN_PORT_OBS_EXT_POOLS_NUM	2
535b22cf74SShreyansh Jain 
545b22cf74SShreyansh Jain #define FMAN_PORT_CG_MAP_NUM		8
555b22cf74SShreyansh Jain #define FMAN_PORT_PRS_RESULT_WORDS_NUM	8
565b22cf74SShreyansh Jain #define FMAN_PORT_BMI_FIFO_UNITS	0x100
575b22cf74SShreyansh Jain #define FMAN_PORT_IC_OFFSET_UNITS	0x10
585b22cf74SShreyansh Jain 
59d2536b00SHemant Agrawal #define FMAN_BMI_COUNTERS_EN 0x80000000
60d2536b00SHemant Agrawal 
615b22cf74SShreyansh Jain #define FMAN_ENABLE_BPOOL_DEPLETION	0xF00000F0
625b22cf74SShreyansh Jain 
635b22cf74SShreyansh Jain #define HASH_CTRL_MCAST_EN	0x00000100
645b22cf74SShreyansh Jain #define GROUP_ADDRESS		0x0000010000000000LL
655b22cf74SShreyansh Jain #define HASH_CTRL_ADDR_MASK	0x0000003F
665b22cf74SShreyansh Jain 
6773585446SVanshika Shukla #define FMAN_RTC_MAX_NUM_OF_ALARMS		3
6873585446SVanshika Shukla #define FMAN_RTC_MAX_NUM_OF_PERIODIC_PULSES	4
6973585446SVanshika Shukla #define FMAN_RTC_MAX_NUM_OF_EXT_TRIGGERS	3
7073585446SVanshika Shukla #define FMAN_IEEE_1588_OFFSET			0X1AFE000
7173585446SVanshika Shukla #define FMAN_IEEE_1588_SIZE			4096
7273585446SVanshika Shukla 
735b22cf74SShreyansh Jain /* Pre definitions of FMAN interface and Bpool structures */
745b22cf74SShreyansh Jain struct __fman_if;
755b22cf74SShreyansh Jain struct fman_if_bpool;
765b22cf74SShreyansh Jain /* Lists of fman interfaces and bpools */
775b22cf74SShreyansh Jain TAILQ_HEAD(rte_fman_if_list, __fman_if);
785b22cf74SShreyansh Jain 
795b22cf74SShreyansh Jain /* Represents the different flavour of network interface */
805b22cf74SShreyansh Jain enum fman_mac_type {
817e5f49aeSRohit Raj 	fman_offline_internal = 0,
825b22cf74SShreyansh Jain 	fman_mac_1g,
835b22cf74SShreyansh Jain 	fman_mac_10g,
84eac3c7b9SSachin Saxena 	fman_mac_2_5g,
859e97abf2SJun Yang 	fman_onic,
865b22cf74SShreyansh Jain };
875b22cf74SShreyansh Jain 
885b22cf74SShreyansh Jain struct mac_addr {
895b22cf74SShreyansh Jain 	uint32_t   mac_addr_l;	/**< Lower 32 bits of 48-bit MAC address */
905b22cf74SShreyansh Jain 	uint32_t   mac_addr_u;	/**< Upper 16 bits of 48-bit MAC address */
915b22cf74SShreyansh Jain };
925b22cf74SShreyansh Jain 
935b22cf74SShreyansh Jain struct memac_regs {
945b22cf74SShreyansh Jain 	/* General Control and Status */
955b22cf74SShreyansh Jain 	uint32_t res0000[2];
965b22cf74SShreyansh Jain 	uint32_t command_config;	/**< 0x008 Ctrl and cfg */
975b22cf74SShreyansh Jain 	struct mac_addr mac_addr0;	/**< 0x00C-0x010 MAC_ADDR_0...1 */
985b22cf74SShreyansh Jain 	uint32_t maxfrm;		/**< 0x014 Max frame length */
995b22cf74SShreyansh Jain 	uint32_t res0018[5];
1005b22cf74SShreyansh Jain 	uint32_t hashtable_ctrl;	/**< 0x02C Hash table control */
1015b22cf74SShreyansh Jain 	uint32_t res0030[4];
1025b22cf74SShreyansh Jain 	uint32_t ievent;		/**< 0x040 Interrupt event */
1035b22cf74SShreyansh Jain 	uint32_t tx_ipg_length;
1045b22cf74SShreyansh Jain 	/**< 0x044 Transmitter inter-packet-gap */
1055b22cf74SShreyansh Jain 	uint32_t res0048;
1065b22cf74SShreyansh Jain 	uint32_t imask;			/**< 0x04C Interrupt mask */
1075b22cf74SShreyansh Jain 	uint32_t res0050;
1085b22cf74SShreyansh Jain 	uint32_t pause_quanta[4];	/**< 0x054 Pause quanta */
1095b22cf74SShreyansh Jain 	uint32_t pause_thresh[4];	/**< 0x064 Pause quanta threshold */
1105b22cf74SShreyansh Jain 	uint32_t rx_pause_status;	/**< 0x074 Receive pause status */
1115b22cf74SShreyansh Jain 	uint32_t res0078[2];
1125b22cf74SShreyansh Jain 	struct mac_addr mac_addr[MEMAC_NUM_OF_PADDRS];
1135b22cf74SShreyansh Jain 	/**< 0x80-0x0B4 mac padr */
1145b22cf74SShreyansh Jain 	uint32_t lpwake_timer;
1155b22cf74SShreyansh Jain 	/**< 0x0B8 Low Power Wakeup Timer */
1165b22cf74SShreyansh Jain 	uint32_t sleep_timer;
1175b22cf74SShreyansh Jain 	/**< 0x0BC Transmit EEE Low Power Timer */
1185b22cf74SShreyansh Jain 	uint32_t res00c0[8];
1195b22cf74SShreyansh Jain 	uint32_t statn_config;
1205b22cf74SShreyansh Jain 	/**< 0x0E0 Statistics configuration */
1215b22cf74SShreyansh Jain 	uint32_t res00e4[7];
1225b22cf74SShreyansh Jain 	/* Rx Statistics Counter */
1235b22cf74SShreyansh Jain 	uint32_t reoct_l;		/**<Rx Eth Octets Counter */
1245b22cf74SShreyansh Jain 	uint32_t reoct_u;
1255b22cf74SShreyansh Jain 	uint32_t roct_l;		/**<Rx Octet Counters */
1265b22cf74SShreyansh Jain 	uint32_t roct_u;
1275b22cf74SShreyansh Jain 	uint32_t raln_l;		/**<Rx Alignment Error Counter */
1285b22cf74SShreyansh Jain 	uint32_t raln_u;
1295b22cf74SShreyansh Jain 	uint32_t rxpf_l;		/**<Rx valid Pause Frame */
1305b22cf74SShreyansh Jain 	uint32_t rxpf_u;
1315b22cf74SShreyansh Jain 	uint32_t rfrm_l;		/**<Rx Frame counter */
1325b22cf74SShreyansh Jain 	uint32_t rfrm_u;
1335b22cf74SShreyansh Jain 	uint32_t rfcs_l;		/**<Rx frame check seq error */
1345b22cf74SShreyansh Jain 	uint32_t rfcs_u;
1355b22cf74SShreyansh Jain 	uint32_t rvlan_l;		/**<Rx Vlan Frame Counter */
1365b22cf74SShreyansh Jain 	uint32_t rvlan_u;
1375b22cf74SShreyansh Jain 	uint32_t rerr_l;		/**<Rx Frame error */
1385b22cf74SShreyansh Jain 	uint32_t rerr_u;
1395b22cf74SShreyansh Jain 	uint32_t ruca_l;		/**<Rx Unicast */
1405b22cf74SShreyansh Jain 	uint32_t ruca_u;
1415b22cf74SShreyansh Jain 	uint32_t rmca_l;		/**<Rx Multicast */
1425b22cf74SShreyansh Jain 	uint32_t rmca_u;
1435b22cf74SShreyansh Jain 	uint32_t rbca_l;		/**<Rx Broadcast */
1445b22cf74SShreyansh Jain 	uint32_t rbca_u;
1455b22cf74SShreyansh Jain 	uint32_t rdrp_l;		/**<Rx Dropper Packet */
1465b22cf74SShreyansh Jain 	uint32_t rdrp_u;
1475b22cf74SShreyansh Jain 	uint32_t rpkt_l;		/**<Rx packet */
1485b22cf74SShreyansh Jain 	uint32_t rpkt_u;
1495b22cf74SShreyansh Jain 	uint32_t rund_l;		/**<Rx undersized packets */
1505b22cf74SShreyansh Jain 	uint32_t rund_u;
1515b22cf74SShreyansh Jain 	uint32_t r64_l;			/**<Rx 64 byte */
1525b22cf74SShreyansh Jain 	uint32_t r64_u;
1535b22cf74SShreyansh Jain 	uint32_t r127_l;
1545b22cf74SShreyansh Jain 	uint32_t r127_u;
1555b22cf74SShreyansh Jain 	uint32_t r255_l;
1565b22cf74SShreyansh Jain 	uint32_t r255_u;
1575b22cf74SShreyansh Jain 	uint32_t r511_l;
1585b22cf74SShreyansh Jain 	uint32_t r511_u;
1595b22cf74SShreyansh Jain 	uint32_t r1023_l;
1605b22cf74SShreyansh Jain 	uint32_t r1023_u;
1615b22cf74SShreyansh Jain 	uint32_t r1518_l;
1625b22cf74SShreyansh Jain 	uint32_t r1518_u;
1635b22cf74SShreyansh Jain 	uint32_t r1519x_l;
1645b22cf74SShreyansh Jain 	uint32_t r1519x_u;
1655b22cf74SShreyansh Jain 	uint32_t rovr_l;		/**<Rx oversized but good */
1665b22cf74SShreyansh Jain 	uint32_t rovr_u;
1675b22cf74SShreyansh Jain 	uint32_t rjbr_l;		/**<Rx oversized with bad csum */
1685b22cf74SShreyansh Jain 	uint32_t rjbr_u;
1695b22cf74SShreyansh Jain 	uint32_t rfrg_l;		/**<Rx fragment Packet */
1705b22cf74SShreyansh Jain 	uint32_t rfrg_u;
1715b22cf74SShreyansh Jain 	uint32_t rcnp_l;		/**<Rx control packets (0x8808 */
1725b22cf74SShreyansh Jain 	uint32_t rcnp_u;
1735b22cf74SShreyansh Jain 	uint32_t rdrntp_l;		/**<Rx dropped due to FIFO overflow */
1745b22cf74SShreyansh Jain 	uint32_t rdrntp_u;
1755b22cf74SShreyansh Jain 	uint32_t res01d0[12];
1765b22cf74SShreyansh Jain 	/* Tx Statistics Counter */
1775b22cf74SShreyansh Jain 	uint32_t teoct_l;		/**<Tx eth octets */
1785b22cf74SShreyansh Jain 	uint32_t teoct_u;
1795b22cf74SShreyansh Jain 	uint32_t toct_l;		/**<Tx Octets */
1805b22cf74SShreyansh Jain 	uint32_t toct_u;
1815b22cf74SShreyansh Jain 	uint32_t res0210[2];
1825b22cf74SShreyansh Jain 	uint32_t txpf_l;		/**<Tx valid pause frame */
1835b22cf74SShreyansh Jain 	uint32_t txpf_u;
1845b22cf74SShreyansh Jain 	uint32_t tfrm_l;		/**<Tx frame counter */
1855b22cf74SShreyansh Jain 	uint32_t tfrm_u;
1865b22cf74SShreyansh Jain 	uint32_t tfcs_l;		/**<Tx FCS error */
1875b22cf74SShreyansh Jain 	uint32_t tfcs_u;
1885b22cf74SShreyansh Jain 	uint32_t tvlan_l;		/**<Tx Vlan Frame */
1895b22cf74SShreyansh Jain 	uint32_t tvlan_u;
1905b22cf74SShreyansh Jain 	uint32_t terr_l;		/**<Tx frame error */
1915b22cf74SShreyansh Jain 	uint32_t terr_u;
1925b22cf74SShreyansh Jain 	uint32_t tuca_l;		/**<Tx Unicast */
1935b22cf74SShreyansh Jain 	uint32_t tuca_u;
1945b22cf74SShreyansh Jain 	uint32_t tmca_l;		/**<Tx Multicast */
1955b22cf74SShreyansh Jain 	uint32_t tmca_u;
1965b22cf74SShreyansh Jain 	uint32_t tbca_l;		/**<Tx Broadcast */
1975b22cf74SShreyansh Jain 	uint32_t tbca_u;
1985b22cf74SShreyansh Jain 	uint32_t res0258[2];
1995b22cf74SShreyansh Jain 	uint32_t tpkt_l;		/**<Tx Packet */
2005b22cf74SShreyansh Jain 	uint32_t tpkt_u;
2015b22cf74SShreyansh Jain 	uint32_t tund_l;		/**<Tx Undersized */
2025b22cf74SShreyansh Jain 	uint32_t tund_u;
2035b22cf74SShreyansh Jain 	uint32_t t64_l;
2045b22cf74SShreyansh Jain 	uint32_t t64_u;
2055b22cf74SShreyansh Jain 	uint32_t t127_l;
2065b22cf74SShreyansh Jain 	uint32_t t127_u;
2075b22cf74SShreyansh Jain 	uint32_t t255_l;
2085b22cf74SShreyansh Jain 	uint32_t t255_u;
2095b22cf74SShreyansh Jain 	uint32_t t511_l;
2105b22cf74SShreyansh Jain 	uint32_t t511_u;
2115b22cf74SShreyansh Jain 	uint32_t t1023_l;
2125b22cf74SShreyansh Jain 	uint32_t t1023_u;
2135b22cf74SShreyansh Jain 	uint32_t t1518_l;
2145b22cf74SShreyansh Jain 	uint32_t t1518_u;
2155b22cf74SShreyansh Jain 	uint32_t t1519x_l;
2165b22cf74SShreyansh Jain 	uint32_t t1519x_u;
2175b22cf74SShreyansh Jain 	uint32_t res02a8[6];
2185b22cf74SShreyansh Jain 	uint32_t tcnp_l;		/**<Tx Control Packet type - 0x8808 */
2195b22cf74SShreyansh Jain 	uint32_t tcnp_u;
2205b22cf74SShreyansh Jain 	uint32_t res02c8[14];
2215b22cf74SShreyansh Jain 	/* Line Interface Control */
2225b22cf74SShreyansh Jain 	uint32_t if_mode;		/**< 0x300 Interface Mode Control */
2235b22cf74SShreyansh Jain 	uint32_t if_status;		/**< 0x304 Interface Status */
2245b22cf74SShreyansh Jain 	uint32_t res0308[14];
2255b22cf74SShreyansh Jain 	/* HiGig/2 */
2265b22cf74SShreyansh Jain 	uint32_t hg_config;		/**< 0x340 Control and cfg */
2275b22cf74SShreyansh Jain 	uint32_t res0344[3];
2285b22cf74SShreyansh Jain 	uint32_t hg_pause_quanta;	/**< 0x350 Pause quanta */
2295b22cf74SShreyansh Jain 	uint32_t res0354[3];
2305b22cf74SShreyansh Jain 	uint32_t hg_pause_thresh;	/**< 0x360 Pause quanta threshold */
2315b22cf74SShreyansh Jain 	uint32_t res0364[3];
2325b22cf74SShreyansh Jain 	uint32_t hgrx_pause_status;	/**< 0x370 Receive pause status */
2335b22cf74SShreyansh Jain 	uint32_t hg_fifos_status;	/**< 0x374 fifos status */
2345b22cf74SShreyansh Jain 	uint32_t rhm;			/**< 0x378 rx messages counter */
2355b22cf74SShreyansh Jain 	uint32_t thm;			/**< 0x37C tx messages counter */
2365b22cf74SShreyansh Jain };
2375b22cf74SShreyansh Jain 
23877393f56SSachin Saxena #define BMI_PORT_CFG_FDOVR 0x02000000
23977393f56SSachin Saxena 
2405b22cf74SShreyansh Jain struct rx_bmi_regs {
2415b22cf74SShreyansh Jain 	uint32_t fmbm_rcfg;		/**< Rx Configuration */
2425b22cf74SShreyansh Jain 	uint32_t fmbm_rst;		/**< Rx Status */
2435b22cf74SShreyansh Jain 	uint32_t fmbm_rda;		/**< Rx DMA attributes*/
2445b22cf74SShreyansh Jain 	uint32_t fmbm_rfp;		/**< Rx FIFO Parameters*/
2455b22cf74SShreyansh Jain 	uint32_t fmbm_rfed;		/**< Rx Frame End Data*/
2465b22cf74SShreyansh Jain 	uint32_t fmbm_ricp;		/**< Rx Internal Context Parameters*/
2475b22cf74SShreyansh Jain 	uint32_t fmbm_rim;		/**< Rx Internal Buffer Margins*/
2485b22cf74SShreyansh Jain 	uint32_t fmbm_rebm;		/**< Rx External Buffer Margins*/
2495b22cf74SShreyansh Jain 	uint32_t fmbm_rfne;		/**< Rx Frame Next Engine*/
2505b22cf74SShreyansh Jain 	uint32_t fmbm_rfca;		/**< Rx Frame Command Attributes.*/
2515b22cf74SShreyansh Jain 	uint32_t fmbm_rfpne;		/**< Rx Frame Parser Next Engine*/
2525b22cf74SShreyansh Jain 	uint32_t fmbm_rpso;		/**< Rx Parse Start Offset*/
2535b22cf74SShreyansh Jain 	uint32_t fmbm_rpp;		/**< Rx Policer Profile  */
2545b22cf74SShreyansh Jain 	uint32_t fmbm_rccb;		/**< Rx Coarse Classification Base */
2555b22cf74SShreyansh Jain 	uint32_t fmbm_reth;		/**< Rx Excessive Threshold */
2565b22cf74SShreyansh Jain 	uint32_t reserved003c[1];	/**< (0x03C 0x03F) */
2575b22cf74SShreyansh Jain 	uint32_t fmbm_rprai[FMAN_PORT_PRS_RESULT_WORDS_NUM];
2585b22cf74SShreyansh Jain 					/**< Rx Parse Results Array Init*/
2595b22cf74SShreyansh Jain 	uint32_t fmbm_rfqid;		/**< Rx Frame Queue ID*/
2605b22cf74SShreyansh Jain 	uint32_t fmbm_refqid;		/**< Rx Error Frame Queue ID*/
2615b22cf74SShreyansh Jain 	uint32_t fmbm_rfsdm;		/**< Rx Frame Status Discard Mask*/
2625b22cf74SShreyansh Jain 	uint32_t fmbm_rfsem;		/**< Rx Frame Status Error Mask*/
2635b22cf74SShreyansh Jain 	uint32_t fmbm_rfene;		/**< Rx Frame Enqueue Next Engine */
2645b22cf74SShreyansh Jain 	uint32_t reserved0074[0x2];	/**< (0x074-0x07C)  */
2655b22cf74SShreyansh Jain 	uint32_t fmbm_rcmne;
2665b22cf74SShreyansh Jain 	/**< Rx Frame Continuous Mode Next Engine */
2675b22cf74SShreyansh Jain 	uint32_t reserved0080[0x20];/**< (0x080 0x0FF)  */
2685b22cf74SShreyansh Jain 	uint32_t fmbm_ebmpi[FMAN_PORT_MAX_EXT_POOLS_NUM];
2695b22cf74SShreyansh Jain 					/**< Buffer Manager pool Information-*/
2705b22cf74SShreyansh Jain 	uint32_t fmbm_acnt[FMAN_PORT_MAX_EXT_POOLS_NUM];
2715b22cf74SShreyansh Jain 					/**< Allocate Counter-*/
272d2536b00SHemant Agrawal 	uint32_t reserved0120[16];
2735b22cf74SShreyansh Jain 					/**< 0x130/0x140 - 0x15F reserved -*/
2745b22cf74SShreyansh Jain 	uint32_t fmbm_rcgm[FMAN_PORT_CG_MAP_NUM];
2755b22cf74SShreyansh Jain 					/**< Congestion Group Map*/
2765b22cf74SShreyansh Jain 	uint32_t fmbm_mpd;		/**< BM Pool Depletion  */
2775b22cf74SShreyansh Jain 	uint32_t reserved0184[0x1F];	/**< (0x184 0x1FF) */
2785b22cf74SShreyansh Jain 	uint32_t fmbm_rstc;		/**< Rx Statistics Counters*/
2795b22cf74SShreyansh Jain 	uint32_t fmbm_rfrc;		/**< Rx Frame Counter*/
2805b22cf74SShreyansh Jain 	uint32_t fmbm_rfbc;		/**< Rx Bad Frames Counter*/
2815b22cf74SShreyansh Jain 	uint32_t fmbm_rlfc;		/**< Rx Large Frames Counter*/
2825b22cf74SShreyansh Jain 	uint32_t fmbm_rffc;		/**< Rx Filter Frames Counter*/
2835b22cf74SShreyansh Jain 	uint32_t fmbm_rfdc;		/**< Rx Frame Discard Counter*/
2845b22cf74SShreyansh Jain 	uint32_t fmbm_rfldec;		/**< Rx Frames List DMA Error Counter*/
2855b22cf74SShreyansh Jain 	uint32_t fmbm_rodc;		/**< Rx Out of Buffers Discard nntr*/
2865b22cf74SShreyansh Jain 	uint32_t fmbm_rbdc;		/**< Rx Buffers Deallocate Counter*/
2875b22cf74SShreyansh Jain 	uint32_t reserved0224[0x17];	/**< (0x224 0x27F) */
2885b22cf74SShreyansh Jain 	uint32_t fmbm_rpc;		/**< Rx Performance Counters*/
2895b22cf74SShreyansh Jain 	uint32_t fmbm_rpcp;		/**< Rx Performance Count Parameters*/
2905b22cf74SShreyansh Jain 	uint32_t fmbm_rccn;		/**< Rx Cycle Counter*/
2915b22cf74SShreyansh Jain 	uint32_t fmbm_rtuc;		/**< Rx Tasks Utilization Counter*/
2925b22cf74SShreyansh Jain 	uint32_t fmbm_rrquc;
2935b22cf74SShreyansh Jain 	/**< Rx Receive Queue Utilization cntr*/
2945b22cf74SShreyansh Jain 	uint32_t fmbm_rduc;		/**< Rx DMA Utilization Counter*/
2955b22cf74SShreyansh Jain 	uint32_t fmbm_rfuc;		/**< Rx FIFO Utilization Counter*/
2965b22cf74SShreyansh Jain 	uint32_t fmbm_rpac;		/**< Rx Pause Activation Counter*/
2975b22cf74SShreyansh Jain 	uint32_t reserved02a0[0x18];	/**< (0x2A0 0x2FF) */
2985b22cf74SShreyansh Jain 	uint32_t fmbm_rdbg;		/**< Rx Debug-*/
2995b22cf74SShreyansh Jain };
3005b22cf74SShreyansh Jain 
301615352f5SVanshika Shukla struct tx_bmi_regs {
302615352f5SVanshika Shukla 	uint32_t fmbm_tcfg;		/**< Tx Configuration*/
303615352f5SVanshika Shukla 	uint32_t fmbm_tst;		/**< Tx Status*/
304615352f5SVanshika Shukla 	uint32_t fmbm_tda;		/**< Tx DMA attributes*/
305615352f5SVanshika Shukla 	uint32_t fmbm_tfp;		/**< Tx FIFO Parameters*/
306615352f5SVanshika Shukla 	uint32_t fmbm_tfed;		/**< Tx Frame End Data*/
307615352f5SVanshika Shukla 	uint32_t fmbm_ticp;		/**< Tx Internal Context Parameters*/
308615352f5SVanshika Shukla 	uint32_t fmbm_tfdne;		/**< Tx Frame Dequeue Next Engine*/
309615352f5SVanshika Shukla 	uint32_t fmbm_tfca;		/**< Tx Frame Attributes*/
310615352f5SVanshika Shukla 	uint32_t fmbm_tcfqid;		/**< Tx Confirmation Frame Queue ID*/
311615352f5SVanshika Shukla 	uint32_t fmbm_tefqid;		/**< Tx Error Frame Queue ID*/
312615352f5SVanshika Shukla 	uint32_t fmbm_tfene;		/**< Tx Frame Enqueue Next Engine*/
313615352f5SVanshika Shukla 	uint32_t fmbm_trlmts;		/**< Tx Rate Limiter Scale*/
314615352f5SVanshika Shukla 	uint32_t fmbm_trlmt;		/**< Tx Rate Limiter*/
315615352f5SVanshika Shukla };
31673585446SVanshika Shukla 
31773585446SVanshika Shukla /* Description FM RTC timer alarm */
31873585446SVanshika Shukla struct t_tmr_alarm {
31973585446SVanshika Shukla 	uint32_t tmr_alarm_h;
32073585446SVanshika Shukla 	uint32_t tmr_alarm_l;
32173585446SVanshika Shukla };
32273585446SVanshika Shukla 
32373585446SVanshika Shukla /* Description FM RTC timer Ex trigger */
32473585446SVanshika Shukla struct t_tmr_ext_trigger {
32573585446SVanshika Shukla 	uint32_t tmr_etts_h;
32673585446SVanshika Shukla 	uint32_t tmr_etts_l;
32773585446SVanshika Shukla };
32873585446SVanshika Shukla 
32973585446SVanshika Shukla struct rtc_regs {
33073585446SVanshika Shukla 	uint32_t tmr_id;	/* 0x000 Module ID register */
33173585446SVanshika Shukla 	uint32_t tmr_id2;	/* 0x004 Controller ID register */
33273585446SVanshika Shukla 	uint32_t reserved0008[30];
33373585446SVanshika Shukla 	uint32_t tmr_ctrl;	/* 0x0080 timer control register */
33473585446SVanshika Shukla 	uint32_t tmr_tevent;	/* 0x0084 timer event register */
33573585446SVanshika Shukla 	uint32_t tmr_temask;	/* 0x0088 timer event mask register */
33673585446SVanshika Shukla 	uint32_t reserved008c[3];
33773585446SVanshika Shukla 	uint32_t tmr_cnt_h;	/* 0x0098 timer counter high register */
33873585446SVanshika Shukla 	uint32_t tmr_cnt_l;	/* 0x009c timer counter low register */
33973585446SVanshika Shukla 	uint32_t tmr_add;	/* 0x00a0 timer drift compensation addend register */
34073585446SVanshika Shukla 	uint32_t tmr_acc;	/* 0x00a4 timer accumulator register */
34173585446SVanshika Shukla 	uint32_t tmr_prsc;	/* 0x00a8 timer prescale */
34273585446SVanshika Shukla 	uint32_t reserved00ac;
34373585446SVanshika Shukla 	uint32_t tmr_off_h;	/* 0x00b0 timer offset high */
34473585446SVanshika Shukla 	uint32_t tmr_off_l;	/* 0x00b4 timer offset low  */
34573585446SVanshika Shukla 	struct t_tmr_alarm tmr_alarm[FMAN_RTC_MAX_NUM_OF_ALARMS];
34673585446SVanshika Shukla 				/* 0x00b8 timer alarm */
34773585446SVanshika Shukla 	uint32_t tmr_fiper[FMAN_RTC_MAX_NUM_OF_PERIODIC_PULSES];
34873585446SVanshika Shukla 				/* 0x00d0 timer fixed period interval */
34973585446SVanshika Shukla 	struct t_tmr_ext_trigger tmr_etts[FMAN_RTC_MAX_NUM_OF_EXT_TRIGGERS];
35073585446SVanshika Shukla 				/* 0x00e0 time stamp general purpose external */
35173585446SVanshika Shukla 	uint32_t reserved00f0[4];
35273585446SVanshika Shukla };
35373585446SVanshika Shukla 
3545b22cf74SShreyansh Jain struct fman_port_qmi_regs {
3555b22cf74SShreyansh Jain 	uint32_t fmqm_pnc;		/**< PortID n Configuration Register */
3565b22cf74SShreyansh Jain 	uint32_t fmqm_pns;		/**< PortID n Status Register */
3575b22cf74SShreyansh Jain 	uint32_t fmqm_pnts;		/**< PortID n Task Status Register */
3585b22cf74SShreyansh Jain 	uint32_t reserved00c[4];	/**< 0xn00C - 0xn01B */
3595b22cf74SShreyansh Jain 	uint32_t fmqm_pnen;		/**< PortID n Enqueue NIA Register */
3605b22cf74SShreyansh Jain 	uint32_t fmqm_pnetfc;		/**< PortID n Enq Total Frame Counter */
3615b22cf74SShreyansh Jain 	uint32_t reserved024[2];	/**< 0xn024 - 0x02B */
3625b22cf74SShreyansh Jain 	uint32_t fmqm_pndn;		/**< PortID n Dequeue NIA Register */
3635b22cf74SShreyansh Jain 	uint32_t fmqm_pndc;		/**< PortID n Dequeue Config Register */
3645b22cf74SShreyansh Jain 	uint32_t fmqm_pndtfc;		/**< PortID n Dequeue tot Frame cntr */
3655b22cf74SShreyansh Jain 	uint32_t fmqm_pndfdc;		/**< PortID n Dequeue FQID Dflt Cntr */
3665b22cf74SShreyansh Jain 	uint32_t fmqm_pndcc;		/**< PortID n Dequeue Confirm Counter */
3675b22cf74SShreyansh Jain };
3685b22cf74SShreyansh Jain 
3697e5f49aeSRohit Raj struct onic_port_cfg {
3707e5f49aeSRohit Raj 	char macless_name[IF_NAME_MAX_LEN];
3717e5f49aeSRohit Raj 	uint32_t rx_start;
3727e5f49aeSRohit Raj 	uint32_t rx_count;
3737e5f49aeSRohit Raj 	uint32_t tx_start;
3747e5f49aeSRohit Raj 	uint32_t tx_count;
3757e5f49aeSRohit Raj 	struct rte_ether_addr src_mac;
3767e5f49aeSRohit Raj 	struct rte_ether_addr peer_mac;
3777e5f49aeSRohit Raj };
3787e5f49aeSRohit Raj 
3795b22cf74SShreyansh Jain /* This struct exports parameters about an Fman network interface, determined
3805b22cf74SShreyansh Jain  * from the device-tree.
3815b22cf74SShreyansh Jain  */
3825b22cf74SShreyansh Jain struct fman_if {
3835b22cf74SShreyansh Jain 	/* Which Fman this interface belongs to */
3845b22cf74SShreyansh Jain 	uint8_t fman_idx;
3855b22cf74SShreyansh Jain 	/* The type/speed of the interface */
3865b22cf74SShreyansh Jain 	enum fman_mac_type mac_type;
3875b22cf74SShreyansh Jain 	/* Boolean, set when mac type is memac */
3885b22cf74SShreyansh Jain 	uint8_t is_memac;
3895b22cf74SShreyansh Jain 	/* Boolean, set when PHY is RGMII */
3905b22cf74SShreyansh Jain 	uint8_t is_rgmii;
3915b22cf74SShreyansh Jain 	/* The index of this MAC (within the Fman it belongs to) */
3925b22cf74SShreyansh Jain 	uint8_t mac_idx;
3935b22cf74SShreyansh Jain 	/* The MAC address */
3946d13ea8eSOlivier Matz 	struct rte_ether_addr mac_addr;
3955b22cf74SShreyansh Jain 	/* The Qman channel to schedule Tx FQs to */
3965b22cf74SShreyansh Jain 	u16 tx_channel_id;
397133332f0SRadu Bulie 
398e0718bb2SHemant Agrawal 	uint8_t base_profile_id;
399e0718bb2SHemant Agrawal 	uint8_t num_profiles;
400e0718bb2SHemant Agrawal 
401133332f0SRadu Bulie 	uint8_t is_shared_mac;
4025b22cf74SShreyansh Jain 	/* The hard-coded FQIDs for this interface. Note: this doesn't cover
4035b22cf74SShreyansh Jain 	 * the PCD nor the "Rx default" FQIDs, which are configured via FMC
404b95afba4SRohit Raj 	 * and its XML-based configuration. These values are being parsed from
405b95afba4SRohit Raj 	 * kernel device tree.
4065b22cf74SShreyansh Jain 	 */
407b95afba4SRohit Raj 	uint32_t fqid_rx_pcd;
408b95afba4SRohit Raj 	uint32_t fqid_rx_pcd_count;
4095b22cf74SShreyansh Jain 	uint32_t fqid_rx_def;
4105b22cf74SShreyansh Jain 	uint32_t fqid_rx_err;
4115b22cf74SShreyansh Jain 	uint32_t fqid_tx_err;
4125b22cf74SShreyansh Jain 	uint32_t fqid_tx_confirm;
4135b22cf74SShreyansh Jain 
4147e5f49aeSRohit Raj 	/* oNIC port info */
4157e5f49aeSRohit Raj 	struct onic_port_cfg onic_info;
4167e5f49aeSRohit Raj 
4175b22cf74SShreyansh Jain 	struct list_head bpool_list;
4185b22cf74SShreyansh Jain 	/* The node for linking this interface into "fman_if_list" */
4195b22cf74SShreyansh Jain 	struct list_head node;
4205b22cf74SShreyansh Jain };
4215b22cf74SShreyansh Jain 
4225b22cf74SShreyansh Jain /* This struct exposes parameters for buffer pools, extracted from the network
4235b22cf74SShreyansh Jain  * interface settings in the device tree.
4245b22cf74SShreyansh Jain  */
4255b22cf74SShreyansh Jain struct fman_if_bpool {
4265b22cf74SShreyansh Jain 	uint32_t bpid;
4275b22cf74SShreyansh Jain 	uint64_t count;
4285b22cf74SShreyansh Jain 	uint64_t size;
4295b22cf74SShreyansh Jain 	uint64_t addr;
4305b22cf74SShreyansh Jain 	/* The node for linking this bpool into fman_if::bpool_list */
4315b22cf74SShreyansh Jain 	struct list_head node;
4325b22cf74SShreyansh Jain };
4335b22cf74SShreyansh Jain 
4345b22cf74SShreyansh Jain /* Internal Context transfer params - FMBM_RICP*/
4355b22cf74SShreyansh Jain struct fman_if_ic_params {
4365b22cf74SShreyansh Jain 	/*IC offset in the packet buffer */
4375b22cf74SShreyansh Jain 	uint16_t iceof;
4385b22cf74SShreyansh Jain 	/*IC internal offset */
4395b22cf74SShreyansh Jain 	uint16_t iciof;
4405b22cf74SShreyansh Jain 	/*IC size to copy */
4415b22cf74SShreyansh Jain 	uint16_t icsz;
4425b22cf74SShreyansh Jain };
4435b22cf74SShreyansh Jain 
4445b22cf74SShreyansh Jain /* The exported "struct fman_if" type contains the subset of fields we want
4455b22cf74SShreyansh Jain  * exposed. This struct is embedded in a larger "struct __fman_if" which
4465b22cf74SShreyansh Jain  * contains the extra bits we *don't* want exposed.
4475b22cf74SShreyansh Jain  */
4485b22cf74SShreyansh Jain struct __fman_if {
4495b22cf74SShreyansh Jain 	struct fman_if __if;
4502aa10990SRohit Raj 	char node_name[IF_NAME_MAX_LEN];
4515b22cf74SShreyansh Jain 	char node_path[PATH_MAX];
4525b22cf74SShreyansh Jain 	uint64_t regs_size;
4535b22cf74SShreyansh Jain 	void *ccsr_map;
4545b22cf74SShreyansh Jain 	void *bmi_map;
455615352f5SVanshika Shukla 	void *tx_bmi_map;
45673585446SVanshika Shukla 	void *rtc_map;
4575b22cf74SShreyansh Jain 	void *qmi_map;
4585b22cf74SShreyansh Jain 	struct list_head node;
4595b22cf74SShreyansh Jain };
4605b22cf74SShreyansh Jain 
4615b22cf74SShreyansh Jain /* And this is the base list node that the interfaces are added to. (See
4625b22cf74SShreyansh Jain  * fman_if_enable_all_rx() below for an example of its use.)
4635b22cf74SShreyansh Jain  */
4645b22cf74SShreyansh Jain extern const struct list_head *fman_if_list;
4655b22cf74SShreyansh Jain 
4665b22cf74SShreyansh Jain extern int fman_ccsr_map_fd;
4675b22cf74SShreyansh Jain 
4685b22cf74SShreyansh Jain /* To iterate the "bpool_list" for an interface. Eg;
4695b22cf74SShreyansh Jain  *        struct fman_if *p = get_ptr_to_some_interface();
4705b22cf74SShreyansh Jain  *        struct fman_if_bpool *bp;
4715b22cf74SShreyansh Jain  *        printf("Interface uses following BPIDs;\n");
4725b22cf74SShreyansh Jain  *        fman_if_for_each_bpool(bp, p) {
4735b22cf74SShreyansh Jain  *            printf("    %d\n", bp->bpid);
4745b22cf74SShreyansh Jain  *            [...]
4755b22cf74SShreyansh Jain  *        }
4765b22cf74SShreyansh Jain  */
4775b22cf74SShreyansh Jain #define fman_if_for_each_bpool(bp, __if) \
4785b22cf74SShreyansh Jain 	list_for_each_entry(bp, &(__if)->bpool_list, node)
4795b22cf74SShreyansh Jain 
480*fd51012dSAndre Muezerie #define FMAN_ERR(rc, fmt, ...) \
4815b22cf74SShreyansh Jain 	do { \
4825b22cf74SShreyansh Jain 		_errno = (rc); \
483*fd51012dSAndre Muezerie 		RTE_LOG_LINE(ERR, DPAA_BUS, fmt "(%d)", ##__VA_ARGS__, errno); \
4845b22cf74SShreyansh Jain 	} while (0)
4855b22cf74SShreyansh Jain 
4865b22cf74SShreyansh Jain #define FMAN_IP_REV_1	0xC30C4
4875b22cf74SShreyansh Jain #define FMAN_IP_REV_1_MAJOR_MASK 0x0000FF00
4885b22cf74SShreyansh Jain #define FMAN_IP_REV_1_MAJOR_SHIFT 8
4895b22cf74SShreyansh Jain #define FMAN_V3	0x06
490a0edbb8aSRohit Raj 
491a0edbb8aSRohit Raj #define DPAA_FQD_CTX_A_SHIFT_BITS       24
492a0edbb8aSRohit Raj #define DPAA_FQD_CTX_B_SHIFT_BITS       24
493a0edbb8aSRohit Raj 
494a0edbb8aSRohit Raj /* Following flags are used to set in context A hi field of FQD */
495a0edbb8aSRohit Raj #define DPAA_FQD_CTX_A_OVERRIDE_FQ	(0x80 << DPAA_FQD_CTX_A_SHIFT_BITS)
496a0edbb8aSRohit Raj #define DPAA_FQD_CTX_A_IGNORE_CMD	(0x40 << DPAA_FQD_CTX_A_SHIFT_BITS)
497a0edbb8aSRohit Raj #define DPAA_FQD_CTX_A_A1_FIELD_VALID	(0x20 << DPAA_FQD_CTX_A_SHIFT_BITS)
498a0edbb8aSRohit Raj #define DPAA_FQD_CTX_A_A2_FIELD_VALID	(0x10 << DPAA_FQD_CTX_A_SHIFT_BITS)
499a0edbb8aSRohit Raj #define DPAA_FQD_CTX_A_A0_FIELD_VALID	(0x08 << DPAA_FQD_CTX_A_SHIFT_BITS)
500a0edbb8aSRohit Raj #define DPAA_FQD_CTX_A_B0_FIELD_VALID	(0x04 << DPAA_FQD_CTX_A_SHIFT_BITS)
501a0edbb8aSRohit Raj #define DPAA_FQD_CTX_A_OVERRIDE_OMB	(0x02 << DPAA_FQD_CTX_A_SHIFT_BITS)
502a0edbb8aSRohit Raj #define DPAA_FQD_CTX_A_RESERVED		(0x01 << DPAA_FQD_CTX_A_SHIFT_BITS)
503a0edbb8aSRohit Raj 
504a0edbb8aSRohit Raj /* Following flags are used to set in context A lo field of FQD */
505a0edbb8aSRohit Raj #define DPAA_FQD_CTX_A2_EBD_BIT		(0x80 << DPAA_FQD_CTX_A_SHIFT_BITS)
506a0edbb8aSRohit Raj #define DPAA_FQD_CTX_A2_EBAD_BIT	(0x40 << DPAA_FQD_CTX_A_SHIFT_BITS)
507a0edbb8aSRohit Raj #define DPAA_FQD_CTX_A2_FWD_BIT		(0x20 << DPAA_FQD_CTX_A_SHIFT_BITS)
508a0edbb8aSRohit Raj #define DPAA_FQD_CTX_A2_NL_BIT		(0x10 << DPAA_FQD_CTX_A_SHIFT_BITS)
509a0edbb8aSRohit Raj #define DPAA_FQD_CTX_A2_CWD_BIT		(0x08 << DPAA_FQD_CTX_A_SHIFT_BITS)
510a0edbb8aSRohit Raj #define DPAA_FQD_CTX_A2_NENQ_BIT	(0x04 << DPAA_FQD_CTX_A_SHIFT_BITS)
511a0edbb8aSRohit Raj #define DPAA_FQD_CTX_A2_RESERVED_BIT	(0x02 << DPAA_FQD_CTX_A_SHIFT_BITS)
512a0edbb8aSRohit Raj #define DPAA_FQD_CTX_A2_VSPE_BIT	(0x01 << DPAA_FQD_CTX_A_SHIFT_BITS)
513a0edbb8aSRohit Raj 
5145b22cf74SShreyansh Jain extern u16 fman_ip_rev;
5155b22cf74SShreyansh Jain extern u32 fman_dealloc_bufs_mask_hi;
5165b22cf74SShreyansh Jain extern u32 fman_dealloc_bufs_mask_lo;
5175b22cf74SShreyansh Jain 
5185b22cf74SShreyansh Jain /**
5195b22cf74SShreyansh Jain  * Initialize the FMAN driver
5205b22cf74SShreyansh Jain  *
5215b22cf74SShreyansh Jain  * @args void
5225b22cf74SShreyansh Jain  * @return
5235b22cf74SShreyansh Jain  *	0 for success; error OTHERWISE
5245b22cf74SShreyansh Jain  */
5255b22cf74SShreyansh Jain int fman_init(void);
5265b22cf74SShreyansh Jain 
5275b22cf74SShreyansh Jain /**
5285b22cf74SShreyansh Jain  * Teardown the FMAN driver
5295b22cf74SShreyansh Jain  *
5305b22cf74SShreyansh Jain  * @args void
5315b22cf74SShreyansh Jain  * @return void
5325b22cf74SShreyansh Jain  */
5335b22cf74SShreyansh Jain void fman_finish(void);
5345b22cf74SShreyansh Jain 
5355b22cf74SShreyansh Jain #endif	/* __FMAN_H */
536