Merge tag 'xilinx-for-v2021.01' of https://gitlab.denx.de/u-boot/custodians/u-boot-microblaze into next
Xilinx changes for v2021.01 arm64: - Support for bigger U-Boot images compiled with PIE microblaze: - Extend support for LE/BE systems zynqmp: - Refactor silicon ID detection code with using firmware interface - Add support for saving variables based on bootmode zynqmp-r5: - Fix MPU mapping and defconfig setting. xilinx: - Minor driver changes: names alignment - Enable UBIFS - Minor DT and macros fixes - Fix boot with appended DT - Fix distro boot cmd: - pxe: Add fixing for platforms with manual relocation support clk: - fixed_rate: Add DM flag to support early boot on r5 fpga: - zynqmppl: Use only firmware interface and enable SPL build serial: - uartlite: Enable for ARM systems and support endians mmc: - zynq: Fix indentation net: - gem: Support for multiple phys - emac: Fix 64bit support and enable it for arm64 kconfig: - Setup default values for Xilinx platforms - Fix dependecies for Xilinx drivers - Source board Kconfig only when platform is enabled - Fix FPGA Kconfig entry with SPL - Change some defconfig values bindings: - Add binding doc for vsc8531
This commit is contained in:
@@ -101,10 +101,10 @@ struct axidma_priv {
|
||||
|
||||
/* BD descriptors */
|
||||
struct axidma_bd {
|
||||
u32 next; /* Next descriptor pointer */
|
||||
u32 reserved1;
|
||||
u32 phys; /* Buffer address */
|
||||
u32 reserved2;
|
||||
u32 next_desc; /* Next descriptor pointer */
|
||||
u32 next_desc_msb;
|
||||
u32 buf_addr; /* Buffer address */
|
||||
u32 buf_addr_msb;
|
||||
u32 reserved3;
|
||||
u32 reserved4;
|
||||
u32 cntrl; /* Control */
|
||||
@@ -182,7 +182,7 @@ static inline int mdio_wait(struct axi_regs *regs)
|
||||
static inline void axienet_dma_write(struct axidma_bd *bd, u32 *desc)
|
||||
{
|
||||
#if defined(CONFIG_PHYS_64BIT)
|
||||
writeq(bd, desc);
|
||||
writeq((unsigned long)bd, desc);
|
||||
#else
|
||||
writel((u32)bd, desc);
|
||||
#endif
|
||||
@@ -492,15 +492,19 @@ static int axiemac_start(struct udevice *dev)
|
||||
|
||||
/* Setup the BD. */
|
||||
memset(&rx_bd, 0, sizeof(rx_bd));
|
||||
rx_bd.next = (u32)&rx_bd;
|
||||
rx_bd.phys = (u32)&rxframe;
|
||||
rx_bd.next_desc = lower_32_bits((unsigned long)&rx_bd);
|
||||
rx_bd.buf_addr = lower_32_bits((unsigned long)&rxframe);
|
||||
#if defined(CONFIG_PHYS_64BIT)
|
||||
rx_bd.next_desc_msb = upper_32_bits((unsigned long)&rx_bd);
|
||||
rx_bd.buf_addr_msb = upper_32_bits((unsigned long)&rxframe);
|
||||
#endif
|
||||
rx_bd.cntrl = sizeof(rxframe);
|
||||
/* Flush the last BD so DMA core could see the updates */
|
||||
flush_cache((u32)&rx_bd, sizeof(rx_bd));
|
||||
flush_cache((phys_addr_t)&rx_bd, sizeof(rx_bd));
|
||||
|
||||
/* It is necessary to flush rxframe because if you don't do it
|
||||
* then cache can contain uninitialized data */
|
||||
flush_cache((u32)&rxframe, sizeof(rxframe));
|
||||
flush_cache((phys_addr_t)&rxframe, sizeof(rxframe));
|
||||
|
||||
/* Start the hardware */
|
||||
temp = readl(&priv->dmarx->control);
|
||||
@@ -534,19 +538,23 @@ static int axiemac_send(struct udevice *dev, void *ptr, int len)
|
||||
len = PKTSIZE_ALIGN;
|
||||
|
||||
/* Flush packet to main memory to be trasfered by DMA */
|
||||
flush_cache((u32)ptr, len);
|
||||
flush_cache((phys_addr_t)ptr, len);
|
||||
|
||||
/* Setup Tx BD */
|
||||
memset(&tx_bd, 0, sizeof(tx_bd));
|
||||
/* At the end of the ring, link the last BD back to the top */
|
||||
tx_bd.next = (u32)&tx_bd;
|
||||
tx_bd.phys = (u32)ptr;
|
||||
tx_bd.next_desc = lower_32_bits((unsigned long)&tx_bd);
|
||||
tx_bd.buf_addr = lower_32_bits((unsigned long)ptr);
|
||||
#if defined(CONFIG_PHYS_64BIT)
|
||||
tx_bd.next_desc_msb = upper_32_bits((unsigned long)&tx_bd);
|
||||
tx_bd.buf_addr_msb = upper_32_bits((unsigned long)ptr);
|
||||
#endif
|
||||
/* Save len */
|
||||
tx_bd.cntrl = len | XAXIDMA_BD_CTRL_TXSOF_MASK |
|
||||
XAXIDMA_BD_CTRL_TXEOF_MASK;
|
||||
|
||||
/* Flush the last BD so DMA core could see the updates */
|
||||
flush_cache((u32)&tx_bd, sizeof(tx_bd));
|
||||
flush_cache((phys_addr_t)&tx_bd, sizeof(tx_bd));
|
||||
|
||||
if (readl(&priv->dmatx->status) & XAXIDMA_HALTED_MASK) {
|
||||
u32 temp;
|
||||
@@ -637,16 +645,20 @@ static int axiemac_free_pkt(struct udevice *dev, uchar *packet, int length)
|
||||
/* Setup RxBD */
|
||||
/* Clear the whole buffer and setup it again - all flags are cleared */
|
||||
memset(&rx_bd, 0, sizeof(rx_bd));
|
||||
rx_bd.next = (u32)&rx_bd;
|
||||
rx_bd.phys = (u32)&rxframe;
|
||||
rx_bd.next_desc = lower_32_bits((unsigned long)&rx_bd);
|
||||
rx_bd.buf_addr = lower_32_bits((unsigned long)&rxframe);
|
||||
#if defined(CONFIG_PHYS_64BIT)
|
||||
rx_bd.next_desc_msb = upper_32_bits((unsigned long)&rx_bd);
|
||||
rx_bd.buf_addr_msb = upper_32_bits((unsigned long)&rxframe);
|
||||
#endif
|
||||
rx_bd.cntrl = sizeof(rxframe);
|
||||
|
||||
/* Write bd to HW */
|
||||
flush_cache((u32)&rx_bd, sizeof(rx_bd));
|
||||
flush_cache((phys_addr_t)&rx_bd, sizeof(rx_bd));
|
||||
|
||||
/* It is necessary to flush rxframe because if you don't do it
|
||||
* then cache will contain previous packet */
|
||||
flush_cache((u32)&rxframe, sizeof(rxframe));
|
||||
flush_cache((phys_addr_t)&rxframe, sizeof(rxframe));
|
||||
|
||||
/* Rx BD is ready - start again */
|
||||
axienet_dma_write(&rx_bd, &priv->dmarx->tail);
|
||||
@@ -738,7 +750,7 @@ static int axi_emac_ofdata_to_platdata(struct udevice *dev)
|
||||
return -EINVAL;
|
||||
}
|
||||
/* RX channel offset is 0x30 */
|
||||
priv->dmarx = (struct axidma_reg *)((u32)priv->dmatx + 0x30);
|
||||
priv->dmarx = (struct axidma_reg *)((phys_addr_t)priv->dmatx + 0x30);
|
||||
|
||||
priv->phyaddr = -1;
|
||||
|
||||
|
||||
@@ -758,6 +758,9 @@ static int zynq_gem_ofdata_to_platdata(struct udevice *dev)
|
||||
|
||||
if (!dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0,
|
||||
&phandle_args)) {
|
||||
fdt_addr_t addr;
|
||||
ofnode parent;
|
||||
|
||||
debug("phy-handle does exist %s\n", dev->name);
|
||||
priv->phyaddr = ofnode_read_u32_default(phandle_args.node,
|
||||
"reg", -1);
|
||||
@@ -765,6 +768,13 @@ static int zynq_gem_ofdata_to_platdata(struct udevice *dev)
|
||||
priv->max_speed = ofnode_read_u32_default(phandle_args.node,
|
||||
"max-speed",
|
||||
SPEED_1000);
|
||||
|
||||
parent = ofnode_get_parent(phandle_args.node);
|
||||
addr = ofnode_get_addr(parent);
|
||||
if (addr != FDT_ADDR_T_NONE) {
|
||||
debug("MDIO bus not found %s\n", dev->name);
|
||||
priv->mdiobase = (struct zynq_gem_regs *)addr;
|
||||
}
|
||||
}
|
||||
|
||||
phy_mode = dev_read_prop(dev, "phy-mode", NULL);
|
||||
|
||||
Reference in New Issue
Block a user