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
 | 
