2019-05-30 07:57:29 +08:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
2010-01-07 07:07:13 +08:00
|
|
|
/*******************************************************************************
|
|
|
|
|
|
|
|
Header file for stmmac platform data
|
|
|
|
|
|
|
|
Copyright (C) 2009 STMicroelectronics Ltd
|
|
|
|
|
|
|
|
|
|
|
|
Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
|
|
#ifndef __STMMAC_PLATFORM_DATA
|
|
|
|
#define __STMMAC_PLATFORM_DATA
|
|
|
|
|
2011-05-03 02:36:45 +08:00
|
|
|
#include <linux/platform_device.h>
|
net: of_get_phy_mode: Change API to solve int/unit warnings
Before this change of_get_phy_mode() returned an enum,
phy_interface_t. On error, -ENODEV etc, is returned. If the result of
the function is stored in a variable of type phy_interface_t, and the
compiler has decided to represent this as an unsigned int, comparision
with -ENODEV etc, is a signed vs unsigned comparision.
Fix this problem by changing the API. Make the function return an
error, or 0 on success, and pass a pointer, of type phy_interface_t,
where the phy mode should be stored.
v2:
Return with *interface set to PHY_INTERFACE_MODE_NA on error.
Add error checks to all users of of_get_phy_mode()
Fixup a few reverse christmas tree errors
Fixup a few slightly malformed reverse christmas trees
v3:
Fix 0-day reported errors.
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
2019-11-04 09:40:33 +08:00
|
|
|
#include <linux/phy.h>
|
2011-05-03 02:36:45 +08:00
|
|
|
|
2017-03-11 02:24:51 +08:00
|
|
|
#define MTL_MAX_RX_QUEUES 8
|
|
|
|
#define MTL_MAX_TX_QUEUES 8
|
2018-09-17 16:22:56 +08:00
|
|
|
#define STMMAC_CH_MAX 8
|
2017-03-11 02:24:51 +08:00
|
|
|
|
2012-04-04 12:33:20 +08:00
|
|
|
#define STMMAC_RX_COE_NONE 0
|
|
|
|
#define STMMAC_RX_COE_TYPE1 1
|
|
|
|
#define STMMAC_RX_COE_TYPE2 2
|
|
|
|
|
2012-04-04 12:33:22 +08:00
|
|
|
/* Define the macros for CSR clock range parameters to be passed by
|
|
|
|
* platform code.
|
|
|
|
* This could also be configured at run time using CPU freq framework. */
|
|
|
|
|
|
|
|
/* MDC Clock Selection define*/
|
2012-04-04 12:33:26 +08:00
|
|
|
#define STMMAC_CSR_60_100M 0x0 /* MDC = clk_scr_i/42 */
|
|
|
|
#define STMMAC_CSR_100_150M 0x1 /* MDC = clk_scr_i/62 */
|
|
|
|
#define STMMAC_CSR_20_35M 0x2 /* MDC = clk_scr_i/16 */
|
|
|
|
#define STMMAC_CSR_35_60M 0x3 /* MDC = clk_scr_i/26 */
|
|
|
|
#define STMMAC_CSR_150_250M 0x4 /* MDC = clk_scr_i/102 */
|
|
|
|
#define STMMAC_CSR_250_300M 0x5 /* MDC = clk_scr_i/122 */
|
2012-04-04 12:33:22 +08:00
|
|
|
|
2017-03-11 02:24:51 +08:00
|
|
|
/* MTL algorithms identifiers */
|
|
|
|
#define MTL_TX_ALGORITHM_WRR 0x0
|
|
|
|
#define MTL_TX_ALGORITHM_WFQ 0x1
|
|
|
|
#define MTL_TX_ALGORITHM_DWRR 0x2
|
|
|
|
#define MTL_TX_ALGORITHM_SP 0x3
|
|
|
|
#define MTL_RX_ALGORITHM_SP 0x4
|
|
|
|
#define MTL_RX_ALGORITHM_WSP 0x5
|
|
|
|
|
2017-03-11 02:24:59 +08:00
|
|
|
/* RX/TX Queue Mode */
|
2017-03-21 23:12:11 +08:00
|
|
|
#define MTL_QUEUE_AVB 0x0
|
|
|
|
#define MTL_QUEUE_DCB 0x1
|
2017-03-11 02:24:51 +08:00
|
|
|
|
2012-04-04 12:33:26 +08:00
|
|
|
/* The MDC clock could be set higher than the IEEE 802.3
|
2012-04-04 12:33:22 +08:00
|
|
|
* specified frequency limit 0f 2.5 MHz, by programming a clock divider
|
|
|
|
* of value different than the above defined values. The resultant MDIO
|
|
|
|
* clock frequency of 12.5 MHz is applicable for the interfacing chips
|
|
|
|
* supporting higher MDC clocks.
|
|
|
|
* The MDC clock selection macros need to be defined for MDC clock rate
|
|
|
|
* of 12.5 MHz, corresponding to the following selection.
|
2012-04-04 12:33:26 +08:00
|
|
|
*/
|
|
|
|
#define STMMAC_CSR_I_4 0x8 /* clk_csr_i/4 */
|
|
|
|
#define STMMAC_CSR_I_6 0x9 /* clk_csr_i/6 */
|
|
|
|
#define STMMAC_CSR_I_8 0xA /* clk_csr_i/8 */
|
|
|
|
#define STMMAC_CSR_I_10 0xB /* clk_csr_i/10 */
|
|
|
|
#define STMMAC_CSR_I_12 0xC /* clk_csr_i/12 */
|
|
|
|
#define STMMAC_CSR_I_14 0xD /* clk_csr_i/14 */
|
|
|
|
#define STMMAC_CSR_I_16 0xE /* clk_csr_i/16 */
|
|
|
|
#define STMMAC_CSR_I_18 0xF /* clk_csr_i/18 */
|
2012-04-04 12:33:22 +08:00
|
|
|
|
2012-08-22 18:11:26 +08:00
|
|
|
/* AXI DMA Burst length supported */
|
2012-04-04 12:33:23 +08:00
|
|
|
#define DMA_AXI_BLEN_4 (1 << 1)
|
|
|
|
#define DMA_AXI_BLEN_8 (1 << 2)
|
|
|
|
#define DMA_AXI_BLEN_16 (1 << 3)
|
|
|
|
#define DMA_AXI_BLEN_32 (1 << 4)
|
|
|
|
#define DMA_AXI_BLEN_64 (1 << 5)
|
|
|
|
#define DMA_AXI_BLEN_128 (1 << 6)
|
|
|
|
#define DMA_AXI_BLEN_256 (1 << 7)
|
|
|
|
#define DMA_AXI_BLEN_ALL (DMA_AXI_BLEN_4 | DMA_AXI_BLEN_8 | DMA_AXI_BLEN_16 \
|
|
|
|
| DMA_AXI_BLEN_32 | DMA_AXI_BLEN_64 \
|
|
|
|
| DMA_AXI_BLEN_128 | DMA_AXI_BLEN_256)
|
|
|
|
|
2011-07-20 08:05:23 +08:00
|
|
|
/* Platfrom data for platform device structure's platform_data field */
|
|
|
|
|
|
|
|
struct stmmac_mdio_bus_data {
|
|
|
|
unsigned int phy_mask;
|
2020-03-09 16:36:27 +08:00
|
|
|
unsigned int has_xpcs;
|
2021-03-15 13:27:09 +08:00
|
|
|
unsigned int xpcs_an_inband;
|
2011-07-20 08:05:23 +08:00
|
|
|
int *irqs;
|
|
|
|
int probed_phy_irq;
|
2019-07-26 18:27:40 +08:00
|
|
|
bool needs_reset;
|
2011-07-20 08:05:23 +08:00
|
|
|
};
|
2010-01-07 07:07:13 +08:00
|
|
|
|
2012-04-04 12:33:23 +08:00
|
|
|
struct stmmac_dma_cfg {
|
|
|
|
int pbl;
|
net: stmmac: add support for independent DMA pbl for tx/rx
GMAC and newer supports independent programmable burst lengths for
DMA tx/rx. Add new optional devicetree properties representing this.
To be backwards compatible, snps,pbl will still be valid, but
snps,txpbl/snps,rxpbl will override the value in snps,pbl if set.
If the IP is synthesized to use the AXI interface, there is a register
and a matching DT property inside the optional stmmac-axi-config DT node
for controlling burst lengths, named snps,blen.
However, using this register, it is not possible to control tx and rx
independently. Also, this register is not available if the IP was
synthesized with, e.g., the AHB interface.
Signed-off-by: Niklas Cassel <niklas.cassel@axis.com>
Acked-by: Alexandre Torgue <alexandre.torgue@st.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2016-12-07 22:20:07 +08:00
|
|
|
int txpbl;
|
|
|
|
int rxpbl;
|
2016-12-07 22:20:08 +08:00
|
|
|
bool pblx8;
|
2012-04-04 12:33:23 +08:00
|
|
|
int fixed_burst;
|
2012-05-14 06:18:42 +08:00
|
|
|
int mixed_burst;
|
2016-02-29 21:27:28 +08:00
|
|
|
bool aal;
|
2019-10-02 22:52:57 +08:00
|
|
|
bool eame;
|
2016-02-29 21:27:28 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
#define AXI_BLEN 7
|
|
|
|
struct stmmac_axi {
|
|
|
|
bool axi_lpi_en;
|
|
|
|
bool axi_xit_frm;
|
|
|
|
u32 axi_wr_osr_lmt;
|
|
|
|
u32 axi_rd_osr_lmt;
|
|
|
|
bool axi_kbbe;
|
|
|
|
u32 axi_blen[AXI_BLEN];
|
|
|
|
bool axi_fb;
|
|
|
|
bool axi_mb;
|
|
|
|
bool axi_rb;
|
2012-04-04 12:33:23 +08:00
|
|
|
};
|
|
|
|
|
2019-12-18 18:33:05 +08:00
|
|
|
#define EST_GCL 1024
|
|
|
|
struct stmmac_est {
|
|
|
|
int enable;
|
|
|
|
u32 btr_offset[2];
|
|
|
|
u32 btr[2];
|
|
|
|
u32 ctr[2];
|
|
|
|
u32 ter;
|
|
|
|
u32 gcl_unaligned[EST_GCL];
|
|
|
|
u32 gcl[EST_GCL];
|
|
|
|
u32 gcl_size;
|
|
|
|
};
|
|
|
|
|
2017-03-11 02:24:51 +08:00
|
|
|
struct stmmac_rxq_cfg {
|
|
|
|
u8 mode_to_use;
|
2017-11-02 15:22:13 +08:00
|
|
|
u32 chan;
|
2017-03-18 00:11:07 +08:00
|
|
|
u8 pkt_route;
|
2017-03-18 00:11:06 +08:00
|
|
|
bool use_prio;
|
|
|
|
u32 prio;
|
2017-03-11 02:24:51 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
struct stmmac_txq_cfg {
|
2017-11-02 15:22:13 +08:00
|
|
|
u32 weight;
|
2017-03-11 02:24:59 +08:00
|
|
|
u8 mode_to_use;
|
|
|
|
/* Credit Base Shaper parameters */
|
|
|
|
u32 send_slope;
|
|
|
|
u32 idle_slope;
|
|
|
|
u32 high_credit;
|
|
|
|
u32 low_credit;
|
2017-03-18 00:11:06 +08:00
|
|
|
bool use_prio;
|
|
|
|
u32 prio;
|
2020-01-14 00:24:09 +08:00
|
|
|
int tbs_en;
|
2017-03-11 02:24:51 +08:00
|
|
|
};
|
|
|
|
|
2010-01-07 07:07:13 +08:00
|
|
|
struct plat_stmmacenet_data {
|
|
|
|
int bus_id;
|
2011-07-20 08:05:23 +08:00
|
|
|
int phy_addr;
|
|
|
|
int interface;
|
net: of_get_phy_mode: Change API to solve int/unit warnings
Before this change of_get_phy_mode() returned an enum,
phy_interface_t. On error, -ENODEV etc, is returned. If the result of
the function is stored in a variable of type phy_interface_t, and the
compiler has decided to represent this as an unsigned int, comparision
with -ENODEV etc, is a signed vs unsigned comparision.
Fix this problem by changing the API. Make the function return an
error, or 0 on success, and pass a pointer, of type phy_interface_t,
where the phy mode should be stored.
v2:
Return with *interface set to PHY_INTERFACE_MODE_NA on error.
Add error checks to all users of of_get_phy_mode()
Fixup a few reverse christmas tree errors
Fixup a few slightly malformed reverse christmas trees
v3:
Fix 0-day reported errors.
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
2019-11-04 09:40:33 +08:00
|
|
|
phy_interface_t phy_interface;
|
2011-07-20 08:05:23 +08:00
|
|
|
struct stmmac_mdio_bus_data *mdio_bus_data;
|
2015-05-28 02:02:47 +08:00
|
|
|
struct device_node *phy_node;
|
2019-06-14 23:06:57 +08:00
|
|
|
struct device_node *phylink_node;
|
2016-04-01 15:07:16 +08:00
|
|
|
struct device_node *mdio_node;
|
2012-04-04 12:33:23 +08:00
|
|
|
struct stmmac_dma_cfg *dma_cfg;
|
2019-12-18 18:33:05 +08:00
|
|
|
struct stmmac_est *est;
|
2010-09-17 11:23:39 +08:00
|
|
|
int clk_csr;
|
2010-01-07 07:07:13 +08:00
|
|
|
int has_gmac;
|
2010-04-14 04:21:14 +08:00
|
|
|
int enh_desc;
|
2010-09-17 11:23:40 +08:00
|
|
|
int tx_coe;
|
2012-04-04 12:33:20 +08:00
|
|
|
int rx_coe;
|
2010-09-17 11:23:40 +08:00
|
|
|
int bugged_jumbo;
|
2010-09-25 12:27:41 +08:00
|
|
|
int pmt;
|
2011-07-18 04:54:09 +08:00
|
|
|
int force_sf_dma_mode;
|
2013-08-28 18:55:39 +08:00
|
|
|
int force_thresh_dma_mode;
|
2012-11-26 07:10:43 +08:00
|
|
|
int riwt_off;
|
2014-01-16 18:51:43 +08:00
|
|
|
int max_speed;
|
2014-01-20 19:39:01 +08:00
|
|
|
int maxmtu;
|
2014-08-01 04:49:17 +08:00
|
|
|
int multicast_filter_bins;
|
|
|
|
int unicast_filter_entries;
|
2015-04-16 00:17:40 +08:00
|
|
|
int tx_fifo_size;
|
|
|
|
int rx_fifo_size;
|
2020-12-07 18:51:41 +08:00
|
|
|
u32 addr64;
|
2017-11-02 15:22:13 +08:00
|
|
|
u32 rx_queues_to_use;
|
|
|
|
u32 tx_queues_to_use;
|
2017-03-11 02:24:51 +08:00
|
|
|
u8 rx_sched_algorithm;
|
|
|
|
u8 tx_sched_algorithm;
|
|
|
|
struct stmmac_rxq_cfg rx_queues_cfg[MTL_MAX_RX_QUEUES];
|
|
|
|
struct stmmac_txq_cfg tx_queues_cfg[MTL_MAX_TX_QUEUES];
|
2010-01-07 07:07:13 +08:00
|
|
|
void (*fix_mac_speed)(void *priv, unsigned int speed);
|
2020-04-20 23:42:52 +08:00
|
|
|
int (*serdes_powerup)(struct net_device *ndev, void *priv);
|
|
|
|
void (*serdes_powerdown)(struct net_device *ndev, void *priv);
|
2014-01-17 21:24:42 +08:00
|
|
|
int (*init)(struct platform_device *pdev, void *priv);
|
|
|
|
void (*exit)(struct platform_device *pdev, void *priv);
|
2017-05-31 15:18:33 +08:00
|
|
|
struct mac_device_info *(*setup)(void *priv);
|
2021-03-15 20:16:47 +08:00
|
|
|
int (*clks_config)(void *priv, bool enabled);
|
2010-01-07 07:07:13 +08:00
|
|
|
void *bsp_priv;
|
2017-01-09 20:35:09 +08:00
|
|
|
struct clk *stmmac_clk;
|
|
|
|
struct clk *pclk;
|
|
|
|
struct clk *clk_ptp_ref;
|
|
|
|
unsigned int clk_ptp_rate;
|
2019-01-30 22:54:19 +08:00
|
|
|
unsigned int clk_ref_rate;
|
2019-08-27 09:38:11 +08:00
|
|
|
s32 ptp_max_adj;
|
2017-01-09 20:35:09 +08:00
|
|
|
struct reset_control *stmmac_rst;
|
2016-02-29 21:27:28 +08:00
|
|
|
struct stmmac_axi *axi;
|
2016-04-01 17:37:33 +08:00
|
|
|
int has_gmac4;
|
2017-05-31 15:18:36 +08:00
|
|
|
bool has_sun8i;
|
2016-04-01 17:37:33 +08:00
|
|
|
bool tso_en;
|
2019-08-07 16:03:12 +08:00
|
|
|
int rss_en;
|
2016-06-24 21:16:26 +08:00
|
|
|
int mac_port_sel_speed;
|
2017-01-09 20:35:08 +08:00
|
|
|
bool en_tx_lpi_clockgating;
|
2018-08-08 16:04:29 +08:00
|
|
|
int has_xgmac;
|
2020-09-25 17:40:41 +08:00
|
|
|
bool vlan_fail_q_en;
|
|
|
|
u8 vlan_fail_q;
|
2020-09-28 18:12:12 +08:00
|
|
|
unsigned int eee_usecs_rate;
|
2021-02-17 17:57:05 +08:00
|
|
|
struct pci_dev *pdev;
|
2010-01-07 07:07:13 +08:00
|
|
|
};
|
|
|
|
#endif
|