mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-08-31 22:39:08 +09:00
![Khoronzhuk, Ivan](/assets/img/avatar_default.png)
As MDIO bus has been added we can register PHYs with it. After registration, the PHY driver will be probed according to the hardware on board. Startup PHY at the ethernet open. Use phy_startup() instead of keystone_get_link_status() when eth open, as it verifies PHY link inside and SGMII link is checked before. For K2HK evm PHY configuration at init was absent, so don't enable phy config at init for k2hk evm. Acked-by: Vitaly Andrianov <vitalya@ti.com> Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@ti.com>
250 lines
7.6 KiB
C
250 lines
7.6 KiB
C
/*
|
|
* emac definitions for keystone2 devices
|
|
*
|
|
* (C) Copyright 2012-2014
|
|
* Texas Instruments Incorporated, <www.ti.com>
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0+
|
|
*/
|
|
|
|
#ifndef _KEYSTONE_NET_H_
|
|
#define _KEYSTONE_NET_H_
|
|
|
|
#include <asm/io.h>
|
|
|
|
/* EMAC */
|
|
#ifdef CONFIG_KSNET_NETCP_V1_0
|
|
|
|
#define GBETH_BASE (CONFIG_KSNET_NETCP_BASE + 0x00090000)
|
|
#define EMAC_EMACSL_BASE_ADDR (GBETH_BASE + 0x900)
|
|
#define EMAC_MDIO_BASE_ADDR (GBETH_BASE + 0x300)
|
|
#define EMAC_SGMII_BASE_ADDR (GBETH_BASE + 0x100)
|
|
#define DEVICE_EMACSL_BASE(x) (EMAC_EMACSL_BASE_ADDR + (x) * 0x040)
|
|
|
|
/* Register offsets */
|
|
#define CPGMACSL_REG_CTL 0x04
|
|
#define CPGMACSL_REG_STATUS 0x08
|
|
#define CPGMACSL_REG_RESET 0x0c
|
|
#define CPGMACSL_REG_MAXLEN 0x10
|
|
|
|
#elif defined CONFIG_KSNET_NETCP_V1_5
|
|
|
|
#define GBETH_BASE (CONFIG_KSNET_NETCP_BASE + 0x00200000)
|
|
#define CPGMACSL_REG_RX_PRI_MAP 0x020
|
|
#define EMAC_EMACSL_BASE_ADDR (GBETH_BASE + 0x22000)
|
|
#define EMAC_MDIO_BASE_ADDR (GBETH_BASE + 0x00f00)
|
|
#define EMAC_SGMII_BASE_ADDR (GBETH_BASE + 0x00100)
|
|
#define DEVICE_EMACSL_BASE(x) (EMAC_EMACSL_BASE_ADDR + (x) * 0x1000)
|
|
|
|
/* Register offsets */
|
|
#define CPGMACSL_REG_CTL 0x330
|
|
#define CPGMACSL_REG_STATUS 0x334
|
|
#define CPGMACSL_REG_RESET 0x338
|
|
#define CPGMACSL_REG_MAXLEN 0x024
|
|
|
|
#endif
|
|
|
|
#define KEYSTONE2_EMAC_GIG_ENABLE
|
|
|
|
#define MAC_ID_BASE_ADDR CONFIG_KSNET_MAC_ID_BASE
|
|
|
|
/* MDIO module input frequency */
|
|
#define EMAC_MDIO_BUS_FREQ (clk_get_rate(pass_pll_clk))
|
|
/* MDIO clock output frequency */
|
|
#define EMAC_MDIO_CLOCK_FREQ 2500000 /* 2.5 MHz */
|
|
|
|
/* MII Status Register */
|
|
#define MII_STATUS_REG 1
|
|
#define MII_STATUS_LINK_MASK 0x4
|
|
|
|
#define MDIO_CONTROL_IDLE 0x80000000
|
|
#define MDIO_CONTROL_ENABLE 0x40000000
|
|
#define MDIO_CONTROL_FAULT_ENABLE 0x40000
|
|
#define MDIO_CONTROL_FAULT 0x80000
|
|
#define MDIO_USERACCESS0_GO 0x80000000
|
|
#define MDIO_USERACCESS0_WRITE_READ 0x0
|
|
#define MDIO_USERACCESS0_WRITE_WRITE 0x40000000
|
|
#define MDIO_USERACCESS0_ACK 0x20000000
|
|
|
|
#define EMAC_MACCONTROL_MIIEN_ENABLE 0x20
|
|
#define EMAC_MACCONTROL_FULLDUPLEX_ENABLE 0x1
|
|
#define EMAC_MACCONTROL_GIGABIT_ENABLE BIT(7)
|
|
#define EMAC_MACCONTROL_GIGFORCE BIT(17)
|
|
#define EMAC_MACCONTROL_RMIISPEED_100 BIT(15)
|
|
|
|
#define EMAC_MIN_ETHERNET_PKT_SIZE 60
|
|
|
|
struct mac_sl_cfg {
|
|
u_int32_t max_rx_len; /* Maximum receive packet length. */
|
|
u_int32_t ctl; /* Control bitfield */
|
|
};
|
|
|
|
/**
|
|
* Definition: Control bitfields used in the ctl field of mac_sl_cfg
|
|
*/
|
|
#define GMACSL_RX_ENABLE_RCV_CONTROL_FRAMES BIT(24)
|
|
#define GMACSL_RX_ENABLE_RCV_SHORT_FRAMES BIT(23)
|
|
#define GMACSL_RX_ENABLE_RCV_ERROR_FRAMES BIT(22)
|
|
#define GMACSL_RX_ENABLE_EXT_CTL BIT(18)
|
|
#define GMACSL_RX_ENABLE_GIG_FORCE BIT(17)
|
|
#define GMACSL_RX_ENABLE_IFCTL_B BIT(16)
|
|
#define GMACSL_RX_ENABLE_IFCTL_A BIT(15)
|
|
#define GMACSL_RX_ENABLE_CMD_IDLE BIT(11)
|
|
#define GMACSL_TX_ENABLE_SHORT_GAP BIT(10)
|
|
#define GMACSL_ENABLE_GIG_MODE BIT(7)
|
|
#define GMACSL_TX_ENABLE_PACE BIT(6)
|
|
#define GMACSL_ENABLE BIT(5)
|
|
#define GMACSL_TX_ENABLE_FLOW_CTL BIT(4)
|
|
#define GMACSL_RX_ENABLE_FLOW_CTL BIT(3)
|
|
#define GMACSL_ENABLE_LOOPBACK BIT(1)
|
|
#define GMACSL_ENABLE_FULL_DUPLEX BIT(0)
|
|
|
|
/* EMAC SL function return values */
|
|
#define GMACSL_RET_OK 0
|
|
#define GMACSL_RET_INVALID_PORT -1
|
|
#define GMACSL_RET_WARN_RESET_INCOMPLETE -2
|
|
#define GMACSL_RET_WARN_MAXLEN_TOO_BIG -3
|
|
#define GMACSL_RET_CONFIG_FAIL_RESET_ACTIVE -4
|
|
|
|
/* EMAC SL register definitions */
|
|
#define DEVICE_EMACSL_RESET_POLL_COUNT 100
|
|
|
|
/* Soft reset register values */
|
|
#define CPGMAC_REG_RESET_VAL_RESET_MASK BIT(0)
|
|
#define CPGMAC_REG_RESET_VAL_RESET BIT(0)
|
|
#define CPGMAC_REG_MAXLEN_LEN 0x3fff
|
|
|
|
/* CPSW */
|
|
/* Control bitfields */
|
|
#define CPSW_CTL_P2_PASS_PRI_TAGGED BIT(5)
|
|
#define CPSW_CTL_P1_PASS_PRI_TAGGED BIT(4)
|
|
#define CPSW_CTL_P0_PASS_PRI_TAGGED BIT(3)
|
|
#define CPSW_CTL_P0_ENABLE BIT(2)
|
|
#define CPSW_CTL_VLAN_AWARE BIT(1)
|
|
#define CPSW_CTL_FIFO_LOOPBACK BIT(0)
|
|
|
|
#define DEVICE_CPSW_NUM_PORTS CONFIG_KSNET_CPSW_NUM_PORTS
|
|
#define DEVICE_N_GMACSL_PORTS (DEVICE_CPSW_NUM_PORTS - 1)
|
|
|
|
#ifdef CONFIG_KSNET_NETCP_V1_0
|
|
|
|
#define DEVICE_CPSW_BASE (GBETH_BASE + 0x800)
|
|
#define CPSW_REG_CTL 0x004
|
|
#define CPSW_REG_STAT_PORT_EN 0x00c
|
|
#define CPSW_REG_MAXLEN 0x040
|
|
#define CPSW_REG_ALE_CONTROL 0x608
|
|
#define CPSW_REG_ALE_PORTCTL(x) (0x640 + (x) * 4)
|
|
#define CPSW_REG_VAL_STAT_ENABLE_ALL 0xf
|
|
|
|
#elif defined CONFIG_KSNET_NETCP_V1_5
|
|
|
|
#define DEVICE_CPSW_BASE (GBETH_BASE + 0x20000)
|
|
#define CPSW_REG_CTL 0x00004
|
|
#define CPSW_REG_STAT_PORT_EN 0x00014
|
|
#define CPSW_REG_MAXLEN 0x01024
|
|
#define CPSW_REG_ALE_CONTROL 0x1e008
|
|
#define CPSW_REG_ALE_PORTCTL(x) (0x1e040 + (x) * 4)
|
|
#define CPSW_REG_VAL_STAT_ENABLE_ALL 0x1ff
|
|
|
|
#endif
|
|
|
|
#define CPSW_REG_VAL_ALE_CTL_RESET_AND_ENABLE ((u_int32_t)0xc0000000)
|
|
#define CPSW_REG_VAL_ALE_CTL_BYPASS ((u_int32_t)0x00000010)
|
|
#define CPSW_REG_VAL_PORTCTL_FORWARD_MODE 0x3
|
|
|
|
#define target_get_switch_ctl() CPSW_CTL_P0_ENABLE
|
|
#define SWITCH_MAX_PKT_SIZE 9000
|
|
|
|
/* SGMII */
|
|
#define SGMII_REG_STATUS_LOCK BIT(4)
|
|
#define SGMII_REG_STATUS_LINK BIT(0)
|
|
#define SGMII_REG_STATUS_AUTONEG BIT(2)
|
|
#define SGMII_REG_CONTROL_AUTONEG BIT(0)
|
|
#define SGMII_REG_CONTROL_MASTER BIT(5)
|
|
#define SGMII_REG_MR_ADV_ENABLE BIT(0)
|
|
#define SGMII_REG_MR_ADV_LINK BIT(15)
|
|
#define SGMII_REG_MR_ADV_FULL_DUPLEX BIT(12)
|
|
#define SGMII_REG_MR_ADV_GIG_MODE BIT(11)
|
|
|
|
#define SGMII_LINK_MAC_MAC_AUTONEG 0
|
|
#define SGMII_LINK_MAC_PHY 1
|
|
#define SGMII_LINK_MAC_MAC_FORCED 2
|
|
#define SGMII_LINK_MAC_FIBER 3
|
|
#define SGMII_LINK_MAC_PHY_FORCED 4
|
|
|
|
#ifdef CONFIG_KSNET_NETCP_V1_0
|
|
#define SGMII_OFFSET(x) ((x <= 1) ? (x * 0x100) : ((x * 0x100) + 0x100))
|
|
#elif defined CONFIG_KSNET_NETCP_V1_5
|
|
#define SGMII_OFFSET(x) ((x) * 0x100)
|
|
#endif
|
|
|
|
#define SGMII_IDVER_REG(x) (EMAC_SGMII_BASE_ADDR + SGMII_OFFSET(x) + 0x000)
|
|
#define SGMII_SRESET_REG(x) (EMAC_SGMII_BASE_ADDR + SGMII_OFFSET(x) + 0x004)
|
|
#define SGMII_CTL_REG(x) (EMAC_SGMII_BASE_ADDR + SGMII_OFFSET(x) + 0x010)
|
|
#define SGMII_STATUS_REG(x) (EMAC_SGMII_BASE_ADDR + SGMII_OFFSET(x) + 0x014)
|
|
#define SGMII_MRADV_REG(x) (EMAC_SGMII_BASE_ADDR + SGMII_OFFSET(x) + 0x018)
|
|
#define SGMII_LPADV_REG(x) (EMAC_SGMII_BASE_ADDR + SGMII_OFFSET(x) + 0x020)
|
|
#define SGMII_TXCFG_REG(x) (EMAC_SGMII_BASE_ADDR + SGMII_OFFSET(x) + 0x030)
|
|
#define SGMII_RXCFG_REG(x) (EMAC_SGMII_BASE_ADDR + SGMII_OFFSET(x) + 0x034)
|
|
#define SGMII_AUXCFG_REG(x) (EMAC_SGMII_BASE_ADDR + SGMII_OFFSET(x) + 0x038)
|
|
|
|
/* PSS */
|
|
#ifdef CONFIG_KSNET_NETCP_V1_0
|
|
|
|
#define DEVICE_PSTREAM_CFG_REG_ADDR (CONFIG_KSNET_NETCP_BASE + 0x604)
|
|
#define DEVICE_PSTREAM_CFG_VAL_ROUTE_CPPI 0x06060606
|
|
#define hw_config_streaming_switch()\
|
|
writel(DEVICE_PSTREAM_CFG_VAL_ROUTE_CPPI, DEVICE_PSTREAM_CFG_REG_ADDR);
|
|
|
|
#elif defined CONFIG_KSNET_NETCP_V1_5
|
|
|
|
#define DEVICE_PSTREAM_CFG_REG_ADDR (CONFIG_KSNET_NETCP_BASE + 0x500)
|
|
#define DEVICE_PSTREAM_CFG_VAL_ROUTE_CPPI 0x0
|
|
|
|
#define hw_config_streaming_switch()\
|
|
writel(DEVICE_PSTREAM_CFG_VAL_ROUTE_CPPI,\
|
|
DEVICE_PSTREAM_CFG_REG_ADDR);\
|
|
writel(DEVICE_PSTREAM_CFG_VAL_ROUTE_CPPI,\
|
|
DEVICE_PSTREAM_CFG_REG_ADDR+4);\
|
|
writel(DEVICE_PSTREAM_CFG_VAL_ROUTE_CPPI,\
|
|
DEVICE_PSTREAM_CFG_REG_ADDR+8);\
|
|
writel(DEVICE_PSTREAM_CFG_VAL_ROUTE_CPPI,\
|
|
DEVICE_PSTREAM_CFG_REG_ADDR+12);
|
|
|
|
#endif
|
|
|
|
/* EMAC MDIO Registers Structure */
|
|
struct mdio_regs {
|
|
u32 version;
|
|
u32 control;
|
|
u32 alive;
|
|
u32 link;
|
|
u32 linkintraw;
|
|
u32 linkintmasked;
|
|
u32 rsvd0[2];
|
|
u32 userintraw;
|
|
u32 userintmasked;
|
|
u32 userintmaskset;
|
|
u32 userintmaskclear;
|
|
u32 rsvd1[20];
|
|
u32 useraccess0;
|
|
u32 userphysel0;
|
|
u32 useraccess1;
|
|
u32 userphysel1;
|
|
};
|
|
|
|
struct eth_priv_t {
|
|
char int_name[32];
|
|
int rx_flow;
|
|
int phy_addr;
|
|
int slave_port;
|
|
int sgmii_link_type;
|
|
struct phy_device *phy_dev;
|
|
};
|
|
|
|
int keystone2_emac_initialize(struct eth_priv_t *eth_priv);
|
|
void sgmii_serdes_setup_156p25mhz(void);
|
|
void sgmii_serdes_shutdown(void);
|
|
|
|
#endif /* _KEYSTONE_NET_H_ */
|