13d0407baSopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
23d0407baSopenharmony_ci/*******************************************************************************
33d0407baSopenharmony_ci
43d0407baSopenharmony_ci  Header file for stmmac platform data
53d0407baSopenharmony_ci
63d0407baSopenharmony_ci  Copyright (C) 2009  STMicroelectronics Ltd
73d0407baSopenharmony_ci
83d0407baSopenharmony_ci
93d0407baSopenharmony_ci  Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
103d0407baSopenharmony_ci*******************************************************************************/
113d0407baSopenharmony_ci
123d0407baSopenharmony_ci#ifndef __STMMAC_PLATFORM_DATA
133d0407baSopenharmony_ci#define __STMMAC_PLATFORM_DATA
143d0407baSopenharmony_ci
153d0407baSopenharmony_ci#include <linux/platform_device.h>
163d0407baSopenharmony_ci#include <linux/phy.h>
173d0407baSopenharmony_ci
183d0407baSopenharmony_ci#define MTL_MAX_RX_QUEUES 8
193d0407baSopenharmony_ci#define MTL_MAX_TX_QUEUES 8
203d0407baSopenharmony_ci#define STMMAC_CH_MAX 8
213d0407baSopenharmony_ci
223d0407baSopenharmony_ci#define STMMAC_RX_COE_NONE 0
233d0407baSopenharmony_ci#define STMMAC_RX_COE_TYPE1 1
243d0407baSopenharmony_ci#define STMMAC_RX_COE_TYPE2 2
253d0407baSopenharmony_ci
263d0407baSopenharmony_ci/* Define the macros for CSR clock range parameters to be passed by
273d0407baSopenharmony_ci * platform code.
283d0407baSopenharmony_ci * This could also be configured at run time using CPU freq framework. */
293d0407baSopenharmony_ci
303d0407baSopenharmony_ci/* MDC Clock Selection define */
313d0407baSopenharmony_ci#define STMMAC_CSR_60_100M 0x0  /* MDC = clk_scr_i/42 */
323d0407baSopenharmony_ci#define STMMAC_CSR_100_150M 0x1 /* MDC = clk_scr_i/62 */
333d0407baSopenharmony_ci#define STMMAC_CSR_20_35M 0x2   /* MDC = clk_scr_i/16 */
343d0407baSopenharmony_ci#define STMMAC_CSR_35_60M 0x3   /* MDC = clk_scr_i/26 */
353d0407baSopenharmony_ci#define STMMAC_CSR_150_250M 0x4 /* MDC = clk_scr_i/102 */
363d0407baSopenharmony_ci#define STMMAC_CSR_250_300M 0x5 /* MDC = clk_scr_i/122 */
373d0407baSopenharmony_ci
383d0407baSopenharmony_ci/* MTL algorithms identifiers */
393d0407baSopenharmony_ci#define MTL_TX_ALGORITHM_WRR 0x0
403d0407baSopenharmony_ci#define MTL_TX_ALGORITHM_WFQ 0x1
413d0407baSopenharmony_ci#define MTL_TX_ALGORITHM_DWRR 0x2
423d0407baSopenharmony_ci#define MTL_TX_ALGORITHM_SP 0x3
433d0407baSopenharmony_ci#define MTL_RX_ALGORITHM_SP 0x4
443d0407baSopenharmony_ci#define MTL_RX_ALGORITHM_WSP 0x5
453d0407baSopenharmony_ci
463d0407baSopenharmony_ci/* RX/TX Queue Mode */
473d0407baSopenharmony_ci#define MTL_QUEUE_AVB 0x0
483d0407baSopenharmony_ci#define MTL_QUEUE_DCB 0x1
493d0407baSopenharmony_ci
503d0407baSopenharmony_ci/* The MDC clock could be set higher than the IEEE 802.3
513d0407baSopenharmony_ci * specified frequency limit 0f 2.5 MHz, by programming a clock divider
523d0407baSopenharmony_ci * of value different than the above defined values. The resultant MDIO
533d0407baSopenharmony_ci * clock frequency of 12.5 MHz is applicable for the interfacing chips
543d0407baSopenharmony_ci * supporting higher MDC clocks.
553d0407baSopenharmony_ci * The MDC clock selection macros need to be defined for MDC clock rate
563d0407baSopenharmony_ci * of 12.5 MHz, corresponding to the following selection.
573d0407baSopenharmony_ci */
583d0407baSopenharmony_ci#define STMMAC_CSR_I_4 0x8  /* clk_csr_i/4 */
593d0407baSopenharmony_ci#define STMMAC_CSR_I_6 0x9  /* clk_csr_i/6 */
603d0407baSopenharmony_ci#define STMMAC_CSR_I_8 0xA  /* clk_csr_i/8 */
613d0407baSopenharmony_ci#define STMMAC_CSR_I_10 0xB /* clk_csr_i/10 */
623d0407baSopenharmony_ci#define STMMAC_CSR_I_12 0xC /* clk_csr_i/12 */
633d0407baSopenharmony_ci#define STMMAC_CSR_I_14 0xD /* clk_csr_i/14 */
643d0407baSopenharmony_ci#define STMMAC_CSR_I_16 0xE /* clk_csr_i/16 */
653d0407baSopenharmony_ci#define STMMAC_CSR_I_18 0xF /* clk_csr_i/18 */
663d0407baSopenharmony_ci
673d0407baSopenharmony_ci/* AXI DMA Burst length supported */
683d0407baSopenharmony_ci#define DMA_AXI_BLEN_4 (1 << 1)
693d0407baSopenharmony_ci#define DMA_AXI_BLEN_8 (1 << 2)
703d0407baSopenharmony_ci#define DMA_AXI_BLEN_16 (1 << 3)
713d0407baSopenharmony_ci#define DMA_AXI_BLEN_32 (1 << 4)
723d0407baSopenharmony_ci#define DMA_AXI_BLEN_64 (1 << 5)
733d0407baSopenharmony_ci#define DMA_AXI_BLEN_128 (1 << 6)
743d0407baSopenharmony_ci#define DMA_AXI_BLEN_256 (1 << 7)
753d0407baSopenharmony_ci#define DMA_AXI_BLEN_ALL                                                                                               \
763d0407baSopenharmony_ci    (DMA_AXI_BLEN_4 | DMA_AXI_BLEN_8 | DMA_AXI_BLEN_16 | DMA_AXI_BLEN_32 | DMA_AXI_BLEN_64 | DMA_AXI_BLEN_128 |        \
773d0407baSopenharmony_ci     DMA_AXI_BLEN_256)
783d0407baSopenharmony_ci
793d0407baSopenharmony_ci/* Platfrom data for platform device structure's platform_data field */
803d0407baSopenharmony_ci
813d0407baSopenharmony_cistruct stmmac_mdio_bus_data {
823d0407baSopenharmony_ci    unsigned int phy_mask;
833d0407baSopenharmony_ci    unsigned int has_xpcs;
843d0407baSopenharmony_ci    int *irqs;
853d0407baSopenharmony_ci    int probed_phy_irq;
863d0407baSopenharmony_ci    bool needs_reset;
873d0407baSopenharmony_ci};
883d0407baSopenharmony_ci
893d0407baSopenharmony_cistruct stmmac_dma_cfg {
903d0407baSopenharmony_ci    int pbl;
913d0407baSopenharmony_ci    int txpbl;
923d0407baSopenharmony_ci    int rxpbl;
933d0407baSopenharmony_ci    bool pblx8;
943d0407baSopenharmony_ci    int fixed_burst;
953d0407baSopenharmony_ci    int mixed_burst;
963d0407baSopenharmony_ci    bool aal;
973d0407baSopenharmony_ci    bool eame;
983d0407baSopenharmony_ci};
993d0407baSopenharmony_ci
1003d0407baSopenharmony_ci#define AXI_BLEN 7
1013d0407baSopenharmony_cistruct stmmac_axi {
1023d0407baSopenharmony_ci    bool axi_lpi_en;
1033d0407baSopenharmony_ci    bool axi_xit_frm;
1043d0407baSopenharmony_ci    u32 axi_wr_osr_lmt;
1053d0407baSopenharmony_ci    u32 axi_rd_osr_lmt;
1063d0407baSopenharmony_ci    bool axi_kbbe;
1073d0407baSopenharmony_ci    u32 axi_blen[AXI_BLEN];
1083d0407baSopenharmony_ci    bool axi_fb;
1093d0407baSopenharmony_ci    bool axi_mb;
1103d0407baSopenharmony_ci    bool axi_rb;
1113d0407baSopenharmony_ci};
1123d0407baSopenharmony_ci
1133d0407baSopenharmony_ci#define EST_GCL 1024
1143d0407baSopenharmony_cistruct stmmac_est {
1153d0407baSopenharmony_ci    struct mutex lock;
1163d0407baSopenharmony_ci    int enable;
1173d0407baSopenharmony_ci    u32 btr_offset[2];
1183d0407baSopenharmony_ci    u32 btr[2];
1193d0407baSopenharmony_ci    u32 ctr[2];
1203d0407baSopenharmony_ci    u32 ter;
1213d0407baSopenharmony_ci    u32 gcl_unaligned[EST_GCL];
1223d0407baSopenharmony_ci    u32 gcl[EST_GCL];
1233d0407baSopenharmony_ci    u32 gcl_size;
1243d0407baSopenharmony_ci};
1253d0407baSopenharmony_ci
1263d0407baSopenharmony_cistruct stmmac_rxq_cfg {
1273d0407baSopenharmony_ci    u8 mode_to_use;
1283d0407baSopenharmony_ci    u32 chan;
1293d0407baSopenharmony_ci    u8 pkt_route;
1303d0407baSopenharmony_ci    bool use_prio;
1313d0407baSopenharmony_ci    u32 prio;
1323d0407baSopenharmony_ci};
1333d0407baSopenharmony_ci
1343d0407baSopenharmony_cistruct stmmac_txq_cfg {
1353d0407baSopenharmony_ci    u32 weight;
1363d0407baSopenharmony_ci    u8 mode_to_use;
1373d0407baSopenharmony_ci    /* Credit Base Shaper parameters */
1383d0407baSopenharmony_ci    u32 send_slope;
1393d0407baSopenharmony_ci    u32 idle_slope;
1403d0407baSopenharmony_ci    u32 high_credit;
1413d0407baSopenharmony_ci    u32 low_credit;
1423d0407baSopenharmony_ci    bool use_prio;
1433d0407baSopenharmony_ci    u32 prio;
1443d0407baSopenharmony_ci    int tbs_en;
1453d0407baSopenharmony_ci};
1463d0407baSopenharmony_ci
1473d0407baSopenharmony_cistruct plat_stmmacenet_data {
1483d0407baSopenharmony_ci    int bus_id;
1493d0407baSopenharmony_ci    int phy_addr;
1503d0407baSopenharmony_ci    int interface;
1513d0407baSopenharmony_ci    phy_interface_t phy_interface;
1523d0407baSopenharmony_ci    struct stmmac_mdio_bus_data *mdio_bus_data;
1533d0407baSopenharmony_ci    struct device_node *phy_node;
1543d0407baSopenharmony_ci    struct device_node *phylink_node;
1553d0407baSopenharmony_ci    struct device_node *mdio_node;
1563d0407baSopenharmony_ci    struct stmmac_dma_cfg *dma_cfg;
1573d0407baSopenharmony_ci    struct stmmac_est *est;
1583d0407baSopenharmony_ci    int clk_csr;
1593d0407baSopenharmony_ci    int has_gmac;
1603d0407baSopenharmony_ci    int enh_desc;
1613d0407baSopenharmony_ci    int tx_coe;
1623d0407baSopenharmony_ci    int rx_coe;
1633d0407baSopenharmony_ci    int bugged_jumbo;
1643d0407baSopenharmony_ci    int pmt;
1653d0407baSopenharmony_ci    int force_sf_dma_mode;
1663d0407baSopenharmony_ci    int force_thresh_dma_mode;
1673d0407baSopenharmony_ci    int riwt_off;
1683d0407baSopenharmony_ci    int max_speed;
1693d0407baSopenharmony_ci    int maxmtu;
1703d0407baSopenharmony_ci    int multicast_filter_bins;
1713d0407baSopenharmony_ci    int unicast_filter_entries;
1723d0407baSopenharmony_ci    int tx_fifo_size;
1733d0407baSopenharmony_ci    int rx_fifo_size;
1743d0407baSopenharmony_ci    u32 addr64;
1753d0407baSopenharmony_ci    u32 rx_queues_to_use;
1763d0407baSopenharmony_ci    u32 tx_queues_to_use;
1773d0407baSopenharmony_ci    u8 rx_sched_algorithm;
1783d0407baSopenharmony_ci    u8 tx_sched_algorithm;
1793d0407baSopenharmony_ci    struct stmmac_rxq_cfg rx_queues_cfg[MTL_MAX_RX_QUEUES];
1803d0407baSopenharmony_ci    struct stmmac_txq_cfg tx_queues_cfg[MTL_MAX_TX_QUEUES];
1813d0407baSopenharmony_ci    void (*fix_mac_speed)(void *priv, unsigned int speed);
1823d0407baSopenharmony_ci    int (*serdes_powerup)(struct net_device *ndev, void *priv);
1833d0407baSopenharmony_ci    void (*serdes_powerdown)(struct net_device *ndev, void *priv);
1843d0407baSopenharmony_ci    int (*init)(struct platform_device *pdev, void *priv);
1853d0407baSopenharmony_ci    void (*exit)(struct platform_device *pdev, void *priv);
1863d0407baSopenharmony_ci    void (*get_eth_addr)(void *priv, unsigned char *addr);
1873d0407baSopenharmony_ci    struct mac_device_info *(*setup)(void *priv);
1883d0407baSopenharmony_ci    void *bsp_priv;
1893d0407baSopenharmony_ci    struct clk *stmmac_clk;
1903d0407baSopenharmony_ci    struct clk *pclk;
1913d0407baSopenharmony_ci    struct clk *clk_ptp_ref;
1923d0407baSopenharmony_ci    unsigned int clk_ptp_rate;
1933d0407baSopenharmony_ci    unsigned int clk_ref_rate;
1943d0407baSopenharmony_ci    s32 ptp_max_adj;
1953d0407baSopenharmony_ci    struct reset_control *stmmac_rst;
1963d0407baSopenharmony_ci    struct stmmac_axi *axi;
1973d0407baSopenharmony_ci    int has_gmac4;
1983d0407baSopenharmony_ci    bool has_sun8i;
1993d0407baSopenharmony_ci    bool tso_en;
2003d0407baSopenharmony_ci    int rss_en;
2013d0407baSopenharmony_ci    int mac_port_sel_speed;
2023d0407baSopenharmony_ci    bool en_tx_lpi_clockgating;
2033d0407baSopenharmony_ci    int has_xgmac;
2043d0407baSopenharmony_ci    bool vlan_fail_q_en;
2053d0407baSopenharmony_ci    u8 vlan_fail_q;
2063d0407baSopenharmony_ci    unsigned int eee_usecs_rate;
2073d0407baSopenharmony_ci    bool sph_disable;
2083d0407baSopenharmony_ci};
2093d0407baSopenharmony_ci#endif
210