123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335 |
- /* SPDX-License-Identifier: GPL-2.0 */
- /*
- * Copyright (C) 2020 Marvell International Ltd.
- *
- * Functions to configure the BGX MAC.
- */
- #ifndef __CVMX_HELPER_BGX_H__
- #define __CVMX_HELPER_BGX_H__
- #define CVMX_BGX_RX_FIFO_SIZE (64 * 1024)
- #define CVMX_BGX_TX_FIFO_SIZE (32 * 1024)
- int __cvmx_helper_bgx_enumerate(int xiface);
- /**
- * @INTERNAL
- * Disable the BGX port
- *
- * @param xipd_port IPD port of the BGX interface to disable
- */
- void cvmx_helper_bgx_disable(int xipd_port);
- /**
- * @INTERNAL
- * Probe a SGMII interface and determine the number of ports
- * connected to it. The SGMII/XAUI interface should still be down after
- * this call. This is used by interfaces using the bgx mac.
- *
- * @param xiface Interface to probe
- *
- * Return: Number of ports on the interface. Zero to disable.
- */
- int __cvmx_helper_bgx_probe(int xiface);
- /**
- * @INTERNAL
- * Bringup and enable a SGMII interface. After this call packet
- * I/O should be fully functional. This is called with IPD
- * enabled but PKO disabled. This is used by interfaces using the
- * bgx mac.
- *
- * @param xiface Interface to bring up
- *
- * Return: Zero on success, negative on failure
- */
- int __cvmx_helper_bgx_sgmii_enable(int xiface);
- /**
- * @INTERNAL
- * Return the link state of an IPD/PKO port as returned by
- * auto negotiation. The result of this function may not match
- * Octeon's link config if auto negotiation has changed since
- * the last call to cvmx_helper_link_set(). This is used by
- * interfaces using the bgx mac.
- *
- * @param xipd_port IPD/PKO port to query
- *
- * Return: Link state
- */
- cvmx_helper_link_info_t __cvmx_helper_bgx_sgmii_link_get(int xipd_port);
- /**
- * @INTERNAL
- * Configure an IPD/PKO port for the specified link state. This
- * function does not influence auto negotiation at the PHY level.
- * The passed link state must always match the link state returned
- * by cvmx_helper_link_get(). It is normally best to use
- * cvmx_helper_link_autoconf() instead. This is used by interfaces
- * using the bgx mac.
- *
- * @param xipd_port IPD/PKO port to configure
- * @param link_info The new link state
- *
- * Return: Zero on success, negative on failure
- */
- int __cvmx_helper_bgx_sgmii_link_set(int xipd_port, cvmx_helper_link_info_t link_info);
- /**
- * @INTERNAL
- * Configure a port for internal and/or external loopback. Internal loopback
- * causes packets sent by the port to be received by Octeon. External loopback
- * causes packets received from the wire to sent out again. This is used by
- * interfaces using the bgx mac.
- *
- * @param xipd_port IPD/PKO port to loopback.
- * @param enable_internal
- * Non zero if you want internal loopback
- * @param enable_external
- * Non zero if you want external loopback
- *
- * Return: Zero on success, negative on failure.
- */
- int __cvmx_helper_bgx_sgmii_configure_loopback(int xipd_port, int enable_internal,
- int enable_external);
- /**
- * @INTERNAL
- * Bringup and enable a XAUI interface. After this call packet
- * I/O should be fully functional. This is called with IPD
- * enabled but PKO disabled. This is used by interfaces using the
- * bgx mac.
- *
- * @param xiface Interface to bring up
- *
- * Return: Zero on success, negative on failure
- */
- int __cvmx_helper_bgx_xaui_enable(int xiface);
- /**
- * @INTERNAL
- * Return the link state of an IPD/PKO port as returned by
- * auto negotiation. The result of this function may not match
- * Octeon's link config if auto negotiation has changed since
- * the last call to cvmx_helper_link_set(). This is used by
- * interfaces using the bgx mac.
- *
- * @param xipd_port IPD/PKO port to query
- *
- * Return: Link state
- */
- cvmx_helper_link_info_t __cvmx_helper_bgx_xaui_link_get(int xipd_port);
- /**
- * @INTERNAL
- * Configure an IPD/PKO port for the specified link state. This
- * function does not influence auto negotiation at the PHY level.
- * The passed link state must always match the link state returned
- * by cvmx_helper_link_get(). It is normally best to use
- * cvmx_helper_link_autoconf() instead. This is used by interfaces
- * using the bgx mac.
- *
- * @param xipd_port IPD/PKO port to configure
- * @param link_info The new link state
- *
- * Return: Zero on success, negative on failure
- */
- int __cvmx_helper_bgx_xaui_link_set(int xipd_port, cvmx_helper_link_info_t link_info);
- /**
- * @INTERNAL
- * Configure a port for internal and/or external loopback. Internal loopback
- * causes packets sent by the port to be received by Octeon. External loopback
- * causes packets received from the wire to sent out again. This is used by
- * interfaces using the bgx mac.
- *
- * @param xipd_port IPD/PKO port to loopback.
- * @param enable_internal
- * Non zero if you want internal loopback
- * @param enable_external
- * Non zero if you want external loopback
- *
- * Return: Zero on success, negative on failure.
- */
- int __cvmx_helper_bgx_xaui_configure_loopback(int xipd_port, int enable_internal,
- int enable_external);
- int __cvmx_helper_bgx_mixed_enable(int xiface);
- cvmx_helper_link_info_t __cvmx_helper_bgx_mixed_link_get(int xipd_port);
- int __cvmx_helper_bgx_mixed_link_set(int xipd_port, cvmx_helper_link_info_t link_info);
- int __cvmx_helper_bgx_mixed_configure_loopback(int xipd_port, int enable_internal,
- int enable_external);
- cvmx_helper_interface_mode_t cvmx_helper_bgx_get_mode(int xiface, int index);
- /**
- * @INTERNAL
- * Configure Priority-Based Flow Control (a.k.a. PFC/CBFC)
- * on a specific BGX interface/port.
- */
- void __cvmx_helper_bgx_xaui_config_pfc(unsigned int node, unsigned int interface, unsigned int port,
- bool pfc_enable);
- /**
- * This function control how the hardware handles incoming PAUSE
- * packets. The most common modes of operation:
- * ctl_bck = 1, ctl_drp = 1: hardware handles everything
- * ctl_bck = 0, ctl_drp = 0: software sees all PAUSE frames
- * ctl_bck = 0, ctl_drp = 1: all PAUSE frames are completely ignored
- * @param node node number.
- * @param interface interface number
- * @param port port number
- * @param ctl_bck 1: Forward PAUSE information to TX block
- * @param ctl_drp 1: Drop control PAUSE frames.
- */
- void cvmx_helper_bgx_rx_pause_ctl(unsigned int node, unsigned int interface, unsigned int port,
- unsigned int ctl_bck, unsigned int ctl_drp);
- /**
- * This function configures the receive action taken for multicast, broadcast
- * and dmac filter match packets.
- * @param node node number.
- * @param interface interface number
- * @param port port number
- * @param cam_accept 0: reject packets on dmac filter match
- * 1: accept packet on dmac filter match
- * @param mcast_mode 0x0 = Force reject all multicast packets
- * 0x1 = Force accept all multicast packets
- * 0x2 = Use the address filter CAM
- * @param bcast_accept 0 = Reject all broadcast packets
- * 1 = Accept all broadcast packets
- */
- void cvmx_helper_bgx_rx_adr_ctl(unsigned int node, unsigned int interface, unsigned int port,
- unsigned int cam_accept, unsigned int mcast_mode,
- unsigned int bcast_accept);
- /**
- * Function to control the generation of FCS, padding by the BGX
- *
- */
- void cvmx_helper_bgx_tx_options(unsigned int node, unsigned int interface, unsigned int index,
- bool fcs_enable, bool pad_enable);
- /**
- * Set mac for the ipd_port
- *
- * @param xipd_port ipd_port to set the mac
- * @param bcst If set, accept all broadcast packets
- * @param mcst Multicast mode
- * 0 = Force reject all multicast packets
- * 1 = Force accept all multicast packets
- * 2 = use the address filter CAM.
- * @param mac mac address for the ipd_port
- */
- void cvmx_helper_bgx_set_mac(int xipd_port, int bcst, int mcst, u64 mac);
- int __cvmx_helper_bgx_port_init(int xipd_port, int phy_pres);
- void cvmx_helper_bgx_set_jabber(int xiface, unsigned int index, unsigned int size);
- int cvmx_helper_bgx_shutdown_port(int xiface, int index);
- int cvmx_bgx_set_backpressure_override(int xiface, unsigned int port_mask);
- int __cvmx_helper_bgx_fifo_size(int xiface, unsigned int lmac);
- /**
- * Returns if an interface is RGMII or not
- *
- * @param xiface xinterface to check
- * @param index port index (must be 0 for rgmii)
- *
- * Return: true if RGMII, false otherwise
- */
- static inline bool cvmx_helper_bgx_is_rgmii(int xiface, int index)
- {
- union cvmx_bgxx_cmrx_config cmr_config;
- if (!OCTEON_IS_MODEL(OCTEON_CN73XX) || index != 0)
- return false;
- cmr_config.u64 = csr_rd(CVMX_BGXX_CMRX_CONFIG(index, xiface));
- return cmr_config.s.lmac_type == 5;
- }
- /**
- * Probes the BGX Super Path (SMU/SPU) mode
- *
- * @param xiface global interface number
- * @param index interface index
- *
- * Return: true, if Super-MAC/PCS mode, false -- otherwise
- */
- bool cvmx_helper_bgx_is_smu(int xiface, int index);
- /**
- * @INTERNAL
- * Configure parameters of PAUSE packet.
- *
- * @param xipd_port Global IPD port (node + IPD port).
- * @param smac Source MAC address.
- * @param dmac Destination MAC address.
- * @param type PAUSE packet type.
- * @param time Pause time for PAUSE packets (number of 512 bit-times).
- * @param interval Interval between PAUSE packets (number of 512 bit-times).
- * Return: Zero on success, negative on failure.
- */
- int cvmx_bgx_set_pause_pkt_param(int xipd_port, u64 smac, u64 dmac, unsigned int type,
- unsigned int time, unsigned int interval);
- /**
- * @INTERNAL
- * Setup the BGX flow-control mode.
- *
- * @param xipd_port Global IPD port (node + IPD port).
- * @param type Flow-control type/protocol.
- * @param mode Flow-control mode.
- * Return: Zero on success, negative on failure.
- */
- int cvmx_bgx_set_flowctl_mode(int xipd_port, cvmx_qos_proto_t qos, cvmx_qos_pkt_mode_t mode);
- /**
- * Enables or disables autonegotiation for an interface.
- *
- * @param xiface interface to set autonegotiation
- * @param index port index
- * @param enable true to enable autonegotiation, false to disable it
- *
- * Return: 0 for success, -1 on error.
- */
- int cvmx_helper_set_autonegotiation(int xiface, int index, bool enable);
- /**
- * Enables or disables forward error correction
- *
- * @param xiface interface
- * @param index port index
- * @param enable set to true to enable FEC, false to disable
- *
- * Return: 0 for success, -1 on error
- *
- * @NOTE: If autonegotiation is enabled then autonegotiation will be
- * restarted for negotiating FEC.
- */
- int cvmx_helper_set_fec(int xiface, int index, bool enable);
- #ifdef CVMX_DUMP_BGX
- /**
- * Dump BGX configuration for node 0
- */
- int cvmx_dump_bgx_config(unsigned int bgx);
- /**
- * Dump BGX status for node 0
- */
- int cvmx_dump_bgx_status(unsigned int bgx);
- /**
- * Dump BGX configuration
- */
- int cvmx_dump_bgx_config_node(unsigned int node, unsigned int bgx);
- /**
- * Dump BGX status
- */
- int cvmx_dump_bgx_status_node(unsigned int node, unsigned int bgx);
- #endif
- #endif
|