104 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 67db0da72eb7ed87ebaaeb8a26891cb2cf916500 Mon Sep 17 00:00:00 2001
 | 
						|
From: Luis Araneda <luaraneda@gmail.com>
 | 
						|
Date: Sun, 21 Jul 2019 23:24:12 -0400
 | 
						|
Subject: [U-Boot] [PATCH] arm: zynq: read mac address from SPI flash memory
 | 
						|
 | 
						|
Implement a method for reading the MAC address from an
 | 
						|
SPI flash memory.
 | 
						|
In particular, this method is used by the Zybo Z7 board
 | 
						|
to read the MAC address from the OTP region in the SPI NOR
 | 
						|
memory
 | 
						|
 | 
						|
Signed-off-by: Luis Araneda <luaraneda@gmail.com>
 | 
						|
---
 | 
						|
As of 2019-08-18, this patch has not been accepted by upstream U-Boot.
 | 
						|
Keep this patch until an alternative is accepted by upstream.
 | 
						|
---
 | 
						|
 board/xilinx/common/board.c    | 28 ++++++++++++++++++++++++++++
 | 
						|
 configs/zynq_zybo_z7_defconfig |  3 +++
 | 
						|
 drivers/misc/Kconfig           | 17 +++++++++++++++++
 | 
						|
 3 files changed, 48 insertions(+)
 | 
						|
 | 
						|
--- a/board/xilinx/common/board.c
 | 
						|
+++ b/board/xilinx/common/board.c
 | 
						|
@@ -6,7 +6,10 @@
 | 
						|
 
 | 
						|
 #include <common.h>
 | 
						|
 #include <dm/uclass.h>
 | 
						|
+#include <dm/device.h>
 | 
						|
+#include <dm/device-internal.h>
 | 
						|
 #include <i2c.h>
 | 
						|
+#include <spi_flash.h>
 | 
						|
 
 | 
						|
 int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)
 | 
						|
 {
 | 
						|
@@ -34,5 +37,30 @@ int zynq_board_read_rom_ethaddr(unsigned
 | 
						|
 		debug("%s: I2C EEPROM MAC %pM\n", __func__, ethaddr);
 | 
						|
 #endif
 | 
						|
 
 | 
						|
+#if defined(CONFIG_MAC_ADDR_IN_SPI_FLASH)
 | 
						|
+	struct spi_flash *flash;
 | 
						|
+	struct udevice *dev;
 | 
						|
+
 | 
						|
+	ret = spi_flash_probe_bus_cs(CONFIG_SF_DEFAULT_BUS,
 | 
						|
+				     CONFIG_SF_DEFAULT_CS,
 | 
						|
+				     0, 0, &dev);
 | 
						|
+	if (ret) {
 | 
						|
+		printf("SPI(bus:%u cs:%u) probe failed\n",
 | 
						|
+		       CONFIG_SF_DEFAULT_BUS,
 | 
						|
+		       CONFIG_SF_DEFAULT_CS);
 | 
						|
+		return 0;
 | 
						|
+	}
 | 
						|
+
 | 
						|
+	flash = dev_get_uclass_priv(dev);
 | 
						|
+	flash->read_opcode = CONFIG_MAC_ADDR_SPI_FLASH_READ_CMD;
 | 
						|
+
 | 
						|
+	if (spi_flash_read_dm(dev,
 | 
						|
+			      CONFIG_MAC_ADDR_SPI_FLASH_DATA_OFFSET,
 | 
						|
+			      6, ethaddr))
 | 
						|
+		printf("SPI MAC address read failed\n");
 | 
						|
+
 | 
						|
+	device_remove(dev, DM_REMOVE_NORMAL);
 | 
						|
+#endif
 | 
						|
+
 | 
						|
 	return ret;
 | 
						|
 }
 | 
						|
--- a/configs/zynq_zybo_z7_defconfig
 | 
						|
+++ b/configs/zynq_zybo_z7_defconfig
 | 
						|
@@ -42,6 +42,9 @@ CONFIG_DFU_RAM=y
 | 
						|
 CONFIG_FPGA_XILINX=y
 | 
						|
 CONFIG_FPGA_ZYNQPL=y
 | 
						|
 CONFIG_DM_GPIO=y
 | 
						|
+CONFIG_MAC_ADDR_IN_SPI_FLASH=y
 | 
						|
+CONFIG_MAC_ADDR_SPI_FLASH_READ_CMD=0x4b
 | 
						|
+CONFIG_MAC_ADDR_SPI_FLASH_DATA_OFFSET=0x20
 | 
						|
 CONFIG_MMC_SDHCI=y
 | 
						|
 CONFIG_MMC_SDHCI_ZYNQ=y
 | 
						|
 CONFIG_SPI_FLASH=y
 | 
						|
--- a/drivers/misc/Kconfig
 | 
						|
+++ b/drivers/misc/Kconfig
 | 
						|
@@ -366,6 +366,23 @@ config SYS_I2C_EEPROM_ADDR_OVERFLOW
 | 
						|
 
 | 
						|
 endif
 | 
						|
 
 | 
						|
+config MAC_ADDR_IN_SPI_FLASH
 | 
						|
+	bool "MAC address in SPI flash"
 | 
						|
+	help
 | 
						|
+	  Read MAC address from an SPI flash memory
 | 
						|
+
 | 
						|
+if MAC_ADDR_IN_SPI_FLASH
 | 
						|
+
 | 
						|
+config MAC_ADDR_SPI_FLASH_READ_CMD
 | 
						|
+	hex "Read command for the SPI flash memory"
 | 
						|
+	default 0
 | 
						|
+
 | 
						|
+config MAC_ADDR_SPI_FLASH_DATA_OFFSET
 | 
						|
+	hex "Offset of MAC data in SPI flash memory"
 | 
						|
+	default 0
 | 
						|
+
 | 
						|
+endif
 | 
						|
+
 | 
						|
 config GDSYS_RXAUI_CTRL
 | 
						|
 	bool "Enable gdsys RXAUI control driver"
 | 
						|
 	depends on MISC
 |