mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-10-31 03:58:17 +00:00 
			
		
		
		
	Update my and DPs email address to match current setup. Signed-off-by: Michal Simek <michal.simek@amd.com> Link: https://lore.kernel.org/r/aba5b19b9c5a95608829e86ad5cc4671c940f1bb.1688992543.git.michal.simek@amd.com
		
			
				
	
	
		
			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@amd.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 */
 |