1d81734caSHemant Agrawal /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0) 26d6b4f49SShreyansh Jain * 3d81734caSHemant Agrawal * Copyright 2017 NXP 46d6b4f49SShreyansh Jain * 56d6b4f49SShreyansh Jain */ 66d6b4f49SShreyansh Jain 76d6b4f49SShreyansh Jain #ifndef __FSL_FMAN_H 86d6b4f49SShreyansh Jain #define __FSL_FMAN_H 96d6b4f49SShreyansh Jain 101e0f9b07SHemant Agrawal #include <rte_compat.h> 111e0f9b07SHemant Agrawal 126d6b4f49SShreyansh Jain /* Status field in FD is updated on Rx side by FMAN with following information. 136d6b4f49SShreyansh Jain * Refer to field description in FM BG. 146d6b4f49SShreyansh Jain */ 15*e7750639SAndre Muezerie struct __rte_packed_begin fm_status_t { 166d6b4f49SShreyansh Jain unsigned int reserved0:3; 176d6b4f49SShreyansh Jain unsigned int dcl4c:1; /* Don't Check L4 Checksum */ 186d6b4f49SShreyansh Jain unsigned int reserved1:1; 196d6b4f49SShreyansh Jain unsigned int ufd:1; /* Unsupported Format */ 206d6b4f49SShreyansh Jain unsigned int lge:1; /* Length Error */ 216d6b4f49SShreyansh Jain unsigned int dme:1; /* DMA Error */ 226d6b4f49SShreyansh Jain 236d6b4f49SShreyansh Jain unsigned int reserved2:4; 246d6b4f49SShreyansh Jain unsigned int fpe:1; /* Frame physical Error */ 256d6b4f49SShreyansh Jain unsigned int fse:1; /* Frame Size Error */ 266d6b4f49SShreyansh Jain unsigned int dis:1; /* Discard by Classification */ 276d6b4f49SShreyansh Jain unsigned int reserved3:1; 286d6b4f49SShreyansh Jain 296d6b4f49SShreyansh Jain unsigned int eof:1; /* Key Extraction goes out of frame */ 306d6b4f49SShreyansh Jain unsigned int nss:1; /* No Scheme selected */ 316d6b4f49SShreyansh Jain unsigned int kso:1; /* Key Size Overflow */ 326d6b4f49SShreyansh Jain unsigned int reserved4:1; 336d6b4f49SShreyansh Jain unsigned int fcl:2; /* Frame Color */ 346d6b4f49SShreyansh Jain unsigned int ipp:1; /* Illegal Policer Profile Selected */ 356d6b4f49SShreyansh Jain unsigned int flm:1; /* Frame Length Mismatch */ 366d6b4f49SShreyansh Jain unsigned int pte:1; /* Parser Timeout */ 376d6b4f49SShreyansh Jain unsigned int isp:1; /* Invalid Soft Parser Instruction */ 386d6b4f49SShreyansh Jain unsigned int phe:1; /* Header Error during parsing */ 396d6b4f49SShreyansh Jain unsigned int frdr:1; /* Frame Dropped by disabled port */ 406d6b4f49SShreyansh Jain unsigned int reserved5:4; 41*e7750639SAndre Muezerie } __rte_packed_end; 426d6b4f49SShreyansh Jain 436d6b4f49SShreyansh Jain /* Set MAC address for a particular interface */ 441e0f9b07SHemant Agrawal __rte_internal 456d6b4f49SShreyansh Jain int fman_if_add_mac_addr(struct fman_if *p, uint8_t *eth, uint8_t addr_num); 466d6b4f49SShreyansh Jain 476d6b4f49SShreyansh Jain /* Remove a MAC address for a particular interface */ 481e0f9b07SHemant Agrawal __rte_internal 496d6b4f49SShreyansh Jain void fman_if_clear_mac_addr(struct fman_if *p, uint8_t addr_num); 506d6b4f49SShreyansh Jain 516d6b4f49SShreyansh Jain /* Get the FMAN statistics */ 521e0f9b07SHemant Agrawal __rte_internal 536d6b4f49SShreyansh Jain void fman_if_stats_get(struct fman_if *p, struct rte_eth_stats *stats); 546d6b4f49SShreyansh Jain 556d6b4f49SShreyansh Jain /* Reset the FMAN statistics */ 561e0f9b07SHemant Agrawal __rte_internal 576d6b4f49SShreyansh Jain void fman_if_stats_reset(struct fman_if *p); 586d6b4f49SShreyansh Jain 596d6b4f49SShreyansh Jain /* Get all of the FMAN statistics */ 601e0f9b07SHemant Agrawal __rte_internal 616d6b4f49SShreyansh Jain void fman_if_stats_get_all(struct fman_if *p, uint64_t *value, int n); 626d6b4f49SShreyansh Jain 63d2536b00SHemant Agrawal __rte_internal 64d2536b00SHemant Agrawal void fman_if_bmi_stats_enable(struct fman_if *p); 65d2536b00SHemant Agrawal 66d2536b00SHemant Agrawal __rte_internal 67d2536b00SHemant Agrawal void fman_if_bmi_stats_disable(struct fman_if *p); 68d2536b00SHemant Agrawal 69d2536b00SHemant Agrawal __rte_internal 70d2536b00SHemant Agrawal void fman_if_bmi_stats_get_all(struct fman_if *p, uint64_t *value); 71d2536b00SHemant Agrawal 72d2536b00SHemant Agrawal __rte_internal 73d2536b00SHemant Agrawal void fman_if_bmi_stats_reset(struct fman_if *p); 74d2536b00SHemant Agrawal 756d6b4f49SShreyansh Jain /* Set ignore pause option for a specific interface */ 766d6b4f49SShreyansh Jain void fman_if_set_rx_ignore_pause_frames(struct fman_if *p, bool enable); 776d6b4f49SShreyansh Jain 786d6b4f49SShreyansh Jain /* Set max frame length */ 796d6b4f49SShreyansh Jain void fman_if_conf_max_frame_len(struct fman_if *p, unsigned int max_frame_len); 806d6b4f49SShreyansh Jain 816d6b4f49SShreyansh Jain /* Enable/disable Rx promiscuous mode on specified interface */ 821e0f9b07SHemant Agrawal __rte_internal 836d6b4f49SShreyansh Jain void fman_if_promiscuous_enable(struct fman_if *p); 841e0f9b07SHemant Agrawal __rte_internal 856d6b4f49SShreyansh Jain void fman_if_promiscuous_disable(struct fman_if *p); 866d6b4f49SShreyansh Jain 876d6b4f49SShreyansh Jain /* Enable/disable Rx on specific interfaces */ 881e0f9b07SHemant Agrawal __rte_internal 896d6b4f49SShreyansh Jain void fman_if_enable_rx(struct fman_if *p); 901e0f9b07SHemant Agrawal __rte_internal 916d6b4f49SShreyansh Jain void fman_if_disable_rx(struct fman_if *p); 92953b6fedSNipun Gupta __rte_internal 93953b6fedSNipun Gupta int fman_if_get_rx_status(struct fman_if *p); 946d6b4f49SShreyansh Jain 956d6b4f49SShreyansh Jain /* Enable/disable loopback on specific interfaces */ 961e0f9b07SHemant Agrawal __rte_internal 976d6b4f49SShreyansh Jain void fman_if_loopback_enable(struct fman_if *p); 981e0f9b07SHemant Agrawal __rte_internal 996d6b4f49SShreyansh Jain void fman_if_loopback_disable(struct fman_if *p); 1006d6b4f49SShreyansh Jain 1016d6b4f49SShreyansh Jain /* Set buffer pool on specific interface */ 1021e0f9b07SHemant Agrawal __rte_internal 1036d6b4f49SShreyansh Jain void fman_if_set_bp(struct fman_if *fm_if, unsigned int num, int bpid, 1046d6b4f49SShreyansh Jain size_t bufsize); 1056d6b4f49SShreyansh Jain 106a5d2650fSShreyansh Jain /* Get Flow Control threshold parameters on specific interface */ 1071e0f9b07SHemant Agrawal __rte_internal 108a5d2650fSShreyansh Jain int fman_if_get_fc_threshold(struct fman_if *fm_if); 109a5d2650fSShreyansh Jain 110a5d2650fSShreyansh Jain /* Enable and Set Flow Control threshold parameters on specific interface */ 1111e0f9b07SHemant Agrawal __rte_internal 112a5d2650fSShreyansh Jain int fman_if_set_fc_threshold(struct fman_if *fm_if, 113a5d2650fSShreyansh Jain u32 high_water, u32 low_water, u32 bpid); 114a5d2650fSShreyansh Jain 1156d6b4f49SShreyansh Jain /* Get Flow Control pause quanta on specific interface */ 1161e0f9b07SHemant Agrawal __rte_internal 1176d6b4f49SShreyansh Jain int fman_if_get_fc_quanta(struct fman_if *fm_if); 1186d6b4f49SShreyansh Jain 1196d6b4f49SShreyansh Jain /* Set Flow Control pause quanta on specific interface */ 1201e0f9b07SHemant Agrawal __rte_internal 1216d6b4f49SShreyansh Jain int fman_if_set_fc_quanta(struct fman_if *fm_if, u16 pause_quanta); 1226d6b4f49SShreyansh Jain 1236d6b4f49SShreyansh Jain /* Set default error fqid on specific interface */ 12477393f56SSachin Saxena __rte_internal 1256d6b4f49SShreyansh Jain void fman_if_set_err_fqid(struct fman_if *fm_if, uint32_t err_fqid); 1266d6b4f49SShreyansh Jain 1276d6b4f49SShreyansh Jain /* Get IC transfer params */ 1286d6b4f49SShreyansh Jain int fman_if_get_ic_params(struct fman_if *fm_if, struct fman_if_ic_params *icp); 1296d6b4f49SShreyansh Jain 1306d6b4f49SShreyansh Jain /* Set IC transfer params */ 1311e0f9b07SHemant Agrawal __rte_internal 1326d6b4f49SShreyansh Jain int fman_if_set_ic_params(struct fman_if *fm_if, 1336d6b4f49SShreyansh Jain const struct fman_if_ic_params *icp); 1346d6b4f49SShreyansh Jain 1356d6b4f49SShreyansh Jain /* Get interface fd->offset value */ 1361e0f9b07SHemant Agrawal __rte_internal 1376d6b4f49SShreyansh Jain int fman_if_get_fdoff(struct fman_if *fm_if); 1386d6b4f49SShreyansh Jain 1396d6b4f49SShreyansh Jain /* Set interface fd->offset value */ 1401e0f9b07SHemant Agrawal __rte_internal 1416d6b4f49SShreyansh Jain void fman_if_set_fdoff(struct fman_if *fm_if, uint32_t fd_offset); 1426d6b4f49SShreyansh Jain 143be20a3a4SHemant Agrawal /* Get interface SG enable status value */ 1441e0f9b07SHemant Agrawal __rte_internal 145be20a3a4SHemant Agrawal int fman_if_get_sg_enable(struct fman_if *fm_if); 146be20a3a4SHemant Agrawal 147be20a3a4SHemant Agrawal /* Set interface SG support mode */ 1481e0f9b07SHemant Agrawal __rte_internal 149be20a3a4SHemant Agrawal void fman_if_set_sg(struct fman_if *fm_if, int enable); 150be20a3a4SHemant Agrawal 1516d6b4f49SShreyansh Jain /* Get interface Max Frame length (MTU) */ 152378cd488SHemant Agrawal __rte_internal 1536d6b4f49SShreyansh Jain uint16_t fman_if_get_maxfrm(struct fman_if *fm_if); 1546d6b4f49SShreyansh Jain 1556d6b4f49SShreyansh Jain /* Set interface Max Frame length (MTU) */ 1561e0f9b07SHemant Agrawal __rte_internal 1576d6b4f49SShreyansh Jain void fman_if_set_maxfrm(struct fman_if *fm_if, uint16_t max_frm); 1586d6b4f49SShreyansh Jain 1596d6b4f49SShreyansh Jain /* Set interface next invoked action for dequeue operation */ 1606d6b4f49SShreyansh Jain void fman_if_set_dnia(struct fman_if *fm_if, uint32_t nia); 1616d6b4f49SShreyansh Jain 1626d6b4f49SShreyansh Jain /* discard error packets on rx */ 1631e0f9b07SHemant Agrawal __rte_internal 1646d6b4f49SShreyansh Jain void fman_if_discard_rx_errors(struct fman_if *fm_if); 1656d6b4f49SShreyansh Jain 1661e0f9b07SHemant Agrawal __rte_internal 16777393f56SSachin Saxena void fman_if_receive_rx_errors(struct fman_if *fm_if, 16877393f56SSachin Saxena unsigned int err_eq); 16977393f56SSachin Saxena 17077393f56SSachin Saxena __rte_internal 1716d6b4f49SShreyansh Jain void fman_if_set_mcast_filter_table(struct fman_if *p); 1726d6b4f49SShreyansh Jain 1731e0f9b07SHemant Agrawal __rte_internal 1746d6b4f49SShreyansh Jain void fman_if_reset_mcast_filter_table(struct fman_if *p); 1756d6b4f49SShreyansh Jain 1766d6b4f49SShreyansh Jain int fman_if_add_hash_mac_addr(struct fman_if *p, uint8_t *eth); 1776d6b4f49SShreyansh Jain 1786d6b4f49SShreyansh Jain int fman_if_get_primary_mac_addr(struct fman_if *p, uint8_t *eth); 1796d6b4f49SShreyansh Jain 1806d6b4f49SShreyansh Jain 1816d6b4f49SShreyansh Jain /* Enable/disable Rx on all interfaces */ 1826d6b4f49SShreyansh Jain static inline void fman_if_enable_all_rx(void) 1836d6b4f49SShreyansh Jain { 1846d6b4f49SShreyansh Jain struct fman_if *__if; 1856d6b4f49SShreyansh Jain 1866d6b4f49SShreyansh Jain list_for_each_entry(__if, fman_if_list, node) 1876d6b4f49SShreyansh Jain fman_if_enable_rx(__if); 1886d6b4f49SShreyansh Jain } 1896d6b4f49SShreyansh Jain 1906d6b4f49SShreyansh Jain static inline void fman_if_disable_all_rx(void) 1916d6b4f49SShreyansh Jain { 1926d6b4f49SShreyansh Jain struct fman_if *__if; 1936d6b4f49SShreyansh Jain 1946d6b4f49SShreyansh Jain list_for_each_entry(__if, fman_if_list, node) 1956d6b4f49SShreyansh Jain fman_if_disable_rx(__if); 1966d6b4f49SShreyansh Jain } 1976d6b4f49SShreyansh Jain #endif /* __FSL_FMAN_H */ 198