[U-Boot-Users] [PATCH] 83xx: Add Vitesse VSC7385 firmware uploading

Ben Warren biggerbadderben at gmail.com
Fri Feb 8 16:31:21 CET 2008


Hi Timur,

Just some nit-picking...

Timur Tabi wrote:
> The Vitesse VSC7385 is a 5-port switch found on the Freescale MPC8349E-mITX
> and other boards.  A small firwmare must be uploaded to its on-board memory
> before it can be enabled.  This patch adds the code which uploads firmware
> (but not the firmware itself) and updates the MPC8349E-mITX, MPC8313E-RDB,
> and MPC837XE-RDB boards to use that code.
>
>   
Is this switch able to pass traffic in a default configuration without 
this firmware or is it dead?
<snip>
> diff --git a/drivers/net/Makefile b/drivers/net/Makefile
> index b9723fa..5ae7cb7 100644
> --- a/drivers/net/Makefile
> +++ b/drivers/net/Makefile
> @@ -57,6 +57,7 @@ COBJS-y += tigon3.o
>  COBJS-y += tsec.o
>  COBJS-y += tsi108_eth.o
>  COBJS-y += uli526x.o
> +COBJS-y += vsc7385.o
>  
>  COBJS	:= $(COBJS-y)
>  SRCS 	:= $(COBJS:.o=.c)
> diff --git a/drivers/net/vsc7385.c b/drivers/net/vsc7385.c
> new file mode 100644
> index 0000000..39b077f
> --- /dev/null
> +++ b/drivers/net/vsc7385.c
>   
I'm not 100% convinced that this is network code, but my opinion isn't 
very strong and I can't really think of a better place (maybe 
device/misc or device/non_free?)
> @@ -0,0 +1,100 @@
> +/*
> + * Vitesse 7385 Switch Firmware Upload
> + *
> + * Author: Timur Tabi <timur at freescale.com>
> + *
> + * Copyright 2008 Freescale Semiconductor, Inc.  This file is licensed
> + * under the terms of the GNU General Public License version 2.  This
> + * program is licensed "as is" without any warranty of any kind, whether
> + * express or implied.
> + *
> + * This module uploads proprietary firmware for the Vitesse VSC7385 5-port
> + * switch.
> + */
> +
> +#include <config.h>
> +#include <common.h>
> +#include <asm/io.h>
> +#include <asm/errno.h>
> +
>   
I think Kim mentioned this will break some architectures. Just repeating it.
> +#ifdef CONFIG_VSC7385_ENET
> +
> +/*
> + * Upload a Vitesse VSC7385 firmware image to the hardware
> + *
> + * This function takes a pointer to a VSC7385 firmware image and a size, and
> + * uploads that firmware to the VSC7385.
> + *
> + * This firmware is typically located at a board-specific flash address,
> + * and the size is typically 8KB.
> + *
> + * The firmware is Vitesse proprietary.
> + *
> + * Further details on the register information can be obtained from Vitesse.
> + */
> +int vsc7385_upload_firmware(void *firmware, unsigned int size)
> +{
> +	u8 *fw = firmware;
> +
> +	u32 *gloreset = (u32 *) (CFG_VSC7385_BASE + 0x1c050);
> +	u32 *icpu_ctrl = (u32 *) (CFG_VSC7385_BASE + 0x1c040);
> +	u32 *icpu_addr = (u32 *) (CFG_VSC7385_BASE + 0x1c044);
> +	u32 *icpu_data = (u32 *) (CFG_VSC7385_BASE + 0x1c048);
> +	u32 *chipid = (u32 *) (CFG_VSC7385_BASE + 0x1c060);
> +	u32 *icpu_rom_map = (u32 *) (CFG_VSC7385_BASE + 0x1c070);
> +
>   
It looks to me that the data bus is 8 bits. Why are you defining 
registers as 32 bits and using 32-bit accessors?
> +	unsigned int i;
> +	int ret = 0;
> +
> +	out_be32(gloreset, 3);
> +	udelay(200);
> +
> +	out_be32(icpu_ctrl, 142);
>   
When you write to the device, can you express the value in hex? It's 
quicker for the reader (who has Vitesse datasheets, of course) to figure 
out what you're doing.
> +	udelay(20);
> +
> +	out_be32(icpu_rom_map, 1);
> +	udelay(20);
> +
> +        /* Write the firmware to I-RAM */
> +	out_be32(icpu_addr, 0);
> +	udelay(20);
> +
> +	for (i = 0; i < size; i++) {
> +		out_be32(icpu_data, fw[i]);
> +		udelay(20);
> +		if (ctrlc())
> +			return -EINTR;
> +	}
> +
> +	/* Read back and compare */
> +	out_be32(icpu_addr, 0);
> +	udelay(20);
> +
> +	for (i = 0; i < size; i++) {
> +		u8 value;
> +
> +		value = (u8) in_be32(icpu_data);
> +		udelay(20);
> +		if (value != fw[i]) {
> +			debug("VSC7385: Upload mismatch: address 0x%x, "
> +                              "read value 0x%x, image value 0x%x\n",
> +                              i, value, fw[i]);
> +
> +			return -EIO;
> +		}
> +		if (ctrlc())
> +			break;
> +	}
> +
> +	out_be32(icpu_ctrl, 11);
> +	udelay(20);
> +
> +#ifdef DEBUG
> +	printf("VSC7385: Chip ID is %08x\n", in_be32(chipid));
> +	udelay(20);
> +#endif
> +
> +	return 0;
> +}
> +
> +#endif
> diff --git a/include/configs/MPC8313ERDB.h b/include/configs/MPC8313ERDB.h
> index f12a3e6..9576fa5 100644
> --- a/include/configs/MPC8313ERDB.h
> +++ b/include/configs/MPC8313ERDB.h
> @@ -38,6 +38,14 @@
>  #define CONFIG_PCI
>  #define CONFIG_83XX_GENERIC_PCI
>  
> +#define CONFIG_MISC_INIT_R
> +
> +/*
> + * On-board devices
> + */
> +#define CONFIG_VSC7385_ENET
> +
> +
>  #ifdef CFG_66MHZ
>  #define CONFIG_83XX_CLKIN	66666667	/* in Hz */
>  #elif defined(CFG_33MHZ)
> @@ -65,6 +73,22 @@
>  #define CFG_ACR_RPTCNT		3	/* Arbiter repeat count (0-7) */
>  
>  /*
> + * Device configurations
> + */
> +
> +/* Vitesse 7385 */
> +
> +#ifdef CONFIG_VSC7385_ENET
> +
> +#define CONFIG_TSEC2
> +
> +/* The flash address and size of the VSC7385 firmware image */
> +#define CONFIG_VSC7385_IMAGE		0xFE7FE000
> +#define CONFIG_VSC7385_IMAGE_SIZE	8192
> +
> +#endif
> +
> +/*
>   * DDR Setup
>   */
>  #define CFG_DDR_BASE		0x00000000	/* DDR is system memory*/
> @@ -214,19 +238,24 @@
>  #define CFG_LBLAWBAR1_PRELIM	CFG_NAND_BASE
>  #define CFG_LBLAWAR1_PRELIM	0x8000000E	/* 32KB  */
>  
> +/* local bus read write buffer mapping */
> +#define CFG_BR3_PRELIM		0xFA000801	/* map at 0xFA000000 */
>   
Like here, bits 19-20 are 01, meaning an 8-bit port
> +#define CFG_OR3_PRELIM		0xFFFF8FF7	/* 32kB */
> +#define CFG_LBLAWBAR3_PRELIM	0xFA000000
> +#define CFG_LBLAWAR3_PRELIM	0x8000000E	/* 32KB  */
> +
> +/* Vitesse 7385 */
> +
>  #define CFG_VSC7385_BASE	0xF0000000
>  
> -#define CONFIG_VSC7385_ENET			/* VSC7385 ethernet support */
> +#ifdef CONFIG_VSC7385_ENET
> +
>  #define CFG_BR2_PRELIM		0xf0000801	/* VSC7385 Base address */
>  #define CFG_OR2_PRELIM		0xfffe09ff	/* VSC7385, 128K bytes*/
>  #define CFG_LBLAWBAR2_PRELIM	CFG_VSC7385_BASE/* Access window base at VSC7385 base */
>  #define CFG_LBLAWAR2_PRELIM	0x80000010	/* Access window size 128K */
>  
> -/* local bus read write buffer mapping */
> -#define CFG_BR3_PRELIM		0xFA000801	/* map at 0xFA000000 */
> -#define CFG_OR3_PRELIM		0xFFFF8FF7	/* 32kB */
> -#define CFG_LBLAWBAR3_PRELIM	0xFA000000
> -#define CFG_LBLAWAR3_PRELIM	0x8000000E	/* 32KB  */
> +#endif
>  
>  /* pass open firmware flat tree */
>  #define CONFIG_OF_LIBFDT	1
> @@ -263,13 +292,6 @@
>  #define CFG_I2C_OFFSET		0x3000
>  #define CFG_I2C2_OFFSET		0x3100
>  
> -/* TSEC */
> -#define CFG_TSEC1_OFFSET	0x24000
> -#define CFG_TSEC1		(CFG_IMMR+CFG_TSEC1_OFFSET)
> -#define CFG_TSEC2_OFFSET	0x25000
> -#define CFG_TSEC2		(CFG_IMMR+CFG_TSEC2_OFFSET)
> -#define CONFIG_NET_MULTI
> -
>  /*
>   * General PCI
>   * Addresses are mapped 1-1.
> @@ -288,26 +310,31 @@
>  #define CFG_PCI_SUBSYS_VENDORID 0x1057	/* Motorola */
>  
>  /*
> - * TSEC configuration
> + * TSEC
>   */
>  #define CONFIG_TSEC_ENET		/* TSEC ethernet support */
>  
> -#ifndef CONFIG_NET_MULTI
> -#define CONFIG_NET_MULTI		1
> -#endif
> -
> -#define CONFIG_GMII			1	/* MII PHY management */
> -#define CONFIG_TSEC1		1
> +#define CONFIG_NET_MULTI
> +#define CONFIG_GMII			/* MII PHY management */
>  
> +#ifdef CONFIG_TSEC1
> +#define CONFIG_HAS_ETH0
>  #define CONFIG_TSEC1_NAME	"TSEC0"
> -#define CONFIG_TSEC2		1
> +#define CFG_TSEC1_OFFSET	0x24000
> +#define TSEC1_PHY_ADDR		0x1c
> +#define TSEC1_FLAGS		TSEC_GIGABIT
> +#define TSEC1_PHYIDX		0
> +#endif
> +
> +#ifdef CONFIG_TSEC2
> +#define CONFIG_HAS_ETH1
>  #define CONFIG_TSEC2_NAME	"TSEC1"
> -#define TSEC1_PHY_ADDR			0x1c
> -#define TSEC2_PHY_ADDR			4
> -#define TSEC1_FLAGS			TSEC_GIGABIT
> -#define TSEC2_FLAGS			TSEC_GIGABIT
> -#define TSEC1_PHYIDX			0
> -#define TSEC2_PHYIDX			0
> +#define CFG_TSEC2_OFFSET	0x25000
> +#define TSEC2_PHY_ADDR		4
> +#define TSEC2_FLAGS		TSEC_GIGABIT
> +#define TSEC2_PHYIDX		0
> +#endif
> +
>  
>  /* Options are: TSEC[0-1] */
>  #define CONFIG_ETHPRIME			"TSEC1"
> @@ -496,10 +523,13 @@
>   */
>  #define CONFIG_ENV_OVERWRITE
>  
> +#ifdef CONFIG_HAS_ETH0
>  #define CONFIG_ETHADDR		00:E0:0C:00:95:01
> -#define CONFIG_HAS_ETH1
> -#define CONFIG_HAS_ETH0
> +#endif
> +
> +#ifdef CONFIG_HAS_ETH1
>  #define CONFIG_ETH1ADDR		00:E0:0C:00:95:02
> +#endif
>  
>  #define CONFIG_IPADDR		10.0.0.2
>  #define CONFIG_SERVERIP		10.0.0.1
> diff --git a/include/configs/MPC8349ITX.h b/include/configs/MPC8349ITX.h
> index 48c2736..0e50186 100644
> --- a/include/configs/MPC8349ITX.h
> +++ b/include/configs/MPC8349ITX.h
> @@ -68,12 +68,16 @@
>  
>  #define CFG_IMMR		0xE0000000	/* The IMMR is relocated to here */
>  
> +#define CONFIG_MISC_INIT_F
> +#define CONFIG_MISC_INIT_R
>  
> -/* On-board devices */
> +/*
> + * On-board devices
> + */
>  
>  #ifdef CONFIG_MPC8349ITX
>  #define CONFIG_COMPACT_FLASH	/* The CF card interface on the back of the board */
> -#define CONFIG_VSC7385		/* The Vitesse 7385 5-port switch */
> +#define CONFIG_VSC7385_ENET	/* VSC7385 ethernet support */
>  #endif
>  
>  #define CONFIG_PCI
> @@ -88,9 +92,6 @@
>  /* I2C */
>  #ifdef CONFIG_HARD_I2C
>  
> -#define CONFIG_MISC_INIT_F
> -#define CONFIG_MISC_INIT_R
> -
>  #define CONFIG_FSL_I2C
>  #define CONFIG_I2C_MULTI_BUS
>  #define CONFIG_I2C_CMD_TREE
> @@ -190,6 +191,18 @@ boards, we say we have two, but don't display a message if we find only one. */
>  #define CFG_FLASH_SIZE		16		/* FLASH size in MB */
>  #define CFG_FLASH_SIZE_SHIFT	4		/* log2 of the above value */
>  
> +/* Vitesse 7385 */
> +
> +#ifdef CONFIG_VSC7385_ENET
> +
> +#define CONFIG_TSEC2
> +
> +/* The flash address and size of the VSC7385 firmware image */
> +#define CONFIG_VSC7385_IMAGE		0xFEFFE000
> +#define CONFIG_VSC7385_IMAGE_SIZE	8192
> +
> +#endif
> +
>  /*
>   * BRx, ORx, LBLAWBARx, and LBLAWARx
>   */
> @@ -205,10 +218,10 @@ boards, we say we have two, but don't display a message if we find only one. */
>  
>  /* Vitesse 7385 */
>  
> -#ifdef CONFIG_VSC7385
> -
>  #define CFG_VSC7385_BASE	0xF8000000
>  
> +#ifdef CONFIG_VSC7385_ENET
> +
>  #define CFG_BR1_PRELIM		(CFG_VSC7385_BASE | BR_PS_8 | BR_V)
>   
Here you use mnemonics for describing the base register settings. I know 
it's not new code, but it would be nice to be consistent
>  #define CFG_OR1_PRELIM		(OR_AM_128KB | OR_GPCM_CSNT | OR_GPCM_XACS | \
>  				OR_GPCM_SCY_15 | OR_GPCM_SETA | OR_GPCM_TRLX | \
> @@ -384,7 +397,7 @@ boards, we say we have two, but don't display a message if we find only one. */
>  #define CONFIG_HAS_ETH1
>  #define CONFIG_TSEC2_NAME  "TSEC1"
>  #define CFG_TSEC2_OFFSET	0x25000
> -#define CONFIG_UNKNOWN_TSEC	/* TSEC2 is proprietary */
> +
>  #define TSEC2_PHY_ADDR		4
>  #define TSEC2_PHYIDX		0
>  #define TSEC2_FLAGS		TSEC_GIGABIT
> @@ -619,11 +632,11 @@ boards, we say we have two, but don't display a message if we find only one. */
>   */
>  #define CONFIG_ENV_OVERWRITE
>  
> -#ifdef CONFIG_TSEC1
> +#ifdef CONFIG_HAS_ETH0
>  #define CONFIG_ETHADDR		00:E0:0C:00:8C:01
>  #endif
>  
> -#ifdef CONFIG_TSEC2
> +#ifdef CONFIG_HAS_ETH1
>  #define CONFIG_ETH1ADDR		00:E0:0C:00:8C:02
>  #endif
>  
> diff --git a/include/configs/MPC837XERDB.h b/include/configs/MPC837XERDB.h
> index 2da4f29..066197f 100644
> --- a/include/configs/MPC837XERDB.h
> +++ b/include/configs/MPC837XERDB.h
> @@ -32,6 +32,14 @@
>  
>  #define CONFIG_PCI	1
>  
> +#define CONFIG_MISC_INIT_R
> +
> +/*
> + * On-board devices
> + */
> +#define CONFIG_TSEC_ENET		/* TSEC Ethernet support */
> +#define CONFIG_VSC7385_ENET
> +
>  /*
>   * System Clock Setup
>   */
> @@ -118,6 +126,22 @@
>  #define CFG_IMMR		0xE0000000
>  
>  /*
> + * Device configurations
> + */
> +
> +/* Vitesse 7385 */
> +
> +#ifdef CONFIG_VSC7385_ENET
> +
> +#define CONFIG_TSEC2
> +
> +/* The flash address and size of the VSC7385 firmware image */
> +#define CONFIG_VSC7385_IMAGE		0xFE7FE000
> +#define CONFIG_VSC7385_IMAGE_SIZE	8192
> +
> +#endif
> +
> +/*
>   * DDR Setup
>   */
>  #define CFG_DDR_BASE		0x00000000 /* DDR is system memory */
> @@ -251,15 +275,19 @@
>  #define CFG_FLASH_ERASE_TOUT	60000	/* Flash Erase Timeout (ms) */
>  #define CFG_FLASH_WRITE_TOUT	500	/* Flash Write Timeout (ms) */
>  
> +/* Vitesse 7385 */
> +
>  #define CFG_VSC7385_BASE	0xF0000000
>  
> -/* VSC7385 Gigabit Switch support */
> -#define CONFIG_VSC7385_ENET
> +#ifdef CONFIG_VSC7385_ENET
> +
>  #define CFG_BR2_PRELIM		0xf0000801		/* Base address */
>  #define CFG_OR2_PRELIM		0xfffe09ff		/* 128K bytes*/
>  #define CFG_LBLAWBAR2_PRELIM	CFG_VSC7385_BASE	/* Access Base */
>  #define CFG_LBLAWAR2_PRELIM	0x80000010		/* Access Size 128K */
>  
> +#endif
> +
>  /*
>   * Serial Port
>   */
> @@ -324,43 +352,43 @@
>  #define CONFIG_NET_MULTI
>  #define CONFIG_PCI_PNP		/* do pci plug-and-play */
>  
> -#undef CONFIG_EEPRO100
>  #undef CONFIG_PCI_SCAN_SHOW	/* show pci devices on startup */
>  #define CFG_PCI_SUBSYS_VENDORID 0x1957	/* Freescale */
>  #endif	/* CONFIG_PCI */
>  
> -#ifndef CONFIG_NET_MULTI
> -#define CONFIG_NET_MULTI	1
> -#endif
> -
>  /*
>   * TSEC
>   */
> -#define CONFIG_TSEC_ENET	/* TSEC ethernet support */
> -#define CFG_TSEC1_OFFSET	0x24000
> -#define CFG_TSEC1		(CFG_IMMR+CFG_TSEC1_OFFSET)
> -#define CFG_TSEC2_OFFSET	0x25000
> -#define CFG_TSEC2		(CFG_IMMR+CFG_TSEC2_OFFSET)
> +#ifdef CONFIG_TSEC_ENET
>  
> -/*
> - * TSEC ethernet configuration
> - */
> -#define CONFIG_GMII			1	/* MII PHY management */
> -#define CONFIG_TSEC1			1
> +#define CONFIG_NET_MULTI
> +#define CONFIG_GMII			/* MII PHY management */
> +
> +#define CONFIG_TSEC1
> +
> +#ifdef CONFIG_TSEC1
> +#define CONFIG_HAS_ETH0
>  #define CONFIG_TSEC1_NAME		"TSEC0"
> -#define CONFIG_TSEC2			1
> -#define CONFIG_TSEC2_NAME		"TSEC1"
> +#define CFG_TSEC1_OFFSET		0x24000
>  #define TSEC1_PHY_ADDR			2
> -#define TSEC2_PHY_ADDR			0x1c
>  #define TSEC1_FLAGS			(TSEC_GIGABIT | TSEC_REDUCED)
> -#define TSEC2_FLAGS			(TSEC_GIGABIT | TSEC_REDUCED)
>  #define TSEC1_PHYIDX			0
> -#define TSEC2_PHYIDX			0
> +#endif
>  
> +#ifdef CONFIG_TSEC2
> +#define CONFIG_HAS_ETH1
> +#define CONFIG_TSEC2_NAME		"TSEC1"
> +#define CFG_TSEC2_OFFSET		0x25000
> +#define TSEC2_PHY_ADDR			0x1c
> +#define TSEC2_FLAGS			(TSEC_GIGABIT | TSEC_REDUCED)
> +#define TSEC2_PHYIDX			0
> +#endif
>  
>  /* Options are: TSEC[0-1] */
>  #define CONFIG_ETHPRIME			"TSEC0"
>  
> +#endif
> +
>  /*
>   * Environment
>   */
> @@ -529,10 +557,13 @@
>   */
>  #define CONFIG_ENV_OVERWRITE
>  
> -#define CONFIG_HAS_ETH0				/* add support for "ethaddr" */
> -#define CONFIG_ETHADDR	00:04:9f:ef:04:01
> -#define CONFIG_HAS_ETH1				/* add support for "eth1addr" */
> -#define CONFIG_ETH1ADDR	00:04:9f:ef:04:02
> +#ifdef CONFIG_HAS_ETH0
> +#define CONFIG_ETHADDR		00:04:9f:ef:04:01
> +#endif
> +
> +#ifdef CONFIG_HAS_ETH1
> +#define CONFIG_ETH1ADDR		00:04:9f:ef:04:02
> +#endif
>  
>  #define CONFIG_IPADDR		10.0.0.2
>  #define CONFIG_SERVERIP		10.0.0.1
> diff --git a/include/vsc7385.h b/include/vsc7385.h
> new file mode 100644
> index 0000000..0432499
> --- /dev/null
> +++ b/include/vsc7385.h
> @@ -0,0 +1,13 @@
> +/*
> + * Header file for vsc7385.c
> + *
> + * Author: Timur Tabi <timur at freescale.com>
> + *
> + * Copyright 2008 Freescale Semiconductor, Inc.  This file is licensed
> + * under the terms of the GNU General Public License version 2.  This
> + * program is licensed "as is" without any warranty of any kind, whether
> + * express or implied.
> + */
> +
> +int vsc7385_upload_firmware(void *firmware, unsigned int size);
> +
>   





More information about the U-Boot mailing list