[PATCH v2 1/2] serial: zynqmp: Fetch baudrate from dtb and update

Michal Simek michal.simek at amd.com
Mon Apr 17 09:13:43 CEST 2023



On 4/17/23 06:28, Venkatesh Yadav Abbarapu wrote:
> From: Algapally Santosh Sagar <santoshsagar.algapally at amd.com>
> 
> The baudrate configured in .config is taken by default by serial. If
> change of baudrate is required then the .config needs to changed and
> u-boot recompilation is required or the u-boot environment needs to be
> updated.
> 
> To avoid this, support is added to fetch the baudrate directly from the
> device tree file and update.
> The serial, prints the log with the configured baudrate in the dtb.
> The commit c4df0f6f315c ("arm: mvebu: Espressobin: Set default value for
> $fdtfile env variable") is taken as reference for changing the default
> environment variable.
> 
> The default environment stores the default baudrate value, When default
> baudrate and dtb baudrate are not same glitches are seen on the serial.
> So, the environment also needs to be updated with the dtb baudrate to
> avoid the glitches on the serial.
> 
> Signed-off-by: Algapally Santosh Sagar <santoshsagar.algapally at amd.com>
> Signed-off-by: Venkatesh Yadav Abbarapu <venkatesh.abbarapu at amd.com>
> ---
>   drivers/serial/Kconfig              | 16 ++++++++++++
>   drivers/serial/serial-uclass.c      | 32 +++++++++++++++++++++++
>   include/configs/mvebu_armada-37xx.h |  1 -
>   include/configs/xilinx_zynqmp.h     |  3 ++-
>   include/env_default.h               |  7 ++++-
>   include/env_internal.h              |  2 +-
>   include/fdtdec.h                    |  8 ++++++
>   include/serial.h                    |  1 +
>   lib/fdtdec.c                        | 40 +++++++++++++++++++++++++++++
>   9 files changed, 106 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
> index 10d07daf27..96cea87f45 100644
> --- a/drivers/serial/Kconfig
> +++ b/drivers/serial/Kconfig
> @@ -24,6 +24,22 @@ config BAUDRATE
>   	  in the SPL stage (most drivers) or for choosing a default baudrate
>   	  in the absence of an environment setting (serial_mxc.c).
>   
> +config SERIAL_DT_BAUD
> +	bool "Fetch serial baudrate from device tree"
> +	depends on DM_SERIAL && SPL_ENV_SUPPORT
> +	select DEFAULT_ENV_IS_RW
> +	help
> +	  Select this to enable fetching and setting of the baudrate
> +	  configured in the DT. Replace the default baudrate with the DT
> +	  baudrate and also set it to the environment.
> +
> +config DEFAULT_ENV_IS_RW
> +	bool "Make default environment as writable"
> +	depends on DM_SERIAL
> +	help
> +	  Select this to enable to make default environment writable. This
> +	  allows modifying the default environment.

This is one separate patch which is simply move to Kconfig and convert armada.


> +
>   config REQUIRE_SERIAL_CONSOLE
>   	bool "Require a serial port for console"
>   	# Running without a serial console is not supported by the
> diff --git a/drivers/serial/serial-uclass.c b/drivers/serial/serial-uclass.c
> index 067fae2614..d77d3bda36 100644
> --- a/drivers/serial/serial-uclass.c
> +++ b/drivers/serial/serial-uclass.c
> @@ -154,12 +154,44 @@ static void serial_find_console_or_panic(void)
>   }
>   #endif /* CONFIG_SERIAL_PRESENT */
>   
> +#ifdef CONFIG_SERIAL_DT_BAUD
> +int serial_get_valid_baudrate(int baud)
> +{
> +	int i;
> +
> +	for (i = 0; i < ARRAY_SIZE(baudrate_table); ++i) {
> +		if (baud == baudrate_table[i])
> +			return 0;
> +	}
> +
> +	return -EINVAL;
> +}
> +#endif
> +
>   /* Called prior to relocation */
>   int serial_init(void)
>   {
>   #if CONFIG_IS_ENABLED(SERIAL_PRESENT)
>   	serial_find_console_or_panic();
>   	gd->flags |= GD_FLG_SERIAL_READY;
> +#ifdef CONFIG_SERIAL_DT_BAUD
> +	int ret = 0;
> +	char *ptr = &default_environment[0];
> +
> +	/*
> +	 * Fetch the baudrate from the dtb and update the value in the
> +	 * default environment.
> +	 */
> +	ret = fdtdec_get_baud_from_dtb(gd->fdt_blob);
> +	if (ret != -EINVAL && ret != -EFAULT) {
> +		gd->baudrate = ret;
> +
> +		while (*ptr != '\0' && *(ptr + 1) != '\0')
> +			ptr++;
> +		ptr += 2;
> +		sprintf(ptr, "baudrate=%d", gd->baudrate);
> +	}
> +#endif
>   	serial_setbrg();
>   #endif
>   
> diff --git a/include/configs/mvebu_armada-37xx.h b/include/configs/mvebu_armada-37xx.h
> index 76e148f55e..18b55be0d8 100644
> --- a/include/configs/mvebu_armada-37xx.h
> +++ b/include/configs/mvebu_armada-37xx.h
> @@ -30,7 +30,6 @@
>   /*
>    * Environment
>    */
> -#define DEFAULT_ENV_IS_RW		/* required for configuring default fdtfile= */
>   
>   #ifdef CONFIG_MMC
>   #define BOOT_TARGET_DEVICES_MMC(func, i) func(MMC, mmc, i)
> diff --git a/include/configs/xilinx_zynqmp.h b/include/configs/xilinx_zynqmp.h
> index 011f0034c5..8620bda489 100644
> --- a/include/configs/xilinx_zynqmp.h
> +++ b/include/configs/xilinx_zynqmp.h
> @@ -176,7 +176,8 @@
>   #ifndef CFG_EXTRA_ENV_SETTINGS
>   #define CFG_EXTRA_ENV_SETTINGS \
>   	ENV_MEM_LAYOUT_SETTINGS \
> -	BOOTENV
> +	BOOTENV \
> +	ENV_RW_FILLER

This is not what TOM was saying. You shouldn't have a need to update every board 
which wants this feature. Just enable it and get it. It means this should be the 
part of env_default.h directly.

>   #endif
>   
>   /* SPL can't handle all huge variables - define just DFU */
> diff --git a/include/env_default.h b/include/env_default.h
> index c0df39d62f..8ff0422ccf 100644
> --- a/include/env_default.h
> +++ b/include/env_default.h
> @@ -23,7 +23,7 @@ env_t embedded_environment __UBOOT_ENV_SECTION__(environment) = {
>   	{
>   #elif defined(DEFAULT_ENV_INSTANCE_STATIC)
>   static char default_environment[] = {
> -#elif defined(DEFAULT_ENV_IS_RW)
> +#elif defined(CONFIG_DEFAULT_ENV_IS_RW)
>   char default_environment[] = {
>   #else
>   const char default_environment[] = {
> @@ -47,6 +47,11 @@ const char default_environment[] = {
>   #if defined(CONFIG_BAUDRATE) && (CONFIG_BAUDRATE >= 0)
>   	"baudrate="	__stringify(CONFIG_BAUDRATE)	"\0"
>   #endif
> +#ifdef CONFIG_SERIAL_DT_BAUD
> +#define ENV_RW_FILLER "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
> +#else
> +#define ENV_RW_FILLER
> +#endif

Can you do just this here?

#ifdef CONFIG_SERIAL_DT_BAUD
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
#endif

Or if this is something what needs to be at the end just move it there.

Thanks,
Michal


More information about the U-Boot mailing list