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