mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-08 22:24:32 +00:00
e7bc6eabd1
Import misc cvmx-helper header files from 2013 U-Boot. They will be used by the later added drivers to support PCIe and networking on the MIPS Octeon II / III platforms. Signed-off-by: Aaron Williams <awilliams@marvell.com> Signed-off-by: Stefan Roese <sr@denx.de>
335 lines
11 KiB
C
335 lines
11 KiB
C
/* 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
|