[RESEND PATCH v5 9/11] ARM: socfpga: Add initial support for ic-automation Moritz III

Marek Vasut marex at denx.de
Fri Sep 11 09:18:44 CEST 2020


On 9/11/20 9:02 AM, Nico Becker wrote:
> Add initial  support for ic-automation Moritz III, which is
> an Cyclone V SOM with ethernet, usb, uart. Booting via
> sd-card or flash is supported.
> 
> Changes for v5:

The changelog shouldn't be part of the commmit message, so it goes below
the "---" line. Git then ignores it.

>         - fixed random ethaddr at failure
>         - fixed comments
> 
> Changes for v4:
>         - re-sort list alphabetically
>         - c style comments
> 
> Changes for v3:
>          - Resend via git send-email
> 
> Changes for v2:
>         - Coding Style cleanup
> 
> Signed-off-by: Nico Becker <n.becker at ic-automation.de>
> ---

Here ...

[...]

> +++ b/arch/arm/dts/socfpga_cyclone5_ica_moritz_iii-u-boot.dtsi
> @@ -0,0 +1,45 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * U-Boot additions
> + *
> + * Copyright (C) 2012 Altera Corporation <www.altera.com>
> + * Copyright (c) 2018 Simon Goldschmidt

I think the copyright assignment needs updating.

> + */
> +
> +#include "socfpga-common-u-boot.dtsi"
> +
> +/{
> +	aliases {
> +		spi0 = "/soc/spi at ff705000";

spi0 = &qspi; should work too ?

[...]

> diff --git a/arch/arm/dts/socfpga_cyclone5_ica_moritz_iii.dts b/arch/arm/dts/socfpga_cyclone5_ica_moritz_iii.dts
> new file mode 100644
> index 0000000000..d81f8ea5bf
> --- /dev/null
> +++ b/arch/arm/dts/socfpga_cyclone5_ica_moritz_iii.dts
> @@ -0,0 +1,123 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (C) 2012 Altera Corporation <www.altera.com>
> + * Copyright (C) 2020 Nico Becker ic-automation GmbH <n.becker at ic-automation.de>
> + */
> +
> +#include "socfpga_cyclone5.dtsi"
> +
> +/ {
> +	model = "ic-automation Moritz III";
> +	compatible = "ic-automation,moritz_iii", "altr,socfpga-cyclone5", "altr,socfpga";
> +
> +	chosen {
> +		bootargs = "earlyprintk";
> +		stdout-path = "serial0:115200n8";
> +	};
> +
> +	memory at 0 {
> +		name = "memory";
> +		device_type = "memory";
> +		reg = <0x0 0x40000000>; /* 1GB */
> +	};
> +
> +	aliases {
> +		/* this allow the ethaddr uboot environmnet variable contents

environment (typo)

> +		 * to be added to the gmac1 device tree blob.
> +		 */
> +		ethernet0 = &gmac1;
> +	};

[...]

[...]

> +++ b/board/ic-automation/moritz_iii/moritz_iii_board.c

[...]

> +int board_late_init(void)
> +{
> +	u8 mac[MAC_LENGTH];
> +	char serial[SERIALNUMBER_LENGTH + 1];
> +	u8 eeprom_data[OVERALL_LENGTH];
> +	u32 calc_crc32;
> +	u32 *read_crc32;
> +	u8 w_data;
> +	int error;
> +	u8 registers[] = {0x02, 0x03, 0x06, 0x07};
> +
> +	for (int i = 0; i < OVERALL_LENGTH; i++)
> +		eeprom_data[i] = 0x00;

Is that a memset() ?

[...]

> +	/* delete environment var first. Otherwise we are unable to set it's value... */
> +	env_set("ethaddr", "");

ethaddr is not a string, so this will fail. Use NULL instead of "" .
But you might just want to check whether ethaddr is set and skip
overwriting it, that way the user can set their own ethaddr and make it
persistent.

> +	struct udevice *bus;
> +	struct udevice *dev;

Move this to the beginning of the function, just like all the other vars.

[...]

> +	/* check crc32 */
> +	calc_crc32 = crc32(0, eeprom_data, OVERALL_LENGTH - CRC32_LENGTH);
> +	read_crc32 = (u32 *)&eeprom_data[SERIALNUMBER_LENGTH + MAC_LENGTH];

Use get_unaligned on the eeprom data, otherwise this will fail on ARM
hardware with CPSR A-bit clear.

> +	if (*read_crc32 != calc_crc32) {
> +		/* print read data is crc32 not valid */
> +		printf("read data:");
> +		for (int i = 0; i < OVERALL_LENGTH; i++)
> +			printf("%02X", eeprom_data[i]);
> +		printf("\n");
> +		/* print crc32 */
> +		printf("read crc32 %08X calc crc32 %08X\n", *read_crc32, calc_crc32);
> +
> +		strncpy(serial, "00000000", 8);
> +		memset((void *)mac, 0x00, 8);
> +	} else {
> +		/* copy serial */
> +		memcpy((void *)serial, (void *)eeprom_data, SERIALNUMBER_LENGTH);

The typecasts are not needed for memset()/memcpy() .

> +		/* copy MAC address */
> +		memcpy((void *)mac, (void *)&eeprom_data[SERIALNUMBER_LENGTH], MAC_LENGTH);
> +	}
> +
> +	serial[SERIALNUMBER_LENGTH] = 0x00;
> +	printf("Serialnumber = %s\n", serial);


[...]

> +++ b/include/configs/socfpga_ica_moritz_iii.h
> @@ -0,0 +1,46 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Copyright (C) 2014 Marek Vasut <marex at denx.de>
> + * Copyright (C) 2020 Nico Becker ic-automation GmbH <n.becker at ic-automation.de>
> + */
> +
> +#ifndef __CONFIG_SOCFPGA_MORITZ_III_H__
> +#define __CONFIG_SOCFPGA_MORITZ_III_H__
> +
> +#include <asm/arch/base_addr_ac5.h>
> +
> +/* Memory configurations */
> +#define PHYS_SDRAM_1_SIZE					0x40000000	/* 1GiB on SoCDK */
> +
> +/* Booting Linux */
> +#define CONFIG_LOADADDR						0x01000000
> +#define CONFIG_SYS_LOAD_ADDR			CONFIG_LOADADDR
> +
> +/* Boot emv */
> +#define CONFIG_EXTRA_ENV_SETTINGS	\
> +	"fdtfile=" CONFIG_DEFAULT_FDT_FILE "\0"	\
> +	"fpgafile=/lib/firmware/socfpga_sram_bridge.rbf\0"	\
> +	"kernel_addr_r=" __stringify(CONFIG_SYS_LOAD_ADDR)"\0"	\
> +	"bootm_size=0xa000000\0"	\
> +	"fdt_addr_r=0x02000000\0"	\
> +	"ramdisk_addr_r=0x02300000\0"	\
> +	"socfpga_legacy_reset_compat=1\0"	\
> +	"fpgaloadandenable="			\
> +	"fpga load 0 ${loadaddr} ${filesize};"			\
> +	"echo firmware $fpgafile written to fpga;"			\
> +	"bridge enable; echo bridges enabled;\0"	\
> +	"fpgaload=ext4load mmc 0:2 ${loadaddr} ${fpgafile}; run checkfpgafw;\0"	\

use plain load (with CONFIG_FS_GENERIC) and use && as the load command
might fail. You don't want to run the script if it fails. Also use && in
the rest of the scripts where applicable.

> +	"checkfpgafw="			\
> +	"if test ${filesize} -le 0; then "			\
> +		"echo cant load fpga firmare $fpgafile;"	\
> +	"else "			\
> +		"run fpgaloadandenable;"					\
> +	"fi;\0"			\
> +	"bootargs=console=ttyS0,115200 rootfstype=ext4 root=/dev/mmcblk0p2 rw rootwait\0"	\
> +	"bootcmd=run fpgaload; run mmcload;\0"			\
> +	"mmcload=ext4load mmc 0:2 ${kernel_addr_r} boot/zImage;ext4load mmc 0:2 ${fdt_addr_r} boot/${fdtfile};bootz ${kernel_addr_r} - ${fdt_addr_r}\0"
> +
> +/* The rest of the configuration is shared */
> +#include <configs/socfpga_common.h>
> +
> +#endif	/* __CONFIG_SOCFPGA_MORITZ_III_H__ */
> 


More information about the U-Boot mailing list