mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-12-27 21:43:45 +00:00
204 lines
6.1 KiB
C
204 lines
6.1 KiB
C
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||
|
/*
|
||
|
* Xilinx Multirate Ethernet MAC(MRMAC) driver
|
||
|
*
|
||
|
* Author(s): Ashok Reddy Soma <ashok.reddy.soma@xilinx.com>
|
||
|
* Michal Simek <michal.simek@xilinx.com>
|
||
|
*
|
||
|
* Copyright (C) 2021 Xilinx, Inc. All rights reserved.
|
||
|
*/
|
||
|
|
||
|
#ifndef __XILINX_AXI_MRMAC_H
|
||
|
#define __XILINX_AXI_MRMAC_H
|
||
|
|
||
|
#define MIN_PKT_SIZE 60
|
||
|
|
||
|
/* MRMAC needs atleast two buffer descriptors for Tx/Rx to work.
|
||
|
* Otherwise MRMAC will drop the packets. So, have atleast two Tx and
|
||
|
* two Rx bd's.
|
||
|
*/
|
||
|
#define TX_DESC 2
|
||
|
#define RX_DESC 2
|
||
|
|
||
|
/* MRMAC platform data structure */
|
||
|
struct axi_mrmac_plat {
|
||
|
struct eth_pdata eth_pdata;
|
||
|
struct mcdma_common_regs *mm2s_cmn;
|
||
|
u32 mrmac_rate; /* Hold the value from DT property "mrmac-rate" */
|
||
|
};
|
||
|
|
||
|
/* MRMAC private driver structure */
|
||
|
struct axi_mrmac_priv {
|
||
|
struct mrmac_regs *iobase;
|
||
|
struct mcdma_common_regs *mm2s_cmn;
|
||
|
struct mcdma_common_regs *s2mm_cmn;
|
||
|
struct mcdma_chan_reg *mcdma_tx;
|
||
|
struct mcdma_chan_reg *mcdma_rx;
|
||
|
struct mcdma_bd *tx_bd[TX_DESC];
|
||
|
struct mcdma_bd *rx_bd[RX_DESC];
|
||
|
u8 *txminframe; /* Pointer to hold min length Tx frame(60) */
|
||
|
u32 mrmac_rate; /* Speed to configure(Read from DT 10G/25G..) */
|
||
|
};
|
||
|
|
||
|
/* MRMAC Register Definitions */
|
||
|
struct mrmac_regs {
|
||
|
u32 revision; /* 0x0: Revision Register */
|
||
|
u32 reset; /* 0x4: Reset Register */
|
||
|
u32 mode; /* 0x8: Mode */
|
||
|
u32 tx_config; /* 0xc: Tx Configuration */
|
||
|
u32 rx_config; /* 0x10: Rx Configuration */
|
||
|
u32 reserved[6];/* 0x14-0x28: Reserved */
|
||
|
u32 tick_reg; /* 0x2c: Tick Register */
|
||
|
};
|
||
|
|
||
|
#define TX_BD_TOTAL_SIZE (TX_DESC * sizeof(struct mcdma_bd))
|
||
|
#define RX_BD_TOTAL_SIZE (RX_DESC * sizeof(struct mcdma_bd))
|
||
|
|
||
|
#define RX_BUFF_TOTAL_SIZE (RX_DESC * PKTSIZE_ALIGN)
|
||
|
|
||
|
/* Status Registers */
|
||
|
#define MRMAC_TX_STS_OFFSET 0x740
|
||
|
#define MRMAC_RX_STS_OFFSET 0x744
|
||
|
#define MRMAC_TX_RT_STS_OFFSET 0x748
|
||
|
#define MRMAC_RX_RT_STS_OFFSET 0x74c
|
||
|
#define MRMAC_STATRX_BLKLCK_OFFSET 0x754
|
||
|
|
||
|
/* Register bit masks */
|
||
|
#define MRMAC_RX_SERDES_RST_MASK (BIT(3) | BIT(2) | BIT(1) | BIT(0))
|
||
|
#define MRMAC_TX_SERDES_RST_MASK BIT(4)
|
||
|
#define MRMAC_RX_RST_MASK BIT(5)
|
||
|
#define MRMAC_TX_RST_MASK BIT(6)
|
||
|
#define MRMAC_RX_AXI_RST_MASK BIT(8)
|
||
|
#define MRMAC_TX_AXI_RST_MASK BIT(9)
|
||
|
#define MRMAC_STS_ALL_MASK 0xffffffff
|
||
|
|
||
|
#define MRMAC_RX_EN_MASK BIT(0)
|
||
|
#define MRMAC_RX_DEL_FCS_MASK BIT(1)
|
||
|
|
||
|
#define MRMAC_TX_EN_MASK BIT(0)
|
||
|
#define MRMAC_TX_INS_FCS_MASK BIT(1)
|
||
|
|
||
|
#define MRMAC_RX_BLKLCK_MASK BIT(0)
|
||
|
|
||
|
#define MRMAC_TICK_TRIGGER BIT(0)
|
||
|
|
||
|
#define MRMAC_RESET_DELAY 1 /* Delay in msecs */
|
||
|
#define MRMAC_BLKLCK_TIMEOUT 100 /* Block lock timeout in msecs */
|
||
|
#define MRMAC_DMARST_TIMEOUT 500 /* MCDMA reset timeout in msecs */
|
||
|
|
||
|
#define XMCDMA_RX_OFFSET 0x500
|
||
|
#define XMCDMA_CHAN_OFFSET 0x40
|
||
|
|
||
|
/* MCDMA Channel numbers are from 1-16 */
|
||
|
#define XMCDMA_CHANNEL_1 BIT(0)
|
||
|
#define XMCDMA_CHANNEL_2 BIT(1)
|
||
|
|
||
|
#define XMCDMA_CR_RUNSTOP BIT(0)
|
||
|
#define XMCDMA_CR_RESET BIT(2)
|
||
|
|
||
|
#define XMCDMA_BD_CTRL_TXSOF_MASK BIT(31) /* First tx packet */
|
||
|
#define XMCDMA_BD_CTRL_TXEOF_MASK BIT(30) /* Last tx packet */
|
||
|
#define XMCDMA_BD_CTRL_ALL_MASK GENMASK(31, 30) /* All control bits */
|
||
|
#define XMCDMA_BD_STS_ALL_MASK GENMASK(31, 28) /* All status bits */
|
||
|
|
||
|
/* MCDMA Mask registers */
|
||
|
#define XMCDMA_CR_RUNSTOP_MASK BIT(0) /* Start/stop DMA channel */
|
||
|
#define XMCDMA_CR_RESET_MASK BIT(2) /* Reset DMA engine */
|
||
|
|
||
|
#define XMCDMA_SR_HALTED_MASK BIT(0)
|
||
|
#define XMCDMA_SR_IDLE_MASK BIT(1)
|
||
|
|
||
|
#define XMCDMA_CH_IDLE BIT(0)
|
||
|
|
||
|
#define XMCDMA_BD_STS_COMPLETE BIT(31) /* Completed */
|
||
|
#define XMCDMA_BD_STS_DEC_ERR BIT(20) /* Decode error */
|
||
|
#define XMCDMA_BD_STS_SLV_ERR BIT(29) /* Slave error */
|
||
|
#define XMCDMA_BD_STS_INT_ERR BIT(28) /* Internal err */
|
||
|
#define XMCDMA_BD_STS_ALL_ERR GENMASK(30, 28) /* All errors */
|
||
|
|
||
|
#define XMCDMA_IRQ_ERRON_OTHERQ_MASK BIT(3)
|
||
|
#define XMCDMA_IRQ_PKTDROP_MASK BIT(4)
|
||
|
#define XMCDMA_IRQ_IOC_MASK BIT(5)
|
||
|
#define XMCDMA_IRQ_DELAY_MASK BIT(6)
|
||
|
#define XMCDMA_IRQ_ERR_MASK BIT(7)
|
||
|
#define XMCDMA_IRQ_ALL_MASK GENMASK(7, 5)
|
||
|
#define XMCDMA_PKTDROP_COALESCE_MASK GENMASK(15, 8)
|
||
|
#define XMCDMA_COALESCE_MASK GENMASK(23, 16)
|
||
|
#define XMCDMA_DELAY_MASK GENMASK(31, 24)
|
||
|
|
||
|
#define MRMAC_CTL_DATA_RATE_MASK GENMASK(2, 0)
|
||
|
#define MRMAC_CTL_DATA_RATE_10G 0
|
||
|
#define MRMAC_CTL_DATA_RATE_25G 1
|
||
|
#define MRMAC_CTL_DATA_RATE_40G 2
|
||
|
#define MRMAC_CTL_DATA_RATE_50G 3
|
||
|
#define MRMAC_CTL_DATA_RATE_100G 4
|
||
|
|
||
|
#define MRMAC_CTL_AXIS_CFG_MASK GENMASK(11, 9)
|
||
|
#define MRMAC_CTL_AXIS_CFG_SHIFT 9
|
||
|
#define MRMAC_CTL_AXIS_CFG_10G_IND 1
|
||
|
#define MRMAC_CTL_AXIS_CFG_25G_IND 1
|
||
|
|
||
|
#define MRMAC_CTL_SERDES_WIDTH_MASK GENMASK(6, 4)
|
||
|
#define MRMAC_CTL_SERDES_WIDTH_SHIFT 4
|
||
|
#define MRMAC_CTL_SERDES_WIDTH_10G 4
|
||
|
#define MRMAC_CTL_SERDES_WIDTH_25G 6
|
||
|
|
||
|
#define MRMAC_CTL_RATE_CFG_MASK (MRMAC_CTL_DATA_RATE_MASK | \
|
||
|
MRMAC_CTL_AXIS_CFG_MASK | \
|
||
|
MRMAC_CTL_SERDES_WIDTH_MASK)
|
||
|
|
||
|
#define MRMAC_CTL_PM_TICK_MASK BIT(30)
|
||
|
#define MRMAC_TICK_TRIGGER BIT(0)
|
||
|
|
||
|
#define XMCDMA_BD_STS_ACTUAL_LEN_MASK 0x007fffff /* Actual length */
|
||
|
|
||
|
/* MCDMA common offsets */
|
||
|
struct mcdma_common_regs {
|
||
|
u32 control; /* Common control */
|
||
|
u32 status; /* Common status */
|
||
|
u32 chen; /* Channel enable/disable */
|
||
|
u32 chser; /* Channel in progress */
|
||
|
u32 err; /* Error */
|
||
|
u32 ch_schd_type; /* Channel Q scheduler type */
|
||
|
u32 wrr_reg1; /* Weight of each channel (ch1-8) */
|
||
|
u32 wrr_reg2; /* Weight of each channel (ch9-16) */
|
||
|
u32 ch_serviced; /* Channels completed */
|
||
|
u32 arcache_aruser; /* ARCACHE and ARUSER values for AXI4 read */
|
||
|
u32 intr_status; /* Interrupt monitor */
|
||
|
u32 reserved[5];
|
||
|
};
|
||
|
|
||
|
/* MCDMA per-channel registers */
|
||
|
struct mcdma_chan_reg {
|
||
|
u32 control; /* Control */
|
||
|
u32 status; /* Status */
|
||
|
u32 current; /* Current descriptor */
|
||
|
u32 current_hi; /* Current descriptor high 32bit */
|
||
|
u32 tail; /* Tail descriptor */
|
||
|
u32 tail_hi; /* Tail descriptor high 32bit */
|
||
|
u32 pktcnt; /* Packet processed count */
|
||
|
};
|
||
|
|
||
|
/* MCDMA buffer descriptors */
|
||
|
struct mcdma_bd {
|
||
|
u32 next_desc; /* Next descriptor pointer */
|
||
|
u32 next_desc_msb;
|
||
|
u32 buf_addr; /* Buffer address */
|
||
|
u32 buf_addr_msb;
|
||
|
u32 reserved1;
|
||
|
u32 cntrl; /* Control */
|
||
|
u32 status; /* Status */
|
||
|
u32 sband_stats;
|
||
|
u32 app0;
|
||
|
u32 app1; /* Tx start << 16 | insert */
|
||
|
u32 app2; /* Tx csum seed */
|
||
|
u32 app3;
|
||
|
u32 app4;
|
||
|
u32 sw_id_offset;
|
||
|
u32 reserved2;
|
||
|
u32 reserved3;
|
||
|
u32 reserved4[16];
|
||
|
};
|
||
|
|
||
|
#endif /* __XILINX_AXI_MRMAC_H */
|