[RFC] riscv: visionfive2: use OF_BOARD_SETUP

Matthias Brugger mbrugger at suse.com
Wed Apr 19 14:34:03 CEST 2023



On 19/04/2023 13:28, Torsten Duwe wrote:
> U-Boot already has a mechanism to fix up the DT before OS boot.
> This avoids the excessive duplication of data and work proposed
> by the explicit separation of 1.2a and 1.3b board revisions. It
> will also, to a good degree, improve the user experience, as
> pointed out by Matthias.
> 
> The defconfig changes required (in diffconfig format) are
> 
> -I2C n
> -NET_RANDOM_ETHADDR y
> +CMD_I2C y
> +CMD_MISC y
> +DM_I2C y
> +I2C_EEPROM y
> +MISC y
> +MISC_INIT_R y
> +OF_BOARD_SETUP y
> +SPL_DM_I2C n
> +SPL_MISC n
> +SYS_I2C_DW y
> +SYS_I2C_EEPROM_ADDR 0x0
> 
> along with the patch below. It has the neat side effect of providing
> the network with the proper MAC addresses ;)
> 
> I take advantage of the fact that I²C-5 is also required to talk to the
> PMIC, so it must already be initialised by OpenSBI. All that's required
> is to declare the EEPROM and to pull in the drivers.
> 
> This is only a proof of concept; let me know if you like it and I can
> add the other 12 DT patches to adjust_for_rev13b(), or maybe start with
> 1.3b as the default and go the other way, or something in between.
> 
> The last hunk, to the i2c Makefile, is IMHO an independent fix, because
> the implication PCI => ACPI in designware_i2c_pci is invalid, and the
> VisionFive2 config proves it. Use this quick hack for now.
> 

Looks like a neat approach to enable a signle U-Boot binary to boot on both 
platforms.

Thanks for investigating this.

> Signed-off-by: Torsten Duwe <duwe at suse.de>
> 
> ---
> diff --git a/arch/riscv/dts/jh7110-starfive-visionfive-2.dtsi b/arch/riscv/dts/jh7110-starfive-visionfive-2.dtsi
> index ff9df56ec2..fd3a1d057a 100644
> --- a/arch/riscv/dts/jh7110-starfive-visionfive-2.dtsi
> +++ b/arch/riscv/dts/jh7110-starfive-visionfive-2.dtsi
> @@ -119,6 +119,12 @@
>   	pinctrl-names = "default";
>   	pinctrl-0 = <&i2c5_pins>;
>   	status = "okay";
> +
> +	eeprom at 50 {
> +		compatible = "atmel,24c04";
> +		reg = <0x50>;
> +		pagesize = <0x10>;
> +	};
>   };
>   
>   &i2c6 {
> diff --git a/board/starfive/visionfive2/starfive_visionfive2.c b/board/starfive/visionfive2/starfive_visionfive2.c
> index 613fe793c4..d7f846a357 100644
> --- a/board/starfive/visionfive2/starfive_visionfive2.c
> +++ b/board/starfive/visionfive2/starfive_visionfive2.c
> @@ -7,6 +7,10 @@
>   #include <common.h>
>   #include <asm/io.h>
>   #include <cpu_func.h>
> +#include <dm/uclass.h>
> +#include <fdt_support.h>
> +#include <i2c_eeprom.h>
> +#include <net.h>
>   #include <linux/bitops.h>
>   
>   #define JH7110_L2_PREFETCHER_BASE_ADDR		0x2030000
> @@ -38,3 +42,62 @@ int board_init(void)
>   
>   	return 0;
>   }
> +
> +#ifdef CONFIG_MISC_INIT_R

As this is will be enabled for the board config I think we don't need the ifedef.

> +int misc_init_r(void)
> +{
> +	int ret = 0;
> +
> +#ifdef CONFIG_I2C_EEPROM
> +       struct udevice *dev;
> +	char mac_addr[6];
> +	unsigned char pcb_rev, BOM;
> +
> +	ret = uclass_first_device_err(UCLASS_I2C_EEPROM, &dev);
> +	if (ret)
> +		goto out;
> +
> +	if (eth_env_get_enetaddr("ethaddr", mac_addr) == 0) {
> +		int i;
> +		for (i=0; i<2; i++) {
> +			ret = i2c_eeprom_read(dev, 0x78+6*i, mac_addr, 6);
> +			if (!ret && is_valid_ethaddr(mac_addr))
> +				eth_env_set_enetaddr_by_index("eth", i, mac_addr);
> +		}
> +	}
> +
> +	ret = i2c_eeprom_read(dev, 0x76, &pcb_rev, 1);
> +	if (!ret)
> +		env_set_hex("board_revision", pcb_rev);
> +
> +	ret = i2c_eeprom_read(dev, 0x77, &BOM, 1);
> +
> +	out:
> +#endif
> +        return ret;
> +}
> +#endif
> +
> +#ifdef CONFIG_OF_BOARD_SETUP

Same here.

Regards,
Matthias

> +static void adjust_for_rev13b(void * fdt)
> +{
> +	do_fixup_by_path(fdt, "/soc/ethernet at 16040000",
> +			 "phy-mode", "rgmii-id", 9, 0);
> +	/*
> +	   ... other fixups ...
> +
> +	 */
> +}
> +
> +int ft_board_setup(void *fdt, struct bd_info *bdip)
> +{
> +	unsigned char pcb_rev = 0;
> +
> +	pcb_rev = env_get_hex("board_revision", pcb_rev);
> +	if (pcb_rev >= 0xB2) {
> +		printf("Adjusting FDT for v1.3B board rev\n");
> +		adjust_for_rev13b(fdt);
> +	}
> +	return 0;
> +}
> +#endif
> diff --git a/drivers/i2c/Makefile b/drivers/i2c/Makefile
> index 99545df2e5..828856e40d 100644
> --- a/drivers/i2c/Makefile
> +++ b/drivers/i2c/Makefile
> @@ -19,8 +19,10 @@ obj-$(CONFIG_SYS_I2C_CA) += i2c-cortina.o
>   obj-$(CONFIG_SYS_I2C_DAVINCI) += davinci_i2c.o
>   obj-$(CONFIG_SYS_I2C_DW) += designware_i2c.o
>   ifdef CONFIG_PCI
> +ifdef CONFIG_ACPIGEN
>   obj-$(CONFIG_SYS_I2C_DW) += designware_i2c_pci.o
>   endif
> +endif
>   obj-$(CONFIG_SYS_I2C_FSL) += fsl_i2c.o
>   obj-$(CONFIG_SYS_I2C_IHS) += ihs_i2c.o
>   obj-$(CONFIG_SYS_I2C_INTEL) += intel_i2c.o


More information about the U-Boot mailing list