[PATCH] board: ti: Add support for the AM335x GP EVM mini board
Tom Rini
trini at konsulko.com
Tue Sep 28 14:14:22 CEST 2021
... trimming the CC list.
On Tue, Sep 28, 2021 at 11:41:36AM +0200, Amjad Ouled-Ameur wrote:
> From: Andreas Dannenberg <dannenberg at ti.com>
>
> This is not really a new board but rather a minimal bootloader solution
> for the AM335x GP EVM. In terms of interfaces, it only supports booting
> from MMC0 or UART0 and only activates a minimal set of drivers that are
> that are necessary to run the device such as DDR, I2C, and PMIC.
>
> The goal is to provide a bare minimum starting point to boot Linux for
> basing custom board-ports on. The limited complexity of this solution
> should make it easier to achieve a successful boot to U-Boot prompt vs.
> trying to pair down the full-featured multi-platform AM335x U-Boot
> available through am335x_evm_defconfig.
>
> Signed-off-by: Andreas Dannenberg <dannenberg at ti.com>
> [Amjad: fix checkpatch and compile warnings]
> Signed-off-by: Amjad Ouled-Ameur <aouledameur at baylibre.com>
There's a few problems here, and I say this as someone who is doing the
"mini" version for J721e/etc. First:
> diff --git a/arch/arm/dts/am335x-evm-mini.dts b/arch/arm/dts/am335x-evm-mini.dts
> new file mode 100644
> index 000000000000..f45da0fd3f6f
> --- /dev/null
> +++ b/arch/arm/dts/am335x-evm-mini.dts
No new dts files. You use the same dts for kernel and u-boot, and have
to write one once. And it all Just Works when you want to
enable more features on your platform.
> diff --git a/arch/arm/mach-omap2/am33xx/Kconfig b/arch/arm/mach-omap2/am33xx/Kconfig
> index 4268419b166b..296559a00c15 100644
> --- a/arch/arm/mach-omap2/am33xx/Kconfig
> +++ b/arch/arm/mach-omap2/am33xx/Kconfig
> @@ -63,6 +63,36 @@ config TARGET_AM335X_EVM
> to write software and develop hardware around
> an AM335x processor subsystem.
>
> +config TARGET_AM335X_EVM_MINI
> + bool "Support am335x_evm_mini"
> + select BOARD_LATE_INIT
> + select DM
> + select DM_GPIO
> + select DM_SERIAL
> + imply CMD_DM
> + imply SPL_DM
> + imply SPL_DM_SEQ_ALIAS
> + imply SPL_ENV_SUPPORT
> + imply SPL_FS_EXT4
> + imply SPL_FS_FAT
> + imply SPL_GPIO_SUPPORT
> + imply SPL_I2C_SUPPORT
> + imply SPL_LIBCOMMON_SUPPORT
> + imply SPL_LIBDISK_SUPPORT
> + imply SPL_LIBGENERIC_SUPPORT
> + imply SPL_MMC_SUPPORT
> + imply SPL_OF_LIBFDT
> + imply SPL_POWER_SUPPORT
> + imply SPL_SEPARATE_BSS
> + imply SPL_SERIAL_SUPPORT
> + imply SPL_SYS_MALLOC_SIMPLE
> + imply SPL_YMODEM_SUPPORT
> + help
> + This option specifies support for the AM335x
> + GP and HS EVM development platforms using a minimal
> + system configuration, only supporting a small subset
> + of boot media and other features.
There should be, maybe, a few selects, for things you simply cannot
avoid, and no imply's. The point is something that's clear about what
is enabled and why it's enabled. And you've got a bunch of extra stuff
enabled there.
> diff --git a/board/ti/am335x/board_hs_mini.h b/board/ti/am335x/board_hs_mini.h
> new file mode 100644
> index 000000000000..e03ba141f286
> --- /dev/null
> +++ b/board/ti/am335x/board_hs_mini.h
> @@ -0,0 +1,19 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * TI AM437x boards information header
> + * Derived from AM335x board.
> + *
> + * Copyright (C) 2020, Texas Instruments, Incorporated - http://www.ti.com/
> + */
> +
> +#ifndef _BOARD_HS_H_
> +#define _BOARD_HS_H_
> +
> +#ifdef CONFIG_TI_SECURE_DEVICE
> +void board_fit_image_post_process(void **p_image, size_t *p_size)
> +{
> + secure_boot_verify_image(p_image, p_size);
> +}
> +#endif
> +
> +#endif
I'd like some of the TI folks to chime in on if we really need to have a
"mini" HS variant too.
> diff --git a/board/ti/am335x/board_mini.c b/board/ti/am335x/board_mini.c
> new file mode 100644
> index 000000000000..94f0a2910be3
> --- /dev/null
> +++ b/board/ti/am335x/board_mini.c
> @@ -0,0 +1,249 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Mini board functions for TI AM335X based boards
> + *
> + * Copyright (C) 2020, Texas Instruments, Incorporated - http://www.ti.com/
> + */
> +
> +#include <common.h>
> +#include <dm.h>
> +#include <env.h>
> +#include <errno.h>
> +#include <init.h>
> +#include <spl.h>
> +#include <serial.h>
> +#include <asm/arch/cpu.h>
> +#include <asm/arch/hardware.h>
> +#include <asm/arch/omap.h>
> +#include <asm/arch/ddr_defs.h>
> +#include <asm/arch/clock.h>
> +#include <asm/arch/mmc_host_def.h>
> +#include <asm/arch/sys_proto.h>
> +#include <asm/arch/mem.h>
> +#include <asm/io.h>
> +#include <asm/emif.h>
> +#include <asm/omap_common.h>
> +#include <asm/omap_sec_common.h>
> +#include <asm/omap_mmc.h>
> +#include <i2c.h>
> +#include <power/tps65910.h>
> +#include <env_internal.h>
> +#include <watchdog.h>
> +#include "board_mini.h"
> +#include "board_hs_mini.h"
Check if we really need all of those includes still.
[snip]
> +const struct dpll_params *get_dpll_mpu_params(void)
> +{
> + int ind = get_sys_clk_index();
> + int freq = am335x_get_efuse_mpu_max_freq(cdev);
> +
> + switch (freq) {
> + case MPUPLL_M_1000:
> + return &dpll_mpu_opp[ind][5];
> + case MPUPLL_M_800:
> + return &dpll_mpu_opp[ind][4];
> + case MPUPLL_M_720:
> + return &dpll_mpu_opp[ind][3];
> + case MPUPLL_M_600:
> + return &dpll_mpu_opp[ind][2];
> + case MPUPLL_M_500:
> + return &dpll_mpu_opp100;
> + case MPUPLL_M_300:
> + return &dpll_mpu_opp[ind][0];
> + }
> +
> + return &dpll_mpu_opp[ind][0];
> +}
> +
> +void scale_vcores_generic(int freq)
> +{
> + int sil_rev, mpu_vdd;
> +
> + /*
> + * The GP EVM, IDK and EVM SK use a TPS65910 PMIC. For all
> + * MPU frequencies we support we use a CORE voltage of
> + * 1.10V. For MPU voltage we need to switch based on
> + * the frequency we are running at.
> + */
> +
> + if (IS_ENABLED(CONFIG_DM_I2C)) {
> + if (power_tps65910_init(0))
> + return;
> + } else {
> + if (i2c_probe(TPS65910_CTRL_I2C_ADDR))
> + return;
> + }
> +
> + /*
> + * Depending on MPU clock and PG we will need a different
> + * VDD to drive at that speed.
> + */
> + sil_rev = readl(&cdev->deviceid) >> 28;
> + mpu_vdd = am335x_get_tps65910_mpu_vdd(sil_rev, freq);
> +
> + /* Tell the TPS65910 to use i2c */
> + tps65910_set_i2c_control();
> +
> + /* First update MPU voltage. */
> + if (tps65910_voltage_update(MPU, mpu_vdd))
> + return;
> +
> + /* Second, update the CORE voltage. */
> + if (tps65910_voltage_update(CORE, TPS65910_OP_REG_SEL_1_1_0))
> + return;
> +}
Are we supposed to be doing all of the frequency scaling stuff in the
"mini" version? And also, just select SPL_DM_I2C so that we can
simplify the code.
> +void set_uart_mux_conf(void)
> +{
> + if (CONFIG_CONS_INDEX == 1)
> + enable_uart0_pin_mux();
> + else if (CONFIG_CONS_INDEX == 2)
> + enable_uart1_pin_mux();
> + else if (CONFIG_CONS_INDEX == 3)
> + enable_uart2_pin_mux();
> + else if (CONFIG_CONS_INDEX == 4)
> + enable_uart3_pin_mux();
> + else if (CONFIG_CONS_INDEX == 5)
> + enable_uart4_pin_mux();
> + else if (CONFIG_CONS_INDEX == 6)
> + enable_uart5_pin_mux();
> +}
All of this was because of the IDK having a different UART port than the
other designs, and we don't need that for "mini".
> +int board_late_init(void)
> +{
> + if (IS_ENABLED(CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG)) {
> + env_set("board_name", CONFIG_SYS_BOARD);
> +
> + /*
> + * Default FIT boot on HS devices. Non FIT images are not allowed
> + * on HS devices.
> + */
> + if (get_device_type() == HS_DEVICE)
> + env_set("boot_fit", "1");
> + }
> +
> + return 0;
> +}
Pending the answer about HS devices, this and also select'ing
BOARD_LATE_INIT can go.
> diff --git a/board/ti/am335x/board_mini.h b/board/ti/am335x/board_mini.h
> new file mode 100644
> index 000000000000..0fa1a8680027
> --- /dev/null
> +++ b/board/ti/am335x/board_mini.h
> @@ -0,0 +1,44 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Mini AM335x boards information header
> + *
> + * Copyright (C) 2020, Texas Instruments, Incorporated - http://www.ti.com/
> + */
> +
> +#ifndef _BOARD_H_
> +#define _BOARD_H_
> +
> +/**
> + * AM335X (EMIF_4D) EMIF REG_COS_COUNT_1, REG_COS_COUNT_2, and
> + * REG_PR_OLD_COUNT values to avoid LCDC DMA FIFO underflows and Frame
> + * Synchronization Lost errors. The values are the biggest that work
> + * reliably with offered video modes and the memory subsystem on the
> + * boards. These register have are briefly documented in "7.3.3.5.2
> + * Command Starvation" section of AM335x TRM. The REG_COS_COUNT_1 and
> + * REG_COS_COUNT_2 do not have any effect on current versions of
> + * AM335x.
> + */
> +#define EMIF_OCP_CONFIG_BEAGLEBONE_BLACK 0x00141414
> +#define EMIF_OCP_CONFIG_AM335X_EVM 0x003d3d3d
We only use the EVM value, so drop the BEAGLEBONE_BLACK one.
> diff --git a/board/ti/am335x/mux_mini.c b/board/ti/am335x/mux_mini.c
> new file mode 100644
> index 000000000000..b724198b9cdf
> --- /dev/null
> +++ b/board/ti/am335x/mux_mini.c
> @@ -0,0 +1,109 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (C) 2020 Texas Instruments Incorporated - http://www.ti.com/
> + */
> +
> +#include <common.h>
> +#include <asm/arch/sys_proto.h>
> +#include <asm/arch/hardware.h>
> +#include <asm/arch/mux.h>
> +#include <asm/io.h>
> +#include <i2c.h>
> +#include "board_mini.h"
> +
> +static struct module_pin_mux uart0_pin_mux[] = {
> + {OFFSET(uart0_rxd), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* UART0_RXD */
> + {OFFSET(uart0_txd), (MODE(0) | PULLUDEN)}, /* UART0_TXD */
> + {-1},
> +};
> +
> +static struct module_pin_mux uart1_pin_mux[] = {
> + {OFFSET(uart1_rxd), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* UART1_RXD */
> + {OFFSET(uart1_txd), (MODE(0) | PULLUDEN)}, /* UART1_TXD */
> + {-1},
> +};
> +
> +static struct module_pin_mux uart2_pin_mux[] = {
> + {OFFSET(spi0_sclk), (MODE(1) | PULLUP_EN | RXACTIVE)}, /* UART2_RXD */
> + {OFFSET(spi0_d0), (MODE(1) | PULLUDEN)}, /* UART2_TXD */
> + {-1},
> +};
> +
> +static struct module_pin_mux uart3_pin_mux[] = {
> + {OFFSET(spi0_cs1), (MODE(1) | PULLUP_EN | RXACTIVE)}, /* UART3_RXD */
> + {OFFSET(ecap0_in_pwm0_out), (MODE(1) | PULLUDEN)}, /* UART3_TXD */
> + {-1},
> +};
> +
> +static struct module_pin_mux uart4_pin_mux[] = {
> + {OFFSET(gpmc_wait0), (MODE(6) | PULLUP_EN | RXACTIVE)}, /* UART4_RXD */
> + {OFFSET(gpmc_wpn), (MODE(6) | PULLUDEN)}, /* UART4_TXD */
> + {-1},
> +};
> +
> +static struct module_pin_mux uart5_pin_mux[] = {
> + {OFFSET(lcd_data9), (MODE(4) | PULLUP_EN | RXACTIVE)}, /* UART5_RXD */
> + {OFFSET(lcd_data8), (MODE(4) | PULLUDEN)}, /* UART5_TXD */
> + {-1},
> +};
> +
> +static struct module_pin_mux mmc0_pin_mux[] = {
> + {OFFSET(mmc0_dat3), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT3 */
> + {OFFSET(mmc0_dat2), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT2 */
> + {OFFSET(mmc0_dat1), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT1 */
> + {OFFSET(mmc0_dat0), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT0 */
> + {OFFSET(mmc0_clk), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CLK */
> + {OFFSET(mmc0_cmd), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CMD */
> + {OFFSET(mcasp0_aclkr), (MODE(4) | RXACTIVE)}, /* MMC0_WP */
> + {OFFSET(spi0_cs1), (MODE(7) | RXACTIVE | PULLUP_EN)}, /* GPIO0_6 */
> + {-1},
> +};
> +
> +static struct module_pin_mux i2c0_pin_mux[] = {
> + {OFFSET(i2c0_sda), (MODE(0) | RXACTIVE |
> + PULLUDEN | SLEWCTRL)}, /* I2C_DATA */
> + {OFFSET(i2c0_scl), (MODE(0) | RXACTIVE |
> + PULLUDEN | SLEWCTRL)}, /* I2C_SCLK */
> + {-1},
> +};
> +
> +void enable_uart0_pin_mux(void)
> +{
> + configure_module_pin_mux(uart0_pin_mux);
> +}
> +
> +void enable_uart1_pin_mux(void)
> +{
> + configure_module_pin_mux(uart1_pin_mux);
> +}
> +
> +void enable_uart2_pin_mux(void)
> +{
> + configure_module_pin_mux(uart2_pin_mux);
> +}
> +
> +void enable_uart3_pin_mux(void)
> +{
> + configure_module_pin_mux(uart3_pin_mux);
> +}
> +
> +void enable_uart4_pin_mux(void)
> +{
> + configure_module_pin_mux(uart4_pin_mux);
> +}
> +
> +void enable_uart5_pin_mux(void)
> +{
> + configure_module_pin_mux(uart5_pin_mux);
> +}
> +
> +void enable_i2c0_pin_mux(void)
> +{
> + configure_module_pin_mux(i2c0_pin_mux);
> +}
> +
> +void enable_board_pin_mux(void)
> +{
> + /* Do board-specific muxes */
> + configure_module_pin_mux(mmc0_pin_mux);
> +}
We don't need all of the UART muxes.
> diff --git a/configs/am335x_evm_mini_defconfig b/configs/am335x_evm_mini_defconfig
> new file mode 100644
> index 000000000000..087d64d742d3
> --- /dev/null
> +++ b/configs/am335x_evm_mini_defconfig
> @@ -0,0 +1,42 @@
> +CONFIG_ARM=y
> +CONFIG_ARCH_CPU_INIT=y
> +CONFIG_ARCH_OMAP2PLUS=y
> +CONFIG_TI_COMMON_CMD_OPTIONS=y
> +CONFIG_DEFAULT_DEVICE_TREE="am335x-evm-mini"
> +CONFIG_AM33XX=y
> +CONFIG_TARGET_AM335X_EVM_MINI=y
> +CONFIG_SPL=y
> +CONFIG_DISTRO_DEFAULTS=y
> +CONFIG_ANDROID_BOOT_IMAGE=y
> +CONFIG_SPL_LOAD_FIT=y
> +CONFIG_OF_BOARD_SETUP=y
> +CONFIG_BOOTCOMMAND="if test ${boot_fit} -eq 1; then run update_to_fit; fi; run findfdt; run init_console; run envboot; run distro_bootcmd"
> +CONFIG_LOGLEVEL=3
> +CONFIG_SYS_CONSOLE_INFO_QUIET=y
> +CONFIG_ARCH_MISC_INIT=y
> +CONFIG_SPL_FIT_IMAGE_TINY=y
> +# CONFIG_SPL_FS_EXT4 is not set
> +CONFIG_SPL_I2C=y
> +# CONFIG_SPL_NAND_SUPPORT is not set
> +CONFIG_SPL_POWER=y
> +# CONFIG_SPL_AM33XX_ENABLE_RTC32K_OSC is not set
> +CONFIG_CMD_SPL=y
> +# CONFIG_CMD_EEPROM is not set
> +# CONFIG_CMD_SETEXPR is not set
> +# CONFIG_SPL_EFI_PARTITION is not set
> +CONFIG_OF_CONTROL=y
> +CONFIG_SYS_RELOC_GD_ENV_ADDR=y
> +CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
> +CONFIG_SPL_ENV_IS_NOWHERE=y
> +CONFIG_VERSION_VARIABLE=y
> +# CONFIG_NET is not set
> +CONFIG_DM_I2C=y
> +CONFIG_MISC=y
> +# CONFIG_MMC_HW_PARTITIONING is not set
> +CONFIG_MMC_OMAP_HS=y
> +CONFIG_TIMER=y
> +CONFIG_OMAP_TIMER=y
> +CONFIG_DYNAMIC_CRC_TABLE=y
> +CONFIG_RSA=y
> +CONFIG_LZO=y
> +# CONFIG_OF_LIBFDT_OVERLAY is not set
Audit this again please, if we're taking a non-default value for a
CONFIG option, it should likely be to disable something, not enable it.
> diff --git a/include/configs/am335x_evm_mini.h b/include/configs/am335x_evm_mini.h
> new file mode 100644
> index 000000000000..f4c8dfe78e1a
> --- /dev/null
> +++ b/include/configs/am335x_evm_mini.h
> @@ -0,0 +1,96 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Copyright (C) 2020 Texas Instruments Incorporated - http://www.ti.com/
> + */
> +
> +#ifndef __CONFIG_AM335X_EVM_MINI_H
> +#define __CONFIG_AM335X_EVM_MINI_H
> +
> +#include <configs/ti_am335x_common.h>
> +#include <linux/sizes.h>
> +
> +#ifndef CONFIG_SPL_BUILD
> +# define CONFIG_TIMESTAMP
> +#endif
You cannot guard options with SPL_BUILD.
> +#define CONFIG_SYS_BOOTM_LEN SZ_16M
> +
> +#define CONFIG_MACH_TYPE MACH_TYPE_AM335XEVM
This isn't going to boot a non-DT kernel.
> +
> +/* Clock Defines */
> +#define V_OSCK 24000000 /* Clock output from T2 */
> +#define V_SCLK (V_OSCK)
> +
> +#define BOOTENV_DEV_LEGACY_MMC(devtypeu, devtypel, instance) \
> + "bootcmd_" #devtypel #instance "=" \
> + "setenv mmcdev " #instance "; "\
> + "setenv bootpart " #instance ":2 ; "\
> + "run mmcboot\0"
> +
> +#define BOOTENV_DEV_NAME_LEGACY_MMC(devtypeu, devtypel, instance) \
> + #devtypel #instance " "
> +
> +#define BOOT_TARGET_DEVICES(func) \
> + func(MMC, mmc, 0) \
> + func(LEGACY_MMC, legacy_mmc, 0)
> +
> +#include <config_distro_bootcmd.h>
No legacy boot, distro only. Which means..
> +#ifndef CONFIG_SPL_BUILD
> +#include <environment/ti/mmc.h>
> +
> +#define CONFIG_EXTRA_ENV_SETTINGS \
> + DEFAULT_LINUX_BOOT_ENV \
> + DEFAULT_MMC_TI_ARGS \
> + DEFAULT_FIT_TI_ARGS \
> + "bootpart=0:2\0" \
> + "bootdir=/boot\0" \
> + "bootfile=zImage\0" \
> + "fdtfile=undefined\0" \
> + "console=ttyS0,115200n8\0" \
> + "partitions=" \
> + "uuid_disk=${uuid_gpt_disk};" \
> + "name=bootloader,start=384K,size=1792K," \
> + "uuid=${uuid_gpt_bootloader};" \
> + "name=rootfs,start=2688K,size=-,uuid=${uuid_gpt_rootfs}\0" \
> + "optargs=\0" \
> + "ramroot=/dev/ram0 rw\0" \
> + "ramrootfstype=ext2\0" \
> + "ramargs=setenv bootargs console=${console} " \
> + "${optargs} " \
> + "root=${ramroot} " \
> + "rootfstype=${ramrootfstype}\0" \
> + "loadramdisk=load mmc ${mmcdev} ${rdaddr} ramdisk.gz\0" \
> + "ramboot=echo Booting from ramdisk ...; " \
> + "run ramargs; " \
> + "bootz ${loadaddr} ${rdaddr} ${fdtaddr}\0" \
> + "default_device_tree=am335x-evm.dtb\0" \
> + "findfdt=" \
> + "setenv name_fdt ${default_device_tree};" \
> + "setenv fdtfile ${name_fdt}\0" \
> + "init_console=" \
> + "setenv console ttyS0,115200n8\0" \
> + BOOTENV
Clean this up.
> +#endif
> +
> +/* NS16550 Configuration */
> +#define CONFIG_SYS_NS16550_COM1 0x44e09000 /* Base EVM has UART0 */
> +#define CONFIG_SYS_NS16550_COM2 0x48022000 /* UART1 */
> +#define CONFIG_SYS_NS16550_COM3 0x48024000 /* UART2 */
> +#define CONFIG_SYS_NS16550_COM4 0x481a6000 /* UART3 */
> +#define CONFIG_SYS_NS16550_COM5 0x481a8000 /* UART4 */
> +#define CONFIG_SYS_NS16550_COM6 0x481aa000 /* UART5 */
> +
> +/* PMIC support */
> +#define CONFIG_POWER_TPS65910
> +
> +/*
> + * Disable MMC DM for SPL build and can be re-enabled after adding
> + * DM support in SPL
> + */
> +#ifdef CONFIG_SPL_BUILD
> +#undef CONFIG_DM_MMC
> +#undef CONFIG_TIMER
> +#endif
You can't do build time guards like that. And I'm sure most of these
kind of comments apply to the am43xx_evm version too. Thanks.
--
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 659 bytes
Desc: not available
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20210928/f80adf14/attachment.sig>
More information about the U-Boot
mailing list